{
  "version": 3,
  "sources": ["../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/visit.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/directives.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/anchors.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/applyReviver.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/toJS.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Node.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Alias.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/createNode.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Collection.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyComment.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/stringify/foldFlowLines.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyString.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/stringify/stringify.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyPair.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/log.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/merge.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/addPairToJSMap.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/Pair.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyCollection.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLMap.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/common/map.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLSeq.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/common/seq.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/common/string.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/common/null.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/core/bool.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyNumber.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/core/float.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/core/int.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/core/schema.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/json/schema.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/binary.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/pairs.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/omap.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/bool.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/float.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/int.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/set.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/schema.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/tags.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/schema/Schema.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyDocument.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/errors.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-props.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/util-contains-newline.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/util-flow-indent-check.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/util-map-includes.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-map.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-seq.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-collection.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-scalar.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-scalar.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/util-empty-scalar-position.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/compose/composer.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-scalar.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst-visit.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/cst.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/lexer.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/line-counter.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/parse/parser.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/public-api.js", "../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js", "../src/main.ts", "../src/process/command.ts", "../src/runtime/capabilities.ts", "../src/runtime/doctor.ts", "../src/testing/run-smoke.ts", "../src/runtime/claude-adapter.ts", "../src/runtime/json-rpc-stdio-client.ts", "../src/runtime/execution-backend.ts", "../src/runtime/acp-adapter.ts", "../src/runtime/claude-stream-json.ts", "../src/runtime/codex-adapter.ts", "../src/runtime/cursor-acp-adapter.ts", "../src/runtime/antigravity-cli-adapter.ts", "../src/runtime/hermes-acp-adapter.ts", "../src/runtime/kimi-adapter.ts", "../src/runtime/opencode-cli-adapter.ts", "../src/runtime/fake-persistent-adapter.ts", "../src/runtime/registry.ts", "../src/testing/smoke-harness.ts", "../src/workspace/ai-employee-workspace.ts", "../src/employee/lark-cli-bin.ts", "../src/skills/injector.ts", "../src/skills/global-store.ts", "../src/skills/templates/index.ts", "../src/skills/hermes-config.ts", "../src/workspace/reference-index.ts", "../src/lab/interactive-lab.ts", "../src/lab/lab-store.ts", "../src/lab/lab-prompts.ts", "../src/lab/lab-ui.ts", "../src/connection/server-connection.ts", "../package.json", "../src/agent-manager/ai-employee-process-manager.ts", "../../shared/src/protocol.ts", "../../shared/src/runtime-session-scope.ts", "../../shared/src/proxy-module/proxy-module-spec.ts", "../src/runtime/model-detector.ts", "../src/runtime/auth-detector.ts", "../src/runtime/container-backend.ts", "../src/runtime/session-diagnostics.ts", "../src/runtime/session-recovery.ts", "../src/reminder/reminder-cache.ts", "../src/agent-manager/employee-file-mutex.ts", "../src/agent-manager/runtime-slot-manager.ts", "../src/agent-manager/runtime-env-allowlist.ts", "../src/agent-manager/activity-tracker.ts", "../src/agent-manager/skill-scanner.ts", "../src/agent-manager/feishu-session-store.ts", "../src/agent-manager/workspace-browser.ts", "../src/platform-proxy.ts", "../src/agent-proxy/ai-employee-local-proxy.ts", "../src/proxy-module/proxy-verifier.ts", "../src/proxy-module/mock-ctx.ts", "../src/proxy-module/proxy-module-runner.ts", "../src/employee/lark-credential.ts", "../src/employee/feishu-personal-agent-poller.ts", "../src/skills/employee-skills.ts", "../src/runtime/container-engine-detector.ts", "../src/cli/setup-report.ts", "../src/routine/primitives/types.ts", "../src/routine/primitives/dedupe.ts", "../src/routine/primitives/filter.ts", "../src/routine/primitives/foreach.ts", "../src/routine/primitives/http-request.ts", "../src/routine/primitives/wake-agent.ts", "../src/routine/primitives/index.ts", "../src/routine/variable-scope.ts", "../src/routine/step-executor.ts", "../src/routine/routine-runner.ts", "../src/routine/routine-dispatcher.ts", "../src/employee/feishu-personal-agent-poller-manager.ts", "../src/native-session/collaboration-manager.ts", "../src/native-session/session-discovery.ts"],
  "sourcesContent": ["'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        return found;\n    }\n    toJSON(_arg, ctx) {\n        if (!ctx)\n            return { source: this.source };\n        const { anchors, doc, maxAliasCount } = ctx;\n        const source = this.resolve(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        let data = anchors.get(source);\n        if (!data) {\n            // Resolve anchors for Node.prototype.toJS()\n            toJS.toJS(source, null, ctx);\n            data = anchors.get(source);\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, source, 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        return data.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 = '\u2026' + lineStr.substring(trimStart);\n        ci -= trimStart - 1;\n    }\n    if (lineStr.length > 80)\n        lineStr = lineStr.substring(0, 79) + '\u2026';\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) + '\u2026\\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            // \u2192 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 foldLines(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 foldLines(source.slice(1, -1)).replace(/''/g, \"'\");\n}\nfunction foldLines(source) {\n    /**\n     * The negative lookbehind here and in the `re` RegExp is to\n     * prevent causing a polynomial search time in certain cases.\n     *\n     * The try-catch is for Safari, which doesn't support this yet:\n     * https://caniuse.com/js-regexp-lookbehind\n     */\n    let first, line;\n    try {\n        first = new RegExp('(.*?)(?<![ \\t])[ \\t]*\\r?\\n', 'sy');\n        line = new RegExp('[ \\t]*(.*?)(?:(?<![ \\t])[ \\t]*)?\\r?\\n', 'sy');\n    }\n    catch {\n        first = /(.*?)[ \\t]*\\r?\\n/sy;\n        line = /[ \\t]*(.*?)[ \\t]*\\r?\\n/sy;\n    }\n    let match = first.exec(source);\n    if (!match)\n        return source;\n    let res = match[1];\n    let sep = ' ';\n    let pos = first.lastIndex;\n    line.lastIndex = pos;\n    while ((match = line.exec(source))) {\n        if (match[1] === '') {\n            if (sep === '\\n')\n                res += sep;\n            else\n                sep = '\\n';\n        }\n        else {\n            res += sep + match[1];\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[]` \u2013 Source tokens before the key or value,\n *       possibly including its anchor or tag.\n *     - `key?: Token | null` \u2013 Set for pair values. May then be `null`, if\n *       the key before the `:` separator is empty.\n *     - `sep?: SourceToken[]` \u2013 Source tokens between the key and the value,\n *       which should include the `:` map value indicator if `value` is set.\n *     - `value?: Token` \u2013 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", "#!/usr/bin/env node\nimport os from \"node:os\";\nimport { randomBytes } from \"node:crypto\";\nimport { chmodSync, createWriteStream, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync, type WriteStream } from \"node:fs\";\nimport { execFile } from \"node:child_process\";\nimport path from \"node:path\";\nimport { realpath } from \"node:fs/promises\";\nimport type { AddressInfo } from \"node:net\";\nimport { createServer as createHttpServer, request as httpRequest, type IncomingMessage, type Server as HttpServer, type ServerResponse } from \"node:http\";\nimport { doctorRuntimes } from \"./runtime/doctor\";\nimport {\n  isSupportedRuntimeId,\n  listRuntimeCapabilities,\n  supportedRuntimeIds,\n  type RuntimeId,\n} from \"./runtime/capabilities\";\nimport { runSmokeMatrix, smokeMatrixHasFailures } from \"./testing/run-smoke\";\nimport { runInteractiveLab } from \"./lab/interactive-lab\";\nimport { ServerConnection } from \"./connection/server-connection\";\nimport { AIEmployeeProcessManager } from \"./agent-manager/ai-employee-process-manager\";\nimport { ensureSeeded as ensureGlobalSkillsSeeded } from \"./skills/global-store\";\nimport { RuntimeModelDetector } from \"./runtime/model-detector\";\nimport { ContainerEngineDetector } from \"./runtime/container-engine-detector\";\nimport { ContainerBackend, containerNetworkEnv, type ContainerCredentialMount } from \"./runtime/container-backend\";\nimport { hostBackend, type ExecutionBackend } from \"./runtime/execution-backend\";\nimport { buildSetupReport } from \"./cli/setup-report\";\nimport { RoutineDispatcher } from \"./routine/routine-dispatcher\";\nimport { syncFeishuPersonalAgentPoller, type FeishuPersonalAgentPollerLike } from \"./employee/feishu-personal-agent-poller-manager\";\nimport packageJson from \"../package.json\";\nimport { NativeSessionCollaborationManager, type NativeSessionLocalStartInput } from \"./native-session/collaboration-manager\";\nimport { resolveCurrentNativeSession } from \"./native-session/session-discovery\";\nimport type { NativeSessionCollaborationCommand, NativeSessionRuntime } from \"@claude-console/shared\";\n\nexport interface CliIo {\n  stdout(line: string): void;\n  stderr(line: string): void;\n}\n\nexport interface CliRuntimeOptions {\n  platform?: NodeJS.Platform;\n  homeDir?: string;\n  logDir?: string;\n  uid?: number;\n  run?: (command: string, args: string[]) => Promise<{ code: number; stdout: string; stderr: string }>;\n}\n\nexport async function runCli(argv: string[], io: CliIo = defaultIo, runtimeOptions: CliRuntimeOptions = {}): Promise<number> {\n  const [command] = argv;\n\n  if (!command || command === \"--help\" || command === \"help\") {\n    io.stdout(buildHelp());\n    return 0;\n  }\n\n  if (command === \"wm\") {\n    return runWmCommand(argv.slice(1), io, runtimeOptions);\n  }\n\n  if (command === \"niuma-collab\") {\n    return runNiumaCollabCommand(argv.slice(1), io, runtimeOptions);\n  }\n\n  if (command === \"runtimes\") {\n    io.stdout(JSON.stringify(listRuntimeCapabilities(), null, 2));\n    return 0;\n  }\n\n  if (command === \"models\") {\n    const detector = new RuntimeModelDetector();\n    io.stdout(JSON.stringify(await detector.detectAll(parseRuntimeArgs(argv)), null, 2));\n    return 0;\n  }\n\n  if (command === \"doctor\") {\n    io.stdout(JSON.stringify(await doctorRuntimes(parseRuntimeArgs(argv)), null, 2));\n    return 0;\n  }\n\n  if (command === \"setup\") {\n    const runtimes = parseRuntimeArgs(argv);\n    const [runtimeResults, containerEngine] = await Promise.all([\n      new RuntimeModelDetector().detectAll(runtimes),\n      new ContainerEngineDetector().detect(),\n    ]);\n    io.stdout(buildSetupReport({ runtimes: runtimeResults, containerEngine }));\n    return 0;\n  }\n\n  if (command === \"smoke\") {\n    const options = parseSmokeArgs(argv);\n    const summaries = await runSmokeMatrix(options);\n    io.stdout(JSON.stringify(summaries, null, 2));\n    return smokeMatrixHasFailures(summaries) ? 1 : 0;\n  }\n\n  if (command === \"lab\") {\n    await runInteractiveLab({\n      rootDir: valueAfter(argv, \"--root\"),\n      serverNamespace: valueAfter(argv, \"--server\"),\n      timeoutMs: numberAfter(argv, \"--timeout-ms\"),\n    });\n    return 0;\n  }\n\n  if (command === \"start\") {\n    const serverUrl = valueAfter(argv, \"--server-url\");\n    const apiKey = valueAfter(argv, \"--api-key\");\n    const spaceId = valueAfter(argv, \"--space-id\");\n    const machineId = valueAfter(argv, \"--machine-id\");\n    const name = valueAfter(argv, \"--name\");\n    const serviceMode = parseDaemonServiceMode(valueAfter(argv, \"--service-mode\"));\n    const executionBackendMode = parseExecutionBackendMode(valueAfter(argv, \"--execution-backend\") ?? process.env.WM_DAEMON_EXECUTION_BACKEND);\n    const containerImage = valueAfter(argv, \"--container-image\") ?? process.env.WM_DAEMON_CONTAINER_IMAGE;\n    const containerMemory = valueAfter(argv, \"--container-memory\") ?? process.env.WM_DAEMON_CONTAINER_MEMORY;\n    const containerCpus = valueAfter(argv, \"--container-cpus\") ?? process.env.WM_DAEMON_CONTAINER_CPUS;\n    if (!serverUrl || !apiKey) {\n      io.stderr(\"wm-daemon start requires --server-url and --api-key\");\n      return 2;\n    }\n    const rootDir = valueAfter(argv, \"--root\") ?? `${process.env.HOME ?? \".\"}/.wm`;\n    const logDir = valueAfter(argv, \"--log-dir\") ?? process.env.WM_DAEMON_LOG_DIR ?? daemonDefaultLogDir(rootDir);\n    const logger = createDaemonFileLogger(io, { logDir, daemonId: machineId ?? `daemon-${process.pid}` });\n    try {\n      logger.io.stdout(`[log] file=${logger.filePath}`);\n      await runDaemon({ serverUrl, apiKey, spaceId, machineId, name, rootDir, serviceMode, executionBackendMode, containerImage, containerMemory, containerCpus, io: logger.io });\n    } finally {\n      logger.close();\n    }\n    return 0;\n  }\n\n  if (command === \"install-service\") {\n    const serverUrl = valueAfter(argv, \"--server-url\");\n    const apiKey = valueAfter(argv, \"--api-key\");\n    if (!serverUrl || !apiKey) {\n      io.stderr(\"wm-daemon install-service requires --server-url and --api-key\");\n      return 2;\n    }\n    const rootDir = valueAfter(argv, \"--root\") ?? `${process.env.HOME ?? \".\"}/.wm`;\n    const result = await installDaemonUserService({\n      serverUrl,\n      apiKey,\n      spaceId: valueAfter(argv, \"--space-id\"),\n      machineId: valueAfter(argv, \"--machine-id\"),\n      name: valueAfter(argv, \"--name\"),\n      rootDir,\n      logDir: valueAfter(argv, \"--log-dir\") ?? process.env.WM_DAEMON_LOG_DIR ?? daemonDefaultLogDir(rootDir),\n      executionBackendMode: parseExecutionBackendMode(valueAfter(argv, \"--execution-backend\") ?? process.env.WM_DAEMON_EXECUTION_BACKEND),\n      containerImage: valueAfter(argv, \"--container-image\") ?? process.env.WM_DAEMON_CONTAINER_IMAGE,\n      containerMemory: valueAfter(argv, \"--container-memory\") ?? process.env.WM_DAEMON_CONTAINER_MEMORY,\n      containerCpus: valueAfter(argv, \"--container-cpus\") ?? process.env.WM_DAEMON_CONTAINER_CPUS,\n      io,\n    });\n    return result.ok ? 0 : 2;\n  }\n\n  io.stderr(`Unknown command: ${command}`);\n  io.stderr(buildHelp());\n  return 2;\n}\n\nconst defaultIo: CliIo = {\n  stdout: (line) => {\n    console.log(line);\n  },\n  stderr: (line) => {\n    console.error(line);\n  },\n};\n\nfunction buildHelp(): string {\n  return [\n    \"wm-daemon\",\n    \"\",\n    \"Commands:\",\n    \"  runtimes    Print v1 runtime adapter capability declarations as JSON.\",\n    \"  models      Detect runtime model and reasoning-effort declarations as JSON.\",\n    \"  doctor      Detect local runtime binaries and versions.\",\n    \"  setup       Print install/auth/sandbox setup guidance.\",\n    \"  wm         Manage the persistent wm-daemon service: status/start/stop/restart/log/uninstall/doctor.\",\n    \"  smoke       Run adapter smoke tests against local runtimes.\",\n    \"  lab         Open the interactive local daemon test lab.\",\n    \"  start       Connect this daemon to a Workspace Server.\",\n    \"  install-service  Install and start wm-daemon as a persistent per-user service.\",\n    \"  help        Print this help text.\",\n    \"\",\n    \"Start writes logs to --log-dir, WM_DAEMON_LOG_DIR, or <root>/logs/daemon by default.\",\n    \"Start supports --container-image, --container-memory and --container-cpus for employee sandbox containers.\",\n    \"Container mode uses WM_DAEMON_CONTAINER_IMAGE as a global override, otherwise wm-daemon-runtime-base plus wm-daemon-runtime-<runtime>:latest.\",\n    \"Lab is local-only and clears its selected server namespace before starting.\",\n  ].join(\"\\n\");\n}\n\nasync function runWmCommand(argv: string[], io: CliIo, options: CliRuntimeOptions): Promise<number> {\n  const command = argv[0] ?? \"help\";\n  if (command === \"help\" || command === \"--help\") {\n    io.stdout([\n      \"wm\",\n      \"\",\n      \"Commands:\",\n      \"  status     Show persistent service status.\",\n      \"  start      Start persistent service.\",\n      \"  stop       Stop persistent service.\",\n      \"  restart    Refresh @wagemule/daemon@latest and restart persistent service.\",\n      \"  log|logs   Print daemon logs. Supports -f/--follow and -n/--lines <count>.\",\n      \"  uninstall  Remove persistent service without deleting workspaces.\",\n      \"  doctor     Print local daemon environment summary.\",\n    ].join(\"\\n\"));\n    return 0;\n  }\n  if (command === \"doctor\") {\n    return runWmDoctor(io, options);\n  }\n  if (command === \"log\" || command === \"logs\") {\n    return runWmLogs(argv.slice(1), io, options);\n  }\n  if ([\"status\", \"start\", \"stop\", \"restart\", \"uninstall\"].includes(command)) {\n    return runWmServiceCommand(command as \"status\" | \"start\" | \"stop\" | \"restart\" | \"uninstall\", io, options);\n  }\n  io.stderr(`Unknown wm command: ${command}`);\n  return 2;\n}\n\nasync function runWmServiceCommand(\n  command: \"status\" | \"start\" | \"stop\" | \"restart\" | \"uninstall\",\n  io: CliIo,\n  options: CliRuntimeOptions\n): Promise<number> {\n  const platform = options.platform ?? process.platform;\n  const run = options.run ?? runCommand;\n  const serviceCalls = serviceCommandsForPlatform(command, platform, options);\n  if (!serviceCalls.length) {\n    io.stderr(`wm ${command} does not support this platform yet: ${platform}`);\n    return 2;\n  }\n  if (command === \"restart\") {\n    const pull = await run(...daemonLatestPullCommand());\n    if (pull.code !== 0) {\n      if (pull.stdout.trim()) io.stdout(pull.stdout.trimEnd());\n      if (pull.stderr.trim()) io.stderr(pull.stderr.trimEnd());\n      return pull.code || 1;\n    }\n  }\n  let last = { code: 0, stdout: \"\", stderr: \"\" };\n  for (const [cmd, args] of serviceCalls) {\n    last = await run(cmd, args);\n    if (last.stdout.trim()) io.stdout(last.stdout.trimEnd());\n    if (last.stderr.trim()) io.stderr(last.stderr.trimEnd());\n    if (last.code !== 0 && !(platform === \"darwin\" && command === \"uninstall\" && args[0] === \"bootout\")) {\n      return last.code || 1;\n    }\n  }\n  if (command === \"status\") {\n    const rootDir = path.join(options.homeDir ?? process.env.HOME ?? os.homedir(), \".wm\");\n    io.stdout(`daemon: ${formatDaemonRuntimeStatus(await queryDaemonRuntimeStatus(rootDir))}`);\n  }\n  return 0;\n}\n\nfunction serviceCommandsForPlatform(\n  command: \"status\" | \"start\" | \"stop\" | \"restart\" | \"uninstall\",\n  platform: NodeJS.Platform,\n  options: CliRuntimeOptions\n): Array<[string, string[]]> {\n  if (platform === \"linux\") {\n    const homeDir = options.homeDir ?? process.env.HOME ?? os.homedir();\n    const unitPath = path.join(homeDir, \".config\", \"systemd\", \"user\", \"wm-daemon.service\");\n    if (command === \"status\") return [[\"systemctl\", [\"--user\", \"status\", \"wm-daemon.service\", \"--no-pager\", \"--lines=0\"]]];\n    if (command === \"start\") return [[\"systemctl\", [\"--user\", \"start\", \"wm-daemon.service\"]]];\n    if (command === \"stop\") return [[\"systemctl\", [\"--user\", \"stop\", \"wm-daemon.service\"]]];\n    if (command === \"restart\") return [[\"systemctl\", [\"--user\", \"restart\", \"wm-daemon.service\"]]];\n    return [\n      [\"systemctl\", [\"--user\", \"disable\", \"--now\", \"wm-daemon.service\"]],\n      [\"rm\", [\"-f\", unitPath]],\n      [\"rm\", [\"-f\", ...legacyWmCommandPaths(homeDir)]],\n      [\"systemctl\", [\"--user\", \"daemon-reload\"]],\n    ];\n  }\n  if (platform === \"darwin\") {\n    const uid = options.uid ?? process.getuid?.() ?? 0;\n    const homeDir = options.homeDir ?? process.env.HOME ?? os.homedir();\n    const label = \"com.wagemule.wm-daemon\";\n    const service = `gui/${uid}/${label}`;\n    const plistPath = path.join(homeDir, \"Library\", \"LaunchAgents\", `${label}.plist`);\n    if (command === \"status\") return [[\"launchctl\", [\"print\", service]]];\n    if (command === \"start\") return [[\"launchctl\", [\"kickstart\", \"-k\", service]]];\n    if (command === \"stop\") return [[\"launchctl\", [\"kill\", \"TERM\", service]]];\n    if (command === \"restart\") return [[\"launchctl\", [\"kickstart\", \"-k\", service]]];\n    return [[\"launchctl\", [\"bootout\", service]], [\"rm\", [\"-f\", plistPath, ...legacyWmCommandPaths(homeDir)]]];\n  }\n  if (platform === \"win32\") {\n    const taskName = \"NiuMa WM Daemon\";\n    if (command === \"status\") return [[\"schtasks\", [\"/Query\", \"/TN\", taskName]]];\n    if (command === \"start\") return [[\"schtasks\", [\"/Run\", \"/TN\", taskName]]];\n    if (command === \"stop\") return [[\"schtasks\", [\"/End\", \"/TN\", taskName]]];\n    if (command === \"restart\") return [[\"schtasks\", [\"/End\", \"/TN\", taskName]], [\"schtasks\", [\"/Run\", \"/TN\", taskName]]];\n    return [[\"schtasks\", [\"/Delete\", \"/TN\", taskName, \"/F\"]]];\n  }\n  return [];\n}\n\nfunction daemonLatestPullCommand(): [string, string[]] {\n  return [\"npx\", [\"--registry=https://registry.npmjs.org/\", \"--prefer-online\", \"-y\", \"@wagemule/daemon@latest\", \"--help\"]];\n}\n\nasync function runWmLogs(argv: string[], io: CliIo, options: CliRuntimeOptions): Promise<number> {\n  const platform = options.platform ?? process.platform;\n  const run = options.run ?? runCommand;\n  const lineCount = valueAfter(argv, \"--lines\") ?? valueAfter(argv, \"-n\") ?? \"80\";\n  const follow = argv.includes(\"-f\") || argv.includes(\"--follow\");\n  if (platform === \"linux\") {\n    const journalArgs = [\"--user\", \"-u\", \"wm-daemon.service\", \"-n\", lineCount, \"--no-pager\"];\n    if (follow) journalArgs.push(\"-f\");\n    const journal = await run(\"journalctl\", journalArgs);\n    const journalOutput = journal.stdout.trimEnd();\n    if (journal.code === 0 && journalOutput && !isEmptyJournalOutput(journalOutput)) {\n      io.stdout(journalOutput);\n      return 0;\n    }\n    if (follow && journal.code === 0) return 0;\n  }\n  const logDir = options.logDir ?? process.env.WM_DAEMON_LOG_DIR ?? daemonDefaultLogDir(path.join(options.homeDir ?? process.env.HOME ?? os.homedir(), \".wm\"));\n  const fallback = latestLogFile(logDir);\n  if (!fallback) {\n    io.stderr(`No daemon logs found in ${logDir}`);\n    return 1;\n  }\n  if (follow && platform !== \"win32\") {\n    const tail = await run(\"tail\", [\"-n\", lineCount, \"-f\", fallback]);\n    if (tail.stdout.trim()) io.stdout(tail.stdout.trimEnd());\n    if (tail.stderr.trim()) io.stderr(tail.stderr.trimEnd());\n    return tail.code;\n  }\n  if (follow) {\n    io.stderr(\"wm log --follow is not supported on this platform when journal logs are unavailable\");\n    return 2;\n  }\n  io.stdout(tailFile(fallback, Number.parseInt(lineCount, 10) || 80));\n  return 0;\n}\n\nfunction isEmptyJournalOutput(output: string): boolean {\n  return output.trim() === \"-- No entries --\";\n}\n\nasync function runWmDoctor(io: CliIo, options: CliRuntimeOptions): Promise<number> {\n  const run = options.run ?? runCommand;\n  const platform = options.platform ?? process.platform;\n  const rootDir = path.join(options.homeDir ?? process.env.HOME ?? os.homedir(), \".wm\");\n  const runtimeStatus = await queryDaemonRuntimeStatus(rootDir);\n  const checks = await Promise.all([\n    commandStatus(\"node\", platform, run),\n    commandStatus(\"npm\", platform, run),\n    commandStatus(\"npx\", platform, run),\n    dockerStatus(run),\n  ]);\n  io.stdout([\n    \"wm daemon doctor\",\n    `daemon: ${formatDaemonRuntimeStatus(runtimeStatus)}`,\n    ...checks,\n    \"runtime: detection only; install/auth for runtime CLIs is managed by the user.\",\n  ].join(\"\\n\"));\n  return 0;\n}\n\ninterface DaemonRuntimeStatus {\n  version: string;\n  pid: number;\n  serviceMode: string;\n  machineId?: string;\n  updatedAt: string;\n  uptimeMs?: number;\n  socketConnected?: boolean;\n}\n\nfunction daemonRuntimeStatusSocketPath(rootDir: string): string {\n  return path.resolve(rootDir, \"wm-daemon.sock\");\n}\n\nexport async function startDaemonRuntimeStatusServer(\n  rootDir: string,\n  getStatus: () => DaemonRuntimeStatus,\n  log: (line: string) => void,\n  nativeSessionManager?: NativeSessionCollaborationManager,\n): Promise<HttpServer | undefined> {\n  mkdirSync(rootDir, { recursive: true, mode: 0o700 });\n  const rootStat = lstatSync(rootDir);\n  if (rootStat.isSymbolicLink() || !rootStat.isDirectory()) {\n    throw new Error(\"daemon control directory must be a real directory, not a symlink\");\n  }\n  if (typeof process.getuid === \"function\" && rootStat.uid !== process.getuid()) {\n    throw new Error(\"daemon control directory owner mismatch\");\n  }\n  chmodSync(rootDir, 0o700);\n  const socketPath = daemonRuntimeStatusSocketPath(rootDir);\n  try {\n    const socketStat = lstatSync(socketPath);\n    if (socketStat.isSymbolicLink()) throw new Error(\"daemon control socket path must not be a symlink\");\n    if (typeof process.getuid === \"function\" && socketStat.uid !== process.getuid()) {\n      throw new Error(\"daemon control socket owner mismatch\");\n    }\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n  }\n  const windowsStatePath = path.join(rootDir, \"wm-daemon-control.json\");\n  const windowsToken = process.platform === \"win32\" ? randomBytes(32).toString(\"hex\") : undefined;\n  if (process.platform !== \"win32\") rmSync(socketPath, { force: true });\n  const server = createHttpServer((request, response) => {\n    if (windowsToken && request.headers.authorization !== `Bearer ${windowsToken}`) {\n      response.writeHead(401, { \"content-type\": \"application/json\" });\n      response.end(JSON.stringify({ error: \"unauthorized\" }));\n      return;\n    }\n    if (request.url === \"/status\" && request.method === \"GET\") {\n      response.writeHead(200, { \"content-type\": \"application/json\" });\n      response.end(JSON.stringify(getStatus()));\n      return;\n    }\n    if (!nativeSessionManager || !request.url?.startsWith(\"/v1/native-session-collaborations/\")) {\n      response.writeHead(404, { \"content-type\": \"application/json\" });\n      response.end(JSON.stringify({ error: \"not_found\" }));\n      return;\n    }\n    if (request.method !== \"POST\") {\n      response.writeHead(405, { \"content-type\": \"application/json\" });\n      response.end(JSON.stringify({ error: \"method_not_allowed\" }));\n      return;\n    }\n    void handleNativeSessionLocalRequest(request, response, nativeSessionManager);\n  });\n  await new Promise<void>((resolve, reject) => {\n    server.once(\"error\", reject);\n    const listen = process.platform === \"win32\"\n      ? () => server.listen(0, \"127.0.0.1\", onListening)\n      : () => server.listen(socketPath, onListening);\n    const onListening = () => {\n      server.off(\"error\", reject);\n      resolve();\n    };\n    listen();\n  }).catch((error) => {\n    log(`local status socket unavailable: ${error instanceof Error ? error.message : String(error)}`);\n    return undefined;\n  });\n  if (!server.listening) return undefined;\n  if (process.platform === \"win32\") {\n    const address = server.address() as AddressInfo;\n    writeFileSync(windowsStatePath, JSON.stringify({ host: \"127.0.0.1\", port: address.port, token: windowsToken }), { mode: 0o600 });\n    server.once(\"close\", () => rmSync(windowsStatePath, { force: true }));\n  } else {\n    chmodSync(socketPath, 0o600);\n    server.once(\"close\", () => rmSync(socketPath, { force: true }));\n  }\n  return server;\n}\n\nasync function handleNativeSessionLocalRequest(\n  request: IncomingMessage,\n  response: ServerResponse,\n  manager: NativeSessionCollaborationManager,\n): Promise<void> {\n  try {\n    const body = await readLocalJsonBody(request, 1_048_576);\n    const route = request.url?.slice(\"/v1/native-session-collaborations/\".length);\n    let result: unknown;\n    if (route === \"sessions\") {\n      result = await manager.listSessions({\n        runtime: requiredNativeRuntime(body.runtime),\n        projectPath: requiredString(body.projectPath ?? body.project_path, \"projectPath\"),\n        limit: optionalNumber(body.limit),\n      });\n    } else if (route === \"current\") {\n      result = await manager.currentSession({ runtime: requiredNativeRuntime(body.runtime) });\n    } else if (route === \"start\") {\n      result = await manager.start(body as unknown as NativeSessionLocalStartInput);\n    } else if (route === \"send\") {\n      result = await manager.send(body as unknown as Extract<NativeSessionCollaborationCommand, { kind: \"send\" }>);\n    } else if (route === \"wait\") {\n      result = await manager.wait(\n        body as unknown as Extract<NativeSessionCollaborationCommand, { kind: \"wait\" }>,\n        optionalNumber(body.timeoutMs ?? body.timeout_ms),\n      );\n    } else if (route === \"finish\") {\n      result = await manager.finish(body as unknown as Extract<NativeSessionCollaborationCommand, { kind: \"finish\" }>);\n    } else if (route === \"status\") {\n      result = await manager.status(body as unknown as Extract<NativeSessionCollaborationCommand, { kind: \"status\" }>);\n    } else if (route === \"confirm-session-change\") {\n      if (body.confirmed !== true) throw new Error(\"session history change confirmation is required\");\n      const rawCommand = body.command && typeof body.command === \"object\" && !Array.isArray(body.command)\n        ? body.command as Record<string, unknown>\n        : {};\n      result = await manager.confirmSessionChange({\n        runtime: requiredNativeRuntime(body.runtime),\n        sessionId: requiredString(body.sessionId ?? body.session_id, \"sessionId\"),\n        confirmed: true,\n        command: {\n          kind: \"retry\",\n          clientRequestId: requiredString(rawCommand.clientRequestId ?? rawCommand.client_request_id, \"command.clientRequestId\"),\n          collaborationId: requiredString(rawCommand.collaborationId ?? rawCommand.collaboration_id, \"command.collaborationId\"),\n          turnId: requiredString(rawCommand.turnId ?? rawCommand.turn_id, \"command.turnId\"),\n        },\n      });\n    } else {\n      response.writeHead(404, { \"content-type\": \"application/json\" });\n      response.end(JSON.stringify({ ok: false, error: \"not_found\" }));\n      return;\n    }\n    response.writeHead(200, { \"content-type\": \"application/json\" });\n    response.end(JSON.stringify({ ok: true, result }));\n  } catch (error) {\n    const code = (error as { code?: unknown }).code;\n    response.writeHead(code === \"BODY_TOO_LARGE\" ? 413 : code === \"BAD_JSON\" ? 400 : 422, { \"content-type\": \"application/json\" });\n    response.end(JSON.stringify({\n      ok: false,\n      error: error instanceof Error ? error.message : String(error),\n      ...(typeof code === \"string\" ? { error_code: code } : {}),\n    }));\n  }\n}\n\nasync function readLocalJsonBody(request: IncomingMessage, maxBytes: number): Promise<Record<string, unknown>> {\n  return new Promise((resolve, reject) => {\n    let size = 0;\n    let body = \"\";\n    let rejected = false;\n    request.setEncoding(\"utf8\");\n    request.on(\"data\", (chunk: string) => {\n      size += Buffer.byteLength(chunk);\n      if (size > maxBytes) {\n        if (!rejected) reject(Object.assign(new Error(\"request body too large\"), { code: \"BODY_TOO_LARGE\" }));\n        rejected = true;\n        return;\n      }\n      if (rejected) return;\n      body += chunk;\n    });\n    request.on(\"end\", () => {\n      if (rejected) return;\n      try {\n        const value = body ? JSON.parse(body) : {};\n        if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"JSON object required\");\n        resolve(value as Record<string, unknown>);\n      } catch (error) {\n        reject(Object.assign(error instanceof Error ? error : new Error(String(error)), { code: \"BAD_JSON\" }));\n      }\n    });\n    request.on(\"error\", reject);\n  });\n}\n\nfunction requiredNativeRuntime(value: unknown): NativeSessionRuntime {\n  if (value !== \"codex\" && value !== \"claude\") throw new Error(\"runtime must be codex or claude\");\n  return value;\n}\n\nfunction requiredString(value: unknown, name: string): string {\n  if (typeof value !== \"string\" || !value.trim()) throw new Error(`${name} is required`);\n  return value.trim();\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n  if (value === undefined) return undefined;\n  const parsed = Number(value);\n  if (!Number.isFinite(parsed)) throw new Error(\"invalid number\");\n  return parsed;\n}\n\nasync function queryDaemonRuntimeStatus(rootDir: string): Promise<DaemonRuntimeStatus | undefined> {\n  if (process.platform === \"win32\") return undefined;\n  const socketPath = daemonRuntimeStatusSocketPath(rootDir);\n  return new Promise((resolve) => {\n    const request = httpRequest({ socketPath, path: \"/status\", method: \"GET\", timeout: 1000 }, (response) => {\n      let body = \"\";\n      response.setEncoding(\"utf8\");\n      response.on(\"data\", (chunk) => {\n        body += chunk;\n      });\n      response.on(\"end\", () => {\n        if ((response.statusCode ?? 500) < 200 || (response.statusCode ?? 500) >= 300) {\n          resolve(undefined);\n          return;\n        }\n        try {\n          resolve(parseDaemonRuntimeStatus(JSON.parse(body) as Partial<DaemonRuntimeStatus>));\n        } catch {\n          resolve(undefined);\n        }\n      });\n    });\n    request.on(\"timeout\", () => {\n      request.destroy();\n      resolve(undefined);\n    });\n    request.on(\"error\", () => resolve(undefined));\n    request.end();\n  });\n}\n\nfunction parseDaemonRuntimeStatus(value: Partial<DaemonRuntimeStatus>): DaemonRuntimeStatus | undefined {\n  if (typeof value.version !== \"string\" || typeof value.pid !== \"number\" || typeof value.updatedAt !== \"string\") return undefined;\n  return {\n    version: value.version,\n    pid: value.pid,\n    serviceMode: typeof value.serviceMode === \"string\" ? value.serviceMode : \"unknown\",\n    machineId: typeof value.machineId === \"string\" ? value.machineId : undefined,\n    updatedAt: value.updatedAt,\n    uptimeMs: typeof value.uptimeMs === \"number\" ? value.uptimeMs : undefined,\n    socketConnected: typeof value.socketConnected === \"boolean\" ? value.socketConnected : undefined,\n  };\n}\n\nfunction formatDaemonRuntimeStatus(status: DaemonRuntimeStatus | undefined): string {\n  if (!status) return \"unknown\";\n  const state = isProcessAlive(status.pid) ? \"running\" : \"stale\";\n  return `${state} version ${status.version} pid ${status.pid}`;\n}\n\nfunction isProcessAlive(pid: number): boolean {\n  try {\n    process.kill(pid, 0);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\ntype CommandRunner = NonNullable<CliRuntimeOptions[\"run\"]>;\n\nasync function commandStatus(bin: string, platform: NodeJS.Platform, run: CommandRunner): Promise<string> {\n  const result = platform === \"win32\"\n    ? await run(\"where\", [bin])\n    : await run(\"sh\", [\"-lc\", `command -v ${shellQuote(bin)}`]);\n  return `${bin}: ${result.code === 0 ? \"installed\" : \"missing\"}`;\n}\n\nasync function dockerStatus(run: NonNullable<CliRuntimeOptions[\"run\"]>): Promise<string> {\n  const result = await run(\"docker\", [\"--version\"]);\n  return `docker: ${result.code === 0 ? \"installed\" : \"missing\"}${result.stdout.trim() ? ` (${result.stdout.trim()})` : \"\"}`;\n}\n\nfunction latestLogFile(logDir: string): string | undefined {\n  try {\n    return readdirSync(logDir)\n      .filter((name) => name.endsWith(\".log\"))\n      .map((name) => path.join(logDir, name))\n      .sort((left, right) => statSync(right).mtimeMs - statSync(left).mtimeMs)[0];\n  } catch {\n    return undefined;\n  }\n}\n\nfunction tailFile(filePath: string, lines: number): string {\n  return readFileSync(filePath, \"utf8\").split(/\\r?\\n/).filter((line) => line.length > 0).slice(-lines).join(\"\\n\");\n}\n\nexport interface InstallDaemonUserServiceInput {\n  serverUrl: string;\n  apiKey: string;\n  spaceId?: string;\n  machineId?: string;\n  name?: string;\n  rootDir?: string;\n  logDir?: string;\n  executionBackendMode?: \"host\" | \"container\";\n  containerImage?: string;\n  containerMemory?: string;\n  containerCpus?: string;\n  homeDir?: string;\n  user?: string;\n  platform?: NodeJS.Platform;\n  uid?: number;\n  io?: CliIo;\n  which?: (bin: string) => Promise<boolean>;\n  resolve?: (bin: string) => Promise<string | undefined>;\n  run?: (command: string, args: string[]) => Promise<{ code: number; stdout: string; stderr: string }>;\n}\n\nexport async function installDaemonUserService(input: InstallDaemonUserServiceInput): Promise<{ ok: boolean; unitPath?: string }> {\n  const io = input.io ?? defaultIo;\n  const platform = input.platform ?? process.platform;\n  const rootDir = input.rootDir ?? `${process.env.HOME ?? \".\"}/.wm`;\n  const logDir = input.logDir ?? daemonDefaultLogDir(rootDir);\n  const homeDir = input.homeDir ?? process.env.HOME ?? os.homedir();\n  const resolve = input.resolve ?? (input.which\n    ? async (bin: string) => {\n      return await input.which?.(bin) ? bin : undefined;\n    }\n    : resolveCommandPath);\n  const which = input.which ?? (async (bin: string) => Boolean(await resolve(bin)));\n  const run = input.run ?? runCommand;\n\n  if (platform === \"linux\") {\n    return installLinuxSystemdUserService({ ...input, rootDir, logDir, homeDir, io, which, resolve, run });\n  }\n  if (platform === \"darwin\") {\n    return installMacLaunchAgent({ ...input, rootDir, logDir, homeDir, io, which, resolve, run });\n  }\n  if (platform === \"win32\") {\n    return installWindowsScheduledTask({ ...input, rootDir, logDir, homeDir, io, which, resolve, run });\n  }\n\n  io.stderr(`wm-daemon install-service does not support this platform yet: ${platform}. Use the temporary command instead: wm-daemon start --server-url <url> --api-key <key>`);\n  return { ok: false };\n}\n\nasync function installLinuxSystemdUserService(input: RequiredServiceInstallInput): Promise<{ ok: boolean; unitPath?: string }> {\n  const { io, rootDir, logDir, homeDir, which, resolve, run } = input;\n  if (!(await which(\"systemctl\"))) {\n    io.stderr(\"wm-daemon install-service requires systemctl --user. Use the temporary command instead: wm-daemon start --server-url <url> --api-key <key>\");\n    return { ok: false };\n  }\n  const npxBin = await resolve(\"npx\");\n  if (!npxBin) {\n    io.stderr(\"wm-daemon install-service requires npx on PATH. Install Node.js/npm, or use wm-daemon start from an existing package install.\");\n    return { ok: false };\n  }\n\n  await cleanupLegacyDaemonService({\n    platform: \"linux\",\n    homeDir,\n    machineId: input.machineId,\n    run,\n  });\n  writeWmCommandWrappers(homeDir);\n\n  const unitDir = path.join(homeDir, \".config\", \"systemd\", \"user\");\n  const unitPath = path.join(unitDir, \"wm-daemon.service\");\n  mkdirSync(unitDir, { recursive: true });\n  writeFileSync(unitPath, buildSystemdUserUnit({\n    serverUrl: input.serverUrl,\n    apiKey: input.apiKey,\n    spaceId: input.spaceId,\n    machineId: input.machineId,\n    name: input.name,\n    rootDir,\n    logDir,\n    npxBin,\n    pathEnv: servicePathForCommand(npxBin, homeDir),\n  }), \"utf8\");\n\n  const user = input.user ?? process.env.USER ?? os.userInfo().username;\n  const linger = await run(\"loginctl\", [\"enable-linger\", user]);\n  if (linger.code !== 0) {\n    io.stderr(`wm-daemon install-service warning: enable-linger failed: ${linger.stderr || linger.stdout || \"unknown error\"}`);\n  }\n\n  for (const [command, args] of [\n    [\"systemctl\", [\"--user\", \"daemon-reload\"]],\n    [\"systemctl\", [\"--user\", \"enable\", \"--now\", \"wm-daemon.service\"]],\n    [\"systemctl\", [\"--user\", \"status\", \"wm-daemon.service\", \"--no-pager\", \"--lines=0\"]],\n  ] as Array<[string, string[]]>) {\n    const result = await run(command, args);\n    if (result.code !== 0) {\n      io.stderr(`wm-daemon install-service failed: ${command} ${args.join(\" \")}\\n${result.stderr || result.stdout}`);\n      return { ok: false, unitPath };\n    }\n  }\n\n  io.stdout(`wm-daemon systemd service installed: ${unitPath}`);\n  return { ok: true, unitPath };\n}\n\nasync function installMacLaunchAgent(input: RequiredServiceInstallInput): Promise<{ ok: boolean; unitPath?: string }> {\n  const { io, rootDir, logDir, homeDir, which, resolve, run } = input;\n  if (!(await which(\"launchctl\"))) {\n    io.stderr(\"wm-daemon install-service requires launchctl on macOS. Use the temporary command instead: wm-daemon start --server-url <url> --api-key <key>\");\n    return { ok: false };\n  }\n  const npxBin = await resolve(\"npx\");\n  if (!npxBin) {\n    io.stderr(\"wm-daemon install-service requires npx on PATH. Install Node.js/npm, or use wm-daemon start from an existing package install.\");\n    return { ok: false };\n  }\n\n  await cleanupLegacyDaemonService({\n    platform: \"darwin\",\n    homeDir,\n    machineId: input.machineId,\n    uid: input.uid ?? process.getuid?.(),\n    run,\n  });\n  writeWmCommandWrappers(homeDir);\n\n  const label = \"com.wagemule.wm-daemon\";\n  const uid = input.uid ?? process.getuid?.();\n  if (typeof uid !== \"number\") {\n    io.stderr(\"wm-daemon install-service could not determine the current macOS user id. Use the temporary command instead: wm-daemon start --server-url <url> --api-key <key>\");\n    return { ok: false };\n  }\n  const plistDir = path.join(homeDir, \"Library\", \"LaunchAgents\");\n  const plistPath = path.join(plistDir, `${label}.plist`);\n  mkdirSync(plistDir, { recursive: true });\n  mkdirSync(logDir, { recursive: true });\n  writeFileSync(plistPath, buildLaunchAgentPlist({\n    label,\n    serverUrl: input.serverUrl,\n    apiKey: input.apiKey,\n    spaceId: input.spaceId,\n    machineId: input.machineId,\n    name: input.name,\n    rootDir,\n    logDir,\n    homeDir,\n    npxBin,\n    pathEnv: servicePathForCommand(npxBin, homeDir),\n  }), \"utf8\");\n\n  await waitForLaunchAgentUnloaded(run, uid, label);\n  for (const [command, args] of [\n    [\"launchctl\", [\"bootstrap\", `gui/${uid}`, plistPath]],\n    [\"launchctl\", [\"enable\", `gui/${uid}/${label}`]],\n    [\"launchctl\", [\"kickstart\", \"-k\", `gui/${uid}/${label}`]],\n    [\"launchctl\", [\"print\", `gui/${uid}/${label}`]],\n  ] as Array<[string, string[]]>) {\n    const result = command === \"launchctl\" && args[0] === \"bootstrap\"\n      ? await runLaunchctlBootstrapWithRetry(run, args, uid, label)\n      : await run(command, args);\n    if (result.code !== 0) {\n      io.stderr(`wm-daemon install-service failed: ${command} ${args.join(\" \")}\\n${result.stderr || result.stdout}`);\n      return { ok: false, unitPath: plistPath };\n    }\n  }\n\n  io.stdout(`wm-daemon LaunchAgent installed: ${plistPath}`);\n  return { ok: true, unitPath: plistPath };\n}\n\nasync function runLaunchctlBootstrapWithRetry(\n  run: RequiredServiceInstallInput[\"run\"],\n  args: string[],\n  uid: number,\n  label: string\n): Promise<{ code: number; stdout: string; stderr: string }> {\n  const first = await run(\"launchctl\", args);\n  if (first.code === 0) return first;\n  await waitForLaunchAgentUnloaded(run, uid, label);\n  return run(\"launchctl\", args);\n}\n\nasync function waitForLaunchAgentUnloaded(\n  run: RequiredServiceInstallInput[\"run\"],\n  uid: number,\n  label: string\n): Promise<void> {\n  for (let attempt = 0; attempt < 10; attempt += 1) {\n    const result = await run(\"launchctl\", [\"print\", `gui/${uid}/${label}`]);\n    if (result.code !== 0) return;\n    await new Promise((resolve) => setTimeout(resolve, 100));\n  }\n}\n\nasync function installWindowsScheduledTask(input: RequiredServiceInstallInput): Promise<{ ok: boolean; unitPath?: string }> {\n  const { io, which, resolve, run } = input;\n  if (!(await which(\"schtasks\"))) {\n    io.stderr(\"wm-daemon install-service requires schtasks on Windows. Use the temporary command instead: wm-daemon start --server-url <url> --api-key <key>\");\n    return { ok: false };\n  }\n  const npxBin = await resolve(\"npx.cmd\") ?? await resolve(\"npx\");\n  if (!npxBin) {\n    io.stderr(\"wm-daemon install-service requires npx on PATH. Install Node.js/npm, or use wm-daemon start from an existing package install.\");\n    return { ok: false };\n  }\n\n  const taskName = \"NiuMa WM Daemon\";\n  await cleanupLegacyDaemonService({\n    platform: \"win32\",\n    homeDir: input.homeDir ?? process.env.USERPROFILE ?? os.homedir(),\n    taskName,\n    run,\n  });\n  const daemonArgs = buildDaemonStartArgs({ ...input, npxBin });\n  const commandLine = daemonArgs.map(windowsQuoteArg).join(\" \");\n  for (const [command, args] of [\n    [\"schtasks\", [\"/Create\", \"/TN\", taskName, \"/SC\", \"ONLOGON\", \"/TR\", commandLine, \"/F\"]],\n    [\"schtasks\", [\"/Run\", \"/TN\", taskName]],\n    [\"schtasks\", [\"/Query\", \"/TN\", taskName]],\n  ] as Array<[string, string[]]>) {\n    const result = await run(command, args);\n    if (result.code !== 0) {\n      io.stderr(`wm-daemon install-service failed: ${command} ${args.join(\" \")}\\n${result.stderr || result.stdout}`);\n      return { ok: false };\n    }\n  }\n\n  io.stdout(`wm-daemon scheduled task installed: ${taskName}`);\n  return { ok: true };\n}\n\ntype RequiredServiceInstallInput = InstallDaemonUserServiceInput & {\n  rootDir: string;\n  logDir: string;\n  homeDir: string;\n  io: CliIo;\n  which: (bin: string) => Promise<boolean>;\n  resolve: (bin: string) => Promise<string | undefined>;\n  run: (command: string, args: string[]) => Promise<{ code: number; stdout: string; stderr: string }>;\n};\n\nasync function cleanupLegacyDaemonService(input: {\n  platform: NodeJS.Platform;\n  homeDir: string;\n  machineId?: string;\n  uid?: number;\n  taskName?: string;\n  run: (command: string, args: string[]) => Promise<{ code: number; stdout: string; stderr: string }>;\n}): Promise<void> {\n  const commands: Array<[string, string[]]> = [];\n  if (input.platform === \"linux\") {\n    commands.push([\"systemctl\", [\"--user\", \"disable\", \"--now\", \"wm-daemon.service\"]]);\n    commands.push(...legacyDaemonProcessKillCommands(input.machineId));\n  } else if (input.platform === \"darwin\") {\n    const uid = input.uid ?? process.getuid?.() ?? 0;\n    commands.push([\"launchctl\", [\"bootout\", `gui/${uid}/com.wagemule.wm-daemon`]]);\n    commands.push(...legacyDaemonProcessKillCommands(input.machineId));\n  } else if (input.platform === \"win32\") {\n    const taskName = input.taskName ?? \"NiuMa WM Daemon\";\n    commands.push([\"schtasks\", [\"/End\", \"/TN\", taskName]]);\n    commands.push([\"schtasks\", [\"/Delete\", \"/TN\", taskName, \"/F\"]]);\n  }\n  for (const [command, args] of commands) {\n    await input.run(command, args).catch(() => ({ code: 1, stdout: \"\", stderr: \"\" }));\n  }\n  for (const filePath of legacyWmCommandPaths(input.homeDir)) {\n    rmSync(filePath, { force: true });\n  }\n}\n\nfunction legacyDaemonProcessKillCommands(machineId?: string): Array<[string, string[]]> {\n  if (!machineId) return [];\n  return [\n    [\"pkill\", [\"-f\", `wm-daemon start .*--machine-id ${machineId}`]],\n    [\"pkill\", [\"-f\", `@wagemule/daemon.* start .*--machine-id ${machineId}`]],\n  ];\n}\n\nfunction legacyWmCommandPaths(homeDir: string): string[] {\n  return [\n    path.join(homeDir, \".local\", \"bin\", \"wm\"),\n    path.join(homeDir, \".local\", \"bin\", \"wm-daemon\"),\n    path.join(homeDir, \".npm-global\", \"bin\", \"wm\"),\n    path.join(homeDir, \".npm-global\", \"bin\", \"wm-daemon\"),\n  ];\n}\n\nfunction writeWmCommandWrappers(homeDir: string): void {\n  const binDir = path.join(homeDir, \".local\", \"bin\");\n  mkdirSync(binDir, { recursive: true });\n  writeExecutableFile(path.join(binDir, \"wm\"), buildWmNpxWrapper(\"wm\"));\n  writeExecutableFile(path.join(binDir, \"wm-daemon\"), buildWmNpxWrapper(\"\"));\n}\n\nfunction writeExecutableFile(filePath: string, content: string): void {\n  writeFileSync(filePath, content, { encoding: \"utf8\", mode: 0o755 });\n  chmodSync(filePath, 0o755);\n}\n\nfunction buildWmNpxWrapper(commandName: \"wm\" | \"\"): string {\n  const commandArg = commandName ? ` \"${commandName}\"` : \"\";\n  return [\n    \"#!/usr/bin/env sh\",\n    \"set -eu\",\n    ': \"${WM_DAEMON_PACKAGE:=@wagemule/daemon}\"',\n    ': \"${WM_DAEMON_TAG:=latest}\"',\n    'PACKAGE_SPEC=\"${WM_DAEMON_PACKAGE}@${WM_DAEMON_TAG}\"',\n    'case \"$WM_DAEMON_PACKAGE\" in',\n    '  *.tgz|file:*|/*|./*) PACKAGE_SPEC=\"$WM_DAEMON_PACKAGE\" ;;',\n    \"esac\",\n    `exec npx --registry=https://registry.npmjs.org/ --prefer-online -y \"$PACKAGE_SPEC\"${commandArg} \"$@\"`,\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction buildDaemonStartArgs(input: {\n  serverUrl: string;\n  apiKey: string;\n  spaceId?: string;\n  machineId?: string;\n  name?: string;\n  rootDir: string;\n  logDir: string;\n  npxBin: string;\n  executionBackendMode?: \"host\" | \"container\";\n  containerImage?: string;\n  containerMemory?: string;\n  containerCpus?: string;\n}): string[] {\n  const args = [\n    input.npxBin,\n    \"--registry=https://registry.npmjs.org/\",\n    \"--prefer-online\",\n    \"-y\",\n    \"@wagemule/daemon@latest\",\n    \"start\",\n    \"--service-mode\",\n    \"persistent\",\n    \"--server-url\",\n    input.serverUrl,\n    \"--api-key\",\n    input.apiKey,\n    \"--log-dir\",\n    input.logDir,\n    \"--root\",\n    input.rootDir,\n  ];\n  if (input.spaceId) args.push(\"--space-id\", input.spaceId);\n  if (input.machineId) args.push(\"--machine-id\", input.machineId);\n  if (input.name) args.push(\"--name\", input.name);\n  if (input.executionBackendMode && input.executionBackendMode !== \"host\") args.push(\"--execution-backend\", input.executionBackendMode);\n  if (input.containerImage) args.push(\"--container-image\", input.containerImage);\n  if (input.containerMemory) args.push(\"--container-memory\", input.containerMemory);\n  if (input.containerCpus) args.push(\"--container-cpus\", input.containerCpus);\n  return args;\n}\n\nfunction buildSystemdUserUnit(input: {\n  serverUrl: string;\n  apiKey: string;\n  spaceId?: string;\n  machineId?: string;\n  name?: string;\n  rootDir: string;\n  logDir: string;\n  npxBin: string;\n  pathEnv: string;\n}): string {\n  const args = buildDaemonStartArgs({ ...input, npxBin: input.npxBin });\n  return [\n    \"[Unit]\",\n    \"Description=NiuMa WM Daemon\",\n    \"After=network-online.target\",\n    \"Wants=network-online.target\",\n    \"\",\n    \"[Service]\",\n    \"Type=simple\",\n    `Environment=PATH=${systemdQuoteArg(input.pathEnv)}`,\n    `ExecStart=/usr/bin/env ${args.map(systemdQuoteArg).join(\" \")}`,\n    \"Restart=always\",\n    \"RestartSec=5\",\n    \"\",\n    \"[Install]\",\n    \"WantedBy=default.target\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction buildLaunchAgentPlist(input: {\n  label: string;\n  serverUrl: string;\n  apiKey: string;\n  spaceId?: string;\n  machineId?: string;\n  name?: string;\n  rootDir: string;\n  logDir: string;\n  homeDir: string;\n  npxBin: string;\n  pathEnv: string;\n}): string {\n  const programArguments = buildDaemonStartArgs({ ...input, npxBin: input.npxBin });\n  return [\n    `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`,\n    `<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">`,\n    `<plist version=\"1.0\">`,\n    `<dict>`,\n    `  <key>Label</key>`,\n    `  <string>${xmlEscape(input.label)}</string>`,\n    `  <key>ProgramArguments</key>`,\n    `  <array>`,\n    ...programArguments.map((arg) => `    <string>${xmlEscape(arg)}</string>`),\n    `  </array>`,\n    `  <key>EnvironmentVariables</key>`,\n    `  <dict>`,\n    `    <key>PATH</key>`,\n    `    <string>${xmlEscape(input.pathEnv)}</string>`,\n    `  </dict>`,\n    `  <key>WorkingDirectory</key>`,\n    `  <string>${xmlEscape(input.homeDir)}</string>`,\n    `  <key>RunAtLoad</key>`,\n    `  <true/>`,\n    `  <key>KeepAlive</key>`,\n    `  <true/>`,\n    `  <key>StandardOutPath</key>`,\n    `  <string>${xmlEscape(path.join(input.logDir, \"launchagent.out.log\"))}</string>`,\n    `  <key>StandardErrorPath</key>`,\n    `  <string>${xmlEscape(path.join(input.logDir, \"launchagent.err.log\"))}</string>`,\n    `</dict>`,\n    `</plist>`,\n    ``,\n  ].join(\"\\n\");\n}\n\nfunction servicePathForCommand(commandPath: string, homeDir?: string): string {\n  const commandDir = path.dirname(commandPath);\n  return Array.from(new Set([\n    commandDir,\n    ...(homeDir ? [\n      path.join(homeDir, \".local\", \"bin\"),\n      path.join(homeDir, \".npm-global\", \"bin\"),\n      path.join(homeDir, \".bun\", \"bin\"),\n    ] : []),\n    \"/opt/homebrew/bin\",\n    \"/usr/local/bin\",\n    \"/usr/bin\",\n    \"/bin\",\n    \"/usr/sbin\",\n    \"/sbin\",\n  ])).join(\":\");\n}\n\nfunction systemdQuoteArg(value: string): string {\n  if (/^[A-Za-z0-9_./:@$=-]+$/.test(value)) return value;\n  return `\"${value.replace(/[\"\\\\]/g, \"\\\\$&\")}\"`;\n}\n\nfunction windowsQuoteArg(value: string): string {\n  if (/^[A-Za-z0-9_./:@$=-]+$/.test(value)) return value;\n  return `\"${value.replace(/(\\\\*)\"/g, '$1$1\\\\\"').replace(/\\\\+$/g, \"$&$&\")}\"`;\n}\n\nfunction xmlEscape(value: string): string {\n  return value\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\")\n    .replace(/'/g, \"&apos;\");\n}\n\nasync function commandExists(bin: string): Promise<boolean> {\n  return Boolean(await resolveCommandPath(bin));\n}\n\nasync function resolveCommandPath(bin: string): Promise<string | undefined> {\n  const result = process.platform === \"win32\"\n    ? await runCommand(\"where\", [bin])\n    : await runCommand(\"sh\", [\"-lc\", `command -v ${shellQuote(bin)}`]);\n  if (result.code !== 0) return undefined;\n  return result.stdout.split(/\\r?\\n/).map((line) => line.trim()).find(Boolean);\n}\n\nfunction shellQuote(value: string): string {\n  return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction runCommand(command: string, args: string[]): Promise<{ code: number; stdout: string; stderr: string }> {\n  return new Promise((resolve) => {\n    execFile(command, args, (error, stdout, stderr) => {\n      const exitCode = typeof error?.code === \"number\" ? error.code : error ? 1 : 0;\n      resolve({\n        code: exitCode,\n        stdout: String(stdout ?? \"\"),\n        stderr: String(stderr ?? \"\"),\n      });\n    });\n  });\n}\n\nexport function daemonLogFilePath(logDir: string, daemonId: string): string {\n  return path.join(logDir, `${sanitizeLogFileName(daemonId)}.log`);\n}\n\nexport function daemonDefaultLogDir(rootDir: string): string {\n  return path.resolve(rootDir, \"logs\", \"daemon\");\n}\n\nexport function createDaemonFileLogger(baseIo: CliIo, input: { logDir: string; daemonId: string }): {\n  io: CliIo;\n  filePath: string;\n  close(): void;\n} {\n  const filePath = daemonLogFilePath(input.logDir, input.daemonId);\n  let stream: WriteStream | undefined;\n  let closed = false;\n  try {\n    mkdirSync(input.logDir, { recursive: true });\n    stream = createWriteStream(filePath, { flags: \"a\" });\n    stream.on(\"error\", (error) => {\n      if (!closed) {\n        baseIo.stderr(`${new Date().toISOString()} [wm-daemon] [log] file error=${error instanceof Error ? error.message : String(error)}`);\n      }\n      stream = undefined;\n    });\n    stream.write(`\\n${new Date().toISOString()} [wm-daemon] [log] opened pid=${process.pid}\\n`);\n  } catch (error) {\n    baseIo.stderr(`${new Date().toISOString()} [wm-daemon] [log] file disabled error=${error instanceof Error ? error.message : String(error)}`);\n  }\n  const write = (line: string) => {\n    if (closed || !stream || stream.destroyed || stream.writableEnded) return;\n    stream.write(`${line}\\n`);\n  };\n  return {\n    filePath,\n    io: {\n      stdout(line) {\n        baseIo.stdout(line);\n        write(line);\n      },\n      stderr(line) {\n        baseIo.stderr(line);\n        write(line);\n      },\n    },\n    close() {\n      if (closed) return;\n      closed = true;\n      const current = stream;\n      stream = undefined;\n      if (current && !current.destroyed && !current.writableEnded) {\n        current.end(`${new Date().toISOString()} [wm-daemon] [log] closed pid=${process.pid}\\n`);\n      }\n    },\n  };\n}\n\nfunction sanitizeLogFileName(value: string): string {\n  const cleaned = value\n    .trim()\n    .replace(/[^A-Za-z0-9._-]+/g, \"-\")\n    .replace(/-+/g, \"-\")\n    .replace(/^[.-]+|[.-]+$/g, \"\")\n    .slice(0, 120);\n  return cleaned || \"daemon\";\n}\n\nasync function runDaemon(input: {\n  serverUrl: string;\n  apiKey: string;\n  spaceId?: string;\n  machineId?: string;\n  name?: string;\n  rootDir: string;\n  serviceMode: \"temporary\" | \"persistent\" | \"unknown\";\n  executionBackendMode?: \"host\" | \"container\";\n  containerImage?: string;\n  containerMemory?: string;\n  containerCpus?: string;\n  io: CliIo;\n}): Promise<void> {\n  const log = (line: string) => input.io.stdout(`${new Date().toISOString()} [wm-daemon] ${line}`);\n  const containerEngineDetector = new ContainerEngineDetector();\n  const detectContainerEngine = async () => containerEngineDetector.detect().catch((error) => {\n    log(`container engine detection failed: ${error instanceof Error ? error.message : String(error)}`);\n    return null;\n  });\n  await ensureGlobalSkillsSeeded().catch((error) => {\n    log(`failed to seed global skills: ${error instanceof Error ? error.message : String(error)}`);\n  });\n  const executionBackend = hostBackend();\n  const sandboxExecutionBackend = buildExecutionBackend({\n    mode: \"container\",\n    image: input.containerImage,\n    memory: input.containerMemory,\n    cpus: input.containerCpus,\n  });\n  if (input.executionBackendMode === \"container\") {\n    log(\"execution-backend=container is deprecated; daemon stays on host and container is used per sandboxed employee\");\n  }\n  log(`daemon backend=${executionBackend.kind} sandbox backend=${sandboxExecutionBackend.kind}`);\n  const startedAt = Date.now();\n  let connection: ServerConnection;\n  const runtimeStatus = (): DaemonRuntimeStatus => ({\n    version: packageJson.version,\n    pid: process.pid,\n    serviceMode: input.serviceMode,\n    machineId: input.machineId,\n    updatedAt: new Date().toISOString(),\n    uptimeMs: Date.now() - startedAt,\n    socketConnected: connection?.connected ?? false,\n  });\n  const nativeSessionManager = new NativeSessionCollaborationManager({\n    rootDir: input.rootDir,\n    sendToServer: (message) => connection.send(message),\n    isServerConnected: () => Boolean(connection?.connected),\n    log,\n  });\n  await nativeSessionManager.initialize();\n  const localStatusServer = await startDaemonRuntimeStatusServer(input.rootDir, runtimeStatus, log, nativeSessionManager);\n  const manager = new AIEmployeeProcessManager({\n    rootDir: input.rootDir,\n    machineDisplayName: input.name?.trim() || os.hostname() || \"machine\",\n    sendToServer: (msg) => connection.send(msg),\n    containerEngineProvider: detectContainerEngine,\n    executionBackend,\n    sandboxExecutionBackend,\n    log,\n  });\n  const routines = new RoutineDispatcher({\n    rootDir: input.rootDir,\n    sendToServer: (msg) => connection.send(msg),\n    wakeAgentForRoutine: (routineInput) => manager.wakeRoutine(routineInput),\n    log,\n  });\n  const feishuPollers = new Map<string, FeishuPersonalAgentPollerLike>();\n  connection = new ServerConnection({\n    serverUrl: input.serverUrl,\n    apiKey: input.apiKey,\n    spaceId: input.spaceId,\n    machineId: input.machineId,\n    name: input.name,\n    daemonVersion: packageJson.version,\n    daemonServiceMode: input.serviceMode,\n    containerImage: containerImageFor(input.containerImage),\n    containerRuntimeStatusProvider: sandboxExecutionBackend instanceof ContainerBackend ? () => sandboxExecutionBackend.runtimeStatus() : undefined,\n    runningAIEmployeesProvider: () => manager.getRunningAIEmployeeIds(),\n    wakeableAIEmployeesProvider: () => manager.getWakeableAgents(),\n    processedDeliveryIdsProvider: () => manager.getProcessedDeliveryIds(),\n    containerEngineProvider: detectContainerEngine,\n    log,\n  });\n  connection.onMessage((message) => {\n    if (nativeSessionManager.handleServerMessage(message)) return;\n    if (message.type === \"routine:start\" || message.type === \"routine:update\") {\n      manager.prepareRoutineWorkspace(message.routine.ai_employee_id, message.routine, message.config)\n        .then(() => {\n          syncFeishuPersonalAgentPoller({\n            aiEmployeeId: message.routine.ai_employee_id,\n            config: message.config,\n            pollers: feishuPollers,\n            resolveWorkspaceDir: (aiEmployeeId) => manager.findEmployeeWorkspaceDir(aiEmployeeId),\n            resolveCommandContext: (aiEmployeeId) => manager.resolveEmployeeFeishuCommandContext(aiEmployeeId),\n            sendToServer: (msg) => connection.send(msg),\n            log,\n          });\n          routines.handle(message);\n        })\n        .catch((error) => {\n        const messageText = error instanceof Error ? error.stack ?? error.message : String(error);\n        input.io.stderr(`${new Date().toISOString()} [wm-daemon] [error] ${messageText}`);\n        connection.send({\n          type: \"routine:status\",\n          routineId: message.routine.id,\n          aiEmployeeId: message.routine.ai_employee_id,\n          status: \"error\",\n          detail: error instanceof Error ? error.message : String(error),\n        });\n      });\n      return;\n    }\n    if (message.type === \"ai_employee:start\") {\n      syncFeishuPersonalAgentPoller({\n        aiEmployeeId: message.aiEmployeeId,\n        config: message.config,\n        pollers: feishuPollers,\n        resolveWorkspaceDir: (aiEmployeeId) => manager.findEmployeeWorkspaceDir(aiEmployeeId),\n        resolveCommandContext: (aiEmployeeId) => manager.resolveEmployeeFeishuCommandContext(aiEmployeeId),\n        sendToServer: (msg) => connection.send(msg),\n        log,\n      });\n    }\n    if (message.type === \"ai_employee:stop\") {\n      const poller = feishuPollers.get(message.aiEmployeeId);\n      if (poller) {\n        poller.stop();\n        feishuPollers.delete(message.aiEmployeeId);\n        log(`feishu personal agent poller stopped ai_employee=${message.aiEmployeeId}`);\n      }\n    }\n    if (routines.handle(message)) return;\n    manager.handle(message).catch((error) => {\n      const messageText = error instanceof Error ? error.stack ?? error.message : String(error);\n      input.io.stderr(`${new Date().toISOString()} [wm-daemon] [error] ${messageText}`);\n    });\n  });\n  connection.connect();\n  log(`started server=${input.serverUrl} root=${input.rootDir}`);\n  const keepAlive = setInterval(() => {\n    const running = manager.getRunningAIEmployeeIds();\n    log(`heartbeat socket=${connection.connected ? \"open\" : \"closed\"} running_aiEmployees=${running.length ? running.join(\",\") : \"-\"}`);\n  }, 30_000);\n  await new Promise<void>((resolve) => {\n    process.once(\"SIGINT\", resolve);\n    process.once(\"SIGTERM\", resolve);\n  });\n  clearInterval(keepAlive);\n  log(\"stopping\");\n  for (const poller of feishuPollers.values()) poller.stop();\n  feishuPollers.clear();\n  routines.stopAll();\n  manager.dispose();\n  connection.disconnect();\n  await new Promise<void>((resolve) => {\n    if (!localStatusServer?.listening) {\n      resolve();\n      return;\n    }\n    localStatusServer.close(() => resolve());\n  });\n}\n\nfunction parseDaemonServiceMode(value?: string): \"temporary\" | \"persistent\" | \"unknown\" {\n  if (value === \"persistent\" || value === \"temporary\") return value;\n  if (value === \"unknown\") return \"unknown\";\n  return \"temporary\";\n}\n\nfunction parseExecutionBackendMode(value?: string): \"host\" | \"container\" {\n  if (value === \"container\") return \"container\";\n  return \"host\";\n}\n\nfunction buildExecutionBackend(input: {\n  mode: \"host\" | \"container\";\n  image?: string;\n  memory?: string;\n  cpus?: string;\n}): ExecutionBackend {\n  if (input.mode === \"container\") {\n    const image = containerImageFor(input.image);\n    return new ContainerBackend({\n      image,\n      runtimeImages: input.image ? undefined : runtimeContainerImages(),\n      memory: input.memory,\n      cpus: input.cpus,\n      credentialMounts: containerCredentialMounts(),\n      networkEnv: daemonContainerNetworkEnv(),\n    });\n  }\n  return hostBackend();\n}\n\nfunction daemonContainerNetworkEnv(env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\n  return containerNetworkEnv({\n    HTTP_PROXY: env.WM_DAEMON_CONTAINER_HTTP_PROXY ?? env.HTTP_PROXY,\n    HTTPS_PROXY: env.WM_DAEMON_CONTAINER_HTTPS_PROXY ?? env.HTTPS_PROXY,\n    ALL_PROXY: env.WM_DAEMON_CONTAINER_ALL_PROXY ?? env.ALL_PROXY,\n    http_proxy: env.WM_DAEMON_CONTAINER_HTTP_PROXY ?? env.http_proxy,\n    https_proxy: env.WM_DAEMON_CONTAINER_HTTPS_PROXY ?? env.https_proxy,\n    all_proxy: env.WM_DAEMON_CONTAINER_ALL_PROXY ?? env.all_proxy,\n    NO_PROXY: env.WM_DAEMON_CONTAINER_NO_PROXY ?? env.NO_PROXY,\n    no_proxy: env.WM_DAEMON_CONTAINER_NO_PROXY ?? env.no_proxy,\n  });\n}\n\nexport function containerCredentialMounts(homeDir = os.homedir(), codexHome = process.env.CODEX_HOME?.trim() || path.join(homeDir, \".codex\")): ContainerCredentialMount[] {\n  const mounts: ContainerCredentialMount[] = [];\n  const codexAuthPath = path.join(codexHome, \"auth.json\");\n  if (isReadableFile(codexAuthPath)) {\n    mounts.push({\n      hostPath: codexAuthPath,\n      containerPath: \"/workspace/.home/.codex/auth.json\",\n      readonly: false,\n    });\n  }\n  return mounts;\n}\n\nfunction isReadableFile(filePath: string): boolean {\n  try {\n    return statSync(filePath).isFile();\n  } catch {\n    return false;\n  }\n}\n\nexport function containerImageFor(value?: string): string {\n  return value?.trim() || \"algo-image-cn-shanghai.cr.volces.com/niuma/wm-daemon-runtime-base:latest\";\n}\n\nexport function runtimeContainerImages(): Partial<Record<RuntimeId, string>> {\n  const registryPrefix = \"algo-image-cn-shanghai.cr.volces.com/niuma\";\n  return Object.fromEntries(\n    supportedRuntimeIds.map((runtime) => [runtime, `${registryPrefix}/wm-daemon-runtime-${runtime}:latest`])\n  ) as Partial<Record<RuntimeId, string>>;\n}\n\nfunction parseRuntimeArgs(argv: string[]): RuntimeId[] {\n  const runtime = valueAfter(argv, \"--runtime\");\n  if (!runtime || runtime === \"all\") return supportedRuntimeIds;\n  if (!isSupportedRuntimeId(runtime)) {\n    throw new Error(`Unsupported runtime: ${runtime}`);\n  }\n  return [runtime];\n}\n\nasync function runNiumaCollabCommand(argv: string[], io: CliIo, runtimeOptions: CliRuntimeOptions): Promise<number> {\n  const [subcommand] = argv;\n  const rootDir = valueAfter(argv, \"--root\")\n    ?? process.env.NIUMA_DAEMON_ROOT\n    ?? path.join(runtimeOptions.homeDir ?? os.homedir(), \".wm\");\n  try {\n    let result: unknown;\n    if (subcommand === \"bootstrap\") {\n      result = await bootstrapNativeSessionCollaboration({\n        homeDir: runtimeOptions.homeDir ?? os.homedir(),\n        serverUrl: requiredString(valueAfter(argv, \"--server-url\"), \"--server-url\"),\n        webUrl: requiredString(valueAfter(argv, \"--web-url\"), \"--web-url\"),\n        timeoutSeconds: boundedInteger(numberAfter(argv, \"--timeout\") ?? 600, 1, 600, \"--timeout\"),\n        io,\n      });\n    } else if (subcommand === \"install\" || subcommand === \"install-hook\") {\n      result = installNativeSessionCollaborationHook(runtimeOptions.homeDir ?? os.homedir());\n    } else if (subcommand === \"doctor\") {\n      result = await nativeSessionCollaborationDoctor(runtimeOptions.homeDir ?? os.homedir());\n    } else if (subcommand === \"sessions\") {\n      result = await requestNativeSessionLocal(rootDir, \"sessions\", {\n        runtime: requiredNativeRuntime(valueAfter(argv, \"--runtime\")),\n        projectPath: requiredString(valueAfter(argv, \"--project-path\"), \"--project-path\"),\n        limit: numberAfter(argv, \"--limit\") ?? 10,\n      });\n    } else if (subcommand === \"current\") {\n      result = await resolveCurrentNativeSession({\n        runtime: requiredNativeRuntime(valueAfter(argv, \"--runtime\")),\n        homeDir: runtimeOptions.homeDir ?? os.homedir(),\n        env: process.env,\n      });\n    } else if (subcommand === \"start\") {\n      const clientRequestId = requiredString(valueAfter(argv, \"--request-id\"), \"--request-id\");\n      const selfRuntime = requiredNativeRuntime(valueAfter(argv, \"--self-runtime\"));\n      const peerRuntime = requiredNativeRuntime(valueAfter(argv, \"--peer-runtime\"));\n      const selfEndpoint = await resolveCurrentNativeSession({\n        runtime: selfRuntime,\n        homeDir: runtimeOptions.homeDir ?? os.homedir(),\n        env: process.env,\n      });\n      const requestedSelfSessionId = valueAfter(argv, \"--self-session\");\n      if (requestedSelfSessionId && requestedSelfSessionId !== selfEndpoint.sessionId) {\n        throw new Error(\"--self-session does not match the current native session\");\n      }\n      const requestedProjectPath = valueAfter(argv, \"--project-path\");\n      if (requestedProjectPath && await realpath(requestedProjectPath) !== selfEndpoint.projectScopePath) {\n        throw new Error(\"--project-path does not match the current native session launch path\");\n      }\n      const projectPath = selfEndpoint.projectScopePath;\n      const peerSessionId = requiredString(valueAfter(argv, \"--peer-session\"), \"--peer-session\");\n      if (!argv.includes(\"--confirm-peer-history\")) throw new Error(\"--confirm-peer-history is required because the peer session history will be permanently updated\");\n      const candidates = await requestNativeSessionLocal(rootDir, \"sessions\", { runtime: peerRuntime, projectPath, limit: 10 });\n      const peerEndpoint = Array.isArray(candidates)\n        ? candidates.find((candidate) => candidate && typeof candidate === \"object\" && (candidate as { sessionId?: unknown }).sessionId === peerSessionId)\n        : undefined;\n      if (!peerEndpoint) throw new Error(\"selected peer session is not an eligible candidate for this project path\");\n      const completionModeValue = valueAfter(argv, \"--completion-mode\");\n      if (completionModeValue && completionModeValue !== \"fixed_rounds\" && completionModeValue !== \"consensus\") {\n        throw new Error(\"--completion-mode must be fixed_rounds or consensus\");\n      }\n      const completionMode = completionModeValue === \"consensus\" ? \"consensus\" : \"fixed_rounds\";\n      const maxRounds = completionMode === \"consensus\"\n        ? 30\n        : boundedInteger(numberAfter(argv, \"--max-rounds\") ?? 3, 1, 30, \"--max-rounds\");\n      const command = {\n        kind: \"start\" as const,\n        clientRequestId,\n        selfRuntime,\n        selfSessionId: selfEndpoint.sessionId,\n        peerRuntime,\n        peerSessionId,\n        projectLabel: path.basename(projectPath),\n        goal: requiredString(valueAfter(argv, \"--goal\"), \"--goal\"),\n        maxRounds,\n        completionMode,\n        continueThreadRootMessageId: valueAfter(argv, \"--continue-thread\"),\n      };\n      persistNativeSessionClientRequest(rootDir, command);\n      result = await requestNativeSessionLocal(rootDir, \"start\", {\n        command,\n        selfProjectPath: projectPath,\n        peerEndpoint,\n        confirmedPeerHistoryMutation: true,\n      });\n    } else if (subcommand === \"send\") {\n      const command = {\n        kind: \"send\" as const,\n        clientRequestId: requiredString(valueAfter(argv, \"--request-id\"), \"--request-id\"),\n        collaborationId: requiredString(valueAfter(argv, \"--collaboration\"), \"--collaboration\"),\n        text: requiredString(valueAfter(argv, \"--text\"), \"--text\"),\n        completionSignal: nativeSessionCompletionSignal(valueAfter(argv, \"--completion-signal\")),\n        proposalTurnId: valueAfter(argv, \"--proposal-turn\"),\n      };\n      persistNativeSessionClientRequest(rootDir, command);\n      result = await requestNativeSessionLocal(rootDir, \"send\", command);\n    } else if (subcommand === \"wait\") {\n      const collaborationId = requiredString(valueAfter(argv, \"--collaboration\"), \"--collaboration\");\n      const explicitCursor = numberAfter(argv, \"--after-seq\");\n      const afterSeq = explicitCursor === undefined\n        ? readNativeSessionCursor(rootDir, collaborationId)\n        : boundedInteger(explicitCursor, 0, Number.MAX_SAFE_INTEGER, \"--after-seq\");\n      result = await requestNativeSessionLocal(rootDir, \"wait\", {\n        kind: \"wait\",\n        collaborationId,\n        afterSeq,\n        limit: numberAfter(argv, \"--limit\") ?? 100,\n        timeoutMs: (numberAfter(argv, \"--timeout\") ?? 90) * 1_000,\n      });\n      const nextCursor = result && typeof result === \"object\" && !Array.isArray(result)\n        ? Number((result as Record<string, unknown>).nextCursor)\n        : Number.NaN;\n      if (Number.isInteger(nextCursor) && nextCursor >= 0) persistNativeSessionCursor(rootDir, collaborationId, nextCursor);\n    } else if (subcommand === \"finish\") {\n      const summaryFile = requiredString(valueAfter(argv, \"--summary-file\"), \"--summary-file\");\n      const outcomeValue = valueAfter(argv, \"--outcome\") ?? \"completed\";\n      if (outcomeValue !== \"completed\" && outcomeValue !== \"limit_reached\" && outcomeValue !== \"stopped\") {\n        throw new Error(\"--outcome must be completed, limit_reached, or stopped\");\n      }\n      const command = {\n        kind: \"finish\" as const,\n        clientRequestId: requiredString(valueAfter(argv, \"--request-id\"), \"--request-id\"),\n        collaborationId: requiredString(valueAfter(argv, \"--collaboration\"), \"--collaboration\"),\n        outcome: outcomeValue,\n        summary: readFileSync(summaryFile, \"utf8\"),\n      };\n      persistNativeSessionClientRequest(rootDir, command);\n      result = await requestNativeSessionLocal(rootDir, \"finish\", command);\n    } else if (subcommand === \"status\") {\n      result = await requestNativeSessionLocal(rootDir, \"status\", {\n        kind: \"status\",\n        collaborationId: requiredString(valueAfter(argv, \"--collaboration\"), \"--collaboration\"),\n      });\n    } else if (subcommand === \"confirm-session-change\") {\n      if (!argv.includes(\"--confirm-session-change\")) throw new Error(\"--confirm-session-change is required\");\n      const command = {\n        kind: \"retry\" as const,\n        clientRequestId: requiredString(valueAfter(argv, \"--request-id\"), \"--request-id\"),\n        collaborationId: requiredString(valueAfter(argv, \"--collaboration\"), \"--collaboration\"),\n        turnId: requiredString(valueAfter(argv, \"--turn\"), \"--turn\"),\n      };\n      persistNativeSessionClientRequest(rootDir, command);\n      result = await requestNativeSessionLocal(rootDir, \"confirm-session-change\", {\n        runtime: requiredNativeRuntime(valueAfter(argv, \"--runtime\")),\n        sessionId: requiredString(valueAfter(argv, \"--session\"), \"--session\"),\n        confirmed: true,\n        command,\n      });\n    } else {\n      io.stdout(\"niuma-collab bootstrap|install-hook|doctor|sessions|current|start|send|wait|finish|status|confirm-session-change\");\n      return subcommand ? 1 : 0;\n    }\n    io.stdout(JSON.stringify(result, null, 2));\n    return 0;\n  } catch (error) {\n    io.stderr(error instanceof Error ? error.message : String(error));\n    return 1;\n  }\n}\n\nfunction installNativeSessionCollaborationHook(homeDir: string): Record<string, unknown> {\n  const assetDir = path.resolve(__dirname, \"../assets/niuma-collab\");\n  const hookText = readFileSync(path.join(assetDir, \"claude-session-hook.cjs\"), \"utf8\");\n  const hookPath = path.join(homeDir, \".wm\", \"native-session\", \"hooks\", \"claude-session-hook.cjs\");\n  mkdirSync(path.dirname(hookPath), { recursive: true, mode: 0o700 });\n  writeFileSync(hookPath, hookText, { mode: 0o700 });\n  chmodSync(hookPath, 0o700);\n  const settingsPath = path.join(homeDir, \".claude\", \"settings.json\");\n  let settings: Record<string, unknown> = {};\n  try {\n    settings = JSON.parse(readFileSync(settingsPath, \"utf8\"));\n  } catch (error) {\n    if (statPathExists(settingsPath)) throw new Error(`Claude settings are invalid JSON: ${error instanceof Error ? error.message : String(error)}`);\n  }\n  const hooks = settings.hooks && typeof settings.hooks === \"object\" && !Array.isArray(settings.hooks)\n    ? settings.hooks as Record<string, unknown>\n    : {};\n  const command = `node ${JSON.stringify(hookPath)}`;\n  for (const event of [\"SessionStart\", \"SessionEnd\"]) {\n    const existing = Array.isArray(hooks[event]) ? hooks[event] as unknown[] : [];\n    const alreadyInstalled = existing.some((entry) => JSON.stringify(entry).includes(hookPath));\n    hooks[event] = alreadyInstalled ? existing : [...existing, { hooks: [{ type: \"command\", command }] }];\n  }\n  settings.hooks = hooks;\n  mkdirSync(path.dirname(settingsPath), { recursive: true, mode: 0o700 });\n  const settingsTemporary = `${settingsPath}.${process.pid}.${randomBytes(6).toString(\"hex\")}.tmp`;\n  writeFileSync(settingsTemporary, `${JSON.stringify(settings, null, 2)}\\n`, { mode: 0o600 });\n  chmodSync(settingsTemporary, 0o600);\n  renameSync(settingsTemporary, settingsPath);\n  chmodSync(settingsPath, 0o600);\n  return { installed: true, hookPath, settingsPath, restartRequired: true };\n}\n\nasync function nativeSessionCollaborationDoctor(homeDir: string): Promise<Record<string, unknown>> {\n  const rootDir = path.join(homeDir, \".wm\");\n  const daemon = await queryDaemonRuntimeStatus(rootDir);\n  const hookPath = path.join(rootDir, \"native-session\", \"hooks\", \"claude-session-hook.cjs\");\n  const settingsPath = path.join(homeDir, \".claude\", \"settings.json\");\n  const hookInstalled = statPathExists(hookPath) && claudeSettingsReferenceHook(settingsPath, hookPath);\n  const daemonRunning = Boolean(daemon && isProcessAlive(daemon.pid));\n  const daemonConnected = daemonRunning && daemon?.socketConnected === true;\n  const status = !daemonRunning\n    ? \"daemon_not_running\"\n    : !daemonConnected\n      ? \"daemon_offline\"\n      : !hookInstalled\n        ? \"claude_hook_missing\"\n        : \"ready\";\n  return {\n    status,\n    daemon: daemon ? {\n      version: daemon.version,\n      pid: daemon.pid,\n      machine_id: daemon.machineId,\n      socket_connected: daemon.socketConnected === true,\n    } : null,\n    claude_hook: { installed: hookInstalled, path: hookPath },\n    remediation: status === \"ready\"\n      ? undefined\n      : \"Run the NiuMa collaboration bootstrap from the installed plugin. It will not accept or print credentials.\",\n  };\n}\n\nasync function bootstrapNativeSessionCollaboration(input: {\n  homeDir: string;\n  serverUrl: string;\n  webUrl: string;\n  timeoutSeconds: number;\n  io: CliIo;\n}): Promise<Record<string, unknown>> {\n  const existing = await nativeSessionCollaborationDoctor(input.homeDir);\n  if (existing.status === \"ready\") return { ...existing, bootstrapped: false };\n  if (existing.status === \"claude_hook_missing\") {\n    const hook = installNativeSessionCollaborationHook(input.homeDir);\n    return { ...(await nativeSessionCollaborationDoctor(input.homeDir)), bootstrapped: false, hook };\n  }\n\n  const created = await fetchJson<{ request_id: string; secret: string; approval_code: string; expires_at: number }>(\n    `${input.serverUrl.replace(/\\/$/, \"\")}/api/native-session-setup/requests`,\n    { method: \"POST\" }\n  );\n  const verificationUrl = `${input.webUrl.replace(/\\/$/, \"\")}/native-session-setup/${encodeURIComponent(created.request_id)}`;\n  openBrowser(verificationUrl);\n  input.io.stderr(`NiuMa authorization required. Open ${verificationUrl} and enter code ${created.approval_code}.`);\n  const deadline = Date.now() + input.timeoutSeconds * 1_000;\n  while (Date.now() < deadline) {\n    await new Promise((resolve) => setTimeout(resolve, 2_000));\n    const polled = await fetchJson<{\n      status: \"pending\" | \"approved\" | \"expired\";\n      server_url?: string;\n      api_key?: string;\n      machine_id?: string;\n    }>(`${input.serverUrl.replace(/\\/$/, \"\")}/api/native-session-setup/requests/${encodeURIComponent(created.request_id)}?secret=${encodeURIComponent(created.secret)}`);\n    if (polled.status === \"pending\") continue;\n    if (polled.status === \"expired\") throw new Error(\"NiuMa authorization expired before approval\");\n    if (!polled.server_url || !polled.api_key || !polled.machine_id) throw new Error(\"NiuMa authorization result is incomplete\");\n    const installed = await installDaemonUserService({\n      serverUrl: polled.server_url,\n      apiKey: polled.api_key,\n      machineId: polled.machine_id,\n      homeDir: input.homeDir,\n      io: input.io,\n    });\n    if (!installed.ok) throw new Error(\"NiuMa daemon service installation failed\");\n    const hook = installNativeSessionCollaborationHook(input.homeDir);\n    return { status: \"service_starting\", bootstrapped: true, hook };\n  }\n  throw new Error(\"NiuMa authorization timed out\");\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n  const response = await fetch(url, init);\n  const payload = await response.json() as { ok?: boolean; error?: string } & T;\n  if (!response.ok || payload.ok !== true) throw new Error(payload.error ?? `NiuMa request failed: ${response.status}`);\n  return payload;\n}\n\nfunction openBrowser(url: string): void {\n  const command = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n  const args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n  execFile(command, args, () => undefined);\n}\n\nfunction claudeSettingsReferenceHook(settingsPath: string, hookPath: string): boolean {\n  if (!statPathExists(settingsPath)) return false;\n  try {\n    const settings = JSON.parse(readFileSync(settingsPath, \"utf8\")) as { hooks?: Record<string, unknown> };\n    return JSON.stringify(settings.hooks ?? {}).includes(hookPath);\n  } catch {\n    return false;\n  }\n}\n\nasync function requestNativeSessionLocal(rootDir: string, route: string, body: Record<string, unknown>): Promise<unknown> {\n  const socketPath = daemonRuntimeStatusSocketPath(rootDir);\n  const payload = JSON.stringify(body);\n  let windowsControl: { host: string; port: number; token: string } | undefined;\n  if (process.platform === \"win32\") {\n    const parsed = JSON.parse(readFileSync(path.join(rootDir, \"wm-daemon-control.json\"), \"utf8\")) as Partial<{ host: string; port: number; token: string }>;\n    if (parsed.host !== \"127.0.0.1\" || !Number.isInteger(parsed.port) || typeof parsed.token !== \"string\" || !parsed.token) {\n      throw new Error(\"invalid daemon loopback control state\");\n    }\n    windowsControl = parsed as { host: string; port: number; token: string };\n  }\n  return new Promise((resolve, reject) => {\n    const request = httpRequest({\n      ...(windowsControl ? { hostname: windowsControl.host, port: windowsControl.port } : { socketPath }),\n      path: `/v1/native-session-collaborations/${route}`,\n      method: \"POST\",\n      timeout: 95_000,\n      headers: {\n        \"content-type\": \"application/json\",\n        \"content-length\": Buffer.byteLength(payload),\n        ...(windowsControl ? { authorization: `Bearer ${windowsControl.token}` } : {}),\n      },\n    }, (response) => {\n      let responseBody = \"\";\n      response.setEncoding(\"utf8\");\n      response.on(\"data\", (chunk) => { responseBody += chunk; });\n      response.on(\"end\", () => {\n        try {\n          const parsed = JSON.parse(responseBody) as { ok?: boolean; result?: unknown; error?: string; error_code?: string };\n          if (!parsed.ok) reject(Object.assign(new Error(parsed.error ?? \"local collaboration request failed\"), { code: parsed.error_code }));\n          else resolve(parsed.result);\n        } catch (error) {\n          reject(error);\n        }\n      });\n    });\n    request.on(\"timeout\", () => request.destroy(new Error(\"local collaboration request timed out\")));\n    request.on(\"error\", reject);\n    request.end(payload);\n  });\n}\n\nfunction persistNativeSessionClientRequest(rootDir: string, command: { clientRequestId: string }): void {\n  assertSafeOpaqueId(command.clientRequestId, \"client request id\");\n  const dir = ensureNativeSessionStateDirectory(rootDir, \"client-requests\");\n  const file = path.join(dir, `${command.clientRequestId}.json`);\n  const payload = JSON.stringify(command, null, 2);\n  if (statPathExists(file)) {\n    const fileStat = lstatSync(file);\n    if (fileStat.isSymbolicLink() || !fileStat.isFile()) throw new Error(\"client request state must be a regular non-symlink file\");\n    if (typeof process.getuid === \"function\" && fileStat.uid !== process.getuid()) throw new Error(\"client request state owner mismatch\");\n    if (readFileSync(file, \"utf8\") !== payload) throw new Error(\"client request id was already persisted with another payload\");\n    return;\n  }\n  const temporary = `${file}.${process.pid}.${randomBytes(6).toString(\"hex\")}.tmp`;\n  writeFileSync(temporary, payload, { mode: 0o600 });\n  chmodSync(temporary, 0o600);\n  renameSync(temporary, file);\n  chmodSync(file, 0o600);\n}\n\nfunction readNativeSessionCursor(rootDir: string, collaborationId: string): number {\n  assertSafeOpaqueId(collaborationId, \"collaboration id\");\n  const dir = ensureNativeSessionStateDirectory(rootDir, \"cursors\");\n  const file = path.join(dir, `${collaborationId}.json`);\n  if (!statPathExists(file)) return 0;\n  const fileStat = lstatSync(file);\n  if (fileStat.isSymbolicLink() || !fileStat.isFile()) throw new Error(\"collaboration cursor state must be a regular non-symlink file\");\n  if (typeof process.getuid === \"function\" && fileStat.uid !== process.getuid()) throw new Error(\"collaboration cursor state owner mismatch\");\n  const parsed = JSON.parse(readFileSync(file, \"utf8\")) as { nextCursor?: unknown };\n  return boundedInteger(Number(parsed.nextCursor), 0, Number.MAX_SAFE_INTEGER, \"stored collaboration cursor\");\n}\n\nfunction persistNativeSessionCursor(rootDir: string, collaborationId: string, nextCursor: number): void {\n  assertSafeOpaqueId(collaborationId, \"collaboration id\");\n  const cursor = boundedInteger(nextCursor, 0, Number.MAX_SAFE_INTEGER, \"next collaboration cursor\");\n  const dir = ensureNativeSessionStateDirectory(rootDir, \"cursors\");\n  const file = path.join(dir, `${collaborationId}.json`);\n  let previous = 0;\n  if (statPathExists(file)) previous = readNativeSessionCursor(rootDir, collaborationId);\n  const payload = `${JSON.stringify({ nextCursor: Math.max(previous, cursor) }, null, 2)}\\n`;\n  const temporary = `${file}.${process.pid}.${randomBytes(6).toString(\"hex\")}.tmp`;\n  writeFileSync(temporary, payload, { mode: 0o600 });\n  chmodSync(temporary, 0o600);\n  renameSync(temporary, file);\n  chmodSync(file, 0o600);\n}\n\nfunction ensureNativeSessionStateDirectory(rootDir: string, leaf: string): string {\n  const absoluteRoot = path.resolve(rootDir);\n  assertOwnerDirectory(absoluteRoot, \"daemon root\");\n  const stateDir = path.join(absoluteRoot, \"native-session\");\n  ensureOwnerDirectory(stateDir, \"native session state directory\");\n  const leafDir = path.join(stateDir, leaf);\n  ensureOwnerDirectory(leafDir, `${leaf} state directory`);\n  return leafDir;\n}\n\nfunction ensureOwnerDirectory(directory: string, label: string): void {\n  if (!statPathExists(directory)) mkdirSync(directory, { mode: 0o700 });\n  assertOwnerDirectory(directory, label);\n  chmodSync(directory, 0o700);\n}\n\nfunction assertOwnerDirectory(directory: string, label: string): void {\n  const info = lstatSync(directory);\n  if (info.isSymbolicLink() || !info.isDirectory()) throw new Error(`${label} must be a real directory`);\n  if (typeof process.getuid === \"function\" && info.uid !== process.getuid()) throw new Error(`${label} owner mismatch`);\n}\n\nfunction assertSafeOpaqueId(value: string, label: string): void {\n  if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(value)) throw new Error(`${label} must be a filesystem-safe opaque id`);\n}\n\nfunction statPathExists(file: string): boolean {\n  try {\n    statSync(file);\n    return true;\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n    throw error;\n  }\n}\n\nfunction nativeSessionCompletionSignal(value: unknown): \"continue\" | \"propose_consensus\" | \"confirm_consensus\" {\n  if (value === undefined || value === \"continue\") return \"continue\";\n  if (value === \"propose_consensus\" || value === \"confirm_consensus\") return value;\n  throw new Error(\"--completion-signal must be continue, propose_consensus, or confirm_consensus\");\n}\n\nfunction boundedInteger(value: number, minimum: number, maximum: number, label: string): number {\n  if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n    throw new Error(`${label} must be an integer between ${minimum} and ${maximum}`);\n  }\n  return value;\n}\n\nfunction parseSmokeArgs(argv: string[]): {\n  runtimes: RuntimeId[];\n  rootDir?: string;\n  timeoutMs?: number;\n  keepArtifacts?: boolean;\n} {\n  return {\n    runtimes: parseRuntimeArgs(argv),\n    rootDir: valueAfter(argv, \"--root\"),\n    timeoutMs: numberAfter(argv, \"--timeout-ms\"),\n    keepArtifacts: argv.includes(\"--keep-artifacts\"),\n  };\n}\n\nfunction valueAfter(argv: string[], name: string): string | undefined {\n  const index = argv.indexOf(name);\n  if (index === -1) return undefined;\n  return argv[index + 1];\n}\n\nfunction numberAfter(argv: string[], name: string): number | undefined {\n  const value = valueAfter(argv, name);\n  if (!value) return undefined;\n  const parsed = Number(value);\n  if (!Number.isFinite(parsed)) throw new Error(`Invalid number for ${name}: ${value}`);\n  return parsed;\n}\n\nif (require.main === module) {\n  const cliName = path.basename(process.argv[1] ?? \"\");\n  const args = cliName === \"wm\" || cliName === \"wm.cmd\"\n    ? [\"wm\", ...process.argv.slice(2)]\n    : cliName === \"niuma-collab\" || cliName === \"niuma-collab.cmd\"\n      ? [\"niuma-collab\", ...process.argv.slice(2)]\n    : process.argv.slice(2);\n  runCli(args).then((code) => {\n    process.exitCode = code;\n  });\n}\n", "import { spawn } from \"node:child_process\";\n\nexport interface CommandSpec {\n  command: string;\n  args: string[];\n  cwd?: string;\n  env?: NodeJS.ProcessEnv;\n  timeoutMs?: number;\n  onStdoutChunk?: (chunk: string) => void;\n  onStderrChunk?: (chunk: string) => void;\n}\n\nexport interface CommandResult {\n  exitCode: number | null;\n  signal: NodeJS.Signals | null;\n  stdout: string;\n  stderr: string;\n  timedOut: boolean;\n}\n\nexport type CommandRunner = (spec: CommandSpec) => Promise<CommandResult>;\n\nexport const runCommand: CommandRunner = (spec) => {\n  return new Promise((resolve, reject) => {\n    const child = spawn(spec.command, spec.args, {\n      cwd: spec.cwd,\n      env: spec.env ?? process.env,\n      stdio: [\"ignore\", \"pipe\", \"pipe\"],\n    });\n\n    let stdout = \"\";\n    let stderr = \"\";\n    let timedOut = false;\n    let settled = false;\n    let timer: NodeJS.Timeout | undefined;\n\n    if (spec.timeoutMs && spec.timeoutMs > 0) {\n      timer = setTimeout(() => {\n        timedOut = true;\n        child.kill(\"SIGTERM\");\n        setTimeout(() => child.kill(\"SIGKILL\"), 1000).unref();\n      }, spec.timeoutMs);\n      timer.unref();\n    }\n\n    child.stdout.on(\"data\", (chunk) => {\n      const text = chunk.toString();\n      stdout += text;\n      spec.onStdoutChunk?.(text);\n    });\n    child.stderr.on(\"data\", (chunk) => {\n      const text = chunk.toString();\n      stderr += text;\n      spec.onStderrChunk?.(text);\n    });\n    child.on(\"error\", (error) => {\n      if (timer) clearTimeout(timer);\n      if (settled) return;\n      settled = true;\n      reject(error);\n    });\n    child.on(\"close\", (exitCode, signal) => {\n      if (timer) clearTimeout(timer);\n      if (settled) return;\n      settled = true;\n      resolve({\n        exitCode,\n        signal,\n        stdout,\n        stderr,\n        timedOut,\n      });\n    });\n  });\n};\n", "export type RuntimeId = \"codex\" | \"claude\" | \"kimi\" | \"antigravity\" | \"cursor\" | \"hermes\" | \"opencode\";\n\nexport type RuntimeAdapterKind =\n  | \"app_server_session\"\n  | \"acp_session\"\n  | \"cli_print_session\"\n  | \"cli_stream_session\"\n  | \"kimi_wire\"\n  | \"wire_session\"\n  | \"sdk_session\";\n\nexport type RuntimeTransport =\n  | \"json_rpc_stdio\"\n  | \"cli_print_stdio\"\n  | \"stream_json_stdio\"\n  | \"wire_stdio\"\n  | \"sdk\";\n\nexport type RuntimeLifecycle = \"persistent\";\n\nexport type RuntimeSessionConcurrencyStrategy =\n  | \"shared_host_multiplex\"\n  | \"process_per_session\"\n  | \"process_per_turn_resume\";\n\nexport type RuntimePromptInjection =\n  | \"developer_instructions\"\n  | \"system_prompt_file\"\n  | \"startup_message\";\n\nexport type RuntimeSessionRecovery =\n  | \"native_resume\"\n  | \"daemon_handoff_only\"\n  | \"none\";\n\nexport type RuntimeEventStream = \"structured\" | \"text_stream\" | \"final_only\";\n\nexport interface RuntimeCapability {\n  runtime: RuntimeId;\n  adapterKind: RuntimeAdapterKind;\n  transport: RuntimeTransport;\n  lifecycle: RuntimeLifecycle;\n  promptInjection: RuntimePromptInjection;\n  sessionRecovery: RuntimeSessionRecovery;\n  eventStream: RuntimeEventStream;\n  sessionConcurrencyStrategy: RuntimeSessionConcurrencyStrategy;\n  maxConcurrentScopesDefault: number;\n  sharesHostAcrossScopes: boolean;\n  sessionRoutingKey: \"turnId\" | \"sessionId\" | \"process\" | \"conversationId\";\n  supportsSteering: boolean;\n  supportsInterrupt: boolean;\n  supportsPermissionEvents: boolean;\n  supportsWorkingDirectory: boolean;\n  notes: string;\n}\n\nexport const supportedRuntimeIds: RuntimeId[] = [\n  \"cursor\",\n  \"claude\",\n  \"codex\",\n  \"antigravity\",\n  \"kimi\",\n  \"hermes\",\n  \"opencode\",\n];\n\nconst capabilities: Record<RuntimeId, RuntimeCapability> = {\n  codex: {\n    runtime: \"codex\",\n    adapterKind: \"app_server_session\",\n    transport: \"json_rpc_stdio\",\n    lifecycle: \"persistent\",\n    promptInjection: \"developer_instructions\",\n    sessionRecovery: \"native_resume\",\n    eventStream: \"structured\",\n    sessionConcurrencyStrategy: \"shared_host_multiplex\",\n    maxConcurrentScopesDefault: 5,\n    sharesHostAcrossScopes: true,\n    sessionRoutingKey: \"turnId\",\n    supportsSteering: true,\n    supportsInterrupt: true,\n    supportsPermissionEvents: false,\n    supportsWorkingDirectory: true,\n    notes:\n      \"Uses one shared `codex app-server --listen stdio://` per employee/runtime key and routes concurrent scoped sessions by thread/turn id. Codex approvals are not bridged to platform Inbox.\",\n  },\n  claude: {\n    runtime: \"claude\",\n    adapterKind: \"cli_stream_session\",\n    transport: \"stream_json_stdio\",\n    lifecycle: \"persistent\",\n    promptInjection: \"system_prompt_file\",\n    sessionRecovery: \"native_resume\",\n    eventStream: \"structured\",\n    sessionConcurrencyStrategy: \"process_per_session\",\n    maxConcurrentScopesDefault: 5,\n    sharesHostAcrossScopes: false,\n    sessionRoutingKey: \"process\",\n    supportsSteering: true,\n    supportsInterrupt: true,\n    supportsPermissionEvents: false,\n    supportsWorkingDirectory: true,\n    notes:\n      \"Uses Claude Code stream-json stdin/stdout with one process per scoped session; Claude session resume is native but one process is not shared across scopes.\",\n  },\n  kimi: {\n    runtime: \"kimi\",\n    adapterKind: \"kimi_wire\",\n    transport: \"json_rpc_stdio\",\n    lifecycle: \"persistent\",\n    promptInjection: \"startup_message\",\n    sessionRecovery: \"native_resume\",\n    eventStream: \"structured\",\n    sessionConcurrencyStrategy: \"process_per_session\",\n    maxConcurrentScopesDefault: 5,\n    sharesHostAcrossScopes: false,\n    sessionRoutingKey: \"process\",\n    supportsSteering: true,\n    supportsInterrupt: true,\n    supportsPermissionEvents: true,\n    supportsWorkingDirectory: true,\n    notes:\n      \"Uses `kimi --wire` as the default stable path. ACP remains experimental until local auth/protocol smoke passes.\",\n  },\n  antigravity: {\n    runtime: \"antigravity\",\n    adapterKind: \"cli_print_session\",\n    transport: \"cli_print_stdio\",\n    lifecycle: \"persistent\",\n    promptInjection: \"startup_message\",\n    sessionRecovery: \"daemon_handoff_only\",\n    eventStream: \"final_only\",\n    sessionConcurrencyStrategy: \"process_per_turn_resume\",\n    maxConcurrentScopesDefault: 5,\n    sharesHostAcrossScopes: false,\n    sessionRoutingKey: \"conversationId\",\n    supportsSteering: true,\n    supportsInterrupt: true,\n    supportsPermissionEvents: false,\n    supportsWorkingDirectory: true,\n    notes:\n      \"Uses `agy --print` per turn with a scope-specific conversation id; concurrent scopes spawn independent print turns.\",\n  },\n  cursor: {\n    runtime: \"cursor\",\n    adapterKind: \"acp_session\",\n    transport: \"json_rpc_stdio\",\n    lifecycle: \"persistent\",\n    promptInjection: \"startup_message\",\n    sessionRecovery: \"native_resume\",\n    eventStream: \"structured\",\n    sessionConcurrencyStrategy: \"shared_host_multiplex\",\n    maxConcurrentScopesDefault: 5,\n    sharesHostAcrossScopes: true,\n    sessionRoutingKey: \"sessionId\",\n    supportsSteering: true,\n    supportsInterrupt: true,\n    supportsPermissionEvents: true,\n    supportsWorkingDirectory: true,\n    notes:\n      \"Uses `cursor-agent acp`. Bridges ACP `session/request_permission` to platform Inbox.\",\n  },\n  hermes: {\n    runtime: \"hermes\",\n    adapterKind: \"acp_session\",\n    transport: \"json_rpc_stdio\",\n    lifecycle: \"persistent\",\n    promptInjection: \"startup_message\",\n    sessionRecovery: \"native_resume\",\n    eventStream: \"structured\",\n    sessionConcurrencyStrategy: \"shared_host_multiplex\",\n    maxConcurrentScopesDefault: 5,\n    sharesHostAcrossScopes: true,\n    sessionRoutingKey: \"sessionId\",\n    supportsSteering: true,\n    supportsInterrupt: true,\n    supportsPermissionEvents: true,\n    supportsWorkingDirectory: true,\n    notes: \"Uses `hermes acp`. Bridges ACP `session/request_permission` to platform Inbox. Python startup ~5s.\",\n  },\n  opencode: {\n    runtime: \"opencode\",\n    adapterKind: \"cli_print_session\",\n    transport: \"cli_print_stdio\",\n    lifecycle: \"persistent\",\n    promptInjection: \"startup_message\",\n    sessionRecovery: \"native_resume\",\n    eventStream: \"final_only\",\n    sessionConcurrencyStrategy: \"process_per_turn_resume\",\n    maxConcurrentScopesDefault: 1,\n    sharesHostAcrossScopes: false,\n    sessionRoutingKey: \"sessionId\",\n    supportsSteering: true,\n    supportsInterrupt: true,\n    supportsPermissionEvents: false,\n    supportsWorkingDirectory: true,\n    notes:\n      \"Uses `opencode run --format json` per turn with `opencode export` to read the final assistant message; each scoped session resumes by session id. Concurrent OpenCode runs can hit the upstream SQLite `database is locked` issue, so daemon serializes it by default.\",\n  },\n};\n\nexport function listRuntimeCapabilities(): RuntimeCapability[] {\n  return supportedRuntimeIds.map((runtime) => capabilities[runtime]);\n}\n\nexport function getRuntimeCapability(\n  runtime: string\n): RuntimeCapability | undefined {\n  if (!isSupportedRuntimeId(runtime)) {\n    return undefined;\n  }\n\n  return capabilities[runtime];\n}\n\nexport function isSupportedRuntimeId(runtime: string): runtime is RuntimeId {\n  return supportedRuntimeIds.includes(runtime as RuntimeId);\n}\n", "import type { CommandRunner } from \"../process/command\";\nimport { runCommand } from \"../process/command\";\nimport { getRuntimeCapability, supportedRuntimeIds, type RuntimeId } from \"./capabilities\";\n\nexport interface RuntimeDoctorResult {\n  runtime: RuntimeId;\n  detected: boolean;\n  status: \"available\" | \"not_installed\" | \"unknown\";\n  version?: string;\n  capability: ReturnType<typeof getRuntimeCapability>;\n  errorMessage?: string;\n}\n\nconst versionArgs: Record<RuntimeId, string[]> = {\n  codex: [\"--version\"],\n  claude: [\"--version\"],\n  kimi: [\"--version\"],\n  antigravity: [\"--version\"],\n  cursor: [\"--version\"],\n  hermes: [\"--version\"],\n  opencode: [\"--version\"],\n};\n\nconst commands: Record<RuntimeId, string> = {\n  codex: \"codex\",\n  claude: \"claude\",\n  kimi: \"kimi\",\n  antigravity: \"agy\",\n  cursor: \"cursor-agent\",\n  hermes: \"hermes\",\n  opencode: \"opencode\",\n};\n\nexport async function doctorRuntimes(\n  runtimes: RuntimeId[] = supportedRuntimeIds,\n  runner: CommandRunner = runCommand\n): Promise<RuntimeDoctorResult[]> {\n  const results: RuntimeDoctorResult[] = [];\n  for (const runtime of runtimes) {\n    try {\n      const result = await runner({\n        command: commands[runtime],\n        args: versionArgs[runtime],\n        timeoutMs: 10000,\n      });\n      const version = `${result.stdout}\\n${result.stderr}`.trim().split(/\\r?\\n/)[0];\n      results.push({\n        runtime,\n        detected: result.exitCode === 0,\n        status: result.exitCode === 0 ? \"available\" : \"unknown\",\n        version: version || undefined,\n        capability: getRuntimeCapability(runtime),\n        errorMessage: result.exitCode === 0 ? undefined : `${result.stderr}\\n${result.stdout}`.trim(),\n      });\n    } catch (error) {\n      results.push({\n        runtime,\n        detected: false,\n        status: \"not_installed\",\n        capability: getRuntimeCapability(runtime),\n        errorMessage: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n  return results;\n}\n", "import { mkdtemp, rm } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeRunStatus } from \"../runtime/adapter\";\nimport { supportedRuntimeIds, type RuntimeId } from \"../runtime/capabilities\";\nimport { createPersistentRuntimeAdapter } from \"../runtime/registry\";\nimport { runAdapterSmokeTest } from \"./smoke-harness\";\n\nexport interface RuntimeSmokeSummary {\n  runtime: RuntimeId;\n  status: RuntimeRunStatus;\n  aiEmployeeDir?: string;\n  runtimeSessionId?: string;\n  finalMessage?: string;\n  eventTypes: string[];\n  errorMessage?: string;\n}\n\nexport interface RunSmokeMatrixInput {\n  runtimes?: RuntimeId[];\n  rootDir?: string;\n  timeoutMs?: number;\n  keepArtifacts?: boolean;\n}\n\nexport async function runSmokeMatrix(\n  input: RunSmokeMatrixInput = {}\n): Promise<RuntimeSmokeSummary[]> {\n  const rootDir =\n    input.rootDir ?? (await mkdtemp(path.join(os.tmpdir(), \"wm-daemon-smoke-\")));\n  const summaries: RuntimeSmokeSummary[] = [];\n\n  try {\n    for (const runtime of input.runtimes ?? supportedRuntimeIds) {\n      const adapter = createPersistentRuntimeAdapter(runtime);\n      if (!adapter) {\n        summaries.push({\n          runtime,\n          status: \"runtime_error\",\n          eventTypes: [],\n          errorMessage: `runtime ${runtime} does not support persistent execution`,\n        });\n        continue;\n      }\n      try {\n        const result = await runAdapterSmokeTest({\n          rootDir,\n          serverNamespace: \"test-server\",\n          serverId: \"test-server\",\n          daemonId: \"test-daemon\",\n          aiEmployeeId: `test-${runtime}-agent`,\n          aiEmployeeName: `test-${runtime}`,\n          runtime,\n          role: \"wm-daemon adapter smoke test agent\",\n          adapter,\n          timeoutMs: input.timeoutMs,\n        });\n\n        summaries.push({\n          runtime,\n          status: result.status,\n          aiEmployeeDir: result.workspace.aiEmployeeDir,\n          runtimeSessionId: result.runtimeSessionId,\n          finalMessage: result.finalMessage,\n          eventTypes: result.events.map((event) => event.type),\n          errorMessage: result.errorMessage,\n        });\n      } catch (error) {\n        summaries.push({\n          runtime,\n          status: \"runtime_error\",\n          eventTypes: [],\n          errorMessage: error instanceof Error ? error.message : String(error),\n        });\n      } finally {\n        adapter.destroy(\"smoke runtime complete\");\n      }\n    }\n  } finally {\n    if (!input.keepArtifacts && !input.rootDir) {\n      await rm(rootDir, { recursive: true, force: true });\n    }\n  }\n\n  return summaries;\n}\n\nexport function smokeMatrixHasFailures(summaries: RuntimeSmokeSummary[]): boolean {\n  return summaries.some((summary) =>\n    [\"runtime_error\", \"timeout\", \"unsupported_version\"].includes(summary.status)\n  );\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport readline from \"node:readline\";\nimport { query as sdkQuery } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n  PersistentRuntimeAdapter,\n  RuntimeAdapter,\n  RuntimeEvent,\n  RuntimePromptInput,\n  RuntimeRunInput,\n  RuntimeRunResult,\n  RuntimeStartInput,\n} from \"./adapter\";\nimport { classifyProtocolError, withTimeout } from \"./acp-adapter\";\nimport {\n  claudeStreamJsonPromptMessage,\n  parseClaudeStreamJsonLine,\n} from \"./claude-stream-json\";\nimport { hostBackend } from \"./execution-backend\";\n\nconst DEFAULT_TURN_TIMEOUT_MS = 300_000;\n\ntype ClaudeEffort = \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ninterface ClaudeQueryInput {\n  prompt: string;\n  options: {\n    cwd: string;\n    permissionMode: \"default\" | \"plan\" | \"bypassPermissions\";\n    allowDangerouslySkipPermissions?: true;\n    abortController: AbortController;\n    includePartialMessages: true;\n    model?: string;\n    effort?: ClaudeEffort;\n    thinking?: { type: \"adaptive\" };\n    systemPrompt: {\n      type: \"preset\";\n      preset: \"claude_code\";\n      append: string;\n    };\n    resume?: string;\n    sessionId?: string;\n  };\n}\n\nexport type ClaudeQueryFactory = (input: ClaudeQueryInput) => Query | AsyncIterable<unknown>;\n\nexport class ClaudeAdapter implements RuntimeAdapter {\n  readonly runtime = \"claude\" as const;\n\n  constructor(private readonly queryFactory: ClaudeQueryFactory = sdkQuery) {}\n\n  async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n    const events: RuntimeEvent[] = [];\n    let finalMessage = \"\";\n    let sessionId: string | undefined;\n    const abortController = new AbortController();\n    const abortHandler = () => abortController.abort();\n    const timer = setTimeout(\n      () => abortController.abort(),\n      input.timeoutMs ?? DEFAULT_TURN_TIMEOUT_MS\n    );\n    const restoreEnv = applyRuntimeEnv(input.env);\n\n    try {\n      if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n      input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n      const isResume = !!input.runtimeSessionId;\n      const stream = this.queryFactory({\n        prompt: input.prompt,\n        options: {\n          cwd: input.cwd,\n          ...claudePermissionOptions(input.permissionMode),\n          abortController,\n          includePartialMessages: true,\n          model: input.model && input.model !== \"default\" ? input.model : undefined,\n          ...claudeReasoningOptions(input.reasoningEffort),\n          systemPrompt: {\n            type: \"preset\",\n            preset: \"claude_code\",\n            append: input.systemPrompt,\n          },\n          ...(isResume\n            ? { resume: input.runtimeSessionId }\n            : { sessionId: randomUUID() }),\n        },\n      });\n\n      for await (const message of stream) {\n        const msg = message as Record<string, unknown>;\n        switch (msg.type) {\n          case \"system\": {\n            if (msg.subtype === \"init\") {\n              sessionId = stringValue(msg.session_id);\n              emit(events, input, {\n                type: \"runtime_started\",\n                data: { runtime: \"claude\", sessionId, model: msg.model },\n              });\n            } else if (msg.subtype === \"status\" && msg.status === \"compacting\") {\n              emit(events, input, { type: \"compaction_started\" });\n            } else if (msg.subtype === \"compact_boundary\") {\n              emit(events, input, { type: \"compaction_finished\" });\n            }\n            break;\n          }\n          case \"stream_event\": {\n            this.handleStreamEvent(msg.event, events, input, (text) => {\n              finalMessage += text;\n            });\n            break;\n          }\n          case \"assistant\": {\n            const text = this.handleAssistant(msg.message, events, input);\n            if (text) finalMessage = text;\n            break;\n          }\n          case \"user\": {\n            if (msg.isSynthetic) {\n              this.handleSyntheticUser(msg.message, events, input);\n            }\n            break;\n          }\n          case \"tool_progress\": {\n            emit(events, input, { type: \"tool_progress\", data: msg });\n            break;\n          }\n          case \"result\": {\n            emit(events, input, {\n              type: \"turn_finished\",\n              data: {\n                cost: msg.total_cost_usd,\n                duration: msg.duration_ms,\n                usage: msg.usage,\n              },\n            });\n            break;\n          }\n        }\n      }\n\n      return { status: \"ok\", finalMessage, runtimeSessionId: sessionId, events };\n    } catch (error) {\n      const status = classifyProtocolError(error);\n      return {\n        status,\n        finalMessage,\n        runtimeSessionId: sessionId,\n        events,\n        errorMessage:\n          status === \"timeout\"\n            ? \"Claude session timed out\"\n            : error instanceof Error\n              ? error.message\n              : String(error),\n      };\n    } finally {\n      clearTimeout(timer);\n      input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n      restoreEnv();\n    }\n  }\n\n  private handleStreamEvent(\n    event: unknown,\n    events: RuntimeEvent[],\n    input: RuntimeRunInput,\n    appendFinalMessage: (text: string) => void\n  ): void {\n    const streamEvent = event as Record<string, unknown> | undefined;\n    if (streamEvent?.type !== \"content_block_delta\") return;\n    const delta = streamEvent.delta as Record<string, unknown> | undefined;\n    if (delta?.type === \"text_delta\" && typeof delta.text === \"string\") {\n      appendFinalMessage(delta.text);\n      emit(events, input, {\n        type: \"assistant_delta\",\n        content: delta.text,\n        data: delta,\n      });\n    }\n    if (delta?.type === \"thinking_delta\" && typeof delta.thinking === \"string\") {\n      emit(events, input, {\n        type: \"thinking_delta\",\n        content: delta.thinking,\n        data: delta,\n      });\n    }\n  }\n\n  private handleAssistant(\n    message: unknown,\n    events: RuntimeEvent[],\n    input: RuntimeRunInput\n  ): string {\n    const blocks = contentBlocks(message);\n    let text = \"\";\n    for (const block of blocks) {\n      if (block.type === \"text\" && typeof block.text === \"string\") {\n        text += block.text;\n      }\n      if (block.type === \"tool_use\") {\n        emit(events, input, {\n          type: \"tool_start\",\n          content: stringValue(block.name) ?? \"\",\n          data: {\n            id: block.id,\n            name: block.name,\n            input: block.input,\n          },\n        });\n      }\n    }\n    return text;\n  }\n\n  private handleSyntheticUser(\n    message: unknown,\n    events: RuntimeEvent[],\n    input: RuntimeRunInput\n  ): void {\n    for (const block of contentBlocks(message)) {\n      if (block.type === \"tool_result\") {\n        emit(events, input, { type: \"tool_result\", data: block });\n      }\n    }\n  }\n}\n\nexport type ClaudeCliProcessFactory = (\n  input: RuntimeStartInput,\n  args: string[]\n) => ChildProcessWithoutNullStreams;\n\nexport class ClaudePersistentAdapter implements PersistentRuntimeAdapter {\n  readonly runtime = \"claude\" as const;\n  private child: ChildProcessWithoutNullStreams | null = null;\n  private lines: readline.Interface | null = null;\n  private startInput: RuntimeStartInput | null = null;\n  private sessionId: string | undefined;\n  private activePrompt: {\n    runInput: RuntimeRunInput;\n    events: RuntimeEvent[];\n    appendFinalMessage(text: string): void;\n    setFinalMessage(text: string): void;\n    markExited(code: number | null, signal: NodeJS.Signals | null): void;\n    finish(): void;\n    exited?: { code: number | null; signal: NodeJS.Signals | null };\n  } | null = null;\n  onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n  constructor(\n    private readonly processFactory: ClaudeCliProcessFactory = (input, args) =>\n      (input.executionBackend ?? hostBackend()).spawnRuntime({\n        command: \"claude\",\n        args,\n        cwd: input.cwd,\n        env: input.env ?? process.env,\n        employeeId: input.aiEmployeeId,\n        detached: process.platform !== \"win32\",\n      })\n  ) {}\n\n  async start(input: RuntimeStartInput): Promise<void> {\n    if (this.child && this.alive) return;\n    this.startInput = input;\n    const args = claudeCliArgs(input);\n    this.child = this.processFactory(input, args);\n    this.child.stderr.on(\"data\", (chunk) => {\n      const text = chunk.toString().trim();\n      if (text) input.onEvent?.({ type: \"runtime_stderr\", content: text });\n    });\n    this.child.on(\"exit\", (code, signal) => {\n      this.activePrompt?.markExited(code, signal);\n      this.child = null;\n      this.onExit?.(code, signal);\n    });\n    this.child.on(\"error\", (error) => {\n      input.onEvent?.({ type: \"runtime_error\", content: error.message });\n    });\n    this.lines = readline.createInterface({ input: this.child.stdout });\n    this.lines.on(\"line\", (line) => this.handleLine(line));\n  }\n\n  async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n    const startInput = this.startInput;\n    const child = this.child;\n    let finalMessage = \"\";\n    const events: RuntimeEvent[] = [];\n    if (!startInput || !child || !this.alive) {\n      return {\n        status: \"runtime_error\",\n        finalMessage,\n        events,\n        errorMessage: \"Claude persistent runtime is not started\",\n      };\n    }\n\n    const runInput: RuntimeRunInput = {\n      ...startInput,\n      prompt: input.prompt,\n      timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n      abortSignal: input.abortSignal,\n    };\n    const abortHandler = () => this.destroy(\"prompt aborted\");\n    let finishTurn: (() => void) | undefined;\n    const turnFinished = new Promise<void>((resolve) => {\n      finishTurn = resolve;\n    });\n    this.activePrompt = {\n      runInput,\n      events,\n      appendFinalMessage: (text) => {\n        finalMessage += text;\n      },\n      setFinalMessage: (text) => {\n        finalMessage = text;\n      },\n      markExited: (code, signal) => {\n        if (this.activePrompt) this.activePrompt.exited = { code, signal };\n        finishTurn?.();\n      },\n      finish: () => finishTurn?.(),\n    };\n\n    try {\n      if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n      input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n      emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n      child.stdin.write(`${claudeStreamJsonPromptMessage(input.prompt)}\\n`);\n      await withTimeout(\n        turnFinished,\n        input.timeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n        \"Claude stream-json turn timeout\"\n      );\n      if (this.activePrompt?.exited) {\n        const { code, signal } = this.activePrompt.exited;\n        return {\n          status: \"runtime_error\",\n          finalMessage,\n          runtimeSessionId: this.sessionId,\n          events,\n          errorMessage: `Claude exited code=${code} signal=${signal ?? \"-\"}`,\n        };\n      }\n      return {\n        status: \"ok\",\n        finalMessage,\n        runtimeSessionId: this.sessionId,\n        events,\n      };\n    } catch (error) {\n      const status = classifyProtocolError(error);\n      return {\n        status,\n        finalMessage,\n        runtimeSessionId: this.sessionId,\n        events,\n        errorMessage: status === \"timeout\"\n          ? \"Claude stream-json session timed out\"\n          : error instanceof Error ? error.message : String(error),\n      };\n    } finally {\n      input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n      this.activePrompt = null;\n    }\n  }\n\n  get alive(): boolean {\n    return Boolean(this.child && !this.child.killed);\n  }\n\n  get pid(): number | undefined {\n    return this.child?.pid;\n  }\n\n  destroy(_reason?: string): void {\n    this.activePrompt = null;\n    this.lines?.close();\n    this.lines = null;\n    killProcessTree(this.child);\n    this.child = null;\n  }\n\n  private handleLine(line: string): void {\n    const parsed = parseClaudeStreamJsonLine(line);\n    if (!parsed) return;\n    if (parsed.sessionId) this.sessionId = parsed.sessionId;\n    const active = this.activePrompt;\n    const runInput = active?.runInput ?? (this.startInput ? { ...this.startInput, prompt: \"\" } : undefined);\n    if (!runInput) return;\n    for (const event of parsed.events) {\n      if (!active && event.type !== \"runtime_started\") {\n        continue;\n      }\n      emit(active?.events ?? [], runInput, event);\n    }\n    if (active) {\n      if (parsed.appendFinalMessage) active.appendFinalMessage(parsed.appendFinalMessage);\n      if (parsed.finalMessage) active.setFinalMessage(parsed.finalMessage);\n      if (parsed.turnFinished) active.finish();\n    }\n  }\n}\n\nfunction claudePermissionOptions(permissionMode: RuntimeRunInput[\"permissionMode\"]): Pick<ClaudeQueryInput[\"options\"], \"permissionMode\" | \"allowDangerouslySkipPermissions\"> {\n  if (permissionMode === \"read_only\") return { permissionMode: \"plan\" };\n  if (permissionMode === \"full_access\") {\n    return {\n      permissionMode: \"bypassPermissions\",\n      allowDangerouslySkipPermissions: true,\n    };\n  }\n  return { permissionMode: \"default\" };\n}\n\nfunction claudeReasoningOptions(reasoningEffort: string | undefined): Pick<ClaudeQueryInput[\"options\"], \"effort\" | \"thinking\"> {\n  if (!reasoningEffort || reasoningEffort === \"default\") return {};\n  if (reasoningEffort === \"adaptive\") return { thinking: { type: \"adaptive\" } };\n  if (!isClaudeEffort(reasoningEffort)) return {};\n  return { effort: reasoningEffort };\n}\n\nfunction claudeCliArgs(input: RuntimeStartInput): string[] {\n  const args = [\n    \"--verbose\",\n    \"--permission-mode\",\n    input.permissionMode === \"full_access\" ? \"bypassPermissions\" : input.permissionMode === \"read_only\" ? \"plan\" : \"default\",\n    \"--input-format\",\n    \"stream-json\",\n    \"--output-format\",\n    \"stream-json\",\n    \"--disallowed-tools\",\n    \"EnterPlanMode,ExitPlanMode,ScheduleWakeup,CronCreate,CronList,CronDelete\",\n    \"--system-prompt-file\",\n    input.systemPromptPath,\n  ];\n  if (input.permissionMode !== \"read_only\") {\n    args.unshift(\"--allow-dangerously-skip-permissions\", \"--dangerously-skip-permissions\");\n  }\n  if (input.model && input.model !== \"default\") {\n    args.push(\"--model\", input.model);\n  }\n  if (input.runtimeSessionId) {\n    args.push(\"--resume\", input.runtimeSessionId);\n  }\n  return args;\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n  if (!child || child.killed) return;\n  if (process.platform === \"win32\") {\n    child.kill();\n    return;\n  }\n  if (child.pid) {\n    try {\n      process.kill(-child.pid, \"SIGTERM\");\n      setTimeout(() => {\n        try {\n          if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n        } catch {\n          // Process already exited.\n        }\n      }, 5000).unref();\n      return;\n    } catch {\n      // Fall through to direct child kill.\n    }\n  }\n  child.kill(\"SIGTERM\");\n}\n\nfunction isClaudeEffort(value: string): value is ClaudeEffort {\n  return value === \"low\" || value === \"medium\" || value === \"high\" || value === \"xhigh\" || value === \"max\";\n}\n\nfunction contentBlocks(message: unknown): Array<Record<string, unknown>> {\n  const msg = message as { content?: unknown } | undefined;\n  return Array.isArray(msg?.content)\n    ? msg.content.filter((block): block is Record<string, unknown> =>\n        typeof block === \"object\" && block !== null\n      )\n    : [];\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n  events.push(event);\n  input.onEvent?.(event);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n\nfunction applyRuntimeEnv(env?: NodeJS.ProcessEnv): () => void {\n  if (!env) return () => {};\n  const previous = new Map<string, string | undefined>();\n  for (const [key, value] of Object.entries(env)) {\n    previous.set(key, process.env[key]);\n    if (value === undefined) {\n      delete process.env[key];\n    } else {\n      process.env[key] = value;\n    }\n  }\n  return () => {\n    for (const [key, value] of previous) {\n      if (value === undefined) {\n        delete process.env[key];\n      } else {\n        process.env[key] = value;\n      }\n    }\n  };\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport readline from \"node:readline\";\nimport type { ExecutionBackend } from \"./execution-backend\";\nimport { hostBackend } from \"./execution-backend\";\n\nexport type JsonRpcId = number | string;\n\nexport interface JsonRpcNotification {\n  method: string;\n  params: unknown;\n}\n\nexport interface JsonRpcServerRequest {\n  id: JsonRpcId;\n  method: string;\n  params: unknown;\n}\n\nexport interface JsonRpcStdioClientOptions {\n  command: string;\n  args: string[];\n  cwd?: string;\n  env?: NodeJS.ProcessEnv;\n  employeeId?: string;\n  executionBackend?: ExecutionBackend;\n  onNotification: (notification: JsonRpcNotification) => void;\n  onServerRequest?: (request: JsonRpcServerRequest) => Promise<unknown>;\n  onStderr?: (text: string) => void;\n  onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n}\n\ninterface PendingRequest {\n  resolve(value: unknown): void;\n  reject(error: Error): void;\n}\n\nexport class JsonRpcStdioClient {\n  private child: ChildProcessWithoutNullStreams | null = null;\n  private lines: readline.Interface | null = null;\n  private nextId = 1;\n  private readonly pending = new Map<JsonRpcId, PendingRequest>();\n  private started = false;\n  private exitEmitted = false;\n\n  constructor(private readonly options: JsonRpcStdioClientOptions) {}\n\n  start(): void {\n    if (this.started) return;\n    this.started = true;\n    this.exitEmitted = false;\n    this.child = (this.options.executionBackend ?? hostBackend()).spawnRuntime({\n      command: this.options.command,\n      args: this.options.args,\n      cwd: this.options.cwd ?? process.cwd(),\n      env: this.options.env ?? process.env,\n      employeeId: this.options.employeeId ?? \"json-rpc-runtime\",\n      detached: process.platform !== \"win32\",\n    });\n\n    this.child.stderr.on(\"data\", (chunk) => {\n      const text = chunk.toString().trim();\n      if (text) this.options.onStderr?.(text);\n    });\n\n    this.child.on(\"error\", (error) => {\n      this.rejectPending(error instanceof Error ? error : new Error(String(error)));\n      this.child = null;\n      this.started = false;\n    });\n\n    this.child.on(\"exit\", (code, signal) => {\n      this.rejectPending(new Error(`Process exited code=${code} signal=${signal}`));\n      this.child = null;\n      this.started = false;\n      this.emitExit(code, signal);\n    });\n\n    this.lines = readline.createInterface({ input: this.child.stdout });\n    this.lines.on(\"line\", (line) => this.handleLine(line));\n  }\n\n  request(method: string, params?: unknown): Promise<unknown> {\n    if (!this.child) {\n      return Promise.reject(new Error(\"JSON-RPC client not started\"));\n    }\n\n    const id = this.nextId++;\n    const message = { jsonrpc: \"2.0\", id, method, params };\n    return new Promise((resolve, reject) => {\n      this.pending.set(id, { resolve, reject });\n      this.child!.stdin.write(`${JSON.stringify(message)}\\n`);\n    });\n  }\n\n  destroy(): void {\n    this.rejectPending(new Error(\"Client destroyed\"));\n    this.lines?.close();\n    this.lines = null;\n    killProcessTree(this.child);\n    this.child = null;\n    this.started = false;\n  }\n\n  get isRunning(): boolean {\n    return this.child !== null;\n  }\n\n  get alive(): boolean {\n    return this.isRunning;\n  }\n\n  get pid(): number | undefined {\n    return this.child?.pid;\n  }\n\n  private handleLine(line: string): void {\n    if (!line.trim()) return;\n\n    let message: unknown;\n    try {\n      message = JSON.parse(line);\n    } catch {\n      return;\n    }\n\n    const packet = message as {\n      id?: JsonRpcId;\n      method?: string;\n      params?: unknown;\n      result?: unknown;\n      error?: { code?: number; message?: string; data?: unknown };\n    };\n\n    if (packet.id !== undefined && !packet.method) {\n      const pending = this.pending.get(packet.id);\n      if (!pending) return;\n      this.pending.delete(packet.id);\n      if (packet.error) {\n        pending.reject(new Error(packet.error.message ?? \"JSON-RPC request failed\"));\n      } else {\n        pending.resolve(packet.result);\n      }\n      return;\n    }\n\n    if (packet.id !== undefined && packet.method) {\n      const request = {\n        id: packet.id,\n        method: packet.method,\n        params: packet.params,\n      };\n      const handler = this.options.onServerRequest;\n      if (!handler) {\n        this.sendResponse(packet.id, {});\n        return;\n      }\n      handler(request)\n        .then((result) => this.sendResponse(packet.id!, result))\n        .catch((error) =>\n          this.sendError(packet.id!, error instanceof Error ? error : new Error(String(error)))\n        );\n      return;\n    }\n\n    if (packet.method) {\n      this.options.onNotification({\n        method: packet.method,\n        params: packet.params,\n      });\n    }\n  }\n\n  private sendResponse(id: JsonRpcId, result: unknown): void {\n    this.child?.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, result })}\\n`);\n  }\n\n  private sendError(id: JsonRpcId, error: Error): void {\n    this.child?.stdin.write(\n      `${JSON.stringify({\n        jsonrpc: \"2.0\",\n        id,\n        error: { code: -32000, message: error.message },\n      })}\\n`\n    );\n  }\n\n  private rejectPending(error: Error): void {\n    for (const pending of this.pending.values()) {\n      pending.reject(error);\n    }\n    this.pending.clear();\n  }\n\n  private emitExit(code: number | null, signal: NodeJS.Signals | null): void {\n    if (this.exitEmitted) return;\n    this.exitEmitted = true;\n    this.options.onExit?.(code, signal);\n  }\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n  if (!child || child.killed) return;\n  if (process.platform === \"win32\") {\n    if (child.pid) {\n      spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], {\n        stdio: \"ignore\",\n        windowsHide: true,\n      });\n      return;\n    }\n    child.kill();\n    return;\n  }\n\n  if (child.pid) {\n    try {\n      process.kill(-child.pid, \"SIGTERM\");\n      setTimeout(() => {\n        try {\n          if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n        } catch {\n          // Process already exited.\n        }\n      }, 5000).unref();\n      return;\n    } catch {\n      // Fall through to direct child kill for runtimes that did not get a group.\n    }\n  }\n  child.kill(\"SIGTERM\");\n  setTimeout(() => {\n    if (!child.killed) child.kill(\"SIGKILL\");\n  }, 5000).unref();\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport type { RuntimeId } from \"./capabilities\";\n\nexport interface EmployeePrepareInput {\n  employeeId: string;\n  workspaceDir: string;\n  runtime?: RuntimeId;\n  env?: NodeJS.ProcessEnv;\n}\n\nexport interface RuntimeSpawnInput {\n  command: string;\n  args: string[];\n  cwd: string;\n  workspaceDir?: string;\n  runtime?: RuntimeId;\n  env?: NodeJS.ProcessEnv;\n  employeeId: string;\n  stdio?: \"pipe\" | \"ignore\" | \"ignore-stdin\";\n  detached?: boolean;\n}\n\nexport interface ExecutionBackend {\n  readonly kind: \"host\" | \"container\";\n  prepareEmployee(input: EmployeePrepareInput): Promise<void>;\n  spawnRuntime(input: RuntimeSpawnInput): ChildProcessWithoutNullStreams;\n  destroyEmployee(employeeId: string): Promise<void>;\n}\n\nexport class HostBackend implements ExecutionBackend {\n  readonly kind = \"host\" as const;\n\n  async prepareEmployee(_input: EmployeePrepareInput): Promise<void> {\n    // Host mode uses the existing local workspace directly.\n  }\n\n  spawnRuntime(input: RuntimeSpawnInput): ChildProcessWithoutNullStreams {\n    return spawn(input.command, input.args, {\n      cwd: input.cwd,\n      env: input.env ?? process.env,\n      stdio: stdioFor(input.stdio),\n      detached: input.detached ?? process.platform !== \"win32\",\n    }) as ChildProcessWithoutNullStreams;\n  }\n\n  async destroyEmployee(_employeeId: string): Promise<void> {\n    // Host mode has no per-employee container to clean up.\n  }\n}\n\nfunction stdioFor(stdio: RuntimeSpawnInput[\"stdio\"]): [\"pipe\" | \"ignore\", \"pipe\" | \"ignore\", \"pipe\" | \"ignore\"] {\n  if (stdio === \"ignore\") return [\"ignore\", \"ignore\", \"ignore\"];\n  if (stdio === \"ignore-stdin\") return [\"ignore\", \"pipe\", \"pipe\"];\n  return [\"pipe\", \"pipe\", \"pipe\"];\n}\n\nconst defaultHostBackend = new HostBackend();\n\nexport function hostBackend(): ExecutionBackend {\n  return defaultHostBackend;\n}\n", "import type {\n  PersistentRuntimeAdapter,\n  RuntimeAdapter,\n  RuntimeEvent,\n  RuntimePromptInput,\n  RuntimeRunInput,\n  RuntimeRunResult,\n  RuntimeStartInput,\n} from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\nimport {\n  JsonRpcStdioClient,\n  type JsonRpcNotification,\n  type JsonRpcServerRequest,\n  type JsonRpcStdioClientOptions,\n} from \"./json-rpc-stdio-client\";\n\nconst DEFAULT_TURN_TIMEOUT_MS = 300_000;\n\nexport interface AcpJsonRpcClient {\n  start(): void;\n  request(method: string, params?: unknown): Promise<unknown>;\n  destroy(): void;\n  readonly isRunning?: boolean;\n  readonly alive?: boolean;\n  readonly pid?: number;\n}\n\nexport interface AcpAdapterConfig {\n  runtime: RuntimeId;\n  command: string;\n  args: string[];\n  modelFlag?: boolean;\n  sessionNewExtras?: Record<string, unknown>;\n  autoApproveMode?: string;\n}\n\nexport type AcpClientFactory = (\n  options: JsonRpcStdioClientOptions\n) => AcpJsonRpcClient;\n\nconst DEFAULT_ACP_CLIENT_FACTORY: AcpClientFactory = (options) =>\n  new JsonRpcStdioClient(options);\n\ninterface ActivePrompt {\n  runInput: RuntimeRunInput;\n  events: RuntimeEvent[];\n  appendFinalMessage(text: string): void;\n}\n\nexport class AcpAdapter implements RuntimeAdapter, PersistentRuntimeAdapter {\n  readonly runtime: RuntimeId;\n  private activePermissionMode: RuntimeRunInput[\"permissionMode\"] = \"default\";\n  private host: AcpSharedHost | null = null;\n  private sessionId: string | undefined;\n  private startInput: RuntimeStartInput | null = null;\n  private activePrompt: ActivePrompt | null = null;\n  onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n  constructor(\n    private readonly config: AcpAdapterConfig,\n    private readonly clientFactory: AcpClientFactory = DEFAULT_ACP_CLIENT_FACTORY\n  ) {\n    this.runtime = config.runtime;\n  }\n\n  async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n    try {\n      await this.start(input);\n      return await this.prompt({\n        prompt: input.prompt,\n        timeoutMs: input.timeoutMs,\n        abortSignal: input.abortSignal,\n      });\n    } finally {\n      await this.destroy(\"compat run complete\");\n    }\n  }\n\n  async start(input: RuntimeStartInput): Promise<void> {\n    this.activePermissionMode = input.permissionMode ?? \"default\";\n\n    try {\n      if (this.host && this.alive && this.sessionId) return;\n      this.startInput = input;\n      this.sessionId = undefined;\n      this.host = AcpSharedHostPool.acquire(this.config, input, this.clientFactory, this);\n      this.host.setStderrSink(this, input.onEvent);\n      const initResult = await this.host.ensureStarted(this.config, input);\n\n      emit([], this.startInputAsRunInput(\"\"), {\n        type: \"runtime_started\",\n        data: { runtime: this.runtime, agent: initResult.agentInfo },\n      });\n\n      if (input.runtimeSessionId) {\n        await this.host.request(\"session/load\", {\n          sessionId: input.runtimeSessionId,\n          cwd: input.cwd,\n          mcpServers: [],\n        });\n        this.sessionId = input.runtimeSessionId;\n      } else {\n        const sessionResult = (await this.host.request(\"session/new\", {\n          cwd: input.cwd,\n          mcpServers: [],\n          ...this.config.sessionNewExtras,\n        })) as { sessionId?: string };\n        this.sessionId = sessionResult.sessionId;\n        if (!this.sessionId) throw new Error(`${this.runtime} session/new returned no session id`);\n      }\n      this.host.bindSession(this, this.sessionId);\n\n      if (input.permissionMode === \"full_access\" && this.config.autoApproveMode) {\n        await this.host.request(\"session/set_mode\", {\n          sessionId: this.sessionId,\n          modeId: this.config.autoApproveMode,\n        });\n      }\n    } catch (error) {\n      this.destroy(\"start failed\");\n      throw error;\n    }\n  }\n\n  async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n    let finalMessage = \"\";\n    const events: RuntimeEvent[] = [];\n    const sessionId = this.sessionId;\n    const host = this.host;\n    const startInput = this.startInput;\n    const abortHandler = () => host?.destroy();\n\n    if (!host || !this.alive || !startInput || !sessionId) {\n      return {\n        status: \"runtime_error\",\n        finalMessage,\n        events,\n        errorMessage: `${this.runtime} persistent runtime is not started`,\n      };\n    }\n\n    const runInput = this.startInputAsRunInput(input.prompt, input);\n    try {\n      if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n      input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n      this.activePrompt = {\n        runInput,\n        events,\n        appendFinalMessage: (text) => {\n          finalMessage += text;\n        },\n      };\n\n      emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n      const promptResult = (await withTimeout(\n        host.request(\"session/prompt\", {\n          sessionId,\n          prompt: [{ type: \"text\", text: this.buildPrompt(startInput.systemPrompt, input.prompt) }],\n        }),\n        input.timeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n        \"ACP prompt timeout\"\n      )) as { stopReason?: string; usage?: unknown; _meta?: unknown };\n\n      emit(events, runInput, {\n        type: \"turn_finished\",\n        data: {\n          stopReason: promptResult.stopReason,\n          usage: promptResult.usage ?? promptResult._meta,\n        },\n      });\n\n      return { status: \"ok\", finalMessage, runtimeSessionId: sessionId, events };\n    } catch (error) {\n      return {\n        status: classifyProtocolError(error),\n        finalMessage,\n        runtimeSessionId: sessionId,\n        events,\n        errorMessage: error instanceof Error ? error.message : String(error),\n      };\n    } finally {\n      input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n      this.activePrompt = null;\n    }\n  }\n\n  get alive(): boolean {\n    return Boolean(this.host?.alive);\n  }\n\n  get pid(): number | undefined {\n    return this.host?.pid;\n  }\n\n  destroy(_reason?: string): void {\n    this.activePrompt = null;\n    this.host?.release(this);\n    this.host = null;\n    this.sessionId = undefined;\n  }\n\n  async handleServerRequestForTest(request: JsonRpcServerRequest): Promise<unknown> {\n    return this.handleServerRequest(request);\n  }\n\n  async handleServerRequestFromHost(request: JsonRpcServerRequest): Promise<unknown> {\n    return this.handleServerRequest(request);\n  }\n\n  routeNotificationFromHost(notification: JsonRpcNotification): void {\n    this.routeNotification(notification);\n  }\n\n  protected buildPrompt(systemPrompt: string, userPrompt: string): string {\n    return `<system>\\n${systemPrompt}\\n</system>\\n\\n${userPrompt}`;\n  }\n\n  protected async handleServerRequest(request: JsonRpcServerRequest): Promise<unknown> {\n    if (request.method === \"session/request_permission\") {\n      const runInput = this.activePrompt?.runInput ?? this.startInput;\n      if (this.activePermissionMode === \"full_access\") {\n        return permissionOutcome(selectPermissionOption(request.params, true));\n      }\n      if (!runInput?.requestPermission) return permissionOutcome(selectPermissionOption(request.params, false));\n      const decision = await runInput.requestPermission({\n        kind: \"session\",\n        title: \"Runtime permission requested\",\n        description: summarizeAcpPermissionParams(request.params),\n        metadata: { method: request.method, params: request.params },\n      });\n      return permissionOutcome(selectPermissionOption(request.params, decision.action === \"approve\"));\n    }\n    return {};\n  }\n\n  private routeNotification(notification: JsonRpcNotification): void {\n    const active = this.activePrompt;\n    if (!active) return;\n    this.handleNotification(\n      notification,\n      active.events,\n      active.runInput,\n      active.appendFinalMessage\n    );\n  }\n\n  private startInputAsRunInput(prompt: string, input: Partial<RuntimePromptInput> = {}): RuntimeRunInput {\n    const startInput = this.startInput;\n    if (!startInput) {\n      throw new Error(`${this.runtime} persistent runtime is not started`);\n    }\n    return {\n      ...startInput,\n      prompt,\n      timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n      abortSignal: input.abortSignal,\n    };\n  }\n\n  private handleNotification(\n    notification: JsonRpcNotification,\n    events: RuntimeEvent[],\n    input: RuntimeRunInput,\n    appendFinalMessage: (text: string) => void\n  ): void {\n    if (notification.method !== \"session/update\") return;\n    const params = notification.params as { update?: Record<string, unknown> } | undefined;\n    const update = params?.update;\n    const sessionUpdate = stringValue(update?.sessionUpdate);\n    if (!update || !sessionUpdate) return;\n\n    switch (sessionUpdate) {\n      case \"agent_message_chunk\": {\n        const content = update.content as { type?: string; text?: string } | undefined;\n        if (content?.text) {\n          appendFinalMessage(content.text);\n          emit(events, input, {\n            type: \"assistant_delta\",\n            content: content.text,\n            data: update,\n          });\n        }\n        break;\n      }\n      case \"agent_thought_chunk\": {\n        const content = update.content as { type?: string; text?: string } | undefined;\n        if (content?.text) {\n          emit(events, input, {\n            type: \"thinking_delta\",\n            content: content.text,\n            data: update,\n          });\n        }\n        break;\n      }\n      case \"tool_call\": {\n        emit(events, input, {\n          type: \"tool_start\",\n          content: stringValue(update.title) ?? \"\",\n          data: update,\n        });\n        break;\n      }\n      case \"tool_call_update\": {\n        emit(events, input, {\n          type: update.status === \"completed\" ? \"tool_result\" : \"tool_progress\",\n          content: stringValue(update.title) ?? \"\",\n          data: update,\n        });\n        break;\n      }\n      case \"usage_update\": {\n        emit(events, input, { type: \"usage_update\", data: update });\n        break;\n      }\n      case \"available_commands_update\":\n      case \"session_info_update\": {\n        events.push({ type: sessionUpdate, data: update });\n        break;\n      }\n      default: {\n        events.push({ type: `acp_${sessionUpdate}`, data: update });\n      }\n    }\n  }\n}\n\nclass AcpSharedHost {\n  private client: AcpJsonRpcClient | null = null;\n  private initializePromise: Promise<{ agentInfo?: unknown }> | null = null;\n  private readonly adapters = new Set<AcpAdapter>();\n  private readonly sessionOwners = new Map<string, AcpAdapter>();\n  private readonly stderrSinks = new Map<AcpAdapter, RuntimeStartInput[\"onEvent\"]>();\n  private released = false;\n\n  constructor(\n    readonly key: string,\n    private readonly factory: AcpClientFactory,\n    private readonly onEmpty: (host: AcpSharedHost) => void\n  ) {}\n\n  addAdapter(adapter: AcpAdapter): void {\n    this.adapters.add(adapter);\n  }\n\n  setStderrSink(adapter: AcpAdapter, sink: RuntimeStartInput[\"onEvent\"]): void {\n    this.stderrSinks.set(adapter, sink);\n  }\n\n  async ensureStarted(config: AcpAdapterConfig, input: RuntimeStartInput): Promise<{ agentInfo?: unknown }> {\n    if (this.client && this.alive && this.initializePromise) return this.initializePromise;\n    this.client = this.factory({\n      command: config.command,\n      args: modelArgs(config.args, input.model, config.modelFlag),\n      cwd: input.cwd,\n      env: input.env,\n      employeeId: input.aiEmployeeId,\n      executionBackend: input.executionBackend,\n      onNotification: (notification) => this.routeNotification(notification),\n      onServerRequest: (request) => this.routeServerRequest(request),\n      onStderr: (text) => this.routeStderr(text),\n      onExit: (code, signal) => {\n        this.client = null;\n        for (const adapter of this.adapters) adapter.onExit?.(code, signal);\n      },\n    });\n    this.client.start();\n    this.initializePromise = withTimeout(\n      this.client.request(\"initialize\", {\n        protocolVersion: 1,\n        clientInfo: { name: \"wm-daemon\", version: \"0.0.1\" },\n        capabilities: {},\n      }),\n      10000,\n      \"ACP initialize timeout\"\n    ).then((result) => result as { agentInfo?: unknown });\n    return this.initializePromise;\n  }\n\n  request(method: string, params?: unknown): Promise<unknown> {\n    if (!this.client || !this.alive) throw new Error(\"ACP shared runtime client is not started\");\n    return this.client.request(method, params);\n  }\n\n  bindSession(adapter: AcpAdapter, sessionId: string | undefined): void {\n    if (sessionId) this.sessionOwners.set(sessionId, adapter);\n  }\n\n  release(adapter: AcpAdapter): void {\n    this.adapters.delete(adapter);\n    this.stderrSinks.delete(adapter);\n    for (const [sessionId, owner] of [...this.sessionOwners.entries()]) {\n      if (owner === adapter) this.sessionOwners.delete(sessionId);\n    }\n    if (this.adapters.size > 0) return;\n    this.destroy();\n    this.onEmpty(this);\n  }\n\n  get alive(): boolean {\n    return Boolean(this.client && (this.client.alive ?? this.client.isRunning ?? true));\n  }\n\n  get pid(): number | undefined {\n    return this.client?.pid;\n  }\n\n  destroy(): void {\n    if (this.released) return;\n    this.released = true;\n    this.client?.destroy();\n    this.client = null;\n    this.sessionOwners.clear();\n    this.initializePromise = null;\n  }\n\n  private routeNotification(notification: JsonRpcNotification): void {\n    const sessionId = acpMessageSessionId(notification.params);\n    const owner = sessionId ? this.sessionOwners.get(sessionId) : undefined;\n    if (owner) {\n      owner.routeNotificationFromHost(notification);\n      return;\n    }\n    if (!sessionId && this.sessionOwners.size === 1) {\n      for (const adapter of this.sessionOwners.values()) {\n        adapter.routeNotificationFromHost(notification);\n        return;\n      }\n    }\n  }\n\n  private async routeServerRequest(request: JsonRpcServerRequest): Promise<unknown> {\n    const sessionId = acpMessageSessionId(request.params);\n    const owner = sessionId ? this.sessionOwners.get(sessionId) : undefined;\n    if (owner) return owner.handleServerRequestFromHost(request);\n    if (!sessionId && this.sessionOwners.size === 1) {\n      for (const adapter of this.sessionOwners.values()) return adapter.handleServerRequestFromHost(request);\n    }\n    return {};\n  }\n\n  private routeStderr(text: string): void {\n    for (const sink of this.stderrSinks.values()) {\n      sink?.({ type: \"runtime_stderr\", content: text });\n    }\n  }\n}\n\nclass AcpSharedHostPool {\n  private static readonly hosts = new Map<string, AcpSharedHost>();\n  private static readonly factoryIds = new WeakMap<AcpClientFactory, number>();\n  private static nextFactoryId = 1;\n\n  static acquire(\n    config: AcpAdapterConfig,\n    input: RuntimeStartInput,\n    factory: AcpClientFactory,\n    adapter: AcpAdapter\n  ): AcpSharedHost {\n    const key = this.keyFor(config, input, factory);\n    let host = this.hosts.get(key);\n    if (!host) {\n      host = new AcpSharedHost(key, factory, (emptyHost) => {\n        if (this.hosts.get(emptyHost.key) === emptyHost) this.hosts.delete(emptyHost.key);\n      });\n      this.hosts.set(key, host);\n    }\n    host.addAdapter(adapter);\n    return host;\n  }\n\n  private static keyFor(config: AcpAdapterConfig, input: RuntimeStartInput, factory: AcpClientFactory): string {\n    let factoryId = this.factoryIds.get(factory);\n    if (!factoryId) {\n      factoryId = this.nextFactoryId;\n      this.nextFactoryId += 1;\n      this.factoryIds.set(factory, factoryId);\n    }\n    const backend = input.executionBackend?.kind ?? \"host\";\n    const args = modelArgs(config.args, input.model, config.modelFlag).join(\"\\u0000\");\n    return [\n      `factory:${factoryId}`,\n      `runtime:${config.runtime}`,\n      `command:${config.command}`,\n      `args:${args}`,\n      `employee:${input.aiEmployeeId}`,\n      `cwd:${input.cwd}`,\n      `backend:${backend}`,\n    ].join(\"|\");\n  }\n}\n\nexport function classifyProtocolError(error: unknown): RuntimeRunResult[\"status\"] {\n  const msg = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n  if (msg.includes(\"enoent\") || msg.includes(\"not found\")) return \"not_installed\";\n  if (\n    msg.includes(\"auth\") ||\n    msg.includes(\"login\") ||\n    msg.includes(\"api key\") ||\n    msg.includes(\"401\")\n  ) {\n    return \"not_logged_in\";\n  }\n  if (msg.includes(\"timeout\") || msg.includes(\"aborted\") || msg.includes(\"abort\")) {\n    return \"timeout\";\n  }\n  return \"runtime_error\";\n}\n\nexport function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n  return new Promise((resolve, reject) => {\n    const timer = setTimeout(() => reject(new Error(message)), ms);\n    promise.then(resolve, reject).finally(() => clearTimeout(timer));\n  });\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n  events.push(event);\n  input.onEvent?.(event);\n}\n\nfunction summarizeAcpPermissionParams(params: unknown): string {\n  if (!params || typeof params !== \"object\") return \"Runtime requested permission.\";\n  const record = params as Record<string, unknown>;\n  const reason = typeof record.reason === \"string\" ? record.reason : undefined;\n  const title = typeof record.title === \"string\" ? record.title : undefined;\n  const command = typeof record.command === \"string\" ? record.command : undefined;\n  return [title, command, reason].filter(Boolean).join(\"\\n\") || JSON.stringify(record).slice(0, 500);\n}\n\nfunction acpMessageSessionId(params: unknown): string | undefined {\n  if (!params || typeof params !== \"object\") return undefined;\n  const record = params as Record<string, unknown>;\n  const direct = record.sessionId ?? record.session_id;\n  if (typeof direct === \"string\" && direct) return direct;\n  const session = record.session as Record<string, unknown> | undefined;\n  if (typeof session?.id === \"string\" && session.id) return session.id;\n  return undefined;\n}\n\nfunction modelArgs(args: string[], model: string | undefined, enabled = true): string[] {\n  if (!enabled || !model || model === \"default\") return args;\n  return [...args, \"--model\", model];\n}\n\nfunction stringValue(value: unknown): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n\nexport function permissionOutcome(optionId: string): {\n  outcome: { outcome: \"selected\"; optionId: string };\n} {\n  return { outcome: { outcome: \"selected\", optionId } };\n}\n\nexport function selectPermissionOption(params: unknown, preferAllow = true): string {\n  const options = Array.isArray((params as { options?: unknown } | undefined)?.options)\n    ? ((params as { options: Array<{ optionId?: unknown }> }).options)\n    : [];\n  if (!preferAllow) {\n    const deny = options.find((option) => {\n      const optionId = String(option.optionId ?? \"\");\n      return /reject|deny|no|cancel/i.test(optionId);\n    });\n    return String(deny?.optionId ?? options[0]?.optionId ?? \"reject\");\n  }\n  const allowed = options.find((option) => {\n    const optionId = String(option.optionId ?? \"\");\n    return /allow|approve|yes|accept/i.test(optionId);\n  });\n  return String(allowed?.optionId ?? options[0]?.optionId ?? \"allow-once\");\n}\n", "import type { RuntimeEvent } from \"./adapter\";\n\nexport interface ClaudeStreamJsonParseResult {\n  sessionId?: string;\n  model?: string;\n  finalMessage?: string;\n  appendFinalMessage?: string;\n  events: RuntimeEvent[];\n  turnFinished: boolean;\n}\n\nexport function parseClaudeStreamJsonLine(line: string): ClaudeStreamJsonParseResult | undefined {\n  if (!line.trim()) return undefined;\n  let message: unknown;\n  try {\n    message = JSON.parse(line);\n  } catch {\n    return undefined;\n  }\n\n  const msg = message as Record<string, unknown>;\n  const result: ClaudeStreamJsonParseResult = {\n    events: [],\n    turnFinished: false,\n  };\n\n  switch (msg.type) {\n    case \"system\": {\n      if (msg.subtype === \"init\") {\n        result.sessionId = stringValue(msg.session_id);\n        result.model = stringValue(msg.model);\n        result.events.push({\n          type: \"runtime_started\",\n          data: { runtime: \"claude\", sessionId: result.sessionId, model: result.model },\n        });\n      } else if (msg.subtype === \"status\" && msg.status === \"compacting\") {\n        result.events.push({ type: \"compaction_started\" });\n      } else if (msg.subtype === \"compact_boundary\") {\n        result.events.push({ type: \"compaction_finished\" });\n      }\n      break;\n    }\n    case \"stream_event\": {\n      const event = msg.event as Record<string, unknown> | undefined;\n      if (event?.type === \"content_block_delta\") {\n        const delta = event.delta as Record<string, unknown> | undefined;\n        if (delta?.type === \"text_delta\" && typeof delta.text === \"string\") {\n          result.appendFinalMessage = delta.text;\n          result.events.push({ type: \"assistant_delta\", content: delta.text, data: delta });\n        }\n        if (delta?.type === \"thinking_delta\" && typeof delta.thinking === \"string\") {\n          result.events.push({ type: \"thinking_delta\", content: delta.thinking, data: delta });\n        }\n      }\n      break;\n    }\n    case \"assistant\": {\n      const text = contentBlocks(msg.message)\n        .filter((block) => block.type === \"text\" && typeof block.text === \"string\")\n        .map((block) => String(block.text))\n        .join(\"\");\n      if (text) result.finalMessage = text;\n      for (const block of contentBlocks(msg.message)) {\n        if (block.type === \"tool_use\") {\n          result.events.push({\n            type: \"tool_start\",\n            content: stringValue(block.name) ?? \"\",\n            data: { id: block.id, name: block.name, input: block.input },\n          });\n        }\n      }\n      break;\n    }\n    case \"user\": {\n      if (msg.isSynthetic) {\n        for (const block of contentBlocks(msg.message)) {\n          if (block.type === \"tool_result\") {\n            result.events.push({ type: \"tool_result\", data: block });\n          }\n        }\n      }\n      break;\n    }\n    case \"tool_progress\": {\n      result.events.push({ type: \"tool_progress\", data: msg });\n      break;\n    }\n    case \"result\": {\n      result.turnFinished = true;\n      result.events.push({\n        type: \"turn_finished\",\n        data: {\n          cost: msg.total_cost_usd,\n          duration: msg.duration_ms,\n          usage: msg.usage,\n        },\n      });\n      break;\n    }\n  }\n\n  return result;\n}\n\nexport function claudeStreamJsonPromptMessage(prompt: string): string {\n  return JSON.stringify({\n    type: \"user\",\n    message: {\n      role: \"user\",\n      content: [{ type: \"text\", text: prompt }],\n    },\n  });\n}\n\nfunction contentBlocks(message: unknown): Array<Record<string, unknown>> {\n  const msg = message as { content?: unknown } | undefined;\n  return Array.isArray(msg?.content)\n    ? msg.content.filter((block): block is Record<string, unknown> =>\n        typeof block === \"object\" && block !== null\n      )\n    : [];\n}\n\nfunction stringValue(value: unknown): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n", "import { createHash } from \"node:crypto\";\nimport type {\n  PersistentRuntimeAdapter,\n  RuntimeAdapter,\n  RuntimeEvent,\n  RuntimePromptInput,\n  RuntimeRunInput,\n  RuntimeRunResult,\n  RuntimeStartInput,\n} from \"./adapter\";\nimport {\n  classifyProtocolError,\n  withTimeout,\n} from \"./acp-adapter\";\nimport {\n  JsonRpcStdioClient,\n  type JsonRpcNotification,\n  type JsonRpcServerRequest,\n  type JsonRpcStdioClientOptions,\n} from \"./json-rpc-stdio-client\";\n\nconst DEFAULT_TURN_TIMEOUT_MS = 300_000;\nconst MAX_EARLY_TURN_IDS = 64;\nconst MAX_EARLY_NOTIFICATIONS_PER_TURN = 256;\n\nexport interface CodexJsonRpcClient {\n  start(): void;\n  request(method: string, params?: unknown): Promise<unknown>;\n  destroy(): void;\n  readonly isRunning?: boolean;\n  readonly alive?: boolean;\n  readonly pid?: number;\n}\n\nexport type CodexClientFactory = (\n  options: JsonRpcStdioClientOptions\n) => CodexJsonRpcClient;\n\nconst DEFAULT_CODEX_CLIENT_FACTORY: CodexClientFactory = (options) =>\n  new JsonRpcStdioClient(options);\n\ninterface ActiveCodexTurn {\n  runInput: RuntimeRunInput;\n  events: RuntimeEvent[];\n  appendMessage(text: string): void;\n  setFinalMessage(text: string): void;\n  resolveTurnCompleted(completion: CodexTurnCompletion): void;\n  rejectTurn(error: Error): void;\n}\n\ninterface CodexTurnCompletion {\n  status?: string;\n  error?: {\n    message?: string;\n    additionalDetails?: string | null;\n  } | null;\n}\n\nexport class CodexAdapter implements RuntimeAdapter, PersistentRuntimeAdapter {\n  readonly runtime = \"codex\" as const;\n  private host: CodexSharedHost | null = null;\n  private threadId: string | undefined;\n  private startInput: RuntimeStartInput | null = null;\n  private activeTurn: ActiveCodexTurn | null = null;\n  private activeTurnId: string | undefined;\n  onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n  constructor(\n    private readonly clientFactory: CodexClientFactory = DEFAULT_CODEX_CLIENT_FACTORY\n  ) {}\n\n  async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n    try {\n      await this.start(input);\n      return await this.prompt({\n        prompt: input.prompt,\n        timeoutMs: input.timeoutMs,\n        abortSignal: input.abortSignal,\n      });\n    } finally {\n      await this.destroy(\"compat run complete\");\n    }\n  }\n\n  async start(input: RuntimeStartInput): Promise<void> {\n    try {\n      if (this.host && this.alive && this.threadId) return;\n      this.startInput = input;\n      this.threadId = undefined;\n      this.host = CodexSharedHostPool.acquire(input, this.clientFactory, this);\n      this.host.setStderrSink(this, input.onEvent);\n      await this.host.ensureStarted(input);\n\n      emit([], this.startInputAsRunInput(\"\"), { type: \"runtime_started\", data: { runtime: \"codex\" } });\n\n      if (input.runtimeSessionId) {\n        await withTimeout(\n          this.host.request(\"thread/resume\", {\n            threadId: input.runtimeSessionId,\n            cwd: codexRuntimeCwd(input),\n            ...codexPermissionOptions(input.permissionMode),\n            approvalsReviewer: \"user\",\n            developerInstructions: input.systemPrompt,\n            model: input.model && input.model !== \"default\" ? input.model : undefined,\n            config: codexReasoningConfig(input.reasoningEffort),\n            excludeTurns: true,\n            persistExtendedHistory: true,\n          }),\n          input.timeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n          \"Codex thread resume timeout\"\n        );\n        this.threadId = input.runtimeSessionId;\n      } else {\n        const response = (await withTimeout(\n          this.host.request(\"thread/start\", {\n            cwd: codexRuntimeCwd(input),\n            ...codexPermissionOptions(input.permissionMode),\n            approvalsReviewer: \"user\",\n            developerInstructions: input.systemPrompt,\n            model: input.model && input.model !== \"default\" ? input.model : undefined,\n            config: codexReasoningConfig(input.reasoningEffort),\n            persistExtendedHistory: true,\n            serviceName: \"wm-daemon\",\n          }),\n          input.timeoutMs ?? DEFAULT_TURN_TIMEOUT_MS,\n          \"Codex thread start timeout\"\n        )) as { thread?: { id?: string } };\n        this.threadId = response.thread?.id;\n        if (!this.threadId) throw new Error(\"Codex thread/start returned no thread id\");\n      }\n    } catch (error) {\n      this.destroy(\"start failed\");\n      throw error;\n    }\n  }\n\n  async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n    const events: RuntimeEvent[] = [];\n    let finalMessage = \"\";\n    let turnId: string | undefined;\n    let resolveTurnCompleted: ((completion: CodexTurnCompletion) => void) | undefined;\n    const turnCompleted = new Promise<CodexTurnCompletion>((resolve) => {\n      resolveTurnCompleted = resolve;\n    });\n    let rejectTurn: ((reason: Error) => void) | undefined;\n    const turnFailed = new Promise<never>((_, reject) => {\n      rejectTurn = reject;\n    });\n    const host = this.host;\n    const threadId = this.threadId;\n    const startInput = this.startInput;\n    let turnCancelled = false;\n    let rejectAborted: ((reason: Error) => void) | undefined;\n    const aborted = new Promise<never>((_, reject) => {\n      rejectAborted = reject;\n    });\n    const abortHandler = () => {\n      if (turnCancelled) return;\n      turnCancelled = true;\n      if (this.activeTurnId) host?.interruptTurn(threadId ?? \"\", this.activeTurnId);\n      rejectAborted?.(new Error(\"Runtime aborted\"));\n    };\n\n    if (!host || !this.alive || !threadId || !startInput) {\n      return {\n        status: \"runtime_error\",\n        finalMessage,\n        events,\n        errorMessage: \"Codex persistent runtime is not started\",\n      };\n    }\n\n    const runInput = this.startInputAsRunInput(input.prompt, input);\n    try {\n      if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n      input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n      const turnTimeoutMs = input.timeoutMs ?? DEFAULT_TURN_TIMEOUT_MS;\n      const turnDeadline = Date.now() + turnTimeoutMs;\n      this.activeTurn = {\n        runInput,\n        events,\n        appendMessage: (text) => {\n          finalMessage += text;\n        },\n        setFinalMessage: (text) => {\n          finalMessage = text;\n        },\n        resolveTurnCompleted: (completion) => resolveTurnCompleted?.(completion),\n        rejectTurn: (error) => rejectTurn?.(error),\n      };\n\n      const turnStarted = withTimeout(\n        host.startTurn(\n          this,\n          {\n            threadId,\n            cwd: codexRuntimeCwd(startInput),\n            ...codexPermissionOptions(startInput.permissionMode),\n            approvalsReviewer: \"user\",\n            input: [{ type: \"text\", text: input.prompt, text_elements: [] }],\n          },\n          {\n            threadId,\n            isCancelled: () => turnCancelled,\n            onTurnId: (nextTurnId) => {\n              turnId = nextTurnId;\n              this.activeTurnId = nextTurnId;\n            },\n          }\n        ),\n        turnTimeoutMs,\n        \"Codex turn timeout\"\n      );\n      await (input.abortSignal\n        ? Promise.race([turnStarted, aborted, turnFailed])\n        : Promise.race([turnStarted, turnFailed]));\n      emit(events, runInput, { type: \"task_delivered\", content: input.prompt });\n\n      const turnCompletion = withTimeout(\n        turnCompleted,\n        Math.max(1, turnDeadline - Date.now()),\n        \"Codex turn timeout\"\n      );\n      const completion = await (input.abortSignal\n        ? Promise.race([turnCompletion, aborted, turnFailed])\n        : Promise.race([turnCompletion, turnFailed]));\n      const completionStatus = completion.status ?? (completion.error ? \"failed\" : \"completed\");\n      emit(events, runInput, {\n        type: \"turn_finished\",\n        data: { threadId, turnId, status: completionStatus, error: completion.error ?? null },\n      });\n\n      if (completionStatus !== \"completed\") {\n        return {\n          status: \"runtime_error\",\n          finalMessage,\n          runtimeSessionId: threadId,\n          events,\n          errorMessage: codexTurnErrorMessage(completionStatus, completion.error),\n        };\n      }\n\n      return {\n        status: \"ok\",\n        finalMessage,\n        runtimeSessionId: threadId,\n        events,\n      };\n    } catch (error) {\n      turnCancelled = true;\n      if (error instanceof Error && error.message === \"Codex turn timeout\") {\n        if (this.activeTurnId) host.interruptTurn(threadId, this.activeTurnId);\n        this.destroy(\"turn timeout\");\n      }\n      return {\n        status: classifyProtocolError(error),\n        finalMessage,\n        runtimeSessionId: threadId,\n        events,\n        errorMessage: error instanceof Error ? error.message : String(error),\n      };\n    } finally {\n      input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n      this.activeTurn = null;\n      host?.clearTurn(this, turnId ?? this.activeTurnId);\n      this.activeTurnId = undefined;\n    }\n  }\n\n  get alive(): boolean {\n    return Boolean(this.host?.alive);\n  }\n\n  get pid(): number | undefined {\n    return this.host?.pid;\n  }\n\n  destroy(_reason?: string): void {\n    this.activeTurn = null;\n    this.host?.clearTurn(this, this.activeTurnId);\n    this.host?.release(this);\n    this.host = null;\n    this.threadId = undefined;\n    this.activeTurnId = undefined;\n  }\n\n  routeNotification(notification: JsonRpcNotification): void {\n    const active = this.activeTurn;\n    if (!active) return;\n    this.handleNotification(notification, active.events, active.runInput, {\n      appendMessage: active.appendMessage,\n      setFinalMessage: active.setFinalMessage,\n    });\n    if (notification.method === \"turn/completed\") {\n      active.resolveTurnCompleted(codexTurnCompletion(notification));\n    }\n  }\n\n  handleHostExit(host: CodexSharedHost, code: number | null, signal: NodeJS.Signals | null): void {\n    if (this.host !== host) return;\n    this.activeTurn?.rejectTurn(new Error(`Codex app-server exited code=${code ?? \"-\"} signal=${signal ?? \"-\"}`));\n    this.host = null;\n    this.threadId = undefined;\n    this.activeTurnId = undefined;\n    host.release(this);\n  }\n\n  private startInputAsRunInput(prompt: string, input: Partial<RuntimePromptInput> = {}): RuntimeRunInput {\n    const startInput = this.startInput;\n    if (!startInput) {\n      throw new Error(\"Codex persistent runtime is not started\");\n    }\n    return {\n      ...startInput,\n      prompt,\n      timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n      abortSignal: input.abortSignal,\n    };\n  }\n\n  private handleNotification(\n    notification: JsonRpcNotification,\n    events: RuntimeEvent[],\n    input: RuntimeRunInput,\n    final: { appendMessage(text: string): void; setFinalMessage(text: string): void }\n  ): void {\n    const params = notification.params as Record<string, unknown> | undefined;\n    switch (notification.method) {\n      case \"item/agentMessage/delta\": {\n        const delta = String(params?.delta ?? \"\");\n        if (delta) {\n          final.appendMessage(delta);\n          emit(events, input, {\n            type: \"assistant_delta\",\n            content: delta,\n            data: params,\n          });\n        }\n        break;\n      }\n      case \"item/reasoning/textDelta\":\n      case \"item/reasoning/summaryTextDelta\": {\n        const delta = String(params?.delta ?? \"\");\n        if (delta) {\n          emit(events, input, {\n            type: \"thinking_delta\",\n            content: delta,\n            data: params,\n          });\n        }\n        break;\n      }\n      case \"item/started\": {\n        emit(events, input, { type: \"tool_start\", data: params });\n        break;\n      }\n      case \"item/completed\": {\n        const item = params?.item as Record<string, unknown> | undefined;\n        if (item?.type === \"agentMessage\" && typeof item.text === \"string\") {\n          final.setFinalMessage(item.text);\n          emit(events, input, {\n            type: \"assistant_result\",\n            content: item.text,\n            data: item,\n          });\n        } else {\n          emit(events, input, { type: \"tool_result\", data: params });\n        }\n        break;\n      }\n      case \"item/commandExecution/outputDelta\":\n      case \"item/fileChange/outputDelta\": {\n        emit(events, input, {\n          type: \"tool_progress\",\n          content: String(params?.delta ?? \"\"),\n          data: params,\n        });\n        break;\n      }\n      case \"thread/tokenUsage/updated\": {\n        emit(events, input, { type: \"usage_update\", data: params });\n        break;\n      }\n      default: {\n        events.push({ type: notification.method, data: params });\n      }\n    }\n  }\n\n  private async handleServerRequest(request: JsonRpcServerRequest): Promise<unknown> {\n    // Codex app-server approval + workspace sandbox currently blocks agent-local\n    // platform wrapper commands from reaching the daemon/server proxy. Match the\n    // Slock-style runner for now: do not bridge Codex approvals to platform Inbox.\n    // Other runtime adapters keep their own permission behavior.\n    return autoDecisionForCodexRequest(request.method, true);\n  }\n}\n\nclass CodexSharedHost {\n  private client: CodexJsonRpcClient | null = null;\n  private initializePromise: Promise<void> | null = null;\n  private readonly adapters = new Set<CodexAdapter>();\n  private readonly turnOwners = new Map<string, CodexAdapter>();\n  private readonly pendingTurnOwners = new Set<CodexAdapter>();\n  private readonly earlyTurnNotifications = new Map<string, JsonRpcNotification[]>();\n  private readonly stderrSinks = new Map<CodexAdapter, RuntimeStartInput[\"onEvent\"]>();\n  private released = false;\n\n  constructor(\n    readonly key: string,\n    private readonly factory: CodexClientFactory,\n    private readonly onEmpty: (host: CodexSharedHost) => void\n  ) {}\n\n  addAdapter(adapter: CodexAdapter): void {\n    this.adapters.add(adapter);\n  }\n\n  setStderrSink(adapter: CodexAdapter, sink: RuntimeStartInput[\"onEvent\"]): void {\n    this.stderrSinks.set(adapter, sink);\n  }\n\n  async ensureStarted(input: RuntimeStartInput): Promise<void> {\n    if (this.client && this.alive && this.initializePromise) {\n      await this.initializePromise;\n      return;\n    }\n    let client!: CodexJsonRpcClient;\n    client = this.factory({\n      command: \"codex\",\n      args: [\"app-server\", \"--listen\", \"stdio://\"],\n      cwd: input.cwd,\n      env: input.env,\n      employeeId: input.aiEmployeeId,\n      executionBackend: input.executionBackend,\n      onNotification: (notification) => this.routeNotification(notification),\n      onServerRequest: async (request) => autoDecisionForCodexRequest(request.method, true),\n      onStderr: (text) => this.routeStderr(text),\n      onExit: (code, signal) => {\n        if (this.client !== client) return;\n        const adapters = [...this.adapters];\n        this.client = null;\n        this.initializePromise = null;\n        for (const adapter of adapters) adapter.handleHostExit(this, code, signal);\n        for (const adapter of adapters) adapter.onExit?.(code, signal);\n      },\n    });\n    this.client = client;\n    client.start();\n    this.initializePromise = withTimeout(\n      client.request(\"initialize\", {\n        clientInfo: {\n          name: \"wm-daemon\",\n          title: \"NiuMa Daemon\",\n          version: \"0.0.1\",\n        },\n        capabilities: { experimentalApi: true },\n      }),\n      10000,\n      \"Codex initialize timeout\"\n    ).then(() => undefined);\n    await this.initializePromise;\n  }\n\n  request(method: string, params?: unknown): Promise<unknown> {\n    if (!this.client || !this.alive) throw new Error(\"Codex shared app-server is not started\");\n    return this.client.request(method, params);\n  }\n\n  async startTurn(\n    adapter: CodexAdapter,\n    params: unknown,\n    options: {\n      threadId: string;\n      isCancelled(): boolean;\n      onTurnId(turnId: string | undefined): void;\n    }\n  ): Promise<unknown> {\n    try {\n      if (options.isCancelled()) throw new Error(\"Runtime aborted\");\n      this.pendingTurnOwners.add(adapter);\n      const response = (await this.request(\"turn/start\", params)) as { turn?: { id?: string } } | undefined;\n      const turnId = response?.turn?.id;\n      if (options.isCancelled()) {\n        if (turnId) this.earlyTurnNotifications.delete(turnId);\n        this.interruptTurn(options.threadId, turnId);\n        return response;\n      }\n      options.onTurnId(turnId);\n      this.bindTurn(adapter, turnId);\n      return response;\n    } finally {\n      this.pendingTurnOwners.delete(adapter);\n    }\n  }\n\n  interruptTurn(threadId: string, turnId: string | undefined): void {\n    const client = this.client;\n    if (!client || !this.alive || !threadId || !turnId) return;\n    try {\n      void client.request(\"turn/interrupt\", { threadId, turnId }).catch(() => undefined);\n    } catch {\n      // The turn is already aborting; a closed client needs no further action.\n    }\n  }\n\n  private bindTurn(adapter: CodexAdapter, turnId: string | undefined): void {\n    this.pendingTurnOwners.delete(adapter);\n    if (!turnId) return;\n    this.turnOwners.set(turnId, adapter);\n    const earlyNotifications = this.earlyTurnNotifications.get(turnId);\n    this.earlyTurnNotifications.delete(turnId);\n    for (const notification of earlyNotifications ?? []) {\n      adapter.routeNotification(notification);\n    }\n  }\n\n  clearTurn(adapter: CodexAdapter, turnId: string | undefined): void {\n    this.pendingTurnOwners.delete(adapter);\n    if (turnId && this.turnOwners.get(turnId) === adapter) {\n      this.turnOwners.delete(turnId);\n    }\n    if (turnId) this.earlyTurnNotifications.delete(turnId);\n  }\n\n  release(adapter: CodexAdapter): void {\n    this.adapters.delete(adapter);\n    this.stderrSinks.delete(adapter);\n    this.pendingTurnOwners.delete(adapter);\n    for (const [turnId, owner] of [...this.turnOwners.entries()]) {\n      if (owner === adapter) this.turnOwners.delete(turnId);\n    }\n    if (this.adapters.size > 0) return;\n    this.destroy();\n    this.onEmpty(this);\n  }\n\n  get alive(): boolean {\n    return Boolean(this.client && (this.client.alive ?? this.client.isRunning ?? true));\n  }\n\n  get pid(): number | undefined {\n    return this.client?.pid;\n  }\n\n  destroy(): void {\n    if (this.released) return;\n    this.released = true;\n    this.client?.destroy();\n    this.client = null;\n    this.turnOwners.clear();\n    this.pendingTurnOwners.clear();\n    this.earlyTurnNotifications.clear();\n    this.initializePromise = null;\n  }\n\n  private routeNotification(notification: JsonRpcNotification): void {\n    const turnId = codexNotificationTurnId(notification);\n    const owner = turnId ? this.turnOwners.get(turnId) : undefined;\n    if (owner) {\n      owner.routeNotification(notification);\n      return;\n    }\n    if (turnId) {\n      if (this.pendingTurnOwners.size > 0) {\n        let earlyNotifications = this.earlyTurnNotifications.get(turnId);\n        if (!earlyNotifications) {\n          if (this.earlyTurnNotifications.size >= MAX_EARLY_TURN_IDS) {\n            const oldestTurnId = this.earlyTurnNotifications.keys().next().value;\n            if (oldestTurnId) this.earlyTurnNotifications.delete(oldestTurnId);\n          }\n          earlyNotifications = [];\n        }\n        if (earlyNotifications.length >= MAX_EARLY_NOTIFICATIONS_PER_TURN) {\n          earlyNotifications.shift();\n        }\n        earlyNotifications.push(notification);\n        this.earlyTurnNotifications.set(turnId, earlyNotifications);\n      }\n      return;\n    }\n    if (this.pendingTurnOwners.size === 1) {\n      for (const pending of this.pendingTurnOwners) {\n        pending.routeNotification(notification);\n        return;\n      }\n    }\n    const activeOwners = new Set(this.turnOwners.values());\n    if (!turnId && activeOwners.size === 1) {\n      for (const active of activeOwners) {\n        active.routeNotification(notification);\n        return;\n      }\n    }\n  }\n\n  private routeStderr(text: string): void {\n    const filtered = filterCodexStderr(text);\n    if (!filtered) return;\n    for (const sink of this.stderrSinks.values()) {\n      sink?.({ type: \"runtime_stderr\", content: filtered });\n    }\n  }\n}\n\nclass CodexSharedHostPool {\n  private static readonly hosts = new Map<string, CodexSharedHost>();\n  private static readonly factoryIds = new WeakMap<CodexClientFactory, number>();\n  private static nextFactoryId = 1;\n\n  static acquire(input: RuntimeStartInput, factory: CodexClientFactory, adapter: CodexAdapter): CodexSharedHost {\n    const key = this.keyFor(input, factory);\n    let host = this.hosts.get(key);\n    if (!host) {\n      host = new CodexSharedHost(key, factory, (emptyHost) => {\n        if (this.hosts.get(emptyHost.key) === emptyHost) this.hosts.delete(emptyHost.key);\n      });\n      this.hosts.set(key, host);\n    }\n    host.addAdapter(adapter);\n    return host;\n  }\n\n  private static keyFor(input: RuntimeStartInput, factory: CodexClientFactory): string {\n    let factoryId = this.factoryIds.get(factory);\n    if (!factoryId) {\n      factoryId = this.nextFactoryId;\n      this.nextFactoryId += 1;\n      this.factoryIds.set(factory, factoryId);\n    }\n    const backend = input.executionBackend?.kind ?? \"host\";\n    return [\n      `factory:${factoryId}`,\n      `employee:${input.aiEmployeeId}`,\n      `cwd:${input.cwd}`,\n      `runtimeCwd:${input.runtimeCwd ?? \"\"}`,\n      `backend:${backend}`,\n      `env:${codexRuntimeEnvIdentity(input.env ?? process.env)}`,\n    ].join(\"|\");\n  }\n}\n\nfunction codexRuntimeEnvIdentity(env: NodeJS.ProcessEnv): string {\n  const entries = Object.entries(env)\n    .filter((entry): entry is [string, string] => entry[1] !== undefined)\n    .sort(([left], [right]) => left.localeCompare(right));\n  return createHash(\"sha256\").update(JSON.stringify(entries)).digest(\"hex\");\n}\n\nfunction autoDecisionForCodexRequest(method: string, approved: boolean): unknown {\n  if (method === \"item/permissions/requestApproval\") {\n    return approved\n      ? { permissions: {}, scope: \"turn\" }\n      : { permissions: null, scope: \"turn\" };\n  }\n  if (method === \"execCommandApproval\" || method === \"applyPatchApproval\") {\n    return { decision: approved ? \"approved\" : \"denied\" };\n  }\n  if (method === \"item/commandExecution/requestApproval\") {\n    return { decision: approved ? \"accept\" : \"decline\" };\n  }\n  if (method === \"item/fileChange/requestApproval\") {\n    return { decision: approved ? \"accept\" : \"reject\" };\n  }\n  if (isApprovalLikeRequest(method)) {\n    return { decision: approved ? \"accept\" : \"decline\" };\n  }\n  return {};\n}\n\nfunction isApprovalLikeRequest(method: string): boolean {\n  return /approval|permission/i.test(method);\n}\n\nfunction codexPermissionOptions(permissionMode: RuntimeRunInput[\"permissionMode\"]): { approvalPolicy: string; sandbox: string } {\n  return { approvalPolicy: \"never\", sandbox: permissionMode === \"read_only\" ? \"read-only\" : \"danger-full-access\" };\n}\n\nfunction emit(events: RuntimeEvent[], input: RuntimeRunInput, event: RuntimeEvent): void {\n  events.push(event);\n  input.onEvent?.(event);\n}\n\nfunction codexReasoningConfig(reasoningEffort: string | undefined): { model_reasoning_effort: string } | undefined {\n  const value = reasoningEffort?.trim();\n  if (!value || value === \"default\") return undefined;\n  return { model_reasoning_effort: value };\n}\n\nfunction codexRuntimeCwd(input: Pick<RuntimeStartInput, \"cwd\" | \"runtimeCwd\">): string {\n  return input.runtimeCwd ?? input.cwd;\n}\n\nfunction codexNotificationTurnId(notification: JsonRpcNotification): string | undefined {\n  const params = notification.params as Record<string, unknown> | undefined;\n  const direct = params?.turnId ?? params?.turn_id;\n  if (typeof direct === \"string\" && direct) return direct;\n  const turn = params?.turn as Record<string, unknown> | undefined;\n  if (typeof turn?.id === \"string\" && turn.id) return turn.id;\n  const item = params?.item as Record<string, unknown> | undefined;\n  const itemTurn = item?.turn as Record<string, unknown> | undefined;\n  const itemDirect = item?.turnId ?? item?.turn_id;\n  if (typeof itemDirect === \"string\" && itemDirect) return itemDirect;\n  if (typeof itemTurn?.id === \"string\" && itemTurn.id) return itemTurn.id;\n  return undefined;\n}\n\nfunction codexTurnCompletion(notification: JsonRpcNotification): CodexTurnCompletion {\n  const params = notification.params as Record<string, unknown> | undefined;\n  const turn = params?.turn as Record<string, unknown> | undefined;\n  const error = turn?.error && typeof turn.error === \"object\"\n    ? turn.error as Record<string, unknown>\n    : undefined;\n  return {\n    status: typeof turn?.status === \"string\" ? turn.status : undefined,\n    error: error\n      ? {\n          message: typeof error.message === \"string\" ? error.message : undefined,\n          additionalDetails: typeof error.additionalDetails === \"string\" ? error.additionalDetails : undefined,\n        }\n      : null,\n  };\n}\n\nfunction codexTurnErrorMessage(\n  status: string,\n  error: CodexTurnCompletion[\"error\"]\n): string {\n  const message = error?.message?.trim();\n  const details = error?.additionalDetails?.trim();\n  if (message && details) return `${message}: ${details}`;\n  return message || details || `Codex turn ${status}`;\n}\n\nexport function filterCodexStderr(text: string): string {\n  const lines = text\n    .split(/\\r?\\n/)\n    .filter((line) => !isNoisyCodexStderrLine(line));\n  return lines.join(\"\\n\").trim();\n}\n\nfunction isNoisyCodexStderrLine(line: string): boolean {\n  const normalized = line.replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/g, \"\").trim();\n  if (!normalized) return true;\n  return (\n    /codex_core::util.*(?:ReasoningSummaryDelta|ReasoningSummaryPartAdded|OutputTextDelta) without active item/.test(normalized) ||\n    /codex_app_server.*Codex could not find bubblewrap/.test(normalized)\n  );\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\nimport type { JsonRpcServerRequest } from \"./json-rpc-stdio-client\";\n\nexport class CursorAcpAdapter extends AcpAdapter {\n  constructor() {\n    super({\n      runtime: \"cursor\",\n      command: \"cursor-agent\",\n      args: [\"acp\"],\n    });\n  }\n\n  protected override async handleServerRequest(\n    request: JsonRpcServerRequest\n  ): Promise<unknown> {\n    if (request.method === \"session/request_permission\") {\n      return super.handleServerRequest(request);\n    }\n    if (request.method === \"cursor/ask_question\") {\n      const params = request.params as { options?: Array<{ optionId?: string }> };\n      return { optionId: params.options?.[0]?.optionId ?? \"yes\" };\n    }\n    if (request.method === \"cursor/create_plan\") {\n      return { decision: \"approve\" };\n    }\n    return {};\n  }\n}\n", "import type { ChildProcess } from \"node:child_process\";\nimport type {\n  PersistentRuntimeAdapter,\n  RuntimeEvent,\n  RuntimePromptInput,\n  RuntimeRunInput,\n  RuntimeRunResult,\n  RuntimeStartInput,\n} from \"./adapter\";\nimport { classifyProtocolError } from \"./acp-adapter\";\nimport { hostBackend } from \"./execution-backend\";\n\nexport class AntigravityCliAdapter implements PersistentRuntimeAdapter {\n  readonly runtime = \"antigravity\" as const;\n  private startInput: RuntimeStartInput | null = null;\n  private child: ChildProcess | null = null;\n  private started = false;\n  private hasConversation = false;\n  private sessionId: string | undefined;\n  private lastTranscriptOutput = \"\";\n  onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n  async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n    try {\n      await this.start(input);\n      return await this.prompt({\n        prompt: input.prompt,\n        timeoutMs: input.timeoutMs,\n        abortSignal: input.abortSignal,\n      });\n    } finally {\n      this.destroy(\"compat run complete\");\n    }\n  }\n\n  async start(input: RuntimeStartInput): Promise<void> {\n    this.startInput = input;\n    this.started = true;\n    this.sessionId = input.runtimeSessionId || antigravitySessionId(input);\n  }\n\n  async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n    const startInput = this.startInput;\n    const events: RuntimeEvent[] = [];\n    let finalMessage = \"\";\n    if (!startInput || !this.started) {\n      return {\n        status: \"runtime_error\",\n        finalMessage,\n        events,\n        errorMessage: \"Antigravity CLI runtime is not started\",\n      };\n    }\n\n    const args = [\n      \"--print\",\n      input.prompt,\n      \"--print-timeout\",\n      formatTimeout(input.timeoutMs ?? startInput.timeoutMs ?? 300000),\n      \"--dangerously-skip-permissions\",\n    ];\n    if (this.hasConversation || startInput.runtimeSessionId) args.push(\"--continue\");\n    if (this.sessionId) args.push(\"--conversation\", this.sessionId);\n    if (startInput.model && startInput.model !== \"default\") args.push(\"--model\", startInput.model);\n\n    const runInput: RuntimeRunInput = {\n      ...startInput,\n      prompt: input.prompt,\n      timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n      abortSignal: input.abortSignal,\n    };\n\n    try {\n      events.push({ type: \"task_delivered\", content: input.prompt });\n      const result = await this.spawnOnce(args, runInput, input.abortSignal);\n      const transcriptOutput = result.stdout.trim();\n      finalMessage = this.extractDelta(transcriptOutput);\n      if (finalMessage) {\n        events.push({ type: \"assistant_result\", content: finalMessage });\n        runInput.onEvent?.({ type: \"assistant_result\", content: finalMessage });\n      }\n      this.hasConversation = true;\n      this.lastTranscriptOutput = transcriptOutput;\n      return { status: \"ok\", finalMessage, runtimeSessionId: this.sessionId, events };\n    } catch (error) {\n      return {\n        status: classifyProtocolError(error),\n        finalMessage,\n        runtimeSessionId: this.sessionId,\n        events,\n        errorMessage: error instanceof Error ? error.message : String(error),\n      };\n    }\n  }\n\n  get alive(): boolean {\n    return this.started;\n  }\n\n  get pid(): number | undefined {\n    return this.child?.pid;\n  }\n\n  destroy(_reason?: string): void {\n    this.started = false;\n    this.child?.kill(\"SIGTERM\");\n    this.child = null;\n  }\n\n  private spawnOnce(\n    args: string[],\n    runInput: RuntimeRunInput,\n    signal?: AbortSignal\n  ): Promise<{ stdout: string; stderr: string }> {\n    return new Promise((resolve, reject) => {\n      if (signal?.aborted) {\n        reject(new Error(\"Runtime aborted\"));\n        return;\n      }\n\n      const child = (runInput.executionBackend ?? hostBackend()).spawnRuntime({\n        command: \"agy\",\n        args,\n        cwd: runInput.cwd,\n        env: runInput.env ?? process.env,\n        employeeId: runInput.aiEmployeeId,\n        stdio: \"ignore-stdin\",\n        detached: process.platform !== \"win32\",\n      });\n      this.child = child;\n      let stdout = \"\";\n      let stderr = \"\";\n\n      const abort = () => {\n        child.kill(\"SIGTERM\");\n        reject(new Error(\"Runtime aborted\"));\n      };\n      signal?.addEventListener(\"abort\", abort, { once: true });\n\n      child.stdout.on(\"data\", (chunk) => {\n        stdout += chunk.toString();\n      });\n      child.stderr.on(\"data\", (chunk) => {\n        const text = chunk.toString();\n        stderr += text;\n        const content = text.trim();\n        if (content) runInput.onEvent?.({ type: \"runtime_stderr\", content });\n      });\n      child.on(\"error\", (error) => {\n        signal?.removeEventListener(\"abort\", abort);\n        this.child = null;\n        reject(error);\n      });\n      child.on(\"exit\", (code, signalName) => {\n        signal?.removeEventListener(\"abort\", abort);\n        this.child = null;\n        this.onExit?.(code, signalName);\n        if (code === 0) {\n          resolve({ stdout, stderr });\n        } else {\n          reject(new Error(stderr.trim() || stdout.trim() || `agy exited with code ${code}`));\n        }\n      });\n    });\n  }\n\n  private extractDelta(transcriptOutput: string): string {\n    if (!this.lastTranscriptOutput) return transcriptOutput;\n    if (!transcriptOutput.startsWith(this.lastTranscriptOutput)) return transcriptOutput;\n    return transcriptOutput.slice(this.lastTranscriptOutput.length).replace(/^\\s+/, \"\");\n  }\n}\n\nfunction formatTimeout(timeoutMs: number): string {\n  const seconds = Math.max(1, Math.ceil(timeoutMs / 1000));\n  return `${seconds}s`;\n}\n\nfunction antigravitySessionId(input: RuntimeStartInput): string {\n  const scope = input.runtimeSessionScope\n    ? `${input.runtimeSessionScope.type}:${input.runtimeSessionScope.id}`\n    : \"external:system:default\";\n  return `agy-${input.aiEmployeeId}-${stableScopeSuffix(scope)}`;\n}\n\nfunction stableScopeSuffix(value: string): string {\n  let hash = 2166136261;\n  for (let i = 0; i < value.length; i += 1) {\n    hash ^= value.charCodeAt(i);\n    hash = Math.imul(hash, 16777619);\n  }\n  return (hash >>> 0).toString(36);\n}\n", "import { AcpAdapter } from \"./acp-adapter\";\n\nexport class HermesAcpAdapter extends AcpAdapter {\n  constructor() {\n    super({\n      runtime: \"hermes\",\n      command: \"hermes\",\n      args: [\"acp\", \"--accept-hooks\"],\n    });\n  }\n}\n", "import type { ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport type {\n  PersistentRuntimeAdapter,\n  RuntimeEvent,\n  RuntimePromptInput,\n  RuntimeRunInput,\n  RuntimeRunResult,\n  RuntimeStartInput,\n} from \"./adapter\";\nimport { classifyProtocolError, withTimeout } from \"./acp-adapter\";\nimport { hostBackend } from \"./execution-backend\";\n\nconst DEFAULT_TURN_TIMEOUT_MS = 300_000;\n\nexport class KimiAdapter implements PersistentRuntimeAdapter {\n  readonly runtime = \"kimi\" as const;\n  private child: ChildProcessWithoutNullStreams | null = null;\n  private lines: readline.Interface | null = null;\n  private startInput: RuntimeStartInput | null = null;\n  private sessionId: string | undefined;\n  private active: {\n    runInput: RuntimeRunInput;\n    events: RuntimeEvent[];\n    promptRequestId?: string;\n    errorMessage?: string;\n    status?: RuntimeRunResult[\"status\"];\n    lastRetry?: KimiRetryInfo;\n    append(text: string): void;\n    set(text: string): void;\n    finish(): void;\n  } | null = null;\n  private nextId = 1;\n  onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n  async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n    try {\n      await this.start(input);\n      return await this.prompt({\n        prompt: input.prompt,\n        timeoutMs: input.timeoutMs,\n        abortSignal: input.abortSignal,\n      });\n    } finally {\n      this.destroy(\"compat run complete\");\n    }\n  }\n\n  async start(input: RuntimeStartInput): Promise<void> {\n    if (this.child && this.alive) return;\n    this.startInput = input;\n    this.sessionId = input.runtimeSessionId || kimiSessionId(input);\n    const wmDir = path.join(input.cwd, \".wm\");\n    await mkdir(wmDir, { recursive: true });\n    const agentFile = path.join(wmDir, \"kimi-agent.yaml\");\n    const systemPromptFile = path.join(wmDir, \"kimi-system.md\");\n    const mcpConfigFile = path.join(wmDir, \"kimi-mcp.json\");\n    await writeFile(systemPromptFile, input.systemPrompt, \"utf8\");\n    await writeFile(agentFile, kimiAgentYaml(), \"utf8\");\n    await writeFile(mcpConfigFile, JSON.stringify({ mcpServers: {} }, null, 2), \"utf8\");\n\n    const args = [\n      \"--wire\",\n      \"--yolo\",\n      \"--agent-file\",\n      agentFile,\n      \"--mcp-config-file\",\n      mcpConfigFile,\n      \"--session\",\n      this.sessionId,\n    ];\n    if (input.model && input.model !== \"default\") args.push(\"--model\", input.model);\n    this.child = (input.executionBackend ?? hostBackend()).spawnRuntime({\n      command: \"kimi\",\n      args,\n      cwd: input.cwd,\n      env: input.env ?? process.env,\n      employeeId: input.aiEmployeeId,\n      detached: process.platform !== \"win32\",\n    });\n    this.child.stderr.on(\"data\", (chunk) => {\n      const text = chunk.toString().trim();\n      if (text) input.onEvent?.({ type: \"runtime_stderr\", content: text });\n    });\n    this.child.on(\"exit\", (code, signal) => {\n      this.child = null;\n      this.onExit?.(code, signal);\n    });\n    this.child.on(\"error\", (error) => {\n      input.onEvent?.({ type: \"runtime_error\", content: error.message });\n    });\n    this.lines = readline.createInterface({ input: this.child.stdout });\n    this.lines.on(\"line\", (line) => this.handleLine(line));\n    this.writeWire(\"initialize\", {\n      protocol_version: \"1.10\",\n      client: { name: \"wm-daemon\", version: \"0.0.1\" },\n      capabilities: { supports_question: false, supports_plan_mode: false },\n    });\n  }\n\n  async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n    const startInput = this.startInput;\n    const child = this.child;\n    let finalMessage = \"\";\n    const events: RuntimeEvent[] = [];\n    if (!startInput || !child || !this.alive) {\n      return {\n        status: \"runtime_error\",\n        finalMessage,\n        events,\n        errorMessage: \"Kimi persistent runtime is not started\",\n      };\n    }\n    let finishTurn: (() => void) | undefined;\n    const turnFinished = new Promise<void>((resolve) => {\n      finishTurn = resolve;\n    });\n    const runInput: RuntimeRunInput = {\n      ...startInput,\n      prompt: input.prompt,\n      timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n      abortSignal: input.abortSignal,\n    };\n    const abortHandler = () => this.destroy(\"prompt aborted\");\n    this.active = {\n      runInput,\n      events,\n      append: (text) => {\n        finalMessage += text;\n      },\n      set: (text) => {\n        finalMessage = text;\n      },\n      finish: () => finishTurn?.(),\n    };\n    try {\n      if (input.abortSignal?.aborted) throw new Error(\"Runtime aborted\");\n      input.abortSignal?.addEventListener(\"abort\", abortHandler, { once: true });\n      events.push({ type: \"task_delivered\", content: input.prompt });\n      this.active.promptRequestId = this.writeWire(\"prompt\", { user_input: input.prompt });\n      await withTimeout(turnFinished, input.timeoutMs ?? DEFAULT_TURN_TIMEOUT_MS, \"Kimi wire turn timeout\");\n      if (this.active.errorMessage) {\n        return {\n          status: this.active.status ?? \"runtime_error\",\n          finalMessage,\n          runtimeSessionId: this.sessionId,\n          events,\n          errorMessage: this.active.errorMessage,\n        };\n      }\n      return { status: \"ok\", finalMessage, runtimeSessionId: this.sessionId, events };\n    } catch (error) {\n      return {\n        status: classifyProtocolError(error),\n        finalMessage,\n        runtimeSessionId: this.sessionId,\n        events,\n        errorMessage: error instanceof Error ? error.message : String(error),\n      };\n    } finally {\n      input.abortSignal?.removeEventListener(\"abort\", abortHandler);\n      this.active = null;\n    }\n  }\n\n  get alive(): boolean {\n    return Boolean(this.child && !this.child.killed);\n  }\n\n  get pid(): number | undefined {\n    return this.child?.pid;\n  }\n\n  destroy(_reason?: string): void {\n    this.active = null;\n    this.lines?.close();\n    this.lines = null;\n    killProcessTree(this.child);\n    this.child = null;\n  }\n\n  private writeWire(method: string, params: unknown): string {\n    const id = String(this.nextId++);\n    this.child?.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, method, params })}\\n`);\n    return id;\n  }\n\n  private handleLine(line: string): void {\n    const parsed = parseKimiWireLine(line);\n    if (!parsed) return;\n    const active = this.active;\n    const runInput = active?.runInput ?? (this.startInput ? { ...this.startInput, prompt: \"\" } : undefined);\n    if (!runInput) return;\n    if (parsed.errorMessage && active && parsed.id === active.promptRequestId) {\n      active.errorMessage = parsed.errorMessage;\n      active.status = \"runtime_error\";\n      active.events.push({ type: \"runtime_error\", content: parsed.errorMessage, data: parsed.data });\n      runInput.onEvent?.({ type: \"runtime_error\", content: parsed.errorMessage, data: parsed.data });\n      active.finish();\n      return;\n    }\n    if (active) {\n      if (parsed.retry) active.lastRetry = parsed.retry;\n      if (parsed.interrupted) {\n        active.status = \"runtime_error\";\n        active.errorMessage = kimiInterruptedMessage(active.lastRetry);\n      }\n      if (parsed.appendFinalMessage) active.append(parsed.appendFinalMessage);\n      if (parsed.finalMessage) active.set(parsed.finalMessage);\n      if (parsed.finished || parsed.events.some((event) => event.type === \"turn_finished\")) active.finish();\n      for (const event of parsed.events) {\n        active.events.push(event);\n        runInput.onEvent?.(event);\n      }\n    }\n  }\n}\n\ninterface ParsedKimiWireLine {\n  id?: string;\n  appendFinalMessage?: string;\n  finalMessage?: string;\n  finished?: boolean;\n  interrupted?: boolean;\n  retry?: KimiRetryInfo;\n  errorMessage?: string;\n  data?: unknown;\n  events: RuntimeEvent[];\n}\n\ninterface KimiRetryInfo {\n  errorType?: string;\n  statusCode?: number;\n}\n\nexport function parseKimiWireLine(line: string): ParsedKimiWireLine | undefined {\n  if (!line.trim()) return undefined;\n  let value: unknown;\n  try {\n    value = JSON.parse(line);\n  } catch {\n    return {\n      appendFinalMessage: `${line}\\n`,\n      events: [{ type: \"runtime_stdout\", content: line }],\n    };\n  }\n  const msg = value as Record<string, unknown>;\n  const id = typeof msg.id === \"string\" ? msg.id : undefined;\n  if (msg.error && typeof msg.error === \"object\") {\n    const error = msg.error as Record<string, unknown>;\n    return {\n      id,\n      errorMessage: typeof error.message === \"string\" ? error.message : \"Kimi wire request failed\",\n      data: msg,\n      events: [],\n    };\n  }\n  if (msg.result && typeof msg.result === \"object\") {\n    const result = msg.result as Record<string, unknown>;\n    const status = typeof result.status === \"string\" ? result.status : undefined;\n    return {\n      id,\n      finished: status === \"finished\" || status === \"cancelled\" || status === \"max_steps_reached\",\n      data: msg,\n      events: status\n        ? [{ type: \"turn_finished\", data: { runtime: \"kimi\", status, result } }]\n        : [{ type: \"runtime_started\", data: { runtime: \"kimi\", result } }],\n    };\n  }\n  if (msg.method !== \"event\" || !msg.params || typeof msg.params !== \"object\") {\n    return { id, events: [{ type: \"runtime_event\", data: msg, silent: true }] };\n  }\n  const params = msg.params as Record<string, unknown>;\n  const eventType = typeof params.type === \"string\" ? params.type : \"runtime_event\";\n  const payload = params.payload && typeof params.payload === \"object\" ? (params.payload as Record<string, unknown>) : {};\n  const text =\n    stringValue(payload.text) ??\n    stringValue(payload.content) ??\n    stringValue(payload.message) ??\n    stringValue((payload.delta as Record<string, unknown> | undefined)?.text);\n  if ((eventType === \"TextPart\" || eventType === \"ContentPart\") && text) {\n    return {\n      appendFinalMessage: text,\n      events: [{ type: \"assistant_delta\", content: text, data: msg }],\n    };\n  }\n  if (eventType === \"TurnEnd\") {\n    return { finished: true, events: [{ type: \"turn_finished\", data: msg }] };\n  }\n  if (eventType === \"ToolCallPart\") {\n    return { events: [] };\n  }\n  if (eventType === \"ToolCall\") {\n    return {\n      events: [{ type: \"tool_start\", content: text ?? stringValue(payload.name), data: msg }],\n    };\n  }\n  if (eventType === \"ToolResult\") {\n    return {\n      events: [{ type: \"tool_result\", content: text, data: msg }],\n    };\n  }\n  if (eventType === \"StepRetry\") {\n    return {\n      retry: kimiRetryInfo(payload),\n      events: [{ type: \"runtime_event\", content: text, data: msg, silent: true }],\n    };\n  }\n  if (eventType === \"StepInterrupted\") {\n    return {\n      interrupted: true,\n      events: [{ type: \"runtime_error\", content: \"Kimi step interrupted\", data: msg }],\n    };\n  }\n  const mappedType = kimiEventName(eventType);\n  return {\n    events: [{ type: mappedType, content: text, data: msg, silent: mappedType === \"runtime_event\" }],\n  };\n}\n\nfunction kimiEventName(eventType: string): string {\n  if (/begin|status|loading|retry|compaction|hook|notification/i.test(eventType)) return \"runtime_event\";\n  return eventType;\n}\n\nfunction kimiRetryInfo(payload: Record<string, unknown>): KimiRetryInfo {\n  const statusCode = typeof payload.status_code === \"number\" ? payload.status_code : undefined;\n  const errorType = typeof payload.error_type === \"string\" ? payload.error_type : undefined;\n  return { errorType, statusCode };\n}\n\nfunction kimiInterruptedMessage(retry?: KimiRetryInfo): string {\n  if (retry?.statusCode) {\n    const type = retry.errorType ? `${retry.errorType} ` : \"\";\n    return `Kimi step interrupted after ${type}${retry.statusCode}`;\n  }\n  return \"Kimi step interrupted\";\n}\n\nfunction stringValue(value: unknown): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n\nfunction kimiSessionId(input: RuntimeStartInput): string {\n  const scope = input.runtimeSessionScope\n    ? `${input.runtimeSessionScope.type}:${input.runtimeSessionScope.id}`\n    : \"external:system:default\";\n  return `wm-${input.aiEmployeeId}-${stableScopeSuffix(scope)}`;\n}\n\nfunction stableScopeSuffix(value: string): string {\n  let hash = 2166136261;\n  for (let i = 0; i < value.length; i += 1) {\n    hash ^= value.charCodeAt(i);\n    hash = Math.imul(hash, 16777619);\n  }\n  return (hash >>> 0).toString(36);\n}\n\nfunction kimiAgentYaml(): string {\n  return [\n    \"version: 1\",\n    \"agent:\",\n    \"  extend: default\",\n    \"  name: wm\",\n    \"  system_prompt_path: ./kimi-system.md\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction killProcessTree(child: ChildProcessWithoutNullStreams | null): void {\n  if (!child || child.killed) return;\n  if (process.platform === \"win32\") {\n    child.kill();\n    return;\n  }\n  if (child.pid) {\n    try {\n      process.kill(-child.pid, \"SIGTERM\");\n      setTimeout(() => {\n        try {\n          if (!child.killed) process.kill(-child.pid!, \"SIGKILL\");\n        } catch {\n          // Process already exited.\n        }\n      }, 5000).unref();\n      return;\n    } catch {\n      // Fall through.\n    }\n  }\n  child.kill();\n}\n", "import { mkdir, readFile, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ChildProcess } from \"node:child_process\";\nimport type {\n  PersistentRuntimeAdapter,\n  RuntimeEvent,\n  RuntimePromptInput,\n  RuntimeRunInput,\n  RuntimeRunResult,\n  RuntimeStartInput,\n} from \"./adapter\";\nimport { classifyProtocolError } from \"./acp-adapter\";\nimport { hostBackend } from \"./execution-backend\";\n\nexport class OpenCodeCliAdapter implements PersistentRuntimeAdapter {\n  readonly runtime = \"opencode\" as const;\n  private static globalOpenCodeQueue: Promise<void> = Promise.resolve();\n  private startInput: RuntimeStartInput | null = null;\n  private started = false;\n  private sessionId: string | undefined;\n  private child: ChildProcess | null = null;\n  onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n  async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n    try {\n      await this.start(input);\n      return await this.prompt({\n        prompt: input.prompt,\n        timeoutMs: input.timeoutMs,\n        abortSignal: input.abortSignal,\n      });\n    } finally {\n      this.destroy(\"compat run complete\");\n    }\n  }\n\n  async start(input: RuntimeStartInput): Promise<void> {\n    this.startInput = input;\n    this.started = true;\n    this.sessionId = input.runtimeSessionId;\n  }\n\n  async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n    const startInput = this.startInput;\n    const events: RuntimeEvent[] = [];\n    let finalMessage = \"\";\n    if (!startInput || !this.started) {\n      return {\n        status: \"runtime_error\",\n        finalMessage,\n        events,\n        errorMessage: \"OpenCode CLI runtime is not started\",\n      };\n    }\n\n    const existingSessionId = this.sessionId || startInput.runtimeSessionId;\n    const prompt = existingSessionId ? input.prompt : withStartupInstructions(startInput.systemPrompt, input.prompt);\n    const args = [\n      \"run\",\n      \"--format\",\n      \"json\",\n      \"--pure\",\n      \"--dangerously-skip-permissions\",\n      \"--dir\",\n      startInput.cwd,\n    ];\n    if (startInput.model && startInput.model !== \"default\") args.push(\"--model\", startInput.model);\n    if (existingSessionId) args.push(\"--session\", existingSessionId);\n    args.push(prompt);\n\n    const runInput: RuntimeRunInput = {\n      ...startInput,\n      prompt: input.prompt,\n      timeoutMs: input.timeoutMs ?? startInput.timeoutMs,\n      abortSignal: input.abortSignal,\n    };\n\n    try {\n      events.push({ type: \"task_delivered\", content: input.prompt });\n      const { sessionId, exported } = await OpenCodeCliAdapter.withGlobalOpenCodeLock(async () => {\n        const result = await this.spawnOnce(\"opencode\", args, runInput, input.abortSignal);\n        const sessionId = extractSessionId(result.stdout) || existingSessionId;\n        if (!sessionId) throw new Error(\"opencode run did not return a session id\");\n        const exported = await this.exportSessionToFile(sessionId, runInput, input.abortSignal);\n        return { sessionId, exported };\n      });\n      this.sessionId = sessionId;\n      finalMessage = extractLatestAssistantText(exported);\n      if (finalMessage) {\n        events.push({ type: \"assistant_result\", content: finalMessage });\n        runInput.onEvent?.({ type: \"assistant_result\", content: finalMessage });\n      }\n      return { status: \"ok\", finalMessage, runtimeSessionId: this.sessionId, events };\n    } catch (error) {\n      return {\n        status: classifyProtocolError(error),\n        finalMessage,\n        runtimeSessionId: this.sessionId,\n        events,\n        errorMessage: error instanceof Error ? error.message : String(error),\n      };\n    }\n  }\n\n  get alive(): boolean {\n    return this.started;\n  }\n\n  get pid(): number | undefined {\n    return this.child?.pid;\n  }\n\n  destroy(_reason?: string): void {\n    this.started = false;\n    this.child?.kill(\"SIGTERM\");\n    this.child = null;\n  }\n\n  private static async withGlobalOpenCodeLock<T>(task: () => Promise<T>): Promise<T> {\n    const previous = OpenCodeCliAdapter.globalOpenCodeQueue.catch(() => undefined);\n    let release!: () => void;\n    OpenCodeCliAdapter.globalOpenCodeQueue = new Promise<void>((resolve) => {\n      release = resolve;\n    });\n    await previous;\n    try {\n      return await task();\n    } finally {\n      release();\n    }\n  }\n\n  private spawnOnce(\n    command: string,\n    args: string[],\n    runInput: RuntimeRunInput,\n    signal?: AbortSignal\n  ): Promise<{ stdout: string; stderr: string }> {\n    return new Promise((resolve, reject) => {\n      if (signal?.aborted) {\n        reject(new Error(\"Runtime aborted\"));\n        return;\n      }\n\n      const child = (runInput.executionBackend ?? hostBackend()).spawnRuntime({\n        command,\n        args,\n        cwd: runInput.cwd,\n        env: runInput.env ?? process.env,\n        employeeId: runInput.aiEmployeeId,\n        stdio: \"ignore-stdin\",\n        detached: process.platform !== \"win32\",\n      });\n      this.child = child;\n      let stdout = \"\";\n      let stderr = \"\";\n      const timeoutMs = runInput.timeoutMs ?? 300000;\n      const timeout = setTimeout(() => {\n        child.kill(\"SIGTERM\");\n        reject(new Error(`opencode timed out after ${timeoutMs}ms`));\n      }, timeoutMs);\n\n      const abort = () => {\n        clearTimeout(timeout);\n        child.kill(\"SIGTERM\");\n        reject(new Error(\"Runtime aborted\"));\n      };\n      signal?.addEventListener(\"abort\", abort, { once: true });\n\n      child.stdout.on(\"data\", (chunk) => {\n        stdout += chunk.toString();\n      });\n      child.stderr.on(\"data\", (chunk) => {\n        const text = chunk.toString();\n        stderr += text;\n        const content = text.trim();\n        if (content) runInput.onEvent?.({ type: \"runtime_stderr\", content });\n      });\n      child.on(\"error\", (error) => {\n        clearTimeout(timeout);\n        signal?.removeEventListener(\"abort\", abort);\n        this.child = null;\n        reject(error);\n      });\n      child.on(\"exit\", (code, signalName) => {\n        this.onExit?.(code, signalName);\n      });\n      child.on(\"close\", (code, signalName) => {\n        clearTimeout(timeout);\n        signal?.removeEventListener(\"abort\", abort);\n        this.child = null;\n        if (code === 0) {\n          resolve({ stdout, stderr });\n        } else {\n          reject(new Error(stderr.trim() || stdout.trim() || `opencode exited with code ${code}`));\n        }\n      });\n    });\n  }\n\n  private async exportSessionToFile(sessionId: string, runInput: RuntimeRunInput, signal?: AbortSignal): Promise<string> {\n    const relativeDir = path.join(\".wm\", \"runtime-sessions\");\n    const relativePath = path.join(\n      relativeDir,\n      `opencode-export-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`\n    );\n    const hostPath = path.join(runInput.cwd, relativePath);\n    await mkdir(path.dirname(hostPath), { recursive: true });\n    try {\n      await this.spawnOnce(\"sh\", [\n        \"-lc\",\n        \"opencode export \\\"$1\\\" > \\\"$2\\\"\",\n        \"opencode-export\",\n        sessionId,\n        relativePath,\n      ], { ...runInput, prompt: \"\" }, signal);\n      return await readFile(hostPath, \"utf8\");\n    } finally {\n      await rm(hostPath, { force: true });\n    }\n  }\n}\n\nfunction withStartupInstructions(systemPrompt: string, prompt: string): string {\n  const trimmedSystem = systemPrompt.trim();\n  if (!trimmedSystem) return prompt;\n  return `System instructions:\\n${trimmedSystem}\\n\\nUser message:\\n${prompt}`;\n}\n\nfunction extractSessionId(stdout: string): string | undefined {\n  for (const line of stdout.split(/\\r?\\n/)) {\n    const trimmed = line.trim();\n    if (!trimmed) continue;\n    try {\n      const event = JSON.parse(trimmed) as { sessionID?: unknown; sessionId?: unknown };\n      const id = event.sessionID ?? event.sessionId;\n      if (typeof id === \"string\" && id) return id;\n    } catch {\n      // Ignore non-JSON progress lines.\n    }\n  }\n  return undefined;\n}\n\nfunction extractLatestAssistantText(stdout: string): string {\n  const jsonStart = stdout.indexOf(\"{\");\n  if (jsonStart === -1) return \"\";\n  const parsed = JSON.parse(stdout.slice(jsonStart)) as {\n    messages?: Array<{\n      info?: { role?: string };\n      role?: string;\n      parts?: Array<{ type?: string; text?: string }>;\n      content?: unknown;\n    }>;\n  };\n  const messages = parsed.messages ?? [];\n  for (let index = messages.length - 1; index >= 0; index -= 1) {\n    const message = messages[index];\n    const role = message?.info?.role ?? message?.role;\n    if (role !== \"assistant\") continue;\n    const partsText = (message.parts ?? [])\n      .filter((part) => part.type === \"text\" && typeof part.text === \"string\")\n      .map((part) => part.text?.trim() ?? \"\")\n      .filter(Boolean)\n      .join(\"\\n\");\n    if (partsText) return partsText;\n    if (typeof message.content === \"string\" && message.content.trim()) return message.content.trim();\n  }\n  return \"\";\n}\n", "import type { ChildProcess } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n  PersistentRuntimeAdapter,\n  RuntimeRunInput,\n  RuntimeEvent,\n  RuntimePromptInput,\n  RuntimeRunResult,\n  RuntimeRunStatus,\n  RuntimeStartInput,\n} from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\nimport { hostBackend } from \"./execution-backend\";\n\nexport class FakePersistentRuntimeAdapter implements PersistentRuntimeAdapter {\n  readonly runtime: RuntimeId;\n  private child: ChildProcess | null = null;\n  private startInput: RuntimeStartInput | null = null;\n  private spawnCount = 0;\n  private promptCount = 0;\n  private runtimeSessionId: string | undefined;\n  private oneShotRun = false;\n  onExit?: (code: number | null, signal: NodeJS.Signals | null) => void;\n\n  constructor(runtime: RuntimeId) {\n    this.runtime = runtime;\n  }\n\n  async run(input: RuntimeRunInput): Promise<RuntimeRunResult> {\n    this.oneShotRun = true;\n    try {\n      await this.start(input);\n      return await this.prompt({\n        prompt: input.prompt,\n        timeoutMs: input.timeoutMs,\n        abortSignal: input.abortSignal,\n      });\n    } finally {\n      this.destroy(\"compat fake runtime complete\");\n    }\n  }\n\n  async start(input: RuntimeStartInput): Promise<void> {\n    if (this.child && this.alive) return;\n    this.startInput = input;\n    this.spawnCount += 1;\n    this.promptCount = 0;\n    this.runtimeSessionId = input.runtimeSessionId || `${this.runtime}-fake-session`;\n    await mkdir(input.cwd, { recursive: true });\n    this.child = (input.executionBackend ?? hostBackend()).spawnRuntime({\n      command: \"node\",\n      args: [\"-e\", \"setInterval(() => {}, 1000)\"],\n      cwd: input.cwd,\n      env: input.env ?? process.env,\n      employeeId: input.aiEmployeeId,\n      stdio: \"ignore\",\n      detached: process.platform !== \"win32\",\n    });\n    this.child.unref();\n    this.child.on(\"exit\", (code, signal) => {\n      this.child = null;\n      this.onExit?.(code, signal);\n    });\n    input.onEvent?.({\n      type: \"runtime_started\",\n      data: { runtime: this.runtime, fake: true, pid: this.pid },\n    });\n    await this.writeDiagnostic();\n  }\n\n  async prompt(input: RuntimePromptInput): Promise<RuntimeRunResult> {\n    if (!this.startInput || !this.alive) {\n      return {\n        status: \"runtime_error\",\n        finalMessage: \"\",\n        events: [],\n        errorMessage: `${this.runtime} fake persistent runtime is not started`,\n      };\n    }\n    this.promptCount += 1;\n    await this.writeDiagnostic();\n    await sleep(fakePersistentRuntimeDelayMs(), input.abortSignal);\n    const events: RuntimeEvent[] = [];\n    const fakeStderr = process.env.WM_DAEMON_FAKE_RUNTIME_STDERR;\n    if (fakeStderr) events.push({ type: \"runtime_stderr\", content: fakeStderr });\n    if (process.env.WM_DAEMON_FAKE_RUNTIME_OMIT_ASSISTANT !== \"1\") {\n      events.push({ type: \"assistant_result\", content: `fake ${this.runtime} prompt ${this.promptCount}: ${input.prompt}` });\n    }\n    events.push({ type: \"turn_finished\", data: { fake: true, promptCount: this.promptCount } });\n    for (const event of events) {\n      this.startInput.onEvent?.(event);\n    }\n    await this.writeDiagnostic();\n    let fakeStatus = fakePersistentRuntimeStatus();\n    if (fakeStatus === \"stale_session_once\" && this.startInput.runtimeSessionId) {\n      const key = `${this.runtime}:${this.startInput.runtimeSessionId}`;\n      if (!staleSessionFailures.has(key)) {\n        staleSessionFailures.add(key);\n        return {\n          status: \"runtime_error\",\n          finalMessage: \"\",\n          runtimeSessionId: this.runtimeSessionId,\n          events,\n          errorMessage: `fake ${this.runtime} session ${this.startInput.runtimeSessionId} not found; resume failed`,\n        };\n      }\n    }\n    if (fakeStatus === \"stale_session_once\") fakeStatus = \"ok\";\n    const fakeFinalMessage = process.env.WM_DAEMON_FAKE_RUNTIME_FINAL_MESSAGE ?? \"\";\n    if (fakeStatus !== \"ok\") {\n      return {\n        status: fakeStatus,\n        finalMessage: fakeFinalMessage,\n        runtimeSessionId: this.runtimeSessionId,\n        events,\n        errorMessage: `fake ${this.runtime} ${fakeStatus}`,\n      };\n    }\n    return {\n      status: \"ok\",\n      finalMessage: `fake ${this.runtime} prompt ${this.promptCount}`,\n      runtimeSessionId: this.runtimeSessionId,\n      events,\n    };\n  }\n\n  get alive(): boolean {\n    return Boolean(this.child && !this.child.killed);\n  }\n\n  get pid(): number | undefined {\n    return this.child?.pid;\n  }\n\n  destroy(_reason?: string): void {\n    const child = this.child;\n    this.child = null;\n    if (!child || child.killed) return;\n    if (process.platform === \"win32\") {\n      child.kill();\n      return;\n    }\n    if (child.pid) {\n      try {\n        process.kill(-child.pid, \"SIGTERM\");\n        return;\n      } catch {\n        // Fall through.\n      }\n    }\n    child.kill(\"SIGTERM\");\n  }\n\n  private async writeDiagnostic(): Promise<void> {\n    if (!this.startInput) return;\n    const dir = path.join(this.startInput.cwd, \".wm\", \"runtime-sessions\");\n    await mkdir(dir, { recursive: true });\n    await writeFile(\n      path.join(dir, \"current.json\"),\n      `${JSON.stringify({\n        runtime: this.runtime,\n        aiEmployeeId: this.startInput.aiEmployeeId,\n        pid: this.pid,\n        spawnCount: this.spawnCount,\n        promptCount: this.promptCount,\n        lastPromptSeq: this.promptCount,\n        model: this.startInput.model ?? \"default\",\n        cwd: this.startInput.cwd,\n        persistent: !this.oneShotRun,\n      }, null, 2)}\\n`,\n      \"utf8\"\n    );\n  }\n}\n\nfunction fakePersistentRuntimeDelayMs(): number {\n  const raw = Number.parseInt(process.env.WM_DAEMON_FAKE_RUNTIME_DELAY_MS ?? \"\", 10);\n  return Number.isFinite(raw) && raw >= 0 ? raw : 10;\n}\n\nconst staleSessionFailures = new Set<string>();\n\nfunction fakePersistentRuntimeStatus(): RuntimeRunStatus | \"stale_session_once\" {\n  const raw = process.env.WM_DAEMON_FAKE_RUNTIME_STATUS;\n  if (\n    raw === \"ok\" ||\n    raw === \"not_installed\" ||\n    raw === \"not_logged_in\" ||\n    raw === \"unsupported_version\" ||\n    raw === \"timeout\" ||\n    raw === \"runtime_error\" ||\n    raw === \"stale_session_once\"\n  ) {\n    return raw;\n  }\n  return \"ok\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n  if (signal?.aborted) return Promise.reject(new Error(\"Fake persistent runtime aborted\"));\n  return new Promise((resolve, reject) => {\n    const timer = setTimeout(resolve, ms);\n    signal?.addEventListener(\"abort\", () => {\n      clearTimeout(timer);\n      reject(new Error(\"Fake persistent runtime aborted\"));\n    }, { once: true });\n  });\n}\n", "import { ClaudePersistentAdapter } from \"./claude-adapter\";\nimport { CodexAdapter } from \"./codex-adapter\";\nimport { CursorAcpAdapter } from \"./cursor-acp-adapter\";\nimport { AntigravityCliAdapter } from \"./antigravity-cli-adapter\";\nimport { HermesAcpAdapter } from \"./hermes-acp-adapter\";\nimport { KimiAdapter } from \"./kimi-adapter\";\nimport { OpenCodeCliAdapter } from \"./opencode-cli-adapter\";\nimport { FakePersistentRuntimeAdapter } from \"./fake-persistent-adapter\";\nimport type { PersistentRuntimeAdapter } from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\n\nexport interface PersistentRuntimeAdapterStatus {\n  runtime: RuntimeId;\n  available: boolean;\n  reason?: string;\n}\n\nexport function createPersistentRuntimeAdapter(runtime: RuntimeId): PersistentRuntimeAdapter | undefined {\n  if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n    return isPersistentRuntime(runtime) ? new FakePersistentRuntimeAdapter(runtime) : undefined;\n  }\n  switch (runtime) {\n    case \"codex\":\n      return new CodexAdapter();\n    case \"claude\":\n      return new ClaudePersistentAdapter();\n    case \"kimi\":\n      return new KimiAdapter();\n    case \"antigravity\":\n      return new AntigravityCliAdapter();\n    case \"cursor\":\n      return new CursorAcpAdapter();\n    case \"hermes\":\n      return new HermesAcpAdapter();\n    case \"opencode\":\n      return new OpenCodeCliAdapter();\n  }\n}\n\nfunction isPersistentRuntime(runtime: RuntimeId): boolean {\n  return runtime === \"codex\"\n    || runtime === \"claude\"\n    || runtime === \"kimi\"\n    || runtime === \"antigravity\"\n    || runtime === \"cursor\"\n    || runtime === \"hermes\"\n    || runtime === \"opencode\";\n}\n\nexport function persistentRuntimeAdapterStatus(runtime: RuntimeId): PersistentRuntimeAdapterStatus {\n  const adapter = createPersistentRuntimeAdapter(runtime);\n  return {\n    runtime,\n    available: adapter !== undefined,\n    reason: undefined,\n  };\n}\n", "import assert from \"node:assert/strict\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n  PersistentRuntimeAdapter,\n  RuntimeRunResult,\n  RuntimeRunStatus,\n} from \"../runtime/adapter\";\nimport type { RuntimeId } from \"../runtime/capabilities\";\nimport {\n  createAIEmployeeWorkspace,\n  type AIEmployeeRuntime,\n  type AIEmployeeWorkspace,\n} from \"../workspace/ai-employee-workspace\";\n\nconst smokePrompt = [\n  \"Create or update a file named wm-daemon-smoke.txt in the current working directory.\",\n  \"The file must contain exactly these 12 bytes with no trailing newline: WM_DAEMON_OK\",\n  \"Do not use `echo`; use a file write method that does not append a newline.\",\n  \"Also create or update `notes/smoke-memory.md` with one short sentence saying this workspace can write notes.\",\n  \"Then reply with exactly: WM_DAEMON_OK\",\n].join(\"\\n\");\n\nexport function buildAgentIdentityPrompt(aiEmployeeId: string, runtime: RuntimeId): string {\n  return [\n    \"\u4F60\u662F\u8C01\uFF1F\",\n    `\u8BF7\u57FA\u4E8E\u5E73\u53F0\u6CE8\u5165\u7684\u8EAB\u4EFD\u56DE\u7B54\uFF0C\u5FC5\u987B\u660E\u786E\u5305\u542B AIEmployee ID: ${aiEmployeeId}`,\n    `\u5E76\u660E\u786E\u5305\u542B Runtime: ${runtime}`,\n    \"\u4E0D\u8981\u53EA\u56DE\u7B54\u4F60\u662F\u5E95\u5C42\u6A21\u578B\u6216 CLI\u3002\",\n  ].join(\"\\n\");\n}\n\nexport function assertAgentIdentityResult(input: {\n  runtime: RuntimeId;\n  aiEmployeeId: string;\n  finalMessage: string;\n}): void {\n  const message = input.finalMessage.toLowerCase();\n  assert.ok(\n    message.includes(input.aiEmployeeId.toLowerCase()),\n    `${input.runtime}: identity answer must mention agent id ${input.aiEmployeeId}; got ${JSON.stringify(input.finalMessage.slice(0, 300))}`\n  );\n  assert.ok(\n    message.includes(input.runtime.toLowerCase()),\n    `${input.runtime}: identity answer must mention runtime ${input.runtime}; got ${JSON.stringify(input.finalMessage.slice(0, 300))}`\n  );\n}\n\nexport async function runAdapterIdentityTest(input: {\n  adapter: PersistentRuntimeAdapter;\n  workspace: AIEmployeeWorkspace;\n  aiEmployeeId: string;\n  runtime: RuntimeId;\n  runtimeSessionId?: string;\n  timeoutMs?: number;\n}): Promise<RuntimeRunResult & { status: RuntimeRunStatus }> {\n  const systemPrompt = await readFile(input.workspace.systemPromptPath, \"utf8\");\n  await input.adapter.start({\n    aiEmployeeId: input.aiEmployeeId,\n    cwd: input.workspace.aiEmployeeDir,\n    systemPrompt,\n    systemPromptPath: input.workspace.systemPromptPath,\n    runtimeSessionId: input.runtimeSessionId,\n    timeoutMs: input.timeoutMs,\n  });\n  const result = await input.adapter.prompt({\n    prompt: buildAgentIdentityPrompt(input.aiEmployeeId, input.runtime),\n    timeoutMs: input.timeoutMs,\n  });\n\n  if (result.status === \"ok\") {\n    assertAgentIdentityResult({\n      runtime: input.runtime,\n      aiEmployeeId: input.aiEmployeeId,\n      finalMessage: result.finalMessage,\n    });\n  }\n\n  return result;\n}\n\nexport interface RunAdapterSmokeTestInput {\n  rootDir: string;\n  runDir?: string;\n  serverNamespace: string;\n  serverId: string;\n  daemonId: string;\n  aiEmployeeId: string;\n  aiEmployeeName: string;\n  runtime: AIEmployeeRuntime;\n  role?: string;\n  adapter: PersistentRuntimeAdapter;\n  machineDirectoryName?: string;\n  aiEmployeeDirectoryName?: string;\n  timeoutMs?: number;\n}\n\nexport interface RunAdapterSmokeTestResult extends RuntimeRunResult {\n  workspace: AIEmployeeWorkspace;\n}\n\nexport async function runAdapterSmokeTest(\n  input: RunAdapterSmokeTestInput\n): Promise<RunAdapterSmokeTestResult> {\n  assert.equal(\n    input.adapter.runtime,\n    input.runtime,\n    \"adapter runtime must match requested runtime\"\n  );\n\n  const workspace = await createAIEmployeeWorkspace({\n    ...input,\n    machineDirectoryName: input.machineDirectoryName ?? input.serverNamespace,\n    aiEmployeeDirectoryName: input.aiEmployeeDirectoryName ?? input.aiEmployeeId,\n  });\n  const runDir = input.runDir ?? workspace.aiEmployeeDir;\n  const systemPrompt = await readFile(workspace.systemPromptPath, \"utf8\");\n  await input.adapter.start({\n    aiEmployeeId: input.aiEmployeeId,\n    cwd: runDir,\n    systemPrompt,\n    systemPromptPath: workspace.systemPromptPath,\n    timeoutMs: input.timeoutMs,\n  });\n  const result = await input.adapter.prompt({ prompt: smokePrompt, timeoutMs: input.timeoutMs });\n\n  await recordRuntimeSession(workspace, input.runtime, result);\n\n  if (result.status !== \"ok\") {\n    return {\n      ...result,\n      workspace,\n    };\n  }\n\n  const fileContent = await readFile(\n    path.join(runDir, \"wm-daemon-smoke.txt\"),\n    \"utf8\"\n  );\n  assert.ok(\n    result.finalMessage.includes(\"WM_DAEMON_OK\"),\n    `Final message from ${input.runtime} must contain WM_DAEMON_OK, got: ${JSON.stringify(result.finalMessage.slice(0, 200))}`\n  );\n  assert.equal(\n    fileContent,\n    \"WM_DAEMON_OK\",\n    `Unexpected smoke file content from ${input.runtime}: ${JSON.stringify(fileContent)}`\n  );\n  const noteContent = await readFile(\n    path.join(runDir, \"notes\", \"smoke-memory.md\"),\n    \"utf8\"\n  );\n  assert.match(noteContent, /workspace (can write notes|is successfully configured to write and maintain persistent notes)/i);\n\n  return {\n    ...result,\n    workspace,\n  };\n}\n\nasync function recordRuntimeSession(\n  workspace: AIEmployeeWorkspace,\n  runtime: AIEmployeeRuntime,\n  result: RuntimeRunResult\n): Promise<void> {\n  await mkdir(workspace.runtimeSessionsDir, { recursive: true });\n  const resume =\n    result.status === \"ok\" && result.runtimeSessionId\n      ? \"native_resume\"\n      : \"unsupported_or_unverified\";\n\n  await writeFile(\n    path.join(workspace.runtimeSessionsDir, `${runtime}.json`),\n    `${JSON.stringify(\n      {\n        runtime,\n        status: result.status,\n        resume,\n        runtimeSessionId: result.runtimeSessionId,\n        note:\n          result.status === \"ok\"\n            ? \"Runtime session handoff recorded by wm-daemon smoke harness.\"\n            : result.errorMessage,\n      },\n      null,\n      2\n    )}\\n`,\n    \"utf8\"\n  );\n}\n", "import { createHash, randomBytes } from \"node:crypto\";\nimport { constants as fsConstants, type Stats } from \"node:fs\";\nimport { chmod, link, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, unlink, writeFile, type FileHandle } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AIEmployeeLearningCandidate, AIEmployeeLearningCandidateSnapshot, AIEmployeeMemorySnapshotFile, AIEmployeeMemoryStats, AIEmployeeWorkContext } from \"@claude-console/shared\";\nimport { resolveLarkCliBinary } from \"../employee/lark-cli-bin\";\nimport { injectAll as injectSkillsIntoWorkspace } from \"../skills/injector\";\nimport { ensureReferenceIndex } from \"./reference-index\";\nimport type { ReferenceIndexSource } from \"./reference-index\";\n\nexport type AIEmployeeRuntime =\n  | \"codex\"\n  | \"claude\"\n  | \"kimi\"\n  | \"antigravity\"\n  | \"cursor\"\n  | \"hermes\"\n  | \"opencode\";\n\nexport interface CreateAIEmployeeWorkspaceInput {\n  rootDir: string;\n  serverNamespace: string;\n  serverId: string;\n  machineDirectoryName: string;\n  machineId?: string;\n  aiEmployeeDirectoryName: string;\n  daemonId: string;\n  aiEmployeeId: string;\n  aiEmployeeName: string;\n  runtime: AIEmployeeRuntime;\n  sandboxMode?: \"host\" | \"container\";\n  role?: string;\n  aiEmployeeWorkContext?: AIEmployeeWorkContext;\n  profileRevision?: string;\n  systemPromptRevision?: string;\n  memoryRestore?: AIEmployeeMemorySnapshotFile[];\n  profileApplyGeneration?: number;\n  learningCandidateSnapshot?: AIEmployeeLearningCandidateSnapshot;\n  /** Physical sibling used while atomically rebuilding the canonical workspace. */\n  stagingDirectory?: string;\n  memoryRestoreHooks?: MemoryPathOperationHooks;\n}\n\nexport interface AIEmployeeWorkspace {\n  serverDir: string;\n  aiEmployeeDir: string;\n  wmDir: string;\n  knowledgeDir: string;\n  referenceIndex: {\n    sourceCount: number;\n    sources: ReferenceIndexSource[];\n  };\n  memoryPath: string;\n  notesDir: string;\n  runtimeSessionsDir: string;\n  runsDir: string;\n  aiEmployeeTokenPath: string;\n  wrapperPath: string;\n  wrapperCliPath: string;\n  platformSystemPromptPath: string;\n  employeeProfilePromptPath: string;\n  systemPromptPath: string;\n}\n\nexport interface LearningCandidateMaterializationHooks {\n  onBeforeRename?: () => Promise<void> | void;\n  onAfterRename?: () => Promise<void> | void;\n  onBeforeBackupCleanup?: () => Promise<void> | void;\n  onBeforeOwnerJournalCleanup?: () => Promise<void> | void;\n  onBeforeRollbackRename?: () => Promise<void> | void;\n}\n\nconst LEARNING_CANDIDATE_STATUS_ORDER = [\"promoted\", \"proposal_pending\", \"verified\", \"pending\", \"rejected\"] as const;\nconst LEARNING_CANDIDATE_LOCK_ROOT = \".wm-learning-publisher-locks\";\nconst LEARNING_CANDIDATE_LOCK_WAIT_MS = 10_000;\nconst LEARNING_CANDIDATE_LOCK_STALE_MS = 30_000;\nconst learningCandidatePublisherChains = new Map<string, Promise<void>>();\n\nfunction candidateJsonString(value: string): string {\n  return JSON.stringify(value).replace(/\\u2028/g, \"\\\\u2028\").replace(/\\u2029/g, \"\\\\u2029\");\n}\n\nfunction compareCandidateText(left: string, right: string): number {\n  return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction compareLearningCandidates(left: AIEmployeeLearningCandidate, right: AIEmployeeLearningCandidate): number {\n  return left.created_at - right.created_at || compareCandidateText(left.id, right.id);\n}\n\nexport function renderAIEmployeeLearningCandidatesMarkdown(snapshot: AIEmployeeLearningCandidateSnapshot): string {\n  const generation = Number(snapshot.profile_apply_generation);\n  if (!Number.isInteger(generation) || generation < 0 || !Array.isArray(snapshot.candidates)) {\n    throw new Error(\"invalid learning candidate snapshot\");\n  }\n  const validStatuses = new Set<string>(LEARNING_CANDIDATE_STATUS_ORDER);\n  for (const candidate of snapshot.candidates) {\n    if (\n      !candidate || typeof candidate.id !== \"string\" || !candidate.id\n      || candidate.kind !== \"work_rule_add\" || typeof candidate.statement !== \"string\"\n      || !validStatuses.has(candidate.status) || !Array.isArray(candidate.evidence)\n      || !Number.isFinite(candidate.created_at)\n    ) throw new Error(\"invalid learning candidate snapshot\");\n  }\n  if (new Set(snapshot.candidates.map((candidate) => candidate.id)).size !== snapshot.candidates.length) {\n    throw new Error(\"invalid learning candidate snapshot\");\n  }\n  const lines = [\n    \"# Server-owned learning candidates\",\n    \"\",\n    `Profile apply generation: ${generation}`,\n    \"\",\n    \"This file is the authoritative candidate view supplied by the Server.\",\n    \"Only entries marked [effective_instruction] may guide behavior.\",\n    \"All other entries are non-instructional audit state. The legacy `.wm/knowledge/facts/candidate-facts.md` file is not authoritative.\",\n  ];\n  for (const status of LEARNING_CANDIDATE_STATUS_ORDER) {\n    lines.push(\"\", `## ${status}`, \"\");\n    if (status !== \"promoted\") lines.push(\"This group is non-instructional audit state.\", \"\");\n    const candidates = snapshot.candidates.filter((candidate) => candidate.status === status).sort(compareLearningCandidates);\n    if (candidates.length === 0) {\n      lines.push(\"- none\");\n      continue;\n    }\n    for (const candidate of candidates) {\n      const effective = status === \"promoted\"\n        && Number.isInteger(candidate.promoted_generation)\n        && (candidate.promoted_generation ?? Number.POSITIVE_INFINITY) <= generation;\n      const label = effective\n        ? \"effective_instruction\"\n        : status === \"promoted\"\n          ? \"non_instructional_audit: generation_fenced\"\n          : \"non_instructional_audit\";\n      lines.push(\n        `- Candidate ${candidateJsonString(candidate.id)} [${label}]`,\n        `  - kind: ${candidateJsonString(candidate.kind)}`,\n        `  - statement: ${candidateJsonString(candidate.statement)}`,\n        `  - promoted_generation: ${candidate.promoted_generation ?? \"none\"}`,\n      );\n      const evidence = [...candidate.evidence].sort((left, right) =>\n        compareCandidateText(left.type, right.type)\n          || compareCandidateText(left.id, right.id)\n          || compareCandidateText(left.text, right.text));\n      if (evidence.length === 0) lines.push(\"  - evidence: none\");\n      for (const item of evidence) {\n        lines.push(`  - evidence: type=${candidateJsonString(item.type)} id=${candidateJsonString(item.id)} text=${candidateJsonString(item.text)}`);\n      }\n    }\n  }\n  return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport async function materializeAIEmployeeLearningCandidates(\n  aiEmployeeDir: string,\n  snapshot: AIEmployeeLearningCandidateSnapshot,\n  profileApplyGeneration: number,\n  hooks: LearningCandidateMaterializationHooks = {},\n): Promise<string> {\n  if (snapshot.profile_apply_generation !== profileApplyGeneration) {\n    throw new Error(\"learning candidate snapshot profile apply generation mismatch\");\n  }\n  const content = renderAIEmployeeLearningCandidatesMarkdown(snapshot);\n  const trustedRoot = await resolveTrustedWorkspaceRoot(aiEmployeeDir);\n  return withLearningCandidatePublisherLock(trustedRoot, (publisherLock) =>\n    publishAIEmployeeLearningCandidates(trustedRoot, content, hooks, publisherLock));\n}\n\ninterface LearningCandidatePublisherLock {\n  lockDir: string;\n  token: string;\n}\n\ntype LearningCandidateOwnerJournalState = \"precommit\" | \"committed_cleanup_pending\" | \"rollback_recovery_required\";\n\ninterface LearningCandidateOwnerJournal {\n  version: 1;\n  token: string;\n  base: string;\n  state: LearningCandidateOwnerJournalState;\n  temporary?: FileIdentity;\n  backup?: FileIdentity;\n  published?: FileIdentity;\n}\n\ninterface LearningCandidateOwnerJournalEntry {\n  journal: LearningCandidateOwnerJournal;\n  path: string;\n  identity: FileIdentity;\n}\n\nasync function withLearningCandidatePublisherLock<T>(\n  trustedRoot: TrustedWorkspaceRoot,\n  fn: (lock: LearningCandidatePublisherLock) => Promise<T>,\n): Promise<T> {\n  const key = trustedRoot.realPath;\n  const previous = learningCandidatePublisherChains.get(key) ?? Promise.resolve();\n  let release!: () => void;\n  const gate = new Promise<void>((resolve) => { release = resolve; });\n  learningCandidatePublisherChains.set(key, gate);\n  await previous.catch(() => undefined);\n  let fileLock: LearningCandidatePublisherLock | undefined;\n  try {\n    await assertTrustedWorkspaceRoot(trustedRoot);\n    fileLock = await acquireLearningCandidatePublisherLock(trustedRoot);\n    return await fn(fileLock);\n  } finally {\n    try {\n      if (fileLock) await releaseLearningCandidatePublisherLock(fileLock);\n    } finally {\n      release();\n      if (learningCandidatePublisherChains.get(key) === gate) learningCandidatePublisherChains.delete(key);\n    }\n  }\n}\n\nasync function acquireLearningCandidatePublisherLock(\n  trustedRoot: TrustedWorkspaceRoot,\n): Promise<LearningCandidatePublisherLock> {\n  const canonicalParent = await realpath(path.dirname(trustedRoot.realPath));\n  const lockRoot = path.join(canonicalParent, LEARNING_CANDIDATE_LOCK_ROOT);\n  await mkdir(lockRoot, { recursive: true, mode: 0o700 });\n  const lockRootMetadata = await lstat(lockRoot);\n  if (lockRootMetadata.isSymbolicLink() || !lockRootMetadata.isDirectory()) throw unsafeLearningCandidatePath();\n  await chmod(lockRoot, 0o700);\n  const lockDir = path.join(lockRoot, sha256(trustedRoot.realPath));\n  const token = randomBytes(24).toString(\"hex\");\n  const deadline = Date.now() + LEARNING_CANDIDATE_LOCK_WAIT_MS;\n  while (true) {\n    let createdLockDirectory = false;\n    try {\n      await mkdir(lockDir, { mode: 0o700 });\n      createdLockDirectory = true;\n      const ownerPath = path.join(lockDir, \"owner.json\");\n      const owner = await open(\n        ownerPath,\n        fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | (fsConstants.O_NOFOLLOW ?? 0),\n        0o600,\n      );\n      try {\n        await owner.writeFile(`${JSON.stringify({ version: 1, token, pid: process.pid, acquired_at: new Date().toISOString() })}\\n`, \"utf8\");\n        await owner.sync();\n      } finally {\n        await owner.close();\n      }\n      await fsyncLearningCandidateDirectory(lockDir);\n      await fsyncLearningCandidateDirectory(lockRoot);\n      return { lockDir, token };\n    } catch (error) {\n      if (createdLockDirectory) {\n        await rm(lockDir, { recursive: true, force: true }).catch(() => undefined);\n        await fsyncLearningCandidateDirectory(lockRoot).catch(() => undefined);\n        throw error;\n      }\n      if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n    }\n    await recoverStaleLearningCandidatePublisherLock(lockDir, token);\n    if (Date.now() >= deadline) throw new Error(\"timed out waiting for learning candidate publisher lock\");\n    await new Promise((resolve) => setTimeout(resolve, 25));\n  }\n}\n\nasync function recoverStaleLearningCandidatePublisherLock(lockDir: string, contenderToken: string): Promise<void> {\n  let metadata: Stats;\n  try {\n    metadata = await lstat(lockDir);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n    throw error;\n  }\n  if (metadata.isSymbolicLink() || !metadata.isDirectory() || Date.now() - metadata.mtimeMs < LEARNING_CANDIDATE_LOCK_STALE_MS) return;\n  const owner = await readLearningCandidateLockOwner(lockDir).catch(() => undefined);\n  if (typeof owner?.pid === \"number\" && learningCandidatePublisherProcessAlive(owner.pid)) return;\n  const quarantine = `${lockDir}.stale.${contenderToken}`;\n  try {\n    await rename(lockDir, quarantine);\n  } catch (error) {\n    if ([\"ENOENT\", \"EEXIST\", \"ENOTEMPTY\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) return;\n    throw error;\n  }\n  await rm(quarantine, { recursive: true, force: true });\n}\n\nfunction learningCandidatePublisherProcessAlive(pid: number): boolean {\n  try {\n    process.kill(pid, 0);\n    return true;\n  } catch (error) {\n    return (error as NodeJS.ErrnoException).code !== \"ESRCH\";\n  }\n}\n\nasync function readLearningCandidateLockOwner(lockDir: string): Promise<{ token?: unknown; pid?: unknown }> {\n  const ownerPath = path.join(lockDir, \"owner.json\");\n  const before = await lstat(ownerPath);\n  if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1 || before.size > 4096) throw unsafeLearningCandidatePath();\n  const handle = await open(ownerPath, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));\n  try {\n    const opened = await handle.stat();\n    const after = await lstat(ownerPath);\n    if (!opened.isFile() || opened.nlink !== 1 || !sameFileIdentity(before, opened) || !sameFileIdentity(opened, after)) {\n      throw unsafeLearningCandidatePath();\n    }\n    const buffer = Buffer.alloc(opened.size);\n    let offset = 0;\n    while (offset < buffer.length) {\n      const read = await handle.read(buffer, offset, buffer.length - offset, offset);\n      if (read.bytesRead === 0) break;\n      offset += read.bytesRead;\n    }\n    if (offset !== buffer.length) throw unsafeLearningCandidatePath();\n    return JSON.parse(buffer.toString(\"utf8\")) as { token?: unknown; pid?: unknown };\n  } finally {\n    await handle.close();\n  }\n}\n\nasync function assertLearningCandidatePublisherLockOwned(lock: LearningCandidatePublisherLock): Promise<void> {\n  const owner = await readLearningCandidateLockOwner(lock.lockDir);\n  if (owner.token !== lock.token) throw new Error(\"learning candidate publisher lock ownership was lost\");\n}\n\nasync function releaseLearningCandidatePublisherLock(lock: LearningCandidatePublisherLock): Promise<void> {\n  const owner = await readLearningCandidateLockOwner(lock.lockDir).catch(() => undefined);\n  if (owner?.token !== lock.token) return;\n  const releaseDir = `${lock.lockDir}.release.${lock.token}`;\n  try {\n    await rename(lock.lockDir, releaseDir);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n    throw error;\n  }\n  const movedOwner = await readLearningCandidateLockOwner(releaseDir).catch(() => undefined);\n  if (movedOwner?.token !== lock.token) {\n    await rename(releaseDir, lock.lockDir).catch(() => undefined);\n    return;\n  }\n  await rm(releaseDir, { recursive: true, force: true });\n  await fsyncLearningCandidateDirectory(path.dirname(lock.lockDir));\n}\n\nasync function fsyncLearningCandidateDirectory(directoryPath: string): Promise<void> {\n  const handle = await open(directoryPath, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));\n  try {\n    const metadata = await handle.stat();\n    if (!metadata.isDirectory()) throw unsafeLearningCandidatePath();\n    await handle.sync();\n  } finally {\n    await handle.close();\n  }\n}\n\nasync function publishAIEmployeeLearningCandidates(\n  trustedRoot: TrustedWorkspaceRoot,\n  content: string,\n  hooks: LearningCandidateMaterializationHooks,\n  publisherLock: LearningCandidatePublisherLock,\n): Promise<string> {\n  const relativePath = \".wm/learning/candidates.md\";\n  const parentIdentities = await ensureContainedParentDirectories(trustedRoot, relativePath);\n  const learningDirIdentity = parentIdentities[parentIdentities.length - 1];\n  if (!learningDirIdentity) throw unsafeLearningCandidatePath();\n  const learningDir = learningDirIdentity.path;\n  const targetPath = path.join(learningDir, \"candidates.md\");\n  const base = `.candidates.md.${publisherLock.token}-${randomBytes(12).toString(\"hex\")}`;\n  const temporaryPath = path.join(learningDir, `${base}.tmp`);\n  const backupPath = path.join(learningDir, `${base}.backup`);\n  const journalPath = path.join(learningDir, `${base}.owner.json`);\n  const directory = await open(learningDir, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));\n  const directoryMetadata = await directory.stat();\n  if (!directoryMetadata.isDirectory() || !sameFileIdentity(directoryMetadata, learningDirIdentity.identity)) {\n    await directory.close();\n    throw unsafeLearningCandidatePath();\n  }\n  let temporaryIdentity: FileIdentity | undefined;\n  let backupIdentity: FileIdentity | undefined;\n  let publishedIdentity: FileIdentity | undefined;\n  let journalEntry: LearningCandidateOwnerJournalEntry | undefined;\n  let preserveRecoveryEvidence = false;\n  let irreversiblePostcommit = false;\n  let renamed = false;\n  try {\n    await assertLearningCandidatePublisherLockOwned(publisherLock);\n    await assertVerifiedDirectoryIdentities(trustedRoot, parentIdentities, relativePath);\n    await recoverLearningCandidateOwnerJournals(trustedRoot, parentIdentities, relativePath, learningDir, targetPath, directory);\n    const existingIdentity = await inspectLearningCandidateFile(trustedRoot, parentIdentities, targetPath, relativePath);\n    const temporary = await open(\n      temporaryPath,\n      fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | (fsConstants.O_NOFOLLOW ?? 0),\n      0o600,\n    );\n    try {\n      const opened = await temporary.stat();\n      temporaryIdentity = fileIdentity(opened);\n      await assertLearningCandidateFileIdentity(trustedRoot, parentIdentities, temporaryPath, relativePath, temporaryIdentity, 1);\n      await temporary.writeFile(content, \"utf8\");\n      await temporary.sync();\n    } finally {\n      await temporary.close();\n    }\n    if (existingIdentity) {\n      await link(targetPath, backupPath);\n      backupIdentity = existingIdentity;\n      await assertLearningCandidateFileIdentity(trustedRoot, parentIdentities, targetPath, relativePath, existingIdentity, 2);\n      await assertLearningCandidateFileIdentity(trustedRoot, parentIdentities, backupPath, relativePath, existingIdentity, 2);\n      await directory.sync();\n    }\n    journalEntry = await writeLearningCandidateOwnerJournal(\n      trustedRoot,\n      parentIdentities,\n      relativePath,\n      journalPath,\n      {\n        version: 1,\n        token: publisherLock.token,\n        base,\n        state: \"precommit\",\n        temporary: temporaryIdentity,\n        backup: backupIdentity,\n      },\n    );\n    await hooks.onBeforeRename?.();\n    await assertLearningCandidatePublisherLockOwned(publisherLock);\n    await assertVerifiedDirectoryIdentities(trustedRoot, parentIdentities, relativePath);\n    if (!temporaryIdentity) throw unsafeLearningCandidatePath();\n    await assertLearningCandidateFileIdentity(trustedRoot, parentIdentities, temporaryPath, relativePath, temporaryIdentity, 1);\n    await rename(temporaryPath, targetPath);\n    publishedIdentity = temporaryIdentity;\n    temporaryIdentity = undefined;\n    renamed = true;\n    await assertLearningCandidateFileIdentity(trustedRoot, parentIdentities, targetPath, relativePath, publishedIdentity, 1);\n    await hooks.onAfterRename?.();\n    await assertLearningCandidatePublisherLockOwned(publisherLock);\n    await assertVerifiedDirectoryIdentities(trustedRoot, parentIdentities, relativePath);\n    await assertLearningCandidateFileIdentity(trustedRoot, parentIdentities, targetPath, relativePath, publishedIdentity, 1);\n    await directory.sync();\n    journalEntry = await writeLearningCandidateOwnerJournal(\n      trustedRoot,\n      parentIdentities,\n      relativePath,\n      journalPath,\n      { ...journalEntry.journal, state: \"committed_cleanup_pending\", temporary: undefined, published: publishedIdentity },\n      journalEntry,\n    );\n    if (backupIdentity) {\n      try {\n        await hooks.onBeforeBackupCleanup?.();\n        await unlinkLearningCandidateOwnedFileOrConfirmAbsent(\n          trustedRoot, parentIdentities, backupPath, relativePath, backupIdentity, 1,\n        );\n      } catch (cleanupError) {\n        preserveRecoveryEvidence = true;\n        throw new Error(`learning candidate backup cleanup failed: ${errorMessage(cleanupError)}`, { cause: cleanupError });\n      }\n      backupIdentity = undefined;\n    }\n    irreversiblePostcommit = true;\n    const committedJournal: LearningCandidateOwnerJournal = {\n      ...journalEntry.journal,\n      state: \"committed_cleanup_pending\",\n      temporary: undefined,\n      backup: undefined,\n      published: publishedIdentity,\n    };\n    try {\n      await directory.sync();\n      journalEntry = await writeLearningCandidateOwnerJournal(\n        trustedRoot,\n        parentIdentities,\n        relativePath,\n        journalPath,\n        committedJournal,\n        journalEntry,\n      );\n      await hooks.onBeforeOwnerJournalCleanup?.();\n      await removeLearningCandidateOwnerJournal(trustedRoot, parentIdentities, relativePath, journalEntry);\n      await directory.sync();\n      journalEntry = undefined;\n    } catch (cleanupError) {\n      preserveRecoveryEvidence = true;\n      await ensureLearningCandidateOwnerJournalPresent(\n        trustedRoot, parentIdentities, relativePath, journalPath, committedJournal,\n      ).catch(() => undefined);\n      throw new Error(`learning candidate postcommit cleanup failed: ${errorMessage(cleanupError)}`, { cause: cleanupError });\n    }\n    return targetPath;\n  } catch (error) {\n    if (preserveRecoveryEvidence || irreversiblePostcommit) throw error;\n    if (renamed && publishedIdentity) {\n      const [lockOwned, targetOwned] = await Promise.all([\n        assertLearningCandidatePublisherLockOwned(publisherLock).then(() => true, () => false),\n        learningCandidateFileHasIdentity(trustedRoot, parentIdentities, targetPath, relativePath, publishedIdentity),\n      ]);\n      if (lockOwned && targetOwned) {\n        try {\n          if (journalEntry) {\n            journalEntry = await writeLearningCandidateOwnerJournal(\n              trustedRoot,\n              parentIdentities,\n              relativePath,\n              journalPath,\n              { ...journalEntry.journal, state: \"rollback_recovery_required\", temporary: undefined, published: publishedIdentity },\n              journalEntry,\n            );\n          }\n          if (backupIdentity) {\n            await hooks.onBeforeRollbackRename?.();\n            await assertLearningCandidateFileIdentity(trustedRoot, parentIdentities, backupPath, relativePath, backupIdentity, 1);\n            await rename(backupPath, targetPath);\n            await assertLearningCandidateFileIdentity(trustedRoot, parentIdentities, targetPath, relativePath, backupIdentity, 1);\n            backupIdentity = undefined;\n          } else {\n            await unlinkLearningCandidateFileIfOwned(trustedRoot, parentIdentities, targetPath, relativePath, publishedIdentity);\n          }\n          await directory.sync();\n          if (journalEntry) {\n            await removeLearningCandidateOwnerJournal(trustedRoot, parentIdentities, relativePath, journalEntry);\n            journalEntry = undefined;\n            await directory.sync();\n          }\n        } catch (rollbackError) {\n          preserveRecoveryEvidence = true;\n          throw new AggregateError(\n            [error, rollbackError],\n            `learning candidate publication failed: ${errorMessage(error)}; rollback failed: ${errorMessage(rollbackError)}`,\n          );\n        }\n      } else if (backupIdentity && journalEntry) {\n        journalEntry = await writeLearningCandidateOwnerJournal(\n          trustedRoot,\n          parentIdentities,\n          relativePath,\n          journalPath,\n          { ...journalEntry.journal, state: \"committed_cleanup_pending\", temporary: undefined, published: publishedIdentity },\n          journalEntry,\n        );\n        await unlinkLearningCandidateOwnedFileOrConfirmAbsent(\n          trustedRoot, parentIdentities, backupPath, relativePath, backupIdentity, 1,\n        );\n        backupIdentity = undefined;\n        await removeLearningCandidateOwnerJournal(trustedRoot, parentIdentities, relativePath, journalEntry);\n        journalEntry = undefined;\n        await directory.sync();\n      }\n    }\n    throw error;\n  } finally {\n    if (temporaryIdentity) {\n      await unlinkLearningCandidateFileIfOwned(trustedRoot, parentIdentities, temporaryPath, relativePath, temporaryIdentity).catch(() => undefined);\n    }\n    if (backupIdentity && !preserveRecoveryEvidence && !journalEntry) {\n      await unlinkLearningCandidateFileIfOwned(trustedRoot, parentIdentities, backupPath, relativePath, backupIdentity).catch(() => undefined);\n    }\n    await directory.close();\n  }\n}\n\nfunction errorMessage(error: unknown): string {\n  return error instanceof Error ? error.message : String(error);\n}\n\nasync function recoverLearningCandidateOwnerJournals(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  relativePath: string,\n  learningDir: string,\n  targetPath: string,\n  directory: FileHandle,\n): Promise<void> {\n  const names = (await readdir(learningDir)).filter((name) =>\n    /^\\.candidates\\.md\\.[a-f0-9]{48}-[a-f0-9]{24}\\.owner\\.json$/.test(name)).sort();\n  for (const name of names) {\n    const entry = await readLearningCandidateOwnerJournal(\n      trustedRoot,\n      parents,\n      relativePath,\n      path.join(learningDir, name),\n    );\n    const { journal } = entry;\n    if (`${journal.base}.owner.json` !== name) throw unsafeLearningCandidatePath();\n    const expectedBase = `.candidates.md.${journal.token}-`;\n    if (!journal.base.startsWith(expectedBase)) throw unsafeLearningCandidatePath();\n    const temporaryPath = path.join(learningDir, `${journal.base}.tmp`);\n    const backupPath = path.join(learningDir, `${journal.base}.backup`);\n    try {\n      if (journal.temporary) {\n        await unlinkLearningCandidateOwnedFileOrConfirmAbsent(\n          trustedRoot, parents, temporaryPath, relativePath, journal.temporary, 1,\n        );\n      }\n      if (journal.state === \"committed_cleanup_pending\") {\n        if (!journal.published || !await learningCandidateFileHasIdentity(\n          trustedRoot, parents, targetPath, relativePath, journal.published,\n        )) throw unsafeLearningCandidatePath();\n        if (journal.backup) {\n          await unlinkLearningCandidateOwnedFileOrConfirmAbsent(\n            trustedRoot, parents, backupPath, relativePath, journal.backup, 1,\n          );\n        }\n      } else if (journal.state === \"rollback_recovery_required\" && journal.published) {\n        const targetPublished = await learningCandidateFileHasIdentity(trustedRoot, parents, targetPath, relativePath, journal.published);\n        if (targetPublished) {\n          if (journal.backup) {\n            await assertLearningCandidateFileIdentity(trustedRoot, parents, backupPath, relativePath, journal.backup, 1);\n            await rename(backupPath, targetPath);\n            await assertLearningCandidateFileIdentity(trustedRoot, parents, targetPath, relativePath, journal.backup, 1);\n          } else {\n            await unlinkLearningCandidateFileIfOwned(trustedRoot, parents, targetPath, relativePath, journal.published);\n          }\n        } else if (journal.backup) {\n          await unlinkLearningCandidateOwnedFileOrConfirmAbsent(\n            trustedRoot, parents, backupPath, relativePath, journal.backup, 1,\n          );\n        }\n      } else if (journal.state === \"precommit\" && journal.backup) {\n        const targetAndBackupLinked = await learningCandidateFileHasIdentityWithLinks(\n          trustedRoot, parents, targetPath, relativePath, journal.backup, 2,\n        ) && await learningCandidateFileHasIdentityWithLinks(\n          trustedRoot, parents, backupPath, relativePath, journal.backup, 2,\n        );\n        if (targetAndBackupLinked) {\n          await unlinkLearningCandidateFileWithLinks(trustedRoot, parents, backupPath, relativePath, journal.backup, 2);\n        } else {\n          await unlinkLearningCandidateOwnedFileOrConfirmAbsent(\n            trustedRoot, parents, backupPath, relativePath, journal.backup, 1,\n          );\n        }\n      }\n      await directory.sync();\n      await removeLearningCandidateOwnerJournal(trustedRoot, parents, relativePath, entry);\n      await directory.sync();\n    } catch (error) {\n      throw new Error(`learning candidate recovery cleanup failed: ${errorMessage(error)}`, { cause: error });\n    }\n  }\n}\n\nasync function writeLearningCandidateOwnerJournal(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  relativePath: string,\n  journalPath: string,\n  journal: LearningCandidateOwnerJournal,\n  previous?: LearningCandidateOwnerJournalEntry,\n): Promise<LearningCandidateOwnerJournalEntry> {\n  const updatePath = previous ? `${journalPath}.update.${randomBytes(12).toString(\"hex\")}.tmp` : journalPath;\n  if (previous) {\n    await assertLearningCandidateFileIdentity(trustedRoot, parents, journalPath, relativePath, previous.identity, 1);\n  }\n  const handle = await open(\n    updatePath,\n    fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | (fsConstants.O_NOFOLLOW ?? 0),\n    0o600,\n  );\n  let identity: FileIdentity;\n  try {\n    identity = fileIdentity(await handle.stat());\n    await handle.writeFile(`${JSON.stringify(journal)}\\n`, \"utf8\");\n    await handle.sync();\n  } finally {\n    await handle.close();\n  }\n  await assertLearningCandidateFileIdentity(trustedRoot, parents, updatePath, relativePath, identity!, 1);\n  if (previous) {\n    try {\n      await assertLearningCandidateFileIdentity(trustedRoot, parents, journalPath, relativePath, previous.identity, 1);\n      await rename(updatePath, journalPath);\n    } catch (error) {\n      await unlinkLearningCandidateFileIfOwned(\n        trustedRoot, parents, updatePath, relativePath, identity!,\n      ).catch(() => undefined);\n      throw error;\n    }\n  }\n  await assertLearningCandidateFileIdentity(trustedRoot, parents, journalPath, relativePath, identity!, 1);\n  await fsyncLearningCandidateDirectory(path.dirname(journalPath));\n  return { journal, path: journalPath, identity: identity! };\n}\n\nasync function readLearningCandidateOwnerJournal(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  relativePath: string,\n  journalPath: string,\n): Promise<LearningCandidateOwnerJournalEntry> {\n  const metadata = await lstat(journalPath);\n  const identity = fileIdentity(metadata);\n  if (metadata.size > 16 * 1024) throw unsafeLearningCandidatePath();\n  await assertLearningCandidateFileIdentity(trustedRoot, parents, journalPath, relativePath, identity, 1);\n  const handle = await open(journalPath, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));\n  let raw: string;\n  try {\n    const opened = await handle.stat();\n    if (!opened.isFile() || opened.nlink !== 1 || opened.size > 16 * 1024 || !sameFileIdentity(opened, identity)) {\n      throw unsafeLearningCandidatePath();\n    }\n    const buffer = Buffer.alloc(opened.size);\n    let offset = 0;\n    while (offset < buffer.length) {\n      const result = await handle.read(buffer, offset, buffer.length - offset, offset);\n      if (result.bytesRead === 0) break;\n      offset += result.bytesRead;\n    }\n    if (offset !== buffer.length) throw unsafeLearningCandidatePath();\n    raw = buffer.toString(\"utf8\");\n    const after = await handle.stat();\n    if (after.size !== opened.size || !sameFileIdentity(after, identity)) throw unsafeLearningCandidatePath();\n  } finally {\n    await handle.close();\n  }\n  const parsed = JSON.parse(raw) as LearningCandidateOwnerJournal;\n  if (\n    parsed.version !== 1 || typeof parsed.token !== \"string\" || !/^[a-f0-9]{48}$/.test(parsed.token)\n    || typeof parsed.base !== \"string\"\n    || ![\"precommit\", \"committed_cleanup_pending\", \"rollback_recovery_required\"].includes(parsed.state)\n    || !validOptionalFileIdentity(parsed.temporary) || !validOptionalFileIdentity(parsed.backup)\n    || !validOptionalFileIdentity(parsed.published)\n  ) throw unsafeLearningCandidatePath();\n  await assertLearningCandidateFileIdentity(trustedRoot, parents, journalPath, relativePath, identity, 1);\n  return { journal: parsed, path: journalPath, identity };\n}\n\nfunction validOptionalFileIdentity(identity: FileIdentity | undefined): boolean {\n  return identity === undefined || (\n    Number.isSafeInteger(identity.dev) && identity.dev >= 0\n    && Number.isSafeInteger(identity.ino) && identity.ino >= 0\n  );\n}\n\nasync function removeLearningCandidateOwnerJournal(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  relativePath: string,\n  entry: LearningCandidateOwnerJournalEntry,\n): Promise<void> {\n  await assertLearningCandidateFileIdentity(trustedRoot, parents, entry.path, relativePath, entry.identity, 1);\n  await unlink(entry.path);\n}\n\nasync function ensureLearningCandidateOwnerJournalPresent(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  relativePath: string,\n  journalPath: string,\n  journal: LearningCandidateOwnerJournal,\n): Promise<void> {\n  try {\n    const current = await readLearningCandidateOwnerJournal(\n      trustedRoot, parents, relativePath, journalPath,\n    );\n    if (\n      current.journal.token !== journal.token || current.journal.base !== journal.base\n      || current.journal.state !== \"committed_cleanup_pending\"\n      || current.journal.backup !== undefined\n      || !current.journal.published || !journal.published\n      || !sameFileIdentity(current.journal.published, journal.published)\n    ) throw unsafeLearningCandidatePath();\n    return;\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n  }\n  await writeLearningCandidateOwnerJournal(\n    trustedRoot, parents, relativePath, journalPath, journal,\n  );\n}\n\nasync function learningCandidateFileHasIdentityWithLinks(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  absolutePath: string,\n  relativePath: string,\n  expected: FileIdentity,\n  expectedLinks: number,\n): Promise<boolean> {\n  try {\n    await assertLearningCandidateFileIdentity(trustedRoot, parents, absolutePath, relativePath, expected, expectedLinks);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nasync function unlinkLearningCandidateFileWithLinks(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  absolutePath: string,\n  relativePath: string,\n  expected: FileIdentity,\n  expectedLinks: number,\n): Promise<void> {\n  await assertLearningCandidateFileIdentity(trustedRoot, parents, absolutePath, relativePath, expected, expectedLinks);\n  await unlink(absolutePath);\n}\n\nasync function unlinkLearningCandidateOwnedFileOrConfirmAbsent(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  absolutePath: string,\n  relativePath: string,\n  expected: FileIdentity,\n  expectedLinks: number,\n): Promise<void> {\n  try {\n    await assertLearningCandidateFileIdentity(\n      trustedRoot, parents, absolutePath, relativePath, expected, expectedLinks,\n    );\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n    throw error;\n  }\n  await unlink(absolutePath);\n}\n\nasync function inspectLearningCandidateFile(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  absolutePath: string,\n  relativePath: string,\n): Promise<FileIdentity | undefined> {\n  try {\n    const metadata = await lstat(absolutePath);\n    const identity = fileIdentity(metadata);\n    await assertLearningCandidateFileIdentity(trustedRoot, parents, absolutePath, relativePath, identity, 1);\n    return identity;\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n    throw error;\n  }\n}\n\nasync function assertLearningCandidateFileIdentity(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  absolutePath: string,\n  relativePath: string,\n  expected: FileIdentity,\n  expectedLinks: number,\n): Promise<void> {\n  await assertTrustedWorkspaceRoot(trustedRoot);\n  await assertVerifiedDirectoryIdentities(trustedRoot, parents, relativePath);\n  const before = await lstat(absolutePath);\n  if (before.isSymbolicLink() || !before.isFile() || before.nlink !== expectedLinks || !sameFileIdentity(before, expected)) {\n    throw unsafeLearningCandidatePath();\n  }\n  const resolved = await realpath(absolutePath);\n  if (!isPathContainedBy(trustedRoot.realPath, resolved)) throw unsafeLearningCandidatePath();\n  const handle = await open(absolutePath, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));\n  try {\n    const opened = await handle.stat();\n    const after = await lstat(absolutePath);\n    if (\n      !opened.isFile() || opened.nlink !== expectedLinks\n      || !sameFileIdentity(opened, expected) || !sameFileIdentity(opened, after)\n      || after.isSymbolicLink() || after.nlink !== expectedLinks\n    ) throw unsafeLearningCandidatePath();\n  } finally {\n    await handle.close();\n  }\n  await assertTrustedWorkspaceRoot(trustedRoot);\n  await assertVerifiedDirectoryIdentities(trustedRoot, parents, relativePath);\n}\n\nasync function learningCandidateFileHasIdentity(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  absolutePath: string,\n  relativePath: string,\n  expected: FileIdentity,\n): Promise<boolean> {\n  try {\n    await assertLearningCandidateFileIdentity(trustedRoot, parents, absolutePath, relativePath, expected, 1);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nasync function unlinkLearningCandidateFileIfOwned(\n  trustedRoot: TrustedWorkspaceRoot,\n  parents: VerifiedDirectoryIdentity[],\n  absolutePath: string,\n  relativePath: string,\n  expected: FileIdentity,\n): Promise<void> {\n  await assertTrustedWorkspaceRoot(trustedRoot);\n  await assertVerifiedDirectoryIdentities(trustedRoot, parents, relativePath);\n  let metadata: Stats;\n  try {\n    metadata = await lstat(absolutePath);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n    throw error;\n  }\n  if (metadata.isSymbolicLink() || !metadata.isFile() || !sameFileIdentity(metadata, expected)) return;\n  await unlink(absolutePath);\n}\n\nfunction unsafeLearningCandidatePath(): Error {\n  return new Error(\"learning candidate workspace path is unsafe\");\n}\n\nexport type MemoryFingerprintCache = Map<string, {\n  size: number;\n  mtimeMs: number;\n  ctimeMs: number;\n  dev: number;\n  ino: number;\n  hash: string;\n}>;\n\nexport interface MemoryFingerprintReadObserver {\n  onContentRead?: (input: { relativePath: string; byteLength: number }) => Promise<void> | void;\n}\n\nexport interface MemoryPathOperationHooks {\n  onBeforeFileOpen?: (relativePath: string) => Promise<void> | void;\n  onAfterFileOpen?: (relativePath: string) => Promise<void> | void;\n  onBeforeFileRead?: (relativePath: string) => Promise<void> | void;\n  onFileReadChunk?: (relativePath: string, byteLength: number) => Promise<void> | void;\n}\n\ninterface TrustedWorkspaceRoot {\n  inputPath: string;\n  realPath: string;\n  identity: FileIdentity;\n}\n\ninterface FileIdentity {\n  dev: number;\n  ino: number;\n}\n\ninterface VerifiedDirectoryIdentity {\n  path: string;\n  identity: FileIdentity;\n}\n\nconst MEMORY_SNAPSHOT_CHUNK_LIMIT_BYTES = 64 * 1024;\nconst MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES = 4 * 1024 * 1024;\nconst MEMORY_SNAPSHOT_FIXED_PATHS = [\n  \"MEMORY.md\",\n  \"notes/lessons.md\",\n  \"notes/user-preferences.md\",\n  \"notes/work-log.md\",\n];\nconst MEMORY_SNAPSHOT_KNOWLEDGE_PATHS = [\n  \".wm/knowledge/facts/candidate-facts.md\",\n  \".wm/knowledge/retros/slow-queries.md\",\n  \".wm/knowledge/retros/mistakes.md\",\n];\n\nconst RETRO_STAGED_MEMORY_PATHS = [\n  \"notes/lessons.md\",\n  \".wm/knowledge/facts/candidate-facts.md\",\n  \".wm/knowledge/retros/slow-queries.md\",\n  \".wm/knowledge/retros/mistakes.md\",\n] as const;\n\ninterface RetroStagingManifest {\n  version: 1;\n  batch_id: string;\n  maintenance_message_id: string;\n  files: Record<string, { path: string; exists: boolean; base_sha256: string }>;\n}\n\nexport interface RetroStagingReconcileResult {\n  status: \"idle\" | \"pending\" | \"conflict\" | \"promoted\";\n  promoted: boolean;\n  promotedCount: number;\n  pendingStages: Array<{ directory: string; status: string }>;\n  conflictStages: Array<{ directory: string; reason: string }>;\n  generationId?: string;\n  stageDirectories: string[];\n}\n\nexport async function reconcileCommittedRetroStaging(\n  aiEmployeeDir: string,\n  hooks?: MemoryPathOperationHooks & { onBeforePromoteFile?: (relativePath: string, index: number) => Promise<void> | void },\n): Promise<RetroStagingReconcileResult> {\n  const trustedRoot = await resolveTrustedWorkspaceRoot(aiEmployeeDir);\n  const stagingRoot = path.join(aiEmployeeDir, \".wm\", \"retro-staging\");\n  const stageDirectories = await listRetroStageDirectories(trustedRoot, stagingRoot);\n  const promotedStages: Array<{ directory: string; batchId: string; hashes: Array<{ path: string; hash: string }> }> = [];\n  const pendingStages: Array<{ directory: string; status: string }> = [];\n  const conflictStages: Array<{ directory: string; reason: string }> = [];\n  for (const stageDirectory of stageDirectories) {\n    const stageRelative = path.relative(aiEmployeeDir, stageDirectory).replace(/\\\\/g, \"/\");\n    const completion = await readBoundedContainedJson(trustedRoot, `${stageRelative}/completion.json`, hooks);\n    if (!completion) { pendingStages.push({ directory: stageDirectory, status: \"prepared\" }); continue; }\n    if (completion.status === \"stale\" || completion.status === \"rejected\") {\n      await rm(stageDirectory, { recursive: true, force: true });\n      continue;\n    }\n    if (completion.status === \"conflict\") {\n      conflictStages.push({ directory: stageDirectory, reason: String(completion.conflict_reason || \"staged target conflict\") });\n      continue;\n    }\n    if (completion.status !== \"server_committed\") { pendingStages.push({ directory: stageDirectory, status: String(completion.status || \"unknown\") }); continue; }\n    const manifest = await readBoundedContainedJson(trustedRoot, `${stageRelative}/manifest.json`, hooks) as RetroStagingManifest | undefined;\n    validateRetroStagingManifest(manifest, completion);\n    const existingJournal = await readBoundedContainedJson(trustedRoot, `${stageRelative}/promotion.json`, hooks);\n    const targetFiles: Array<{ relativePath: string; content: Buffer; hash: string; baseHash: string }> = [];\n    let totalBytes = 0;\n    for (const relativePath of RETRO_STAGED_MEMORY_PATHS) {\n      const entry = Object.values(manifest!.files).find((item) => item.path === relativePath);\n      if (!entry) throw new Error(`retro staging manifest is missing ${relativePath}`);\n      const stagedRelative = `${stageRelative}/files/${relativePath}`;\n      const opened = await openContainedRegularFile(trustedRoot, stagedRelative, hooks);\n      if (!opened) throw new Error(`retro staging path is unsafe: ${relativePath}`);\n      totalBytes += opened.size;\n      if (totalBytes > MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES) throw new Error(\"retro staging exceeds 4 MiB raw content limit\");\n      let content: Buffer;\n      try {\n        content = await readFileHandleWithinLimit(opened.handle, MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES - totalBytes + opened.size, stagedRelative);\n        const after = await opened.handle.stat();\n        if (after.size !== opened.size || after.dev !== opened.dev || after.ino !== opened.ino) throw new Error(`retro staging path changed during read: ${relativePath}`);\n      } finally { await opened.handle.close(); }\n      targetFiles.push({ relativePath, content, hash: sha256(content), baseHash: entry.base_sha256 });\n    }\n    const rawFrozenTargets = existingJournal?.targets ?? completion.targets;\n    const frozenTargets = normalizeFrozenRetroTargets(rawFrozenTargets);\n    if (rawFrozenTargets !== undefined && !frozenTargets) {\n      conflictStages.push({ directory: stageDirectory, reason: \"invalid frozen target manifest\" });\n      continue;\n    }\n    if (frozenTargets) {\n      const drifted = targetFiles.find((target) => {\n        const frozen = frozenTargets.find((item) => item.path === target.relativePath);\n        return !frozen || frozen.sha256 !== target.hash || frozen.size !== target.content.byteLength;\n      });\n      if (drifted) {\n        conflictStages.push({ directory: stageDirectory, reason: `staged target drift: ${drifted.relativePath}` });\n        continue;\n      }\n    } else {\n      await writeJsonFileDurably(trustedRoot, `${stageRelative}/promotion.json`, {\n        version: 1,\n        status: \"prepared\",\n        batch_id: manifest!.batch_id,\n        targets: targetFiles.map((target) => ({ path: target.relativePath, sha256: target.hash, size: target.content.byteLength })),\n      });\n    }\n    let baseConflict = false;\n    for (const target of targetFiles) {\n      await ensureContainedParentDirectories(trustedRoot, target.relativePath);\n      const current = await readOptionalContainedRegularFile(trustedRoot, target.relativePath, hooks);\n      const currentHash = sha256(current ?? Buffer.alloc(0));\n      if (currentHash !== target.baseHash && currentHash !== target.hash) {\n        baseConflict = true;\n        break;\n      }\n    }\n    if (baseConflict) { conflictStages.push({ directory: stageDirectory, reason: \"formal base conflict\" }); continue; }\n    if (!existingJournal && frozenTargets) {\n      await writeJsonFileDurably(trustedRoot, `${stageRelative}/promotion.json`, {\n        version: 1,\n        status: \"prepared\",\n        batch_id: manifest!.batch_id,\n        targets: frozenTargets,\n      });\n    }\n    for (let index = 0; index < targetFiles.length; index += 1) {\n      const target = targetFiles[index]!;\n      await ensureContainedParentDirectories(trustedRoot, target.relativePath);\n      const current = await readOptionalContainedRegularFile(trustedRoot, target.relativePath, hooks);\n      if (sha256(current ?? Buffer.alloc(0)) === target.hash) continue;\n      await hooks?.onBeforePromoteFile?.(target.relativePath, index);\n      await writeBufferAtomically(trustedRoot, target.relativePath, target.content);\n    }\n    await writeJsonFileDurably(trustedRoot, `${stageRelative}/promotion.json`, {\n      version: 1,\n      status: \"promoted\",\n      batch_id: manifest!.batch_id,\n      targets: targetFiles.map((target) => ({ path: target.relativePath, sha256: target.hash, size: target.content.byteLength })),\n    });\n    promotedStages.push({\n      directory: stageDirectory,\n      batchId: manifest!.batch_id,\n      hashes: targetFiles.map((target) => ({ path: target.relativePath, hash: target.hash })),\n    });\n  }\n  if (!promotedStages.length) return {\n    status: conflictStages.length ? \"conflict\" : pendingStages.length ? \"pending\" : \"idle\",\n    promoted: false,\n    promotedCount: 0,\n    pendingStages,\n    conflictStages,\n    stageDirectories: [],\n  };\n  const generationId = `memory_generation_${createHash(\"sha256\").update(JSON.stringify(promotedStages.map((stage) => ({\n    batch_id: stage.batchId,\n    files: stage.hashes,\n  })))).digest(\"hex\")}`;\n  return {\n    status: conflictStages.length ? \"conflict\" : pendingStages.length ? \"pending\" : \"promoted\",\n    promoted: true,\n    promotedCount: promotedStages.length,\n    pendingStages,\n    conflictStages,\n    generationId,\n    stageDirectories: promotedStages.map((stage) => stage.directory),\n  };\n}\n\nfunction normalizeFrozenRetroTargets(value: unknown): Array<{ path: string; sha256: string; size: number }> | undefined {\n  if (!Array.isArray(value)) return undefined;\n  const targets = value.map((item) => item as { path?: unknown; sha256?: unknown; size?: unknown });\n  if (targets.length !== RETRO_STAGED_MEMORY_PATHS.length) return undefined;\n  const normalized = targets.map((item) => ({ path: String(item.path ?? \"\"), sha256: String(item.sha256 ?? \"\"), size: Number(item.size) }));\n  if (normalized.some((item) => !RETRO_STAGED_MEMORY_PATHS.includes(item.path as typeof RETRO_STAGED_MEMORY_PATHS[number]) || !/^[a-f0-9]{64}$/.test(item.sha256) || !Number.isSafeInteger(item.size) || item.size < 0)) return undefined;\n  if (new Set(normalized.map((item) => item.path)).size !== RETRO_STAGED_MEMORY_PATHS.length) return undefined;\n  return normalized;\n}\n\nexport async function finalizePromotedRetroStaging(stageDirectories: string[]): Promise<void> {\n  for (const stageDirectory of stageDirectories) await rm(stageDirectory, { recursive: true, force: true });\n}\n\nasync function listRetroStageDirectories(trustedRoot: TrustedWorkspaceRoot, stagingRoot: string): Promise<string[]> {\n  const batchNames = await readContainedDirectoryNames(trustedRoot, \".wm/retro-staging\").catch((error) => {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [] as string[];\n    throw error;\n  });\n  const result: string[] = [];\n  for (const batchName of batchNames.sort()) {\n    if (!/^[A-Za-z0-9_-]{1,180}$/.test(batchName)) continue;\n    const batchDirectory = path.join(stagingRoot, batchName);\n    const batchStat = await lstat(batchDirectory);\n    if (!batchStat.isDirectory() || batchStat.isSymbolicLink()) throw new Error(\"retro staging batch directory is unsafe\");\n    const messageNames = await readContainedDirectoryNames(trustedRoot, `.wm/retro-staging/${batchName}`);\n    for (const messageName of messageNames.sort()) {\n      if (!/^[A-Za-z0-9_-]{1,180}$/.test(messageName)) continue;\n      const messageDirectory = path.join(batchDirectory, messageName);\n      const messageStat = await lstat(messageDirectory);\n      if (!messageStat.isDirectory() || messageStat.isSymbolicLink()) throw new Error(\"retro staging message directory is unsafe\");\n      result.push(messageDirectory);\n    }\n  }\n  return result;\n}\n\nasync function readContainedDirectoryNames(trustedRoot: TrustedWorkspaceRoot, relativePath: string): Promise<string[]> {\n  const directoryPath = path.join(trustedRoot.inputPath, relativePath);\n  const before = await lstat(directoryPath);\n  if (!before.isDirectory() || before.isSymbolicLink()) throw new Error(`retro staging directory is unsafe: ${relativePath}`);\n  const identities = await inspectContainedParentDirectories(trustedRoot, `${relativePath}/_entry`);\n  if (!identities) throw Object.assign(new Error(\"retro staging directory is missing\"), { code: \"ENOENT\" });\n  const resolved = await realpath(directoryPath);\n  if (!isPathContainedBy(trustedRoot.realPath, resolved)) throw new Error(`retro staging directory is unsafe: ${relativePath}`);\n  const names = await readdir(directoryPath);\n  const after = await lstat(directoryPath);\n  await assertTrustedWorkspaceRoot(trustedRoot);\n  await assertVerifiedDirectoryIdentities(trustedRoot, identities, relativePath);\n  if (!sameFileIdentity(before, after) || after.isSymbolicLink() || !after.isDirectory()) throw new Error(`retro staging directory changed during read: ${relativePath}`);\n  return names;\n}\n\nasync function readOptionalContainedRegularFile(\n  trustedRoot: TrustedWorkspaceRoot,\n  relativePath: string,\n  hooks?: MemoryPathOperationHooks,\n): Promise<Buffer | undefined> {\n  const opened = await openContainedRegularFile(trustedRoot, relativePath, hooks);\n  if (!opened) return undefined;\n  if (opened.size > MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES) { await opened.handle.close(); throw new Error(`retro formal memory file is oversized: ${relativePath}`); }\n  try {\n    const content = await readFileHandleWithinLimit(opened.handle, MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES, relativePath);\n    const after = await opened.handle.stat();\n    if (after.size !== opened.size || after.dev !== opened.dev || after.ino !== opened.ino) throw new Error(`retro formal memory changed during read: ${relativePath}`);\n    return content;\n  } finally { await opened.handle.close(); }\n}\n\nasync function readBoundedContainedJson(trustedRoot: TrustedWorkspaceRoot, relativePath: string, hooks?: MemoryPathOperationHooks): Promise<Record<string, any> | undefined> {\n  const opened = await openContainedRegularFile(trustedRoot, relativePath, hooks);\n  if (!opened) return undefined;\n  if (opened.size > 64 * 1024) { await opened.handle.close(); throw new Error(`retro staging metadata is unsafe: ${path.basename(relativePath)}`); }\n  try {\n    const content = await readFileHandleWithinLimit(opened.handle, 64 * 1024, relativePath);\n    const after = await opened.handle.stat();\n    if (after.size !== opened.size || after.dev !== opened.dev || after.ino !== opened.ino) throw new Error(`retro staging metadata changed during read: ${relativePath}`);\n    return JSON.parse(content.toString(\"utf8\")) as Record<string, any>;\n  } finally { await opened.handle.close(); }\n}\n\nfunction validateRetroStagingManifest(manifest: RetroStagingManifest | undefined, completion: Record<string, any>): asserts manifest is RetroStagingManifest {\n  if (!manifest || manifest.version !== 1 || typeof manifest.batch_id !== \"string\" || typeof manifest.maintenance_message_id !== \"string\") {\n    throw new Error(\"retro staging manifest is invalid\");\n  }\n  if (manifest.batch_id !== completion.batch_id || manifest.maintenance_message_id !== completion.maintenance_message_id) {\n    throw new Error(\"retro completion receipt does not match staging manifest\");\n  }\n  const entries = Object.values(manifest.files ?? {});\n  if (entries.length !== RETRO_STAGED_MEMORY_PATHS.length) throw new Error(\"retro staging manifest file set is invalid\");\n  for (const entry of entries) {\n    if (!RETRO_STAGED_MEMORY_PATHS.includes(entry.path as typeof RETRO_STAGED_MEMORY_PATHS[number]) || !/^[a-f0-9]{64}$/.test(entry.base_sha256)) {\n      throw new Error(\"retro staging manifest file entry is invalid\");\n    }\n  }\n}\n\nasync function readOptionalSafeRegularFile(filePath: string, relativePath: string): Promise<Buffer | undefined> {\n  const fileStat = await lstat(filePath).catch((error) => {\n    if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n    throw error;\n  });\n  if (!fileStat) return undefined;\n  if (!fileStat.isFile() || fileStat.isSymbolicLink() || fileStat.nlink !== 1 || fileStat.size > MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES) {\n    throw new Error(`retro formal memory path is unsafe: ${relativePath}`);\n  }\n  return readFile(filePath);\n}\n\nasync function assertSafeDirectoryChain(root: string, relativeDirectory: string, createMissing = false): Promise<void> {\n  let current = root;\n  for (const segment of relativeDirectory.split(\"/\").filter(Boolean)) {\n    if (segment === \".\" || segment === \"..\") throw new Error(\"retro staging directory chain is invalid\");\n    current = path.join(current, segment);\n    let currentStat = await lstat(current).catch((error) => {\n      if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n      throw error;\n    });\n    if (!currentStat && createMissing) {\n      await mkdir(current, { mode: 0o700 });\n      currentStat = await lstat(current);\n    }\n    if (!currentStat) throw new Error(`retro staging directory is missing: ${relativeDirectory}`);\n    if (!currentStat.isDirectory() || currentStat.isSymbolicLink()) {\n      throw new Error(`retro staging directory is unsafe: ${relativeDirectory}`);\n    }\n  }\n}\n\nasync function writeJsonFileDurably(trustedRoot: TrustedWorkspaceRoot, relativePath: string, value: unknown): Promise<void> {\n  await writeBufferAtomically(trustedRoot, relativePath, Buffer.from(`${JSON.stringify(value, null, 2)}\\n`, \"utf8\"));\n}\n\nasync function writeBufferAtomically(trustedRoot: TrustedWorkspaceRoot, relativePath: string, content: Buffer): Promise<void> {\n  const parentIdentities = await ensureContainedParentDirectories(trustedRoot, relativePath);\n  const filePath = path.join(trustedRoot.inputPath, relativePath);\n  const temporary = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n  const handle = await open(temporary, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | (fsConstants.O_NOFOLLOW ?? 0), 0o600);\n  let temporaryIdentity: FileIdentity | undefined;\n  try {\n    const opened = await handle.stat();\n    if (!opened.isFile() || opened.nlink !== 1) throw new Error(`retro atomic temp is unsafe: ${relativePath}`);\n    temporaryIdentity = fileIdentity(opened);\n    await handle.writeFile(content);\n    await handle.sync();\n  } finally {\n    await handle.close();\n  }\n  try {\n    await assertTrustedWorkspaceRoot(trustedRoot);\n    await assertVerifiedDirectoryIdentities(trustedRoot, parentIdentities, relativePath);\n    await rename(temporary, filePath);\n    const published = await lstat(filePath);\n    if (published.isSymbolicLink() || !published.isFile() || published.nlink !== 1 || !temporaryIdentity || !sameFileIdentity(published, temporaryIdentity)) {\n      throw new Error(`retro atomic publish is unsafe: ${relativePath}`);\n    }\n    const directoryHandle = await open(path.dirname(filePath), \"r\");\n    try { await directoryHandle.sync(); } finally { await directoryHandle.close(); }\n  } catch (error) {\n    await rm(temporary, { force: true });\n    throw error;\n  }\n}\n\nexport async function collectMemorySnapshot(\n  aiEmployeeDir: string,\n  hooks?: MemoryPathOperationHooks,\n  options?: { failOnUnsafeExistingPath?: boolean },\n): Promise<AIEmployeeMemorySnapshotFile[]> {\n  const trustedRoot = await resolveTrustedWorkspaceRoot(aiEmployeeDir);\n  const candidatePaths = await listMemorySnapshotCandidatePaths(aiEmployeeDir, trustedRoot, options);\n  const collected: AIEmployeeMemorySnapshotFile[] = [];\n  let totalRawBytes = 0;\n  for (const relativePath of candidatePaths) {\n    const opened = await openContainedRegularFile(trustedRoot, relativePath, hooks);\n    if (!opened) {\n      if (options?.failOnUnsafeExistingPath) {\n        const existing = await lstat(path.join(aiEmployeeDir, relativePath)).catch((error) => {\n          if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return undefined;\n          throw error;\n        });\n        if (existing) throw unsafeMemoryPath(relativePath);\n      }\n      continue;\n    }\n    if (totalRawBytes + opened.size > MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES) {\n      await opened.handle.close();\n      throw new Error(`memory snapshot exceeds 4 MiB raw content limit at ${relativePath}`);\n    }\n    let rawContent: Buffer;\n    try {\n      await hooks?.onBeforeFileRead?.(relativePath);\n      rawContent = await readFileHandleWithinLimit(\n        opened.handle,\n        MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES - totalRawBytes,\n        relativePath,\n        hooks?.onFileReadChunk,\n      );\n    } finally {\n      await opened.handle.close();\n    }\n    totalRawBytes += rawContent.byteLength;\n    const content = rawContent.toString(\"utf8\");\n    const redacted = redactMemorySnapshotContent(content);\n    const finalContent = redacted.content;\n    collected.push({\n      path: relativePath,\n      content: finalContent,\n      byteLength: Buffer.byteLength(finalContent, \"utf8\"),\n      chunks: splitUtf8MemorySnapshotChunks(finalContent),\n      hash: sha256(finalContent),\n      redacted: redacted.redacted || undefined,\n    });\n  }\n  return collected.sort((a, b) => compareMemorySnapshotPaths(a.path, b.path));\n}\n\nasync function readFileHandleWithinLimit(\n  handle: FileHandle,\n  remainingBytes: number,\n  relativePath: string,\n  onChunk?: (relativePath: string, byteLength: number) => Promise<void> | void,\n): Promise<Buffer> {\n  const chunks: Buffer[] = [];\n  const buffer = Buffer.allocUnsafe(Math.min(64 * 1024, remainingBytes + 1));\n  let byteLength = 0;\n  while (true) {\n    const bytesToRead = Math.min(buffer.byteLength, remainingBytes - byteLength + 1);\n    if (bytesToRead <= 0) throw new Error(`memory snapshot exceeds 4 MiB raw content limit at ${relativePath}`);\n    const { bytesRead } = await handle.read(buffer, 0, bytesToRead, null);\n    if (bytesRead === 0) break;\n    byteLength += bytesRead;\n    await onChunk?.(relativePath, bytesRead);\n    if (byteLength > remainingBytes) {\n      throw new Error(`memory snapshot exceeds 4 MiB raw content limit at ${relativePath}`);\n    }\n    chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));\n  }\n  return Buffer.concat(chunks, byteLength);\n}\n\nexport async function captureMemoryFingerprint(\n  aiEmployeeDir: string,\n  cache: MemoryFingerprintCache = new Map(),\n  observer?: MemoryFingerprintReadObserver,\n  hooks?: MemoryPathOperationHooks,\n): Promise<Map<string, string>> {\n  const trustedRoot = await resolveTrustedWorkspaceRoot(aiEmployeeDir);\n  const currentPaths = await listMemorySnapshotCandidatePaths(aiEmployeeDir, trustedRoot);\n  const candidatePaths = new Set([...currentPaths, ...cache.keys()]);\n  const fingerprints = new Map<string, string>();\n  let totalRawBytes = 0;\n  for (const relativePath of candidatePaths) {\n    let opened: { handle: FileHandle; size: number; mtimeMs: number; ctimeMs: number; dev: number; ino: number } | null = null;\n    try {\n      opened = await openContainedRegularFile(trustedRoot, relativePath, hooks);\n      if (!opened) {\n        cache.delete(relativePath);\n        continue;\n      }\n      if (totalRawBytes + opened.size > MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES) {\n        throw new Error(`memory snapshot exceeds 4 MiB raw content limit at ${relativePath}`);\n      }\n      const cached = cache.get(relativePath);\n      let hash = cached?.size === opened.size\n        && cached.mtimeMs === opened.mtimeMs\n        && cached.ctimeMs === opened.ctimeMs\n        && cached.dev === opened.dev\n        && cached.ino === opened.ino\n        ? cached.hash\n        : undefined;\n      if (!hash) {\n        await hooks?.onBeforeFileRead?.(relativePath);\n        const fingerprint = await hashFileHandleWithinLimit(\n          opened.handle,\n          MEMORY_SNAPSHOT_RAW_CONTENT_LIMIT_BYTES - totalRawBytes,\n          relativePath,\n        );\n        hash = fingerprint.hash;\n        totalRawBytes += fingerprint.byteLength;\n        await observer?.onContentRead?.({ relativePath, byteLength: fingerprint.byteLength });\n      } else {\n        totalRawBytes += opened.size;\n      }\n      cache.set(relativePath, {\n        size: opened.size,\n        mtimeMs: opened.mtimeMs,\n        ctimeMs: opened.ctimeMs,\n        dev: opened.dev,\n        ino: opened.ino,\n        hash,\n      });\n      fingerprints.set(relativePath, hash);\n    } catch (error) {\n      if ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") throw error;\n      cache.delete(relativePath);\n    } finally {\n      await opened?.handle.close().catch(() => undefined);\n    }\n  }\n  return fingerprints;\n}\n\nasync function hashFileHandleWithinLimit(\n  handle: FileHandle,\n  remainingBytes: number,\n  relativePath: string,\n): Promise<{ hash: string; byteLength: number }> {\n  const hash = createHash(\"sha256\");\n  const buffer = Buffer.allocUnsafe(Math.min(64 * 1024, remainingBytes + 1));\n  let byteLength = 0;\n  while (true) {\n    const bytesToRead = Math.min(buffer.byteLength, remainingBytes - byteLength + 1);\n    if (bytesToRead <= 0) throw new Error(`memory snapshot exceeds 4 MiB raw content limit at ${relativePath}`);\n    const { bytesRead } = await handle.read(buffer, 0, bytesToRead, null);\n    if (bytesRead === 0) break;\n    byteLength += bytesRead;\n    if (byteLength > remainingBytes) {\n      throw new Error(`memory snapshot exceeds 4 MiB raw content limit at ${relativePath}`);\n    }\n    hash.update(buffer.subarray(0, bytesRead));\n  }\n  return { hash: hash.digest(\"hex\"), byteLength };\n}\n\nexport function diffMemoryFingerprints(before: Map<string, string>, after: Map<string, string>, lessonsRead: boolean | null): AIEmployeeMemoryStats {\n  const paths = new Set([...before.keys(), ...after.keys()]);\n  const notesWritten = [...paths].filter((relativePath) => before.get(relativePath) !== after.get(relativePath)).sort();\n  return {\n    memory_updated: notesWritten.length > 0,\n    notes_written: notesWritten,\n    lessons_read: lessonsRead,\n  };\n}\n\nexport async function applyMemoryRestore(\n  aiEmployeeDir: string,\n  files: AIEmployeeMemorySnapshotFile[] | undefined,\n  hooks?: MemoryPathOperationHooks,\n): Promise<void> {\n  if (!files?.length) return;\n  const validatedFiles = validateMemorySnapshotFiles(files);\n  if (!validatedFiles.length) return;\n  await mkdir(aiEmployeeDir, { recursive: true });\n  const trustedRoot = await resolveTrustedWorkspaceRoot(aiEmployeeDir);\n  for (const file of validatedFiles) {\n    const relativePath = file.path;\n    const absolutePath = path.join(aiEmployeeDir, relativePath);\n    const parentIdentities = await ensureContainedParentDirectories(trustedRoot, relativePath);\n    if (await containedPathAlreadyExists(trustedRoot, relativePath)) continue;\n    // O_NOFOLLOW is unavailable on Windows and only protects the final component on POSIX.\n    // Portable safety comes from matching root, parent, path, and opened-handle identities.\n    const flags = fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | (fsConstants.O_NOFOLLOW ?? 0);\n    let handle: FileHandle | undefined;\n    let createdIdentity: FileIdentity | undefined;\n    try {\n      await hooks?.onBeforeFileOpen?.(relativePath);\n      handle = await open(absolutePath, flags, 0o666);\n      await hooks?.onAfterFileOpen?.(relativePath);\n      const openedMetadata = await handle.stat();\n      createdIdentity = fileIdentity(openedMetadata);\n      const pathMetadata = await lstat(absolutePath);\n      const resolvedPath = await realpath(absolutePath);\n      await assertTrustedWorkspaceRoot(trustedRoot);\n      await assertVerifiedDirectoryIdentities(trustedRoot, parentIdentities, relativePath);\n      if (\n        !openedMetadata.isFile()\n        || openedMetadata.nlink !== 1\n        || pathMetadata.isSymbolicLink()\n        || !pathMetadata.isFile()\n        || pathMetadata.nlink !== 1\n        || !sameFileIdentity(openedMetadata, pathMetadata)\n        || !isPathContainedBy(trustedRoot.realPath, resolvedPath)\n      ) throw unsafeMemoryPath(relativePath);\n      await handle.writeFile(file.content, \"utf8\");\n    } catch (error) {\n      if (handle) {\n        if (!createdIdentity) {\n          const openedMetadata = await handle.stat().catch(() => undefined);\n          if (openedMetadata) createdIdentity = fileIdentity(openedMetadata);\n        }\n        await handle.close().catch(() => undefined);\n        handle = undefined;\n        if (createdIdentity) {\n          await unlinkCreatedRestoreFileIfStillOwned(\n            trustedRoot,\n            parentIdentities,\n            relativePath,\n            createdIdentity,\n          );\n        }\n      }\n      if ((error as NodeJS.ErrnoException)?.code === \"EEXIST\") {\n        if (await containedPathAlreadyExists(trustedRoot, relativePath)) continue;\n      }\n      throw error;\n    } finally {\n      await handle?.close().catch(() => undefined);\n    }\n  }\n}\n\nexport function validateMemorySnapshotFiles(\n  files: AIEmployeeMemorySnapshotFile[],\n): Array<{ path: string; content: string }> {\n  const validated: Array<{ path: string; content: string }> = [];\n  const seenPaths = new Set<string>();\n  for (const file of files) {\n    const relativePath = normalizeSafeSnapshotPath(file.path);\n    if (!relativePath) continue;\n    if (seenPaths.has(relativePath)) throw invalidMemorySnapshot(relativePath, \"duplicate path\");\n    seenPaths.add(relativePath);\n    if (file.truncated) throw invalidMemorySnapshot(relativePath, \"legacy file is truncated\");\n\n    const hasChunks = Object.prototype.hasOwnProperty.call(file, \"chunks\");\n    const hasByteLength = Object.prototype.hasOwnProperty.call(file, \"byteLength\");\n    if (hasChunks !== hasByteLength) {\n      throw invalidMemorySnapshot(relativePath, \"incomplete v2 structure\");\n    }\n    if (!hasChunks) {\n      if (typeof file.content !== \"string\") throw invalidMemorySnapshot(relativePath, \"missing content or chunks\");\n      if (file.hash !== sha256(file.content)) throw invalidMemorySnapshot(relativePath, \"file hash mismatch\");\n      validated.push({ path: relativePath, content: file.content });\n      continue;\n    }\n    const v2File = file as Extract<AIEmployeeMemorySnapshotFile, { chunks: unknown }>;\n    if (!Number.isSafeInteger(v2File.byteLength) || v2File.byteLength < 0) {\n      throw invalidMemorySnapshot(relativePath, \"invalid file byte length\");\n    }\n    if (!Array.isArray(v2File.chunks) || v2File.chunks.length === 0) {\n      throw invalidMemorySnapshot(relativePath, \"missing chunks\");\n    }\n    const contents: string[] = [];\n    for (let index = 0; index < v2File.chunks.length; index += 1) {\n      const chunk = v2File.chunks[index];\n      if (!chunk || chunk.index !== index) throw invalidMemorySnapshot(relativePath, \"non-contiguous chunk indexes\");\n      if (typeof chunk.content !== \"string\") throw invalidMemorySnapshot(relativePath, `chunk ${index} content is invalid`);\n      const actualByteLength = Buffer.byteLength(chunk.content, \"utf8\");\n      if (\n        !Number.isSafeInteger(chunk.byteLength)\n        || chunk.byteLength !== actualByteLength\n        || actualByteLength > MEMORY_SNAPSHOT_CHUNK_LIMIT_BYTES\n      ) throw invalidMemorySnapshot(relativePath, `chunk ${index} byte length mismatch`);\n      if (chunk.hash !== sha256(chunk.content)) throw invalidMemorySnapshot(relativePath, `chunk ${index} hash mismatch`);\n      contents.push(chunk.content);\n    }\n    const content = contents.join(\"\");\n    if (Buffer.byteLength(content, \"utf8\") !== v2File.byteLength) {\n      throw invalidMemorySnapshot(relativePath, \"file byte length mismatch\");\n    }\n    if (v2File.hash !== sha256(content)) throw invalidMemorySnapshot(relativePath, \"file hash mismatch\");\n    if (v2File.content !== undefined && v2File.content !== content) {\n      throw invalidMemorySnapshot(relativePath, \"inline content does not match chunks\");\n    }\n    validated.push({ path: relativePath, content });\n  }\n  return validated;\n}\n\nasync function unlinkCreatedRestoreFileIfStillOwned(\n  trustedRoot: TrustedWorkspaceRoot,\n  parentIdentities: VerifiedDirectoryIdentity[],\n  relativePath: string,\n  createdIdentity: FileIdentity,\n): Promise<void> {\n  const absolutePath = path.join(trustedRoot.inputPath, relativePath);\n  try {\n    await assertTrustedWorkspaceRoot(trustedRoot);\n    await assertVerifiedDirectoryIdentities(trustedRoot, parentIdentities, relativePath);\n    const pathMetadata = await lstat(absolutePath);\n    if (pathMetadata.isSymbolicLink() || !sameFileIdentity(pathMetadata, createdIdentity)) return;\n    await unlink(absolutePath);\n  } catch (error) {\n    if (isMissingOrUnsafePathError(error)) return;\n    throw error;\n  }\n}\n\nasync function openContainedRegularFile(\n  trustedRoot: TrustedWorkspaceRoot,\n  relativePath: string,\n  hooks?: MemoryPathOperationHooks,\n): Promise<{ handle: FileHandle; size: number; mtimeMs: number; ctimeMs: number; dev: number; ino: number } | null> {\n  const absolutePath = path.join(trustedRoot.inputPath, relativePath);\n  try {\n    await assertTrustedWorkspaceRoot(trustedRoot);\n    const parentIdentities = await inspectContainedParentDirectories(trustedRoot, relativePath);\n    if (!parentIdentities) return null;\n    const metadata = await lstat(absolutePath);\n    if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.nlink !== 1) return null;\n    const resolvedBeforeOpen = await realpath(absolutePath);\n    if (!isPathContainedBy(trustedRoot.realPath, resolvedBeforeOpen)) return null;\n    await hooks?.onBeforeFileOpen?.(relativePath);\n    const handle = await open(absolutePath, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));\n    try {\n      await hooks?.onAfterFileOpen?.(relativePath);\n      const openedMetadata = await handle.stat();\n      const pathMetadata = await lstat(absolutePath);\n      const resolvedAfterOpen = await realpath(absolutePath);\n      await assertTrustedWorkspaceRoot(trustedRoot);\n      await assertVerifiedDirectoryIdentities(trustedRoot, parentIdentities, relativePath);\n      if (\n        !openedMetadata.isFile()\n        || openedMetadata.nlink !== 1\n        || pathMetadata.isSymbolicLink()\n        || !pathMetadata.isFile()\n        || pathMetadata.nlink !== 1\n        || !sameFileIdentity(metadata, openedMetadata)\n        || !sameFileIdentity(openedMetadata, pathMetadata)\n        || resolvedAfterOpen !== resolvedBeforeOpen\n        || !isPathContainedBy(trustedRoot.realPath, resolvedAfterOpen)\n      ) {\n        await handle.close();\n        return null;\n      }\n      return {\n        handle,\n        size: openedMetadata.size,\n        mtimeMs: openedMetadata.mtimeMs,\n        ctimeMs: openedMetadata.ctimeMs,\n        dev: openedMetadata.dev,\n        ino: openedMetadata.ino,\n      };\n    } catch (error) {\n      await handle.close().catch(() => undefined);\n      throw error;\n    }\n  } catch (error) {\n    if (isMissingOrUnsafePathError(error)) return null;\n    throw error;\n  }\n}\n\nasync function ensureContainedParentDirectories(\n  trustedRoot: TrustedWorkspaceRoot,\n  relativePath: string,\n): Promise<VerifiedDirectoryIdentity[]> {\n  await assertTrustedWorkspaceRoot(trustedRoot);\n  const parentParts = path.posix.dirname(relativePath).split(\"/\").filter((part) => part && part !== \".\");\n  const identities: VerifiedDirectoryIdentity[] = [];\n  let currentPath = trustedRoot.inputPath;\n  for (const part of parentParts) {\n    currentPath = path.join(currentPath, part);\n    await mkdir(currentPath).catch((error) => {\n      if ((error as NodeJS.ErrnoException)?.code !== \"EEXIST\") throw error;\n    });\n    const metadata = await lstat(currentPath);\n    if (!metadata.isDirectory() || metadata.isSymbolicLink()) throw unsafeMemoryPath(relativePath);\n    const resolvedPath = await realpath(currentPath);\n    if (!isPathContainedBy(trustedRoot.realPath, resolvedPath)) throw unsafeMemoryPath(relativePath);\n    identities.push({ path: currentPath, identity: fileIdentity(metadata) });\n  }\n  await assertTrustedWorkspaceRoot(trustedRoot);\n  return identities;\n}\n\nasync function containedPathAlreadyExists(\n  trustedRoot: TrustedWorkspaceRoot,\n  relativePath: string,\n): Promise<boolean> {\n  const absolutePath = path.join(trustedRoot.inputPath, relativePath);\n  try {\n    const parentIdentities = await inspectContainedParentDirectories(trustedRoot, relativePath);\n    if (!parentIdentities) return false;\n    const metadata = await lstat(absolutePath);\n    if (metadata.isSymbolicLink()) throw unsafeMemoryPath(relativePath);\n    const resolvedPath = await realpath(absolutePath);\n    if (!isPathContainedBy(trustedRoot.realPath, resolvedPath)) throw unsafeMemoryPath(relativePath);\n    await assertTrustedWorkspaceRoot(trustedRoot);\n    await assertVerifiedDirectoryIdentities(trustedRoot, parentIdentities, relativePath);\n    return true;\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return false;\n    throw error;\n  }\n}\n\nasync function inspectContainedParentDirectories(\n  trustedRoot: TrustedWorkspaceRoot,\n  relativePath: string,\n): Promise<VerifiedDirectoryIdentity[] | null> {\n  const parentParts = path.posix.dirname(relativePath).split(\"/\").filter((part) => part && part !== \".\");\n  const identities: VerifiedDirectoryIdentity[] = [];\n  let currentPath = trustedRoot.inputPath;\n  try {\n    await assertTrustedWorkspaceRoot(trustedRoot);\n    for (const part of parentParts) {\n      currentPath = path.join(currentPath, part);\n      const metadata = await lstat(currentPath);\n      if (!metadata.isDirectory() || metadata.isSymbolicLink()) throw unsafeMemoryPath(relativePath);\n      const resolvedPath = await realpath(currentPath);\n      if (!isPathContainedBy(trustedRoot.realPath, resolvedPath)) throw unsafeMemoryPath(relativePath);\n      identities.push({ path: currentPath, identity: fileIdentity(metadata) });\n    }\n    return identities;\n  } catch (error) {\n    if (isMissingOrUnsafePathError(error)) return null;\n    throw error;\n  }\n}\n\nasync function assertVerifiedDirectoryIdentities(\n  trustedRoot: TrustedWorkspaceRoot,\n  identities: VerifiedDirectoryIdentity[],\n  relativePath: string,\n): Promise<void> {\n  await assertTrustedWorkspaceRoot(trustedRoot);\n  for (const item of identities) {\n    const metadata = await lstat(item.path);\n    if (\n      !metadata.isDirectory()\n      || metadata.isSymbolicLink()\n      || !sameFileIdentity(metadata, item.identity)\n    ) throw unsafeMemoryPath(relativePath);\n    const resolvedPath = await realpath(item.path);\n    if (!isPathContainedBy(trustedRoot.realPath, resolvedPath)) throw unsafeMemoryPath(relativePath);\n  }\n}\n\nasync function resolveTrustedWorkspaceRoot(aiEmployeeDir: string): Promise<TrustedWorkspaceRoot> {\n  const before = await lstat(aiEmployeeDir);\n  if (!before.isDirectory() || before.isSymbolicLink()) throw unsafeMemoryWorkspaceRoot(aiEmployeeDir);\n  const resolvedPath = await realpath(aiEmployeeDir);\n  const after = await lstat(aiEmployeeDir);\n  if (\n    !after.isDirectory()\n    || after.isSymbolicLink()\n    || !sameFileIdentity(before, after)\n  ) throw unsafeMemoryWorkspaceRoot(aiEmployeeDir);\n  return { inputPath: aiEmployeeDir, realPath: resolvedPath, identity: fileIdentity(after) };\n}\n\nasync function assertTrustedWorkspaceRoot(trustedRoot: TrustedWorkspaceRoot): Promise<void> {\n  const metadata = await lstat(trustedRoot.inputPath);\n  if (\n    !metadata.isDirectory()\n    || metadata.isSymbolicLink()\n    || !sameFileIdentity(metadata, trustedRoot.identity)\n  ) throw unsafeMemoryWorkspaceRoot(trustedRoot.inputPath);\n  const resolvedPath = await realpath(trustedRoot.inputPath);\n  if (path.relative(trustedRoot.realPath, resolvedPath) !== \"\") throw unsafeMemoryWorkspaceRoot(trustedRoot.inputPath);\n}\n\nfunction fileIdentity(metadata: Pick<Stats, \"dev\" | \"ino\">): FileIdentity {\n  return { dev: metadata.dev, ino: metadata.ino };\n}\n\nfunction sameFileIdentity(\n  left: Pick<Stats, \"dev\" | \"ino\"> | FileIdentity,\n  right: Pick<Stats, \"dev\" | \"ino\"> | FileIdentity,\n): boolean {\n  return left.dev === right.dev && left.ino === right.ino;\n}\n\nasync function pathHasSymlinkComponent(aiEmployeeDir: string, relativePath: string): Promise<boolean> {\n  let currentPath = aiEmployeeDir;\n  for (const part of relativePath.split(\"/\")) {\n    if (!part) continue;\n    currentPath = path.join(currentPath, part);\n    try {\n      if ((await lstat(currentPath)).isSymbolicLink()) return true;\n    } catch (error) {\n      if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return false;\n      throw error;\n    }\n  }\n  return false;\n}\n\nfunction isPathContainedBy(rootPath: string, candidatePath: string): boolean {\n  const relativePath = path.relative(rootPath, candidatePath);\n  return relativePath === \"\" || (\n    relativePath !== \"..\"\n    && !relativePath.startsWith(`..${path.sep}`)\n    && !path.isAbsolute(relativePath)\n  );\n}\n\nfunction isMissingOrUnsafePathError(error: unknown): boolean {\n  const code = (error as NodeJS.ErrnoException)?.code;\n  return code === \"ENOENT\" || code === \"ENOTDIR\" || code === \"ELOOP\" || code === \"WM_UNSAFE_MEMORY_PATH\";\n}\n\nfunction unsafeMemoryPath(relativePath: string): Error {\n  const error = new Error(`unsafe memory snapshot path: ${relativePath}`) as NodeJS.ErrnoException;\n  error.code = \"WM_UNSAFE_MEMORY_PATH\";\n  return error;\n}\n\nfunction unsafeMemoryWorkspaceRoot(aiEmployeeDir: string): Error {\n  return new Error(`unsafe memory workspace root: ${aiEmployeeDir}`);\n}\n\nfunction invalidMemorySnapshot(relativePath: string, reason: string): Error {\n  return new Error(`invalid memory snapshot file ${relativePath}: ${reason}`);\n}\n\nasync function listMemorySnapshotCandidatePaths(\n  aiEmployeeDir: string,\n  trustedRoot: TrustedWorkspaceRoot,\n  options?: { failOnUnsafeExistingPath?: boolean },\n): Promise<string[]> {\n  const paths = new Set<string>();\n  for (const fixedPath of MEMORY_SNAPSHOT_FIXED_PATHS) paths.add(fixedPath);\n  for (const knowledgePath of MEMORY_SNAPSHOT_KNOWLEDGE_PATHS) paths.add(knowledgePath);\n  for (const retroPath of await listRetroMemoryPaths(aiEmployeeDir, trustedRoot, options)) paths.add(retroPath);\n  return [...paths].filter(Boolean).sort(compareMemorySnapshotPaths);\n}\n\nasync function listRetroMemoryPaths(\n  aiEmployeeDir: string,\n  trustedRoot: TrustedWorkspaceRoot,\n  options?: { failOnUnsafeExistingPath?: boolean },\n): Promise<string[]> {\n  const retroDir = path.join(aiEmployeeDir, \"notes\", \"retro\");\n  let entries: Array<{ name: string; isFile(): boolean }>;\n  try {\n    await assertTrustedWorkspaceRoot(trustedRoot);\n    if (await pathHasSymlinkComponent(aiEmployeeDir, \"notes/retro\")) {\n      if (options?.failOnUnsafeExistingPath) throw unsafeMemoryPath(\"notes/retro\");\n      return [];\n    }\n    if (!isPathContainedBy(trustedRoot.realPath, await realpath(retroDir))) {\n      if (options?.failOnUnsafeExistingPath) throw unsafeMemoryPath(\"notes/retro\");\n      return [];\n    }\n    entries = await readdir(retroDir, { withFileTypes: true });\n    await assertTrustedWorkspaceRoot(trustedRoot);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return [];\n    throw error;\n  }\n  return entries\n    .filter((entry) => (options?.failOnUnsafeExistingPath || entry.isFile()) && entry.name.endsWith(\".md\"))\n    .map((entry) => path.posix.join(\"notes\", \"retro\", entry.name))\n    .sort()\n    .reverse();\n}\n\nfunction memorySnapshotPriority(relativePath: string): number {\n  if (relativePath === \"MEMORY.md\") return 0;\n  if (relativePath === \"notes/lessons.md\") return 1;\n  if (relativePath.startsWith(\"notes/retro/\")) return 2;\n  if (relativePath === \"notes/user-preferences.md\") return 3;\n  if (relativePath === \"notes/work-log.md\") return 4;\n  if (relativePath.startsWith(\".wm/knowledge/retros/\")) return 5;\n  if (relativePath.startsWith(\".wm/knowledge/\")) return 6;\n  return 10;\n}\n\nfunction compareMemorySnapshotPaths(left: string, right: string): number {\n  const priority = memorySnapshotPriority(left) - memorySnapshotPriority(right);\n  if (priority !== 0) return priority;\n  if (left.startsWith(\"notes/retro/\") && right.startsWith(\"notes/retro/\")) return right.localeCompare(left);\n  return left.localeCompare(right);\n}\n\nfunction splitUtf8MemorySnapshotChunks(content: string): Array<{\n  index: number;\n  content: string;\n  byteLength: number;\n  hash: string;\n}> {\n  const chunks: string[] = [];\n  let codePoints: string[] = [];\n  let byteLength = 0;\n  for (const codePoint of content) {\n    const codePointByteLength = Buffer.byteLength(codePoint, \"utf8\");\n    if (byteLength > 0 && byteLength + codePointByteLength > MEMORY_SNAPSHOT_CHUNK_LIMIT_BYTES) {\n      chunks.push(codePoints.join(\"\"));\n      codePoints = [];\n      byteLength = 0;\n    }\n    codePoints.push(codePoint);\n    byteLength += codePointByteLength;\n  }\n  chunks.push(codePoints.join(\"\"));\n  return chunks.map((chunk, index) => ({\n    index,\n    content: chunk,\n    byteLength: Buffer.byteLength(chunk, \"utf8\"),\n    hash: sha256(chunk),\n  }));\n}\n\nfunction redactMemorySnapshotContent(content: string): { content: string; redacted: boolean } {\n  const patterns: RegExp[] = [\n    /sk-[A-Za-z0-9_-]{12,}/g,\n    /Bearer\\s+[A-Za-z0-9._~+/=-]{12,}/gi,\n    /AKIA[0-9A-Z]{16}/g,\n    /xoxb-[A-Za-z0-9-]{10,}/g,\n    /-----BEGIN [A-Z ]+PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]+PRIVATE KEY-----/g,\n  ];\n  let redacted = false;\n  let next = content;\n  for (const pattern of patterns) {\n    next = next.replace(pattern, () => {\n      redacted = true;\n      return \"[REDACTED]\";\n    });\n  }\n  return { content: next, redacted };\n}\n\nfunction normalizeSafeSnapshotPath(inputPath: string): string | null {\n  const normalized = inputPath.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n  if (!normalized || normalized.includes(\"\\0\")) return null;\n  if ((normalized === \".wm\" || normalized.startsWith(\".wm/\")) && !isKnowledgeSnapshotPathAllowed(normalized)) return null;\n  if (normalized.split(\"/\").some((part) => part === \"..\" || part === \"\")) return null;\n  if (!isMemorySnapshotPathAllowed(normalized)) return null;\n  return normalized;\n}\n\nfunction isMemorySnapshotPathAllowed(relativePath: string): boolean {\n  if (MEMORY_SNAPSHOT_FIXED_PATHS.includes(relativePath)) return true;\n  if (isKnowledgeSnapshotPathAllowed(relativePath)) return true;\n  return relativePath.startsWith(\"notes/retro/\") && relativePath.endsWith(\".md\") && !relativePath.slice(\"notes/retro/\".length).includes(\"/\");\n}\n\nfunction isKnowledgeSnapshotPathAllowed(relativePath: string): boolean {\n  return MEMORY_SNAPSHOT_KNOWLEDGE_PATHS.includes(relativePath);\n}\n\nfunction sha256(content: string | Buffer): string {\n  return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nexport async function createAIEmployeeWorkspace(\n  input: CreateAIEmployeeWorkspaceInput\n): Promise<AIEmployeeWorkspace> {\n  const serverDir = input.machineId\n    ? path.join(input.rootDir, input.machineDirectoryName)\n    : path.join(input.rootDir, input.serverNamespace);\n  const logicalAIEmployeeDir = path.join(serverDir, input.aiEmployeeDirectoryName);\n  const aiEmployeeDir = input.stagingDirectory ?? logicalAIEmployeeDir;\n  const wmDir = path.join(aiEmployeeDir, \".wm\");\n  const knowledgeDir = path.join(wmDir, \"knowledge\");\n  const notesDir = path.join(aiEmployeeDir, \"notes\");\n  const runtimeSessionsDir = path.join(wmDir, \"runtime-sessions\");\n  const runsDir = path.join(wmDir, \"runs\");\n  const memoryPath = path.join(aiEmployeeDir, \"MEMORY.md\");\n  const lessonsPath = path.join(notesDir, \"lessons.md\");\n  const aiEmployeeTokenPath = path.join(wmDir, \"ai-employee-token\");\n  const wrapperPath = path.join(wmDir, \"wm\");\n  const wrapperCliPath = path.join(wmDir, \"wm-cli.js\");\n  const larkGuardPath = path.join(wmDir, \"lark-cli-guard.js\");\n  const larkWrapperPath = path.join(wmDir, \"lark-cli\");\n  const toolPolicyPath = path.join(wmDir, \"tool-policy.json\");\n  const platformSystemPromptPath = path.join(wmDir, \"platform-system-prompt.md\");\n  const employeeProfilePromptPath = path.join(wmDir, \"employee-profile-prompt.md\");\n  const systemPromptPath = path.join(wmDir, \"system-prompt.md\");\n\n  await mkdir(notesDir, { recursive: true });\n  await mkdir(runtimeSessionsDir, { recursive: true });\n  await mkdir(runsDir, { recursive: true });\n  if (input.learningCandidateSnapshot !== undefined) {\n    if (input.profileApplyGeneration === undefined) throw new Error(\"learning candidate snapshot requires profile apply generation\");\n    await materializeAIEmployeeLearningCandidates(\n      aiEmployeeDir,\n      input.learningCandidateSnapshot,\n      input.profileApplyGeneration,\n    );\n  }\n  await applyMemoryRestore(aiEmployeeDir, input.memoryRestore, input.memoryRestoreHooks);\n  await writeFile(memoryPath, buildMemory(input), { flag: \"wx\" }).catch((error) => {\n    if (error?.code !== \"EEXIST\") {\n      throw error;\n    }\n  });\n  await writeFile(lessonsPath, buildLessonsTemplate(input), { flag: \"wx\" }).catch((error) => {\n    if (error?.code !== \"EEXIST\") {\n      throw error;\n    }\n  });\n  await writeFile(aiEmployeeTokenPath, buildAIEmployeeToken(input), { flag: \"wx\" }).catch(\n    (error) => {\n      if (error?.code !== \"EEXIST\") {\n        throw error;\n      }\n    }\n  );\n  const referenceIndexSources = await ensureReferenceIndex(aiEmployeeDir, {\n    aiEmployeeId: input.aiEmployeeId,\n    aiEmployeeName: input.aiEmployeeName,\n    aiEmployeeWorkContext: input.aiEmployeeWorkContext,\n  });\n  await syncWorkspaceSkills(wmDir);\n  await injectSkillsIntoWorkspace({ workspaceDir: aiEmployeeDir, runtime: input.runtime });\n  await writeAIEmployeePromptFiles(input, {\n    aiEmployeeDir: logicalAIEmployeeDir,\n    wrapperPath: path.join(logicalAIEmployeeDir, \".wm\", \"wm\"),\n    platformSystemPromptPath,\n    employeeProfilePromptPath,\n    systemPromptPath,\n  });\n  await writeFile(toolPolicyPath, JSON.stringify(resolveAIEmployeeToolPolicy(input.aiEmployeeWorkContext), null, 2), \"utf8\");\n  await writeFile(wrapperCliPath, buildWrapperCli(), \"utf8\");\n  await writeFile(larkGuardPath, buildLarkCliGuard(), \"utf8\");\n  await writeFile(wrapperPath, buildWrapper(wrapperCliPath), \"utf8\");\n  await writeFile(larkWrapperPath, await buildLarkWrapper(), \"utf8\");\n  await chmod(wrapperPath, 0o755);\n  await chmod(larkWrapperPath, 0o755);\n\n  return {\n    serverDir,\n    aiEmployeeDir,\n    wmDir,\n    knowledgeDir,\n    referenceIndex: {\n      sourceCount: referenceIndexSources.length,\n      sources: referenceIndexSources,\n    },\n    memoryPath,\n    notesDir,\n    runtimeSessionsDir,\n    runsDir,\n    aiEmployeeTokenPath,\n    wrapperPath,\n    wrapperCliPath,\n    platformSystemPromptPath,\n    employeeProfilePromptPath,\n    systemPromptPath,\n  };\n}\n\nexport function rebaseAIEmployeeWorkspace(\n  workspace: AIEmployeeWorkspace,\n  aiEmployeeDir: string,\n): AIEmployeeWorkspace {\n  const previousRoot = workspace.aiEmployeeDir;\n  const rebase = (value: string): string => value === previousRoot\n    ? aiEmployeeDir\n    : value.startsWith(`${previousRoot}${path.sep}`)\n      ? path.join(aiEmployeeDir, path.relative(previousRoot, value))\n      : value;\n  return {\n    ...workspace,\n    aiEmployeeDir,\n    wmDir: rebase(workspace.wmDir),\n    knowledgeDir: rebase(workspace.knowledgeDir),\n    memoryPath: rebase(workspace.memoryPath),\n    notesDir: rebase(workspace.notesDir),\n    runtimeSessionsDir: rebase(workspace.runtimeSessionsDir),\n    runsDir: rebase(workspace.runsDir),\n    aiEmployeeTokenPath: rebase(workspace.aiEmployeeTokenPath),\n    wrapperPath: rebase(workspace.wrapperPath),\n    wrapperCliPath: rebase(workspace.wrapperCliPath),\n    platformSystemPromptPath: rebase(workspace.platformSystemPromptPath),\n    employeeProfilePromptPath: rebase(workspace.employeeProfilePromptPath),\n    systemPromptPath: rebase(workspace.systemPromptPath),\n  };\n}\n\nexport async function writeAIEmployeePromptFiles(\n  input: CreateAIEmployeeWorkspaceInput,\n  paths: {\n    aiEmployeeDir: string;\n    wrapperPath: string;\n    platformSystemPromptPath: string;\n    employeeProfilePromptPath: string;\n    systemPromptPath: string;\n  }\n): Promise<void> {\n  const platformPrompt = await buildPlatformSystemPrompt(input, paths);\n  const employeePrompt = buildEmployeeProfilePrompt(input);\n  await writeFile(paths.platformSystemPromptPath, platformPrompt, \"utf8\");\n  await writeFile(paths.employeeProfilePromptPath, employeePrompt, \"utf8\");\n  await writeFile(paths.systemPromptPath, [platformPrompt, employeePrompt].filter(Boolean).join(\"\\n\\n\"), \"utf8\");\n}\n\nfunction buildMemory(input: CreateAIEmployeeWorkspaceInput): string {\n  const role = input.role?.trim() || \"NiuMa local agent\";\n\n  return [\n    `# ${input.aiEmployeeName}`,\n    \"\",\n    \"## Role\",\n    \"\",\n    role,\n    \"\",\n    \"## Key Knowledge\",\n    \"\",\n    \"- No durable knowledge has been recorded yet.\",\n    \"- Add stable user preferences, project context, and work history to notes, then link them from this file.\",\n    \"\",\n    \"## Active Context\",\n    \"\",\n    \"- First startup.\",\n    \"- Before long work, keep this section current enough to recover after interruption or context compression.\",\n    \"\",\n    \"## Memory Index\",\n    \"\",\n    \"- `notes/user-preferences.md` -- User preferences, communication style, recurring requests, and conventions.\",\n    \"- `notes/lessons.md` -- Stable lessons from retrospectives, corrections, and repeated failure patterns.\",\n    \"- `notes/work-log.md` -- Important completed work, decisions, failed approaches, and verification history.\",\n    \"- `notes/channels.md` -- Platform channel, DM, and thread context when relevant.\",\n    \"- `notes/<domain>.md` -- Domain-specific knowledge that deserves its own durable file.\",\n    \"- `wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md` -- Read one validated, single-generation reference bundle for an answer.\",\n    \"- `.wm/knowledge/retros/` -- Candidate index and memory improvements from slow or wrong answers.\",\n    \"\",\n    \"## Platform Context\",\n    \"\",\n    `- AIEmployee ID: ${input.aiEmployeeId}`,\n    `- Server Namespace: ${input.serverNamespace}`,\n    `- Server ID: ${input.serverId}`,\n    ...(input.machineId ? [`- Machine ID: ${input.machineId}`] : []),\n    `- Daemon ID: ${input.daemonId}`,\n    `- Runtime: ${input.runtime}`,\n    \"\",\n    \"## Memory Rules\",\n    \"\",\n    \"- MEMORY.md is the recovery index for this agent.\",\n    \"- Keep `MEMORY.md` concise and update it when new note files are added.\",\n    \"- Keep detailed long-lived knowledge in `notes/`.\",\n    \"- Keep `notes/lessons.md` concise and reusable; it is loaded first for lessons from prior mistakes.\",\n    \"- Do not store secrets, tokens, passwords, private keys, or sensitive credentials in memory or notes.\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction buildLessonsTemplate(input: CreateAIEmployeeWorkspaceInput): string {\n  return [\n    `# ${input.aiEmployeeName} Lessons`,\n    \"\",\n    \"Stable lessons from retrospectives, corrections, and repeated mistakes go here.\",\n    \"\",\n    \"## Current Lessons\",\n    \"\",\n    \"- No lessons recorded yet.\",\n    \"\",\n    \"## Rules\",\n    \"\",\n    \"- Keep lessons short, durable, and reusable across future turns.\",\n    \"- Prefer behavior rules over raw incident logs.\",\n    \"- Do not store secrets, credentials, tokens, or private data.\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nasync function buildPlatformSystemPrompt(\n  input: CreateAIEmployeeWorkspaceInput,\n  paths: { aiEmployeeDir: string; wrapperPath: string }\n): Promise<string> {\n  const role = input.role?.trim() || \"NiuMa local agent\";\n  const aiEmployeeDir = runtimePathForPrompt(input, paths.aiEmployeeDir);\n  const wrapperPath = runtimePathForPrompt(input, paths.wrapperPath);\n\n  return [\n    `You are \"${input.aiEmployeeName}\", an AI employee in NiuMa -- a collaborative platform where humans and AI employees work together in shared channels while local daemon processes execute AI employee runtime sessions.`,\n    \"\",\n    \"## Who you are\",\n    \"\",\n    \"Your platform identity, AI employee directory, MEMORY.md, notes, and runtime session handoff persist across turns. You may be started, put to sleep when idle, and resumed when the platform delivers more work. Treat yourself as a platform-created colleague with durable local context, not as a one-off command.\",\n    \"\",\n    \"## Current Runtime Context\",\n    \"\",\n    \"This section is authoritative daemon-injected context. Do not infer platform identity from hostname, cwd, runtime account, local user name, or non-platform-created runtime sessions when this section is present.\",\n    \"\",\n    `- AIEmployee ID: ${input.aiEmployeeId}`,\n    `- AIEmployee Name: ${input.aiEmployeeName}`,\n    `- Server Namespace: ${input.serverNamespace}`,\n    `- Server ID: ${input.serverId}`,\n    ...(input.machineId ? [`- Machine ID: ${input.machineId}`] : []),\n    `- Daemon ID: ${input.daemonId}`,\n    `- Hostname: ${os.hostname() || \"unknown\"}`,\n    `- Runtime: ${input.runtime}`,\n    `- Role: ${role}`,\n    `- AIEmployee Directory: ${aiEmployeeDir}`,\n    `- Memory File: ${path.posix.join(aiEmployeeDir, \"MEMORY.md\")}`,\n    `- Notes Directory: ${path.posix.join(aiEmployeeDir, \"notes\")}`,\n    `- wm CLI Wrapper: ${wrapperPath}`,\n    \"\",\n    \"## Communication -- wm CLI\",\n    \"\",\n    \"Use the daemon-created `wm` CLI wrapper for platform chat, task, proxy/routine, attachment, profile, and reminder operations. The daemon prepends the wrapper directory to PATH, so prefer short `wm ...` commands. Use `.wm/wm ...` or the absolute wm CLI Wrapper path only if PATH resolution is unclear. The commands listed below are implemented platform commands, not placeholders.\",\n    \"\",\n    \"Available platform commands:\",\n    \"\",\n    \"1. `wm message check` -- Non-blocking check for new channel, DM, or thread messages at natural breakpoints.\",\n    \"2. `wm message send` -- Send a channel, DM, or thread reply through the platform.\",\n    \"3. `wm dm send` -- Send a private AI employee DM, optionally waiting for a reply.\",\n    \"4. `wm message read` -- Read visible history with pagination or around a specific message.\",\n    \"5. `wm message search` -- Search visible channel and DM history before answering historical questions.\",\n    \"6. `wm server info` -- Inspect the current server, visible channels, humans, aiEmployees, and memberships.\",\n    \"7. `wm channel members` -- Inspect members of a channel, DM, or thread target.\",\n    \"8. `wm member find` -- Find platform members by Feishu open_id.\",\n    \"9. `wm task list` -- View explicit user-visible tasks for a channel or relevant target.\",\n    \"10. `wm task update` -- Move an explicit task through statuses such as todo, in_progress, in_review, and done.\",\n    \"11. `wm task create` -- Create genuine new follow-up work when no canonical user-visible task exists.\",\n    \"12. `wm attachment upload` -- Upload a local artifact and reference it in a platform message.\",\n    \"13. `wm attachment view` -- Download and inspect a platform attachment.\",\n    \"14. `wm profile show` -- Inspect your own profile or a visible human/AI employee profile.\",\n    \"15. `wm profile update` -- Update your display name, description, or avatar when explicitly asked.\",\n    \"16. `wm reminder schedule` -- Schedule a platform-visible reminder for follow-up work.\",\n    \"17. `wm reminder list` -- List reminders and their lifecycle history.\",\n    \"18. `wm reminder snooze` -- Push an existing reminder later.\",\n    \"19. `wm reminder update` -- Change a reminder without creating a duplicate.\",\n    \"20. `wm reminder cancel` -- Cancel a reminder that is no longer needed.\",\n    \"21. `wm routine list` -- List your enabled routine.\",\n    \"22. `wm routine get` -- Inspect one of your routines.\",\n    \"23. `wm routine pause` / `wm routine resume` / `wm routine archive` -- Manage one of your routines.\",\n    \"24. `wm proxy probe` / `wm proxy verify` / `wm proxy create` -- Probe, validate, and register a proxy module from `.wm/proxies/<id>/` (must contain proxy.json + contract.json + handler.ts + fixtures/positive.json).\",\n    \"\",\n    \"Diagnostic command:\",\n    \"\",\n    \"- `wm auth whoami` prints the current platform identity and server URL.\",\n    \"- Use `--json` on wm commands only when you need machine-readable output; default output is optimized for AI employee collaboration.\",\n    \"- Proxy creation rule: `wm proxy create` runs verification internally and rejects creation if structure / config / contract / positive_fixture fail. A 0-draft dry run is not acceptance; every proxy needs a positive sample proving it can create an inbox draft.\",\n    \"- Use platform communication commands as the only channel for channel/task-visible communication. Runtime stdout/final answers are daemon transport details, not the long-term platform protocol.\",\n    \"- File delivery rule: when the user asks you to output, generate, or hand over a file/document, create the file locally, run `wm attachment upload --file <path>`, then send the result with `wm message send --attachment-ids <attachment_id> --text \\\"\u6587\u4EF6\u5DF2\u751F\u6210\\\"`. Do not reply with only a local filesystem path.\",\n    \"\",\n    \"## Work Surface Routing\",\n    \"\",\n    \"First identify where the requested work must happen, then choose the tool for that surface.\",\n    \"\",\n    \"- NiuMa platform: use `wm` for channel replies, DMs, thread collaboration, tasks, attachments, profiles, reminders, and questions directed at other platform AI employees.\",\n    \"- Local workspace: use normal filesystem and shell tools for code, documents, local diagnostics, and verification.\",\n    \"- External systems: use the relevant installed workspace skill, token, CLI, or API for tools outside NiuMa, such as Feishu/Lark.\",\n    \"- Do not turn external-contact requests into platform mentions. If the user asks you to contact a person through an external system, use that external system and then report the result back to the original platform thread.\",\n    \"- If a request needs both surfaces, do the external work on the external surface and use `wm message send` only for the platform-visible progress or final report.\",\n    \"\",\n    \"## CRITICAL RULES\",\n    \"\",\n    \"- Other aiEmployees may be running on different machines. Do not use local processes, workspaces, server activity, task lists, or runtime sessions to answer what another AI employee is doing.\",\n    \"- When a human asks you to ask, check, confirm, contact, or get status from another platform AI employee, your first platform action is to ask that AI employee in the original message thread with `wm message send --target \\\"#channel:<message>\\\"` and an @mention.\",\n    \"- When the request explicitly calls for a private agent DM, use `wm dm send --to-agent-id <ai_employee_id>` instead of a thread mention.\",\n    \"- Wait for that AI employee's platform reply via delivered messages, `wm message check`, or recent unread output; then summarize the reply in the same thread.\",\n    \"- `wm server info`, `wm channel members`, and `wm task list` are discovery tools. They are not authoritative answers for another AI employee's current work.\",\n    \"\",\n    \"## Startup sequence\",\n    \"\",\n    \"1. If the current turn includes a concrete incoming user/platform message, decide whether it needs a quick acknowledgment, blocker question, or ownership signal before deep work.\",\n    \"2. For simple replies, answer directly without reading `MEMORY.md` or skills. For questions that depend on rule-linked reference material, run `wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md` once and use only that validated single-generation bundle for the answer. For work that depends on durable context or prior corrections, read `notes/lessons.md` first, then `MEMORY.md`, then only the additional notes or repository files needed for this turn.\",\n    \"3. If the message asks for multi-step work, update the Active Context section in `MEMORY.md` before diving deep when interruption would lose important state.\",\n    \"4. Complete the requested work end to end when feasible: inspect context, make changes if needed, run verification, then report the result.\",\n    \"5. After significant work or learning, update `notes/` and then update `MEMORY.md` so future resumes can recover the context.\",\n    \"6. At natural breakpoints in long work, check for platform messages when `wm message check` is available.\",\n    \"7. Before stopping, send or return one concise summary containing result, verification, blockers, and next relevant path.\",\n    \"\",\n    \"## Messaging model\",\n    \"\",\n    \"Platform messages may come from channels, DMs, or threads. Server-delivered messages carry structured target, message id, timestamp, sender kind, and sender identity. Reply in the same target unless the platform explicitly asks for a different surface. For channel main messages that start a collaboration, create or use that message's thread target.\",\n    \"\",\n    \"Target examples:\",\n    \"\",\n    \"```text\",\n    \"[target=#all msg=a1b2c3d4 time=2026-03-15T01:00:00 type=human] @user: hello\",\n    \"[target=#all:a1b2c3d4 msg=f3a4b5c6 time=2026-03-15T01:00:03 type=human] @user: thread reply\",\n    \"[target=dm:@user msg=c9d0e1f2 time=2026-03-15T01:00:02 type=human] @user: can you help?\",\n    \"```\",\n    \"\",\n    \"- Reuse the exact target when replying in a future `wm message send` call.\",\n    \"- `wm message send --kind answer` automatically records the current delivered message and attachments as the minimum evidence chain. Use `--evidence <json-file>` only when the answer also relies on tools, files, history, or human corrections that must be audited explicitly.\",\n    \"- Treat system messages as state changes; do not reply unless they clearly request action.\",\n    \"- Keep private channel or DM context inside that authorized surface.\",\n    \"- When a user references prior platform discussion, search/read history first once `wm message search` and `wm message read` are available.\",\n    \"\",\n    \"## Tasks\",\n    \"\",\n    \"Task commands manage explicit user-visible tasks. Normal delivered channel or DM messages are already assigned to this turn and do not need claiming.\",\n    \"\",\n    \"- Use `wm task list` only to inspect explicit task-list items.\",\n    \"- Prefer updating an existing task over creating duplicates.\",\n    \"- Move finished work to review/done according to platform workflow.\",\n    \"- Split large work into independent subtasks only when it genuinely enables parallel execution.\",\n    \"\",\n    \"## Communication style\",\n    \"\",\n    \"- Be concise, concrete, and transparent about blockers.\",\n    \"- For multi-step work, provide brief progress updates when platform messaging is available.\",\n    \"- Do not flood channels with idle narration.\",\n    \"- Do not summarize another AI employee's owned work unless explicitly asked.\",\n    \"- Keep URLs next to non-English punctuation wrapped in angle brackets or markdown links.\",\n    \"\",\n    \"## Employee Profile\",\n    \"\",\n    \"Your current employee profile is part of this system prompt and is also written to `.wm/employee-profile-prompt.md` for inspection. Treat it as authoritative. Do not rely on old conversation history if it conflicts with the current profile.\",\n    ...(input.profileRevision ? [`- Profile Revision: ${input.profileRevision}`] : []),\n    ...(input.systemPromptRevision ? [`- System Prompt Revision: ${input.systemPromptRevision}`] : []),\n    \"\",\n    \"## Workspace & Memory\",\n    \"\",\n    \"- The AIEmployee Directory belongs only to this platform-created agent.\",\n    \"- The daemon starts the runtime with the AIEmployee Directory as cwd; files created by relative path stay inside this workspace.\",\n    \"- `MEMORY.md` is the recovery index for who you are, what you know, what is active, and where detailed notes live.\",\n    \"- Keep `MEMORY.md` concise. Use it as a table of contents and active recovery point, not as an unbounded transcript.\",\n    \"- `notes/lessons.md` is the first-stop file for reusable lessons from corrections and retrospectives.\",\n    \"- `.wm/learning/candidates.md` is the Server-owned candidate view bound to the current profile generation. Only entries marked `effective_instruction` may guide behavior.\",\n    \"- `.wm/knowledge/facts/candidate-facts.md` is a legacy retro working file, not an authoritative instruction source.\",\n    \"- `wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md` reads the first-stop facts, index, routes, and full fact cache from one validated generation. Use one bundle per reference-backed answer.\",\n    \"- `.wm/knowledge/retros/slow-queries.md` and `.wm/knowledge/retros/mistakes.md` are working notes for future index improvements. They are not automatically trusted facts.\",\n    \"- Create or update files under `notes/` for detailed durable knowledge such as user preferences, work history, channel context, and domain notes.\",\n    \"- Suggested note files: `notes/user-preferences.md`, `notes/lessons.md`, `notes/work-log.md`, `notes/channels.md`, and `notes/<domain>.md`.\",\n    \"- After significant work or learning, update `notes/` and then update `MEMORY.md` to link or summarize the new durable context.\",\n    \"- Before long work, update the Active Context section in `MEMORY.md` enough that you can resume after interruption or context compression.\",\n    \"- Do not import local sessions, AI employees, profiles, memories, or identities that were not created by NiuMa.\",\n    \"- Runtime-native session/resume state is owned by the runtime adapter. Use it, but do not rewrite or normalize it unless the daemon explicitly asks.\",\n    \"- Do not store secrets, tokens, passwords, private keys, or sensitive credentials in memory, notes, code, or logs.\",\n    \"\",\n    \"## Safety and permissions\",\n    \"\",\n    \"- Follow repository AGENTS.md or equivalent local instructions before editing code.\",\n    \"- Do not commit, push, deploy, delete important files, or perform externally visible actions unless explicitly instructed.\",\n    \"- Do not store secrets, tokens, passwords, or private keys in code, memory, notes, or logs.\",\n    \"- If local and platform instructions conflict, prefer the most specific valid instruction and report the conflict.\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction runtimePathForPrompt(input: CreateAIEmployeeWorkspaceInput, hostPath: string): string {\n  if (input.sandboxMode !== \"container\") return hostPath;\n  const serverDir = input.machineId\n    ? path.join(input.rootDir, input.machineDirectoryName)\n    : path.join(input.rootDir, input.serverNamespace);\n  const aiEmployeeDir = path.join(serverDir, input.aiEmployeeDirectoryName);\n  const relative = path.relative(aiEmployeeDir, hostPath);\n  if (!relative || relative === \"\") return \"/workspace\";\n  if (relative.startsWith(\"..\") || path.isAbsolute(relative)) return hostPath;\n  return path.posix.join(\"/workspace\", ...relative.split(path.sep));\n}\n\nfunction buildEmployeeProfilePrompt(input: CreateAIEmployeeWorkspaceInput): string {\n  const context = input.aiEmployeeWorkContext;\n  const toolPolicy = resolveAIEmployeeToolPolicy(context);\n  const role = context?.role || input.role?.trim() || \"NiuMa AI employee\";\n  const lines: string[] = [\n    \"# Employee Profile\",\n    \"\",\n    \"This section is the current authoritative behavior profile for this AI employee.\",\n    ...(input.profileRevision ? [`Profile Revision: ${input.profileRevision}`] : []),\n    ...(input.systemPromptRevision ? [`System Prompt Revision: ${input.systemPromptRevision}`] : []),\n    ...(context?.templateKey ? [`Template: ${context.templateKey}`] : []),\n    \"\",\n    \"## Role\",\n    \"\",\n    role,\n  ];\n  if (context?.instructions) lines.push(\"\", \"## Instructions\", \"\", context.instructions);\n  if (context?.workRules) lines.push(\"\", \"## Work Rules\", \"\", context.workRules);\n  if (context?.tone) lines.push(\"\", \"## Tone\", \"\", context.tone);\n  if (context?.feishu) {\n    lines.push(\"\", \"## Feishu\", \"\");\n    if (context.feishu.appDisplayName) lines.push(`- App display name: ${context.feishu.appDisplayName}`);\n    if (context.feishu.replySink) lines.push(`- Reply sink: ${context.feishu.replySink}`);\n    if (context.feishu.readiness) lines.push(`- Readiness: ${JSON.stringify(context.feishu.readiness)}`);\n  }\n  if (toolPolicy.lark.driveSearch.mode === \"work_rule_sources_only\") {\n    const tokens = toolPolicy.lark.driveSearch.allowedFolderTokens;\n    lines.push(\n      \"\",\n      \"## Tool Policy\",\n      \"\",\n      \"Feishu drive search is limited to the work-rule source folders. Do not run global Feishu drive search.\",\n      tokens.length\n        ? `Allowed Feishu drive folder tokens: ${tokens.join(\", \")}`\n        : \"No Feishu drive folder token was extracted from the current work rules; Feishu drive search is blocked until the work rules include an allowed source.\",\n      \"If these sources do not contain the answer, say the referenced source did not cover it before using the allowed fallback search policy.\",\n      \"External Feishu message sending remains controlled by the `.wm/lark-cli` send gate and the employee reply sink.\"\n    );\n  }\n  lines.push(\n    \"\",\n    \"## Rule-linked reference materials\",\n    \"\",\n    \"The work rules are the source of truth for business behavior. The daemon extracts rule-linked URLs and local paths into one atomically published reference generation; use `wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md` once per reference-backed answer.\",\n    \"If the rules include Feishu/Lark doc, wiki, or drive folder URLs, use available tools to read those materials when they are relevant to the task.\",\n    \"For Feishu customer-service app resources, read rule-linked reference documents with user identity after authorization; keep bot identity for customer-message send/reply operations, for example:\",\n    \"\",\n    \"```bash\",\n    \".wm/lark-cli drive +inspect --as user --url <url_from_work_rules> --format json\",\n    \".wm/lark-cli docs +fetch --api-version v2 --as user --doc <docx_url_or_token>\",\n    \"```\",\n    \"\",\n    \"If a rule-referenced material cannot be read, say that the referenced material read failed instead of presenting general knowledge as document-backed.\",\n    \"If slow or wrong answers reveal missing reference routing, write a concise candidate improvement to `.wm/knowledge/retros/slow-queries.md` or `.wm/knowledge/retros/mistakes.md` during retro; promote only stable behavior lessons to `notes/lessons.md` or `MEMORY.md`.\",\n    \"Do not look for a separate configured knowledge-source list; reference URLs belong in the work rules/prompt.\"\n  );\n  return lines.join(\"\\n\");\n}\n\nexport function resolveAIEmployeeToolPolicy(context?: AIEmployeeWorkContext): NonNullable<AIEmployeeWorkContext[\"toolPolicy\"]> {\n  if (context?.toolPolicy) return context.toolPolicy;\n  if (context?.templateKey === \"feishu_customer_service\") {\n    return {\n      lark: {\n        driveSearch: {\n          mode: \"work_rule_sources_only\",\n          allowedFolderTokens: [],\n        },\n        imSend: {\n          mode: \"controlled_by_reply_sink\",\n        },\n      },\n      webSearch: {\n        mode: \"allowed_after_source_miss\",\n      },\n    };\n  }\n  return {\n    lark: {\n      driveSearch: {\n        mode: \"unrestricted\",\n        allowedFolderTokens: [],\n      },\n      imSend: {\n        mode: \"controlled_by_reply_sink\",\n      },\n    },\n    webSearch: {\n      mode: \"disabled\",\n    },\n  };\n}\n\nasync function syncWorkspaceSkills(wmDir: string): Promise<void> {\n  const skillsDir = path.join(wmDir, \"skills\");\n  await mkdir(skillsDir, { recursive: true });\n}\n\nfunction buildAIEmployeeToken(input: CreateAIEmployeeWorkspaceInput): string {\n  return [\n    `WM_DAEMON_SERVER_NAMESPACE=${input.serverNamespace}`,\n    ...(input.machineId ? [`WM_DAEMON_MACHINE_ID=${input.machineId}`] : []),\n    `WM_DAEMON_SERVER_ID=${input.serverId}`,\n    `WM_DAEMON_DAEMON_ID=${input.daemonId}`,\n    `WM_DAEMON_AGENT_ID=${input.aiEmployeeId}`,\n    `WM_DAEMON_RUNTIME=${input.runtime}`,\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction shellSingleQuote(value: string): string {\n  return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction buildWrapper(wrapperCliPath: string): string {\n  return `#!/usr/bin/env bash\nunset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxy\nself_dir=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nexec node \"$self_dir/wm-cli.js\" \"$@\"\n`;\n}\n\nasync function buildLarkWrapper(): Promise<string> {\n  const larkCliPath = await resolveLarkCliBinary();\n  return `#!/usr/bin/env bash\nset -euo pipefail\n\nif [[ -f \"$(dirname \"$0\")/runtime-env\" ]]; then\n  while IFS='=' read -r key value; do\n    [[ -z \"$key\" ]] && continue\n    if [[ -z \"\\${!key:-}\" ]]; then\n      export \"$key=$value\"\n    fi\n  done < \"$(dirname \"$0\")/runtime-env\"\nfi\n\nif [[ \"\\${1:-}\" == \"im\" && ( \"\\${2:-}\" == \"+messages-reply\" || \"\\${2:-}\" == \"+messages-send\" ) && \"\\${WM_FEISHU_ALLOW_SEND:-}\" != \"1\" ]]; then\n  echo \"lark-cli send command blocked: set WM_FEISHU_ALLOW_SEND=1 to send external Feishu messages\" >&2\n  exit 64\nfi\n\nself_dir=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nworkspace_lark_cli=\"$self_dir/tools/lark-cli/bin/lark-cli\"\nworkspace_lark_cli_shim=\"$self_dir/tools/lark-cli/node_modules/.bin/lark-cli\"\ndefault_lark_cli=${shellSingleQuote(larkCliPath)}\nreal_lark_cli=\"\\${WM_LARK_CLI_BIN:-}\"\nif [[ -z \"$real_lark_cli\" ]]; then\n  if [[ -x \"$workspace_lark_cli_shim\" ]]; then\n    real_lark_cli=\"$workspace_lark_cli_shim\"\n  elif [[ -x \"$workspace_lark_cli\" ]]; then\n    real_lark_cli=\"$workspace_lark_cli\"\n  elif [[ -x \"$default_lark_cli\" ]]; then\n    real_lark_cli=\"$default_lark_cli\"\n  else\n    real_lark_cli=\"lark-cli\"\n  fi\nfi\nif [[ \"$real_lark_cli\" == \"lark-cli\" ]]; then\n  clean_path=\"\"\n  IFS=':' read -ra path_parts <<< \"\\${PATH:-}\"\n  for part in \"\\${path_parts[@]}\"; do\n    [[ \"$part\" == \"$self_dir\" ]] && continue\n    clean_path=\"\\${clean_path:+$clean_path:}$part\"\n  done\n  real_lark_cli=\"$(PATH=\"$clean_path\" command -v lark-cli || true)\"\nfi\nif [[ -z \"$real_lark_cli\" ]]; then\n  echo \"lark-cli binary not found\" >&2\n  exit 127\nfi\n\nexec node \"$self_dir/lark-cli-guard.js\" \"$real_lark_cli\" \"$@\"\n`;\n}\n\nfunction buildLarkCliGuard(): string {\n  return `#!/usr/bin/env node\nconst fs = require(\"node:fs\");\nconst path = require(\"node:path\");\nconst { spawn } = require(\"node:child_process\");\n\nconst selfDir = __dirname;\nconst [realLarkCli, ...rawArgs] = process.argv.slice(2);\nif (!realLarkCli) {\n  console.error(\"lark-cli binary not found\");\n  process.exit(127);\n}\n\nloadRuntimeEnv();\n\nfunction loadRuntimeEnv() {\n  const envPath = path.join(selfDir, \"runtime-env\");\n  if (!fs.existsSync(envPath)) return;\n  for (const line of fs.readFileSync(envPath, \"utf8\").split(/\\\\n/)) {\n    const match = line.match(/^([^=]+)=(.*)$/);\n    if (match && !process.env[match[1]]) process.env[match[1]] = match[2];\n  }\n}\n\nfunction readJsonIfExists(file) {\n  try {\n    if (!fs.existsSync(file)) return undefined;\n    return JSON.parse(fs.readFileSync(file, \"utf8\"));\n  } catch {\n    return undefined;\n  }\n}\n\nfunction optionValue(args, names) {\n  for (let i = 0; i < args.length; i += 1) {\n    const arg = args[i];\n    if (names.includes(arg)) return args[i + 1] || \"\";\n    for (const name of names) {\n      if (arg.startsWith(name + \"=\")) return arg.slice(name.length + 1);\n    }\n  }\n  return \"\";\n}\n\nfunction allowedFolderTokens() {\n  const driveSearch = readJsonIfExists(path.join(selfDir, \"tool-policy.json\"))?.lark?.driveSearch;\n  if (!driveSearch || driveSearch.mode !== \"work_rule_sources_only\") return undefined;\n  return new Set(Array.isArray(driveSearch.allowedFolderTokens) ? driveSearch.allowedFolderTokens : []);\n}\n\nfunction collectFolderTokens(value, output) {\n  if (!value || typeof value !== \"object\") return;\n  for (const key of [\"folder_token\", \"folderToken\", \"folder_tokens\", \"folderTokens\"]) {\n    const raw = value[key];\n    if (Array.isArray(raw)) output.push(...raw.map(String));\n    else if (typeof raw === \"string\") output.push(...raw.split(/[,\\\\s]+/).filter(Boolean));\n  }\n}\n\nfunction suppliedFolderTokens(args, stdinText) {\n  const supplied = [];\n  const fromOption = optionValue(args, [\"--folder-tokens\", \"--folder-token\", \"--folder_tokens\", \"--folder_token\"]);\n  for (const token of fromOption.split(/[,\\\\s]+/).filter(Boolean)) supplied.push(token);\n  const params = optionValue(args, [\"--params\"]);\n  if (params && params !== \"-\") {\n    try { collectFolderTokens(JSON.parse(params), supplied); } catch {}\n  }\n  if (params === \"-\" && stdinText.trim()) {\n    try { collectFolderTokens(JSON.parse(stdinText), supplied); } catch {}\n  }\n  return supplied;\n}\n\nfunction isHelpLikeCommand(args) {\n  return args.some((arg) => arg === \"--help\" || arg === \"-h\" || arg === \"help\" || arg === \"--version\" || arg === \"version\");\n}\n\nfunction assertAllowedFolderAccess(args, stdinText) {\n  const allowed = allowedFolderTokens();\n  if (!allowed || isHelpLikeCommand(args)) return;\n  if (args[0] === \"search\") {\n    console.error(\"blocked by employee tool policy: Feishu global search is disabled; use the work-rule source folder only\");\n    process.exit(64);\n  }\n  const isDriveSearch = args[0] === \"drive\" && args[1] === \"+search\";\n  const isDriveFilesList = args[0] === \"drive\" && args[1] === \"files\" && args[2] === \"list\";\n  if (!isDriveSearch && !isDriveFilesList) return;\n  const supplied = suppliedFolderTokens(args, stdinText);\n  const ok = supplied.length > 0 && supplied.every((token) => allowed.has(token));\n  if (!ok) {\n    console.error(\"blocked by employee tool policy: Feishu drive access must use an allowed folder token from this employee work rules\");\n    process.exit(64);\n  }\n}\n\nfunction sanitizeSendArgs(args) {\n  if (!(args[0] === \"im\" && (args[1] === \"+messages-reply\" || args[1] === \"+messages-send\"))) return args;\n  const out = [];\n  for (let i = 0; i < args.length; i += 1) {\n    const arg = args[i];\n    if (arg === \"--feishu-activity-key\" || arg === \"--activity-key\") {\n      i += 1;\n      continue;\n    }\n    if (arg.startsWith(\"--feishu-activity-key=\") || arg.startsWith(\"--activity-key=\")) continue;\n    if (arg === \"--format\") {\n      i += 1;\n      continue;\n    }\n    if (arg.startsWith(\"--format=\")) continue;\n    out.push(arg);\n  }\n  return out;\n}\n\nfunction assertSendMatchesCurrentTurn(args) {\n  if (!isSend(args) || process.env.WM_FEISHU_ALLOW_SEND !== \"1\") return;\n  const command = args[1];\n  const activityKey = optionValue(args, [\"--feishu-activity-key\", \"--activity-key\"]);\n  const messageId = optionValue(args, [\"--message-id\", \"--feishu-message-id\", \"--open-message-id\"]);\n  const chatId = optionValue(args, [\"--chat-id\"]);\n  const turn = currentTurn(args);\n  const turnActivityKey = turn.feishu_activity_key ? String(turn.feishu_activity_key) : \"\";\n  const turnChatId = turn.chat_id ? String(turn.chat_id) : \"\";\n  const turnMessageIdList = turnMessageIds(turn);\n  const hasTurnEvidence = Boolean(turnActivityKey || turnChatId || turnMessageIdList.length);\n  if (!hasTurnEvidence) {\n    if (activityKey) {\n      throw new Error(\"blocked by platform turn guard: feishu activity key does not match current turn\");\n    }\n    return;\n  }\n  if (command === \"+messages-send\" && turnActivityKey && !activityKey) {\n    throw new Error(\"blocked by platform turn guard: messages-send requires --feishu-activity-key for this Feishu turn\");\n  }\n  if (activityKey && turnActivityKey !== activityKey) {\n    throw new Error(\"blocked by platform turn guard: feishu activity key does not match current turn\");\n  }\n  if (messageId && !turnMessageIdList.includes(messageId)) {\n    throw new Error(\"blocked by platform turn guard: message id does not match current turn\");\n  }\n  if (chatId && turnChatId !== chatId) {\n    throw new Error(\"blocked by platform turn guard: chat id does not match current turn\");\n  }\n}\n\nfunction readWmClientConfig() {\n  const proxyUrl = process.env.WM_AGENT_PROXY_URL;\n  const proxyTokenFile = process.env.WM_AGENT_PROXY_TOKEN_FILE;\n  if (proxyUrl && proxyTokenFile) {\n    return { serverUrl: proxyUrl, token: fs.readFileSync(proxyTokenFile, \"utf8\").trim() };\n  }\n  return { serverUrl: process.env.WM_SERVER_URL, token: process.env.WM_AGENT_TOKEN };\n}\n\nasync function request(method, pathName, body) {\n  const { serverUrl, token } = readWmClientConfig();\n  if (!serverUrl || !token) throw new Error(\"platform client env missing\");\n  const response = await fetch(new URL(pathName, serverUrl), {\n    method,\n    headers: { authorization: \\`Bearer \\${token}\\`, \"content-type\": \"application/json\" },\n    body: body === undefined ? undefined : JSON.stringify(body),\n  });\n  const text = await response.text();\n  let payload = {};\n  try { payload = text ? JSON.parse(text) : {}; } catch { payload = { text }; }\n  if (!response.ok) {\n    const error = new Error(payload.error || text || \\`HTTP \\${response.status}\\`);\n    error.status = response.status;\n    error.code = typeof payload.code === \"string\" ? payload.code : undefined;\n    throw error;\n  }\n  return payload;\n}\n\nfunction currentTurnCandidates() {\n  const dir = path.join(selfDir, \"current-turns\");\n  try {\n    return fs.readdirSync(dir)\n      .filter((name) => name.endsWith(\".json\"))\n      .map((name) => {\n        const file = path.join(dir, name);\n        const value = readJsonIfExists(file);\n        if (!value || typeof value !== \"object\") return undefined;\n        let mtimeMs = 0;\n        try { mtimeMs = fs.statSync(file).mtimeMs; } catch {}\n        return { file, value, mtimeMs };\n      })\n      .filter(Boolean)\n      .sort((left, right) => right.mtimeMs - left.mtimeMs);\n  } catch {\n    return [];\n  }\n}\n\nfunction turnMessageIds(turn) {\n  const ids = [];\n  for (const key of [\"feishu_message_id\", \"message_id\", \"open_message_id\"]) {\n    if (turn[key]) ids.push(String(turn[key]));\n  }\n  if (Array.isArray(turn.message_ids)) ids.push(...turn.message_ids.map(String));\n  return ids.filter(Boolean);\n}\n\nfunction scoreTurnForArgs(turn, args) {\n  let score = 0;\n  let explicit = false;\n  const activityKey = optionValue(args, [\"--feishu-activity-key\", \"--activity-key\"]);\n  if (activityKey) {\n    explicit = true;\n    if (turn.feishu_activity_key !== activityKey) return -1;\n    score += 1000;\n  }\n  const messageId = optionValue(args, [\"--message-id\", \"--feishu-message-id\", \"--open-message-id\"]);\n  if (messageId) {\n    explicit = true;\n    if (!turnMessageIds(turn).includes(messageId)) return -1;\n    score += 100;\n  }\n  const chatId = optionValue(args, [\"--chat-id\"]);\n  if (chatId) {\n    explicit = true;\n    if (turn.chat_id !== chatId) return -1;\n    score += 20;\n  }\n  return explicit ? score : 0;\n}\n\nfunction currentTurn(args = []) {\n  const hasExplicitTarget = Boolean(\n    optionValue(args, [\"--feishu-activity-key\", \"--activity-key\", \"--message-id\", \"--feishu-message-id\", \"--open-message-id\", \"--chat-id\"])\n  );\n  const candidates = currentTurnCandidates();\n  if (hasExplicitTarget) {\n    const match = candidates\n      .map((candidate) => ({ candidate, score: scoreTurnForArgs(candidate.value, args) }))\n      .filter((item) => item.score > 0)\n      .sort((left, right) => right.score - left.score || right.candidate.mtimeMs - left.candidate.mtimeMs)[0];\n    return match?.candidate.value || {};\n  }\n  const scopedFile = process.env.WM_CURRENT_TURN_FILE;\n  return (scopedFile ? readJsonIfExists(scopedFile) : undefined) || readJsonIfExists(path.join(selfDir, \"current-turn.json\")) || {};\n}\n\nfunction currentTurnAttachments(turn) {\n  const ids = Array.isArray(turn.attachment_ids)\n    ? turn.attachment_ids.map(String).filter(Boolean)\n    : [];\n  const attachments = Array.isArray(turn.attachments)\n    ? turn.attachments.filter(item => item && typeof item === \"object\" && typeof item.id === \"string\" && typeof item.filename === \"string\")\n    : [];\n  return { attachment_ids: ids, attachments };\n}\n\nfunction isSend(args) {\n  return args[0] === \"im\" && (args[1] === \"+messages-reply\" || args[1] === \"+messages-send\");\n}\n\nfunction assertMaintenanceLarkAllowed(args) {\n  const explicitPolicyFile = process.env.WM_TOOL_POLICY_FILE;\n  const policy = readJsonIfExists(explicitPolicyFile || path.join(selfDir, \"tool-policy.json\"));\n  if (explicitPolicyFile && !policy) {\n    console.error(\"explicit employee tool policy is unavailable\");\n    process.exit(64);\n  }\n  if (!policy || policy.maintenance !== true) return;\n  if (!isSend(args)) return;\n  console.error(\"blocked by employee tool policy: Feishu send is disabled during retro maintenance turn\");\n  process.exit(64);\n}\n\nasync function reportSendResult(args, ok, detail) {\n  if (!isSend(args) || process.env.WM_FEISHU_ALLOW_SEND !== \"1\") return undefined;\n  const aiEmployeeId = process.env.WM_AGENT_ID || process.env.WM_DAEMON_AGENT_ID;\n  if (!aiEmployeeId) return undefined;\n  const turn = currentTurn(args);\n  const command = args[1];\n  const messageId = optionValue(args, [\"--message-id\"]) || turn.feishu_message_id || \"\";\n  const chatId = optionValue(args, [\"--chat-id\"]) || turn.chat_id || \"\";\n  const text = optionValue(args, [\"--text\", \"--content\"]);\n  const routineId = turn.routine_id || \"\";\n  const humanId = turn.owner_human_id || turn.human_id || \"\";\n  const attachments = currentTurnAttachments(turn);\n  if ((command === \"+messages-reply\" && !messageId) || !text || (!routineId && !turn.delegation_id)) return undefined;\n  await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/inbox/feishu-draft\\`, {\n    routine_id: routineId,\n    delegation_id: turn.delegation_id || \"\",\n    human_id: humanId,\n    feishu_message_id: messageId,\n    chat_id: chatId,\n    sender_name: turn.sender_name || \"\",\n    sender_open_id: turn.sender_open_id || \"\",\n    original_text: turn.original_text || \"\",\n    draft_text: text,\n    risk: ok ? \"sent\" : \"send_failed\",\n    status: ok ? \"sent\" : \"failed\",\n    approval_mode: \"auto\",\n    sent_message_id: ok ? detail || \"\" : \"\",\n    error: ok ? \"\" : detail || \"send failed\",\n    feishu_activity_key: turn.feishu_activity_key || \"\",\n    message_ids: Array.isArray(turn.message_ids) ? turn.message_ids : [],\n    recent_messages: Array.isArray(turn.recent_messages) ? turn.recent_messages : [],\n    attachment_ids: attachments.attachment_ids,\n    attachments: attachments.attachments,\n  });\n}\n\nfunction runReal(args, stdinText) {\n  return new Promise((resolve) => {\n    const child = spawn(realLarkCli, args, { stdio: [\"pipe\", \"pipe\", \"pipe\"], env: process.env });\n    let stdout = \"\";\n    let stderr = \"\";\n    child.stdout.on(\"data\", (chunk) => {\n      stdout += String(chunk);\n      process.stdout.write(chunk);\n    });\n    child.stderr.on(\"data\", (chunk) => {\n      stderr += String(chunk);\n      process.stderr.write(chunk);\n    });\n    child.on(\"error\", (error) => resolve({ code: 127, stdout, stderr: error.message }));\n    child.on(\"exit\", (code) => resolve({ code: code ?? 1, stdout, stderr }));\n    child.stdin.end(stdinText);\n  });\n}\n\nfunction parseSentMessageId(stdout) {\n  try {\n    const parsed = JSON.parse(stdout);\n    return parsed.message_id || parsed.messageId || parsed.data?.message_id || parsed.data?.messageId || \"\";\n  } catch {\n    const match = stdout.match(/(?:message_id|messageId|Message ID)[:=]\\\\s*([A-Za-z0-9_\\\\-]+)/);\n    return match ? match[1] : \"\";\n  }\n}\n\nfunction shouldReadStdin(args) {\n  return optionValue(args, [\"--params\"]) === \"-\" || args.includes(\"--app-secret-stdin\");\n}\n\nfunction readStdinIfNeeded(args) {\n  if (!shouldReadStdin(args)) return Promise.resolve(\"\");\n  return new Promise((resolve) => {\n    let data = \"\";\n    process.stdin.setEncoding(\"utf8\");\n    process.stdin.on(\"data\", (chunk) => data += chunk);\n    process.stdin.on(\"end\", () => resolve(data));\n  });\n}\n\nasync function main() {\n  const stdinText = await readStdinIfNeeded(rawArgs);\n  assertMaintenanceLarkAllowed(rawArgs);\n  assertAllowedFolderAccess(rawArgs, stdinText);\n  assertSendMatchesCurrentTurn(rawArgs);\n  const args = sanitizeSendArgs(rawArgs);\n  const result = await runReal(args, stdinText);\n  await reportSendResult(\n    rawArgs,\n    result.code === 0,\n    result.code === 0 ? parseSentMessageId(result.stdout) : (result.stderr || result.stdout).slice(0, 1000)\n  ).catch((error) => {\n    console.error(\\`platform send result report failed: \\${error instanceof Error ? error.message : String(error)}\\`);\n  });\n  process.exit(result.code);\n}\n\nmain().catch((error) => {\n  console.error(error instanceof Error ? error.message : String(error));\n  process.exit(1);\n});\n`;\n}\n\nfunction buildWrapperCli(): string {\n  return `#!/usr/bin/env node\nconst crypto = require(\"node:crypto\");\nconst fs = require(\"node:fs\");\nconst path = require(\"node:path\");\n\nconst envPath = path.join(__dirname, \"runtime-env\");\nif (fs.existsSync(envPath)) {\n  for (const line of fs.readFileSync(envPath, \"utf8\").split(/\\\\n/)) {\n    const match = line.match(/^([^=]+)=(.*)$/);\n    if (match && !process.env[match[1]]) process.env[match[1]] = match[2];\n  }\n}\n\nconst args = process.argv.slice(2);\nconst [group, command] = args;\nconst help = \"Available commands: wm auth whoami; wm reference read/bundle; wm message send/check/read/search; wm dm send; wm server info; wm channel members; wm member find; wm task list/update/create; wm proxy probe/verify/create; wm routine list/get/pause/resume/archive; wm retro inputs/complete; wm attachment upload/view; wm profile show/update/propose; wm reminder schedule/list/snooze/update/cancel; wm inbox feishu-draft create/sent/failed. message send supports --kind answer|question|status|system and --evidence <json-file>.\";\n\nfunction readJsonIfExists(filePath) {\n  try {\n    return JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n  } catch {\n    return undefined;\n  }\n}\n\nfunction assertMaintenanceCommandAllowed() {\n  const explicitPolicyFile = process.env.WM_TOOL_POLICY_FILE;\n  const policy = readJsonIfExists(explicitPolicyFile || path.join(__dirname, \"tool-policy.json\"));\n  if (explicitPolicyFile && !policy) {\n    throw new Error(\"explicit employee tool policy is unavailable\");\n  }\n  if (!policy || policy.maintenance !== true) return;\n  const allowed = (\n    group === \"retro\" ||\n    group === \"reference\" ||\n    group === \"auth\" ||\n    group === \"server\" ||\n    (group === \"profile\" && [\"show\", \"propose\"].includes(command)) ||\n    (group === \"message\" && [\"check\", \"read\", \"search\"].includes(command)) ||\n    (group === \"routine\" && [\"list\", \"get\"].includes(command)) ||\n    (group === \"attachment\" && [\"view\"].includes(command))\n  );\n  if (!allowed) {\n    throw new Error(\"wm command blocked during retro maintenance turn\");\n  }\n}\n\nfunction valueAfter(name) {\n  const index = args.indexOf(name);\n  return index === -1 ? undefined : args[index + 1];\n}\n\nconst publishedReferenceFiles = new Set([\n  \"index.md\",\n  \"routing.md\",\n  \"source-map.json\",\n  \"facts/quick-reference.md\",\n  \"facts/reference-facts.md\",\n  \"index-errors.md\",\n  \"manifest.json\",\n]);\n\nfunction normalizeReferenceFile(relativeInput) {\n  let relativePath = String(relativeInput || \"\").split(String.fromCharCode(92)).join(\"/\");\n  if (relativePath.startsWith(\"./\")) relativePath = relativePath.slice(2);\n  if (!publishedReferenceFiles.has(relativePath)) throw new Error(\"reference file is not a published index output\");\n  return relativePath;\n}\n\nfunction isReferencePathContained(rootPath, childPath) {\n  const relative = path.relative(rootPath, childPath);\n  return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction captureReferenceParentIdentities(rootDir, relativePath) {\n  const canonicalRoot = fs.realpathSync(rootDir);\n  const identities = [];\n  let parent = rootDir;\n  for (const segment of [\"\", ...relativePath.split(\"/\").slice(0, -1)]) {\n    if (segment) parent = path.join(parent, segment);\n    const info = fs.lstatSync(parent);\n    const canonicalPath = fs.realpathSync(parent);\n    if (info.isSymbolicLink() || !info.isDirectory() || !isReferencePathContained(canonicalRoot, canonicalPath)) {\n      throw new Error(\"reference index file has an unsafe parent\");\n    }\n    identities.push({ path: parent, dev: info.dev, ino: info.ino, canonicalPath });\n  }\n  return identities;\n}\n\nfunction revalidateReferenceParentIdentities(identities) {\n  const canonicalRoot = identities[0] && identities[0].canonicalPath;\n  for (const identity of identities) {\n    const info = fs.lstatSync(identity.path);\n    const canonicalPath = fs.realpathSync(identity.path);\n    if (\n      info.isSymbolicLink() ||\n      !info.isDirectory() ||\n      info.dev !== identity.dev ||\n      info.ino !== identity.ino ||\n      canonicalPath !== identity.canonicalPath ||\n      !canonicalRoot ||\n      !isReferencePathContained(canonicalRoot, canonicalPath)\n    ) throw new Error(\"reference index parent changed during access\");\n  }\n}\n\nfunction referenceParentValidationCheckpoint(_input) {}\n\nfunction candidateFileValidationCheckpoint(_input) {}\n\nfunction readCandidateFileFromOpenedFd(workspaceRoot, relativePath, maxBytes) {\n  if (!relativePath || relativePath.startsWith(\"../\") || path.isAbsolute(relativePath)) {\n    throw new Error(\"--candidates-file must resolve to a file inside the AI employee workspace\");\n  }\n  const parentIdentities = captureReferenceParentIdentities(workspaceRoot, relativePath);\n  const candidatePath = path.join(workspaceRoot, ...relativePath.split(\"/\"));\n  const before = fs.lstatSync(candidatePath);\n  if (before.isSymbolicLink() || !before.isFile() || before.nlink !== 1 || before.size > maxBytes) {\n    throw new Error(\"--candidates-file must be a regular JSON file no larger than 256 KiB\");\n  }\n  candidateFileValidationCheckpoint({ phase: \"after_check\", candidatePath, relativePath });\n  const fd = fs.openSync(candidatePath, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0));\n  try {\n    const opened = fs.fstatSync(fd);\n    if (\n      !opened.isFile() || opened.nlink !== 1 || opened.size > maxBytes ||\n      opened.dev !== before.dev || opened.ino !== before.ino || opened.size !== before.size ||\n      opened.mtimeMs !== before.mtimeMs || opened.ctimeMs !== before.ctimeMs\n    ) throw new Error(\"--candidates-file changed during open\");\n    revalidateReferenceParentIdentities(parentIdentities);\n    candidateFileValidationCheckpoint({ phase: \"after_open\", candidatePath, relativePath, fd });\n    const chunks = [];\n    let total = 0;\n    while (true) {\n      const remaining = maxBytes + 1 - total;\n      if (remaining <= 0) throw new Error(\"--candidates-file grew larger than 256 KiB during read\");\n      const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, remaining));\n      const bytesRead = fs.readSync(fd, chunk, 0, chunk.length, null);\n      if (bytesRead === 0) break;\n      total += bytesRead;\n      if (total > maxBytes) throw new Error(\"--candidates-file grew larger than 256 KiB during read\");\n      chunks.push(chunk.subarray(0, bytesRead));\n    }\n    const after = fs.fstatSync(fd);\n    const pathAfter = fs.lstatSync(candidatePath);\n    if (\n      !after.isFile() || after.nlink !== 1 || after.dev !== opened.dev || after.ino !== opened.ino ||\n      after.size !== opened.size || after.mtimeMs !== opened.mtimeMs || after.ctimeMs !== opened.ctimeMs ||\n      !pathAfter.isFile() || pathAfter.isSymbolicLink() || pathAfter.nlink !== 1 ||\n      pathAfter.dev !== opened.dev || pathAfter.ino !== opened.ino || pathAfter.size !== opened.size ||\n      pathAfter.mtimeMs !== opened.mtimeMs || pathAfter.ctimeMs !== opened.ctimeMs || total !== opened.size\n    ) throw new Error(\"--candidates-file changed during read\");\n    revalidateReferenceParentIdentities(parentIdentities);\n    return Buffer.concat(chunks, total);\n  } finally {\n    fs.closeSync(fd);\n  }\n}\n\nfunction readReferenceFileFromOpenedFd(rootDir, relativePath, maxBytes) {\n  const segments = relativePath.split(\"/\");\n  const parentIdentities = captureReferenceParentIdentities(rootDir, relativePath);\n  referenceParentValidationCheckpoint({ rootDir, relativePath });\n  const target = path.join(rootDir, ...segments);\n  const before = fs.lstatSync(target);\n  if (before.isSymbolicLink() || !before.isFile() || before.nlink !== 1 || before.size > maxBytes) {\n    throw new Error(\"reference index output is unsafe or not a regular file\");\n  }\n  const fd = fs.openSync(target, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0));\n  try {\n    const opened = fs.fstatSync(fd);\n    if (!opened.isFile() || opened.nlink !== 1 || opened.dev !== before.dev || opened.ino !== before.ino || opened.size > maxBytes) {\n      throw new Error(\"reference index output changed during open\");\n    }\n    revalidateReferenceParentIdentities(parentIdentities);\n    const content = fs.readFileSync(fd);\n    const after = fs.fstatSync(fd);\n    if (\n      after.dev !== opened.dev ||\n      after.ino !== opened.ino ||\n      after.size !== opened.size ||\n      after.mtimeMs !== opened.mtimeMs ||\n      after.ctimeMs !== opened.ctimeMs ||\n      content.length !== opened.size\n    ) throw new Error(\"reference index output changed during read\");\n    revalidateReferenceParentIdentities(parentIdentities);\n    return content;\n  } finally {\n    fs.closeSync(fd);\n  }\n}\n\nfunction readAtomicReferencePointer(knowledgeDir) {\n  const target = path.join(knowledgeDir, \"current.json\");\n  for (let attempt = 0; attempt < 16; attempt++) {\n    const parentIdentities = captureReferenceParentIdentities(knowledgeDir, \"current.json\");\n    referenceParentValidationCheckpoint({ rootDir: knowledgeDir, relativePath: \"current.json\" });\n    const before = fs.lstatSync(target);\n    if (before.isSymbolicLink() || !before.isFile() || before.nlink !== 1 || before.size > 64 * 1024) {\n      throw new Error(\"reference index current pointer is unsafe\");\n    }\n    let fd;\n    try {\n      fd = fs.openSync(target, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0));\n    } catch (error) {\n      if (error && error.code === \"ENOENT\") continue;\n      throw error;\n    }\n    try {\n      const opened = fs.fstatSync(fd);\n      if (!opened.isFile() || opened.nlink > 1 || opened.size > 64 * 1024) {\n        throw new Error(\"reference index current pointer is unsafe\");\n      }\n      if (opened.nlink === 0) continue;\n      if (opened.dev !== before.dev || opened.ino !== before.ino || opened.size !== before.size) continue;\n      const pathAfterOpen = fs.lstatSync(target);\n      if (pathAfterOpen.isSymbolicLink() || !pathAfterOpen.isFile() || pathAfterOpen.nlink !== 1) {\n        throw new Error(\"reference index current pointer is unsafe\");\n      }\n      revalidateReferenceParentIdentities(parentIdentities);\n      const content = fs.readFileSync(fd);\n      const after = fs.fstatSync(fd);\n      if (\n        after.dev !== opened.dev ||\n        after.ino !== opened.ino ||\n        after.size !== opened.size ||\n        after.mtimeMs !== opened.mtimeMs ||\n        content.length !== opened.size\n      ) throw new Error(\"reference index current pointer changed during read\");\n      revalidateReferenceParentIdentities(parentIdentities);\n      return content;\n    } finally {\n      fs.closeSync(fd);\n    }\n  }\n  throw new Error(\"reference index current pointer changed repeatedly during open\");\n}\n\nfunction currentReferenceBundle(relativeInputs) {\n  const relativePaths = relativeInputs.map(normalizeReferenceFile);\n  if (relativePaths.length === 0) throw new Error(\"at least one reference file is required\");\n  if (new Set(relativePaths).size !== relativePaths.length) throw new Error(\"reference bundle files must be unique\");\n  const knowledgeDir = path.join(__dirname, \"knowledge\");\n  const pointerContent = readAtomicReferencePointer(knowledgeDir);\n  const pointer = JSON.parse(String(pointerContent));\n  const generationId = pointer && pointer.version === 1 ? String(pointer.generation_id || \"\") : \"\";\n  if (!/^ref-[a-f0-9]{64}$/.test(generationId)) throw new Error(\"reference index current pointer is unavailable or invalid\");\n  const manifestSha256 = String(pointer.manifest_sha256 || \"\");\n  if (!/^[a-f0-9]{64}$/.test(manifestSha256)) throw new Error(\"reference index current pointer manifest hash is invalid\");\n  const generationsPath = path.join(knowledgeDir, \"generations\");\n  const generationsStat = fs.lstatSync(generationsPath);\n  if (generationsStat.isSymbolicLink() || !generationsStat.isDirectory()) throw new Error(\"reference index generations root is unsafe\");\n  const generationsDir = fs.realpathSync(generationsPath);\n  const generationPath = path.join(generationsDir, generationId);\n  const generationStat = fs.lstatSync(generationPath);\n  if (generationStat.isSymbolicLink() || !generationStat.isDirectory()) throw new Error(\"reference index generation is unsafe\");\n  const generationDir = fs.realpathSync(generationPath);\n  const generationRelative = path.relative(generationsDir, generationDir);\n  if (generationRelative.startsWith(\"..\") || path.isAbsolute(generationRelative)) throw new Error(\"reference index generation escapes its root\");\n  const manifestContent = readReferenceFileFromOpenedFd(generationDir, \"manifest.json\", 2 * 1024 * 1024);\n  const actualManifestSha256 = crypto.createHash(\"sha256\").update(manifestContent).digest(\"hex\");\n  if (actualManifestSha256 !== manifestSha256 || generationId !== \"ref-\" + actualManifestSha256) {\n    throw new Error(\"reference index current manifest hash mismatch\");\n  }\n  const manifest = JSON.parse(String(manifestContent));\n  const files = relativePaths.map((relativePath) => {\n    const content = relativePath === \"manifest.json\"\n      ? manifestContent\n      : readReferenceFileFromOpenedFd(generationDir, relativePath, 4 * 1024 * 1024);\n    if (relativePath !== \"manifest.json\") {\n      const expectedHash = manifest && manifest.content_state && manifest.content_state.output_hashes\n        ? manifest.content_state.output_hashes[relativePath]\n        : \"\";\n      const actualHash = crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n      if (!expectedHash || actualHash !== expectedHash) throw new Error(\"reference index current output hash mismatch\");\n    }\n    return { path: relativePath, content, sha256: crypto.createHash(\"sha256\").update(content).digest(\"hex\") };\n  });\n  return { generationId, files };\n}\n\nfunction hasFlag(name) {\n  return args.includes(name);\n}\n\nfunction positionalText() {\n  const knownOptions = new Set([\"--target\", \"--channel\", \"--text\", \"--content\", \"--attachment-ids\", \"--kind\", \"--evidence\", \"--query\", \"--q\", \"--around\", \"--status\", \"--id\", \"--task-id\", \"--title\", \"--description\", \"--file\", \"--spec\", \"--at\", \"--every\", \"--role\", \"--instructions\", \"--body\", \"--to-agent-id\", \"--timeout\", \"--feishu-open-id\", \"--open-id\", \"--delegation-id\", \"--human-id\", \"--feishu-message-id\", \"--chat-id\", \"--sender-name\", \"--sender-open-id\", \"--original-text\", \"--draft-text\", \"--risk\", \"--message-id\", \"--error\", \"--window-ms\", \"--summary\", \"--lessons-added\", \"--retro-note\", \"--note\", \"--proposal-id\", \"--feedback-ids\", \"--run-id\", \"--diff-file\", \"--retro-id\"]);\n  const values = [];\n  for (let index = 2; index < args.length; index++) {\n    const arg = args[index];\n    if (knownOptions.has(arg)) {\n      index++;\n      continue;\n    }\n    if (!arg.startsWith(\"-\")) values.push(arg);\n  }\n  return values.join(\" \").trim();\n}\n\nasync function stdin() {\n  if (process.stdin.isTTY) return \"\";\n  return await new Promise((resolve) => {\n    let data = \"\";\n    process.stdin.setEncoding(\"utf8\");\n    process.stdin.on(\"data\", chunk => data += chunk);\n    process.stdin.on(\"end\", () => resolve(data.trim()));\n  });\n}\n\nfunction normalizeRelativeModulePath(dirPath) {\n  const workspaceDir = fs.realpathSync(path.resolve(__dirname, \"..\"));\n  const targetDir = fs.realpathSync(path.resolve(dirPath));\n  const relative = path.relative(workspaceDir, targetDir).replace(/\\\\\\\\/g, \"/\") || \".\";\n  if (relative.startsWith(\"..\") || path.isAbsolute(relative)) throw new Error(\"proxy module dir must be inside the AI employee workspace\");\n  return relative;\n}\n\nfunction readProxyModuleDir(dirPath) {\n  const fullDir = path.resolve(dirPath);\n  const raw = fs.readFileSync(path.join(fullDir, \"proxy.json\"), \"utf8\");\n  const contractRaw = fs.readFileSync(path.join(fullDir, \"contract.json\"), \"utf8\");\n  const spec = JSON.parse(raw);\n  const contract = JSON.parse(contractRaw);\n  if (!spec || typeof spec !== \"object\" || Array.isArray(spec)) throw new Error(\"proxy.json must contain an object\");\n  const modulePath = normalizeRelativeModulePath(fullDir);\n  return {\n    mode: \"agent_proxy_module_create\",\n    module_path: modulePath,\n    contract,\n    spec: {\n      ...spec,\n      kind: \"proxy_module\",\n      version: 1,\n    },\n  };\n}\n\nfunction buildNoProxy(serverUrl, existing) {\n  const entries = [\"127.0.0.1\", \"localhost\", \"::1\"];\n  try {\n    const url = new URL(serverUrl);\n    if (url.hostname) entries.push(url.hostname);\n  } catch {}\n  if (existing) entries.push(...String(existing).split(\",\"));\n  const seen = new Set();\n  return entries.map(entry => entry.trim()).filter(entry => {\n    if (!entry || seen.has(entry)) return false;\n    seen.add(entry);\n    return true;\n  }).join(\",\");\n}\n\nasync function withPlatformProxyBypass(serverUrl, action) {\n  const keys = [\"HTTP_PROXY\", \"HTTPS_PROXY\", \"ALL_PROXY\", \"http_proxy\", \"https_proxy\", \"all_proxy\", \"NO_PROXY\", \"no_proxy\"];\n  const previous = new Map(keys.map(key => [key, process.env[key]]));\n  for (const key of [\"HTTP_PROXY\", \"HTTPS_PROXY\", \"ALL_PROXY\", \"http_proxy\", \"https_proxy\", \"all_proxy\"]) delete process.env[key];\n  process.env.NO_PROXY = buildNoProxy(serverUrl, process.env.NO_PROXY);\n  process.env.no_proxy = buildNoProxy(serverUrl, process.env.no_proxy);\n  try {\n    return await action();\n  } finally {\n    for (const [key, value] of previous) {\n      if (value === undefined) delete process.env[key];\n      else process.env[key] = value;\n    }\n  }\n}\n\nfunction readWmClientConfig() {\n  const proxyUrl = process.env.WM_AGENT_PROXY_URL;\n  const proxyTokenFile = process.env.WM_AGENT_PROXY_TOKEN_FILE;\n  if (proxyUrl && proxyTokenFile) {\n    return {\n      serverUrl: proxyUrl,\n      token: fs.readFileSync(process.env.WM_AGENT_PROXY_TOKEN_FILE, \"utf8\").trim(),\n    };\n  }\n  return {\n    serverUrl: process.env.WM_SERVER_URL,\n    token: process.env.WM_AGENT_TOKEN,\n  };\n}\n\nasync function request(method, pathName, body) {\n  const { serverUrl, token } = readWmClientConfig();\n  if (!serverUrl || !token) throw new Error(\"WM_AGENT_PROXY_URL and WM_AGENT_PROXY_TOKEN_FILE, or WM_SERVER_URL and WM_AGENT_TOKEN are required\");\n  const response = await withPlatformProxyBypass(serverUrl, () =>\n    fetch(new URL(pathName, serverUrl), {\n      method,\n      headers: { authorization: \\`Bearer \\${token}\\`, \"content-type\": \"application/json\" },\n      body: body === undefined ? undefined : JSON.stringify(body),\n    })\n  );\n  const text = await response.text();\n  let payload;\n  try { payload = text ? JSON.parse(text) : {}; } catch { payload = { text }; }\n  if (!response.ok) {\n    const error = new Error(payload.error || text || \\`HTTP \\${response.status}\\`);\n    error.status = response.status;\n    error.code = typeof payload.code === \"string\" ? payload.code : undefined;\n    throw error;\n  }\n  return payload;\n}\n\nfunction readJsonIfExists(file) {\n  try {\n    if (!fs.existsSync(file)) return undefined;\n    return JSON.parse(fs.readFileSync(file, \"utf8\"));\n  } catch {\n    return undefined;\n  }\n}\n\nfunction optionFromArgs(callArgs, names) {\n  for (let i = 0; i < callArgs.length; i += 1) {\n    const arg = callArgs[i];\n    if (names.includes(arg)) return callArgs[i + 1] || \"\";\n    for (const name of names) {\n      if (arg.startsWith(name + \"=\")) return arg.slice(name.length + 1);\n    }\n  }\n  return \"\";\n}\n\nfunction currentTurnCandidates() {\n  const dir = path.join(__dirname, \"current-turns\");\n  try {\n    return fs.readdirSync(dir)\n      .filter((name) => name.endsWith(\".json\"))\n      .map((name) => {\n        const file = path.join(dir, name);\n        const value = readJsonIfExists(file);\n        if (!value || typeof value !== \"object\") return undefined;\n        let mtimeMs = 0;\n        try { mtimeMs = fs.statSync(file).mtimeMs; } catch {}\n        return { file, value, mtimeMs };\n      })\n      .filter(Boolean)\n      .sort((left, right) => right.mtimeMs - left.mtimeMs);\n  } catch {\n    return [];\n  }\n}\n\nfunction turnMessageIds(turn) {\n  const ids = [];\n  for (const key of [\"feishu_message_id\", \"message_id\", \"open_message_id\"]) {\n    if (turn[key]) ids.push(String(turn[key]));\n  }\n  if (Array.isArray(turn.message_ids)) ids.push(...turn.message_ids.map(String));\n  return ids.filter(Boolean);\n}\n\nfunction scoreTurnForArgs(turn, callArgs) {\n  let score = 0;\n  let explicit = false;\n  const activityKey = optionFromArgs(callArgs, [\"--feishu-activity-key\", \"--activity-key\"]);\n  if (activityKey) {\n    explicit = true;\n    if (turn.feishu_activity_key !== activityKey) return -1;\n    score += 1000;\n  }\n  const messageId = optionFromArgs(callArgs, [\"--message-id\", \"--feishu-message-id\", \"--open-message-id\"]);\n  if (messageId) {\n    explicit = true;\n    if (!turnMessageIds(turn).includes(messageId)) return -1;\n    score += 100;\n  }\n  const chatId = optionFromArgs(callArgs, [\"--chat-id\"]);\n  if (chatId) {\n    explicit = true;\n    if (turn.chat_id !== chatId) return -1;\n    score += 20;\n  }\n  return explicit ? score : 0;\n}\n\nfunction currentTurn(callArgs = []) {\n  const hasExplicitTarget = Boolean(\n    optionFromArgs(callArgs, [\"--feishu-activity-key\", \"--activity-key\", \"--message-id\", \"--feishu-message-id\", \"--open-message-id\", \"--chat-id\"])\n  );\n  const candidates = currentTurnCandidates();\n  if (hasExplicitTarget) {\n    const match = candidates\n      .map((candidate) => ({ candidate, score: scoreTurnForArgs(candidate.value, callArgs) }))\n      .filter((item) => item.score > 0)\n      .sort((left, right) => right.score - left.score || right.candidate.mtimeMs - left.candidate.mtimeMs)[0];\n    return match?.candidate.value || {};\n  }\n  const scopedFile = process.env.WM_CURRENT_TURN_FILE;\n  return (scopedFile ? readJsonIfExists(scopedFile) : undefined) || readJsonIfExists(path.join(__dirname, \"current-turn.json\")) || {};\n}\n\nfunction retroTransportContext() {\n  const explicitMessageId = String(valueAfter(\"--message-id\") || \"\").trim();\n  const scopedFile = process.env.WM_CURRENT_TURN_FILE;\n  const scopedTurn = scopedFile ? readJsonIfExists(scopedFile) : undefined;\n  const scopedMessageId = typeof scopedTurn?.message_id === \"string\" ? scopedTurn.message_id.trim() : \"\";\n  const messageId = explicitMessageId || scopedMessageId;\n  if (!messageId) throw new Error(\"retro commands require a scoped current turn or --message-id\");\n  const safeKey = Buffer.from(messageId, \"utf8\").toString(\"base64url\");\n  if (!safeKey || safeKey.length > 180) throw new Error(\"retro maintenance message id is too long\");\n  return {\n    messageId,\n    safeKey,\n    cachePath: path.join(__dirname, \"retro-inputs\", safeKey + \".json\"),\n  };\n}\n\nconst retroMemoryFiles = {\n  lessons: \"notes/lessons.md\",\n  candidates: \".wm/knowledge/facts/candidate-facts.md\",\n  slow_queries: \".wm/knowledge/retros/slow-queries.md\",\n  mistakes: \".wm/knowledge/retros/mistakes.md\",\n};\n\nfunction sha256Content(content) {\n  return crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction safeRetroBatchId(batchId) {\n  if (!/^[A-Za-z0-9_-]{1,180}$/.test(batchId)) throw new Error(\"retro batch id is unsafe\");\n  return batchId;\n}\n\nfunction retroStageDirectory(transport, batchId) {\n  return path.join(__dirname, \"retro-staging\", safeRetroBatchId(batchId), transport.safeKey);\n}\n\nfunction assertSafeRetroDirectoryChain(root, relativeDirectory) {\n  let current = root;\n  for (const segment of relativeDirectory.split(\"/\").filter(Boolean)) {\n    if (segment === \".\" || segment === \"..\") throw new Error(\"retro memory directory chain is invalid\");\n    current = path.join(current, segment);\n    const stat = fs.lstatSync(current);\n    if (!stat.isDirectory() || stat.isSymbolicLink()) throw new Error(\"retro memory directory is unsafe: \" + relativeDirectory);\n  }\n}\n\nfunction prepareRetroStaging(transport, batch) {\n  const workspaceRoot = path.resolve(__dirname, \"..\");\n  const stageDir = retroStageDirectory(transport, batch.batch_id);\n  ensureRetroDirectory(workspaceRoot, path.relative(workspaceRoot, stageDir).replace(/\\\\\\\\/g, \"/\"));\n  const manifestPath = path.join(stageDir, \"manifest.json\");\n  const existing = readRetroJsonSafely(workspaceRoot, manifestPath);\n  if (existing) {\n    if (existing.batch_id !== batch.batch_id || existing.maintenance_message_id !== transport.messageId) {\n      throw new Error(\"retro staging ownership mismatch\");\n    }\n  } else {\n    const files = {};\n    for (const [key, relativePath] of Object.entries(retroMemoryFiles)) {\n      const formalPath = path.join(workspaceRoot, relativePath);\n      assertSafeRetroDirectoryChain(workspaceRoot, path.dirname(relativePath));\n      let content = \"\";\n      let exists = false;\n      if (fs.existsSync(formalPath)) {\n        content = readReferenceFileFromOpenedFd(workspaceRoot, relativePath, 4 * 1024 * 1024).toString(\"utf8\");\n        exists = true;\n      }\n      const stagedPath = path.join(stageDir, \"files\", relativePath);\n      ensureRetroDirectory(workspaceRoot, path.dirname(path.relative(workspaceRoot, stagedPath).replace(/\\\\\\\\/g, \"/\")));\n      writeRetroFileAtomically(stagedPath, content);\n      files[key] = { path: relativePath, exists, base_sha256: sha256Content(content) };\n    }\n    writeJsonAtomically(manifestPath, {\n      version: 1,\n      batch_id: batch.batch_id,\n      maintenance_message_id: transport.messageId,\n      files,\n      created_at: Date.now(),\n    });\n  }\n  return {\n    stageDir,\n    memoryFiles: Object.fromEntries(Object.entries(retroMemoryFiles).map(([key, relativePath]) => [\n      key,\n      path.relative(workspaceRoot, path.join(stageDir, \"files\", relativePath)).replace(/\\\\\\\\/g, \"/\"),\n    ])),\n  };\n}\n\nfunction ensureRetroDirectory(workspaceRoot, relativeDirectory) {\n  const canonicalRoot = fs.realpathSync(workspaceRoot);\n  let current = workspaceRoot;\n  for (const segment of relativeDirectory.split(\"/\").filter(Boolean)) {\n    current = path.join(current, segment);\n    try { fs.mkdirSync(current, { mode: 0o700 }); } catch (error) { if (error.code !== \"EEXIST\") throw error; }\n    const info = fs.lstatSync(current);\n    const canonical = fs.realpathSync(current);\n    if (!info.isDirectory() || info.isSymbolicLink() || !isReferencePathContained(canonicalRoot, canonical)) throw new Error(\"retro staging directory is unsafe\");\n  }\n}\n\nfunction readRetroJsonSafely(workspaceRoot, filePath) {\n  try {\n    const relativePath = path.relative(workspaceRoot, filePath).replace(/\\\\\\\\/g, \"/\");\n    return JSON.parse(readReferenceFileFromOpenedFd(workspaceRoot, relativePath, 64 * 1024).toString(\"utf8\"));\n  } catch (error) {\n    if (error?.code === \"ENOENT\") return undefined;\n    throw error;\n  }\n}\n\nfunction freezeRetroTargets(workspaceRoot, stageDir) {\n  return Object.values(retroMemoryFiles).map(relativePath => {\n    const stagedRelative = path.relative(workspaceRoot, path.join(stageDir, \"files\", relativePath)).replace(/\\\\\\\\/g, \"/\");\n    const content = readReferenceFileFromOpenedFd(workspaceRoot, stagedRelative, 4 * 1024 * 1024);\n    return { path: relativePath, sha256: sha256Content(content), size: content.length };\n  });\n}\n\nfunction validateFrozenRetroTargets(workspaceRoot, stageDir, targets) {\n  if (!Array.isArray(targets) || targets.length !== Object.keys(retroMemoryFiles).length) throw new Error(\"retro frozen targets are invalid\");\n  const expected = new Map(targets.map(item => [String(item?.path || \"\"), item]));\n  for (const relativePath of Object.values(retroMemoryFiles)) {\n    const frozen = expected.get(relativePath);\n    if (!frozen || !/^[a-f0-9]{64}$/.test(String(frozen.sha256 || \"\")) || !Number.isSafeInteger(Number(frozen.size)) || Number(frozen.size) < 0) {\n      throw new Error(\"retro frozen targets are invalid\");\n    }\n    const stagedRelative = path.relative(workspaceRoot, path.join(stageDir, \"files\", relativePath)).replace(/\\\\\\\\/g, \"/\");\n    const content = readReferenceFileFromOpenedFd(workspaceRoot, stagedRelative, 4 * 1024 * 1024);\n    if (content.length !== Number(frozen.size) || sha256Content(content) !== String(frozen.sha256)) {\n      throw new Error(\"retro staged target drift: \" + relativePath);\n    }\n  }\n}\n\nfunction writeJsonAtomically(filePath, value) {\n  writeRetroFileAtomically(filePath, JSON.stringify(value, null, 2) + \"\\\\n\");\n}\n\nfunction writeRetroFileAtomically(filePath, content) {\n  fs.mkdirSync(path.dirname(filePath), { recursive: true });\n  const workspaceRoot = path.resolve(__dirname, \"..\");\n  const relativePath = path.relative(workspaceRoot, filePath).replace(/\\\\\\\\/g, \"/\");\n  if (relativePath.startsWith(\"../\") || path.isAbsolute(relativePath)) throw new Error(\"retro metadata path escapes workspace\");\n  const parentIdentities = captureReferenceParentIdentities(workspaceRoot, relativePath);\n  const tempPath = filePath + \".\" + process.pid + \".\" + Date.now() + \".tmp\";\n  let fd;\n  let tempIdentity;\n  try {\n    fd = fs.openSync(tempPath, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | (fs.constants.O_NOFOLLOW || 0), 0o600);\n    const opened = fs.fstatSync(fd);\n    if (!opened.isFile() || opened.nlink !== 1) throw new Error(\"retro metadata temp file is unsafe\");\n    tempIdentity = { dev: opened.dev, ino: opened.ino };\n    fs.writeFileSync(fd, content, \"utf8\");\n    fs.fsyncSync(fd);\n    fs.closeSync(fd);\n    fd = undefined;\n    revalidateReferenceParentIdentities(parentIdentities);\n    fs.renameSync(tempPath, filePath);\n    revalidateReferenceParentIdentities(parentIdentities);\n    const published = fs.lstatSync(filePath);\n    if (published.isSymbolicLink() || !published.isFile() || published.nlink !== 1 || !tempIdentity || published.dev !== tempIdentity.dev || published.ino !== tempIdentity.ino) {\n      throw new Error(\"retro metadata publish identity mismatch\");\n    }\n    const parentFd = fs.openSync(path.dirname(filePath), fs.constants.O_RDONLY);\n    try { fs.fsyncSync(parentFd); } finally { fs.closeSync(parentFd); }\n  } catch (error) {\n    if (fd !== undefined) fs.closeSync(fd);\n    fs.rmSync(tempPath, { force: true });\n    throw error;\n  }\n}\n\nfunction retroInputBatch(payload) {\n  const inputs = payload?.inputs;\n  if (!inputs || typeof inputs !== \"object\" || Array.isArray(inputs)) throw new Error(\"retro inputs response is invalid\");\n  if (inputs.has_activity !== true) return undefined;\n  const batchId = typeof inputs.batch_id === \"string\" ? inputs.batch_id.trim() : \"\";\n  const periodStart = Number(inputs.period?.start);\n  const periodEnd = Number(inputs.period?.end);\n  if (!batchId || !Number.isFinite(periodStart) || !Number.isFinite(periodEnd)) {\n    throw new Error(\"retro inputs response is missing batch_id or period\");\n  }\n  return {\n    batch_id: batchId,\n    period: { start: periodStart, end: periodEnd },\n    feedback_ids: Array.isArray(inputs.feedback)\n      ? inputs.feedback.map(item => String(item?.id || \"\").trim()).filter(Boolean)\n      : [],\n  };\n}\n\nfunction defaultAnswerEvidence(turn) {\n  const messageId = typeof turn.message_id === \"string\" ? turn.message_id.trim() : \"\";\n  const attachments = Array.isArray(turn.attachments) ? turn.attachments : [];\n  const attachmentIds = Array.from(new Set([\n    ...attachments.map(item => item && item.id).filter(Boolean),\n    ...(Array.isArray(turn.attachment_ids) ? turn.attachment_ids.map(String).filter(Boolean) : []),\n  ]));\n  const sources = [];\n  if (messageId) {\n    sources.push({\n      type: \"message\",\n      pointer: \\`message:\\${messageId}\\`,\n      sensitivity: \"private_local\",\n      audience_summary: \"\u5F53\u524D\u4F1A\u8BDD\u4E2D\u7528\u6237\u63D0\u4F9B\u7684\u6D88\u606F\",\n    });\n  }\n  for (const attachmentId of attachmentIds) {\n    sources.push({\n      type: \"attachment\",\n      pointer: \\`attachment:\\${attachmentId}\\`,\n      sensitivity: \"private_local\",\n      audience_summary: \"\u5F53\u524D\u4F1A\u8BDD\u4E2D\u7528\u6237\u63D0\u4F9B\u7684\u9644\u4EF6\",\n    });\n  }\n  if (sources.length === 0) {\n    return {\n      authority: {\n        mode: \"missing_context\",\n        sources: [],\n        confidence: \"low\",\n        audience_safe_summary: \"\u5F53\u524D\u56DE\u5408\u6CA1\u6709\u53EF\u5173\u8054\u7684\u6765\u6E90\uFF0C\u9700\u8981\u8865\u5145\u4E0A\u4E0B\u6587\u3002\",\n      },\n      missing_context: [\"current_turn_source\"],\n      used_local_context: false,\n      used_user_token: false,\n    };\n  }\n  return {\n    authority: {\n      mode: \"agent_grounded\",\n      sources,\n      confidence: \"medium\",\n      audience_safe_summary: \"\u56DE\u7B54\u57FA\u4E8E\u5F53\u524D\u4F1A\u8BDD\u4E2D\u7528\u6237\u63D0\u4F9B\u7684\u4FE1\u606F\u3002\",\n    },\n    internal_evidence: {\n      current_message_id: messageId || undefined,\n      attachment_ids: attachmentIds,\n    },\n    used_local_context: false,\n    used_user_token: false,\n  };\n}\n\nfunction replyIdempotencyKey(turn, body) {\n  const messageId = typeof turn.message_id === \"string\" ? turn.message_id.trim() : \"\";\n  if (!messageId) return undefined;\n  const digest = crypto.createHash(\"sha256\")\n    .update(JSON.stringify([messageId, String(body.target || \"\"), String(body.kind || \"answer\")]))\n    .digest(\"hex\");\n  return \"wm-reply-v1:\" + digest;\n}\n\nfunction readPlatformReplyOutbox(filePath, sourceMessageId, idempotencyKey) {\n  let payload;\n  try {\n    payload = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n  } catch {\n    throw new Error(\"platform reply outbox invalid\");\n  }\n  if (\n    !payload\n    || typeof payload !== \"object\"\n    || Array.isArray(payload)\n    || payload.version !== 1\n    || payload.source_message_id !== sourceMessageId\n    || !payload.body\n    || typeof payload.body !== \"object\"\n    || Array.isArray(payload.body)\n    || typeof payload.body.text !== \"string\"\n    || !payload.body.text.trim()\n  ) {\n    throw new Error(\"platform reply outbox invalid\");\n  }\n  const storedKey = typeof payload.body.idempotency_key === \"string\"\n    ? payload.body.idempotency_key\n    : \"\";\n  const recomputedKey = replyIdempotencyKey({ message_id: sourceMessageId }, payload.body);\n  if (storedKey !== idempotencyKey || recomputedKey !== idempotencyKey) {\n    throw new Error(\"platform reply outbox idempotency key mismatch\");\n  }\n  return { filePath, body: payload.body };\n}\n\nfunction writePlatformReplyOutbox(turn, body) {\n  const sourceMessageId = typeof turn.message_id === \"string\" ? turn.message_id.trim() : \"\";\n  const idempotencyKey = typeof body.idempotency_key === \"string\" ? body.idempotency_key.trim() : \"\";\n  if (!sourceMessageId || !idempotencyKey) return undefined;\n  const outboxDir = path.join(__dirname, \"platform-reply-outbox\");\n  fs.mkdirSync(outboxDir, { recursive: true, mode: 0o700 });\n  const filename = crypto.createHash(\"sha256\").update(idempotencyKey).digest(\"hex\") + \".json\";\n  const filePath = path.join(outboxDir, filename);\n  const temporaryPath = filePath + \".tmp-\" + process.pid;\n  if (fs.existsSync(filePath)) {\n    return readPlatformReplyOutbox(filePath, sourceMessageId, idempotencyKey);\n  }\n  fs.writeFileSync(temporaryPath, JSON.stringify({\n    version: 1,\n    source_message_id: sourceMessageId,\n    body,\n    created_at: new Date().toISOString(),\n  }), { encoding: \"utf8\", mode: 0o600 });\n  try {\n    fs.linkSync(temporaryPath, filePath);\n  } catch (error) {\n    if (!error || error.code !== \"EEXIST\") throw error;\n  } finally {\n    fs.rmSync(temporaryPath, { force: true });\n  }\n  return readPlatformReplyOutbox(filePath, sourceMessageId, idempotencyKey);\n}\n\nfunction currentTurnAttachments(turn) {\n  const ids = Array.isArray(turn.attachment_ids)\n    ? turn.attachment_ids.map(String).filter(Boolean)\n    : [];\n  const attachments = Array.isArray(turn.attachments)\n    ? turn.attachments.filter(item => item && typeof item === \"object\" && typeof item.id === \"string\" && typeof item.filename === \"string\")\n    : [];\n  return { attachment_ids: ids, attachments };\n}\n\nfunction messageLine(message) {\n  const target = message.target || message.read_target || \"#unknown\";\n  const id = message.message_id || message.id || \"unknown\";\n  const time = message.timestamp || (message.created_at ? new Date(message.created_at).toISOString() : \"\");\n  const senderType = message.sender_type || message.author_type || \"unknown\";\n  const sender = message.sender_name || message.author_name || message.author_id || \"unknown\";\n  const content = message.content || message.text || \"\";\n  return \\`[target=\\${target} msg=\\${String(id).slice(0, 12)} time=\\${time} type=\\${senderType}] @\\${sender}: \\${content}\\`;\n}\n\nfunction printResult(payload, text) {\n  if (hasFlag(\"--json\")) {\n    console.log(JSON.stringify(payload, null, 2));\n  } else {\n    console.log(text);\n  }\n}\n\nfunction formatSendResult(result, target) {\n  const messageId = result.messageId || result.message?.id || \"unknown\";\n  const sentTarget = result.message?.target || target;\n  const lines = [\\`Message sent to \\${sentTarget}. Message ID: \\${messageId}\\`];\n  if (result.replyTargetHint) lines.push(\\`To reply in this message's thread, use target \"\\${result.replyTargetHint}\".\\`);\n  const unread = result.recentUnread || [];\n  if (unread.length) {\n    lines.push(\"\", \"--- New messages you may have missed ---\");\n    for (const message of unread) lines.push(messageLine(message));\n  }\n  return lines.join(\"\\\\n\");\n}\n\nfunction formatDmSendResult(payload) {\n  const messageId = payload.messageId || payload.message?.id || \"unknown\";\n  const lines = [\\`DM sent. Message ID: \\${messageId}\\`];\n  if (payload.reply) {\n    lines.push(\"\", \"--- Reply ---\", messageLine(payload.reply));\n  } else if (payload.timed_out) {\n    lines.push(\"Timed out waiting for reply.\");\n  }\n  return lines.join(\"\\\\n\");\n}\n\nfunction formatMessages(payload) {\n  const messages = payload.messages || [];\n  if (!messages.length) return \"No messages.\";\n  return messages.map(messageLine).join(\"\\\\n\");\n}\n\nfunction formatSearch(payload) {\n  const results = payload.results || [];\n  if (!results.length) return \"No matching messages.\";\n  return results.map((item) => \\`\\${messageLine({ ...item.message, target: item.target })}\\\\n  hint: \\${item.read_hint}\\`).join(\"\\\\n\");\n}\n\nfunction formatServerInfo(payload) {\n  const lines = [\n    \\`AIEmployee: \\${payload.identity?.name || payload.identity?.ai_employee_id || \"unknown\"}\\`,\n    \\`Runtime: \\${payload.identity?.runtime || \"unknown\"}\\`,\n    \"Channels:\",\n    ...((payload.channels || payload.channels || []).map((channel) => \\`- #\\${channel.name} (\\${channel.id})\\`)),\n    \"Humans:\",\n    ...((payload.humans || []).map((human) => \\`- @\\${human.name} (\\${human.id})\\`)),\n    \"AI employees:\",\n    ...((payload.agents || []).map((agent) => \\`- @\\${agent.name} runtime=\\${agent.runtime} channel=\\${agent.channel_id || \"none\"}\\`)),\n    \"Machines:\",\n    ...((payload.machines || []).map((machine) => \\`- \\${machine.name} status=\\${machine.status} host=\\${machine.hostname}\\`)),\n  ];\n  return lines.join(\"\\\\n\");\n}\n\nfunction formatMembers(payload) {\n  const members = payload.members || [];\n  if (!members.length) return \"No visible members.\";\n  return members.map((member) => \\`- \\${member.mention} type=\\${member.type}\\${member.runtime ? \\` runtime=\\${member.runtime}\\` : \"\"}\\`).join(\"\\\\n\");\n}\n\nfunction formatMemberFind(payload) {\n  const lines = [];\n  if (payload.human) {\n    lines.push(\\`Human: @\\${payload.human.name} (\\${payload.human.id})\\`);\n    if (payload.human.feishu_open_id) lines.push(\\`Feishu open_id: \\${payload.human.feishu_open_id}\\`);\n    if (payload.human.email) lines.push(\\`Email: \\${payload.human.email}\\`);\n  } else {\n    lines.push(\"Human: not found\");\n  }\n  lines.push(\"AI employees:\");\n  if (payload.ai_employees?.length) {\n    for (const agent of payload.agents) {\n      lines.push(\\`- @\\${agent.name} id=\\${agent.ai_employee_id} runtime=\\${agent.runtime} machine=\\${agent.machine_id} \\${agent.online ? \"online\" : \"offline\"}\\`);\n    }\n  } else {\n    lines.push(\"- none\");\n  }\n  return lines.join(\"\\\\n\");\n}\n\nfunction formatInboxDraft(payload, fallback) {\n  const item = payload.item || {};\n  return \\`\\${fallback}: \\${item.id || \"unknown\"} status=\\${item.status || \"unknown\"}\\`;\n}\n\nfunction formatRetroInputs(payload) {\n  const inputs = payload.inputs || {};\n  const period = inputs.period || {};\n  const runs = Array.isArray(inputs.runs) ? inputs.runs : [];\n  const feedback = Array.isArray(inputs.feedback) ? inputs.feedback : [];\n  const lessons = typeof inputs.lessons === \"string\" ? inputs.lessons : \"\";\n  return [\n    \"Retro inputs loaded.\",\n    \\`Period: \\${period.start ? new Date(period.start).toISOString() : \"unknown\"} - \\${period.end ? new Date(period.end).toISOString() : \"unknown\"}\\`,\n    \\`Activity events: \\${runs.length}\\`,\n    \\`Unconsumed feedback: \\${feedback.length}\\`,\n    \\`Lessons bytes: \\${lessons.length}\\`,\n  ].join(\"\\\\n\");\n}\n\nasync function main() {\n  const aiEmployeeId = process.env.WM_AGENT_ID || process.env.WM_DAEMON_AGENT_ID;\n  if (group === \"auth\" && command === \"whoami\") {\n    console.log(JSON.stringify({\n      aiEmployeeId,\n      serverUrl: process.env.WM_SERVER_URL,\n      serverNamespace: process.env.WM_DAEMON_SERVER_NAMESPACE,\n      serverId: process.env.WM_DAEMON_SERVER_ID,\n      daemonId: process.env.WM_DAEMON_DAEMON_ID,\n      runtime: process.env.WM_DAEMON_RUNTIME\n    }, null, 2));\n    return;\n  }\n  if (!aiEmployeeId) throw new Error(\"WM_AGENT_ID is required\");\n  assertMaintenanceCommandAllowed();\n  if (group === \"reference\" && command === \"read\") {\n    const bundle = currentReferenceBundle([valueAfter(\"--file\") || args[2]]);\n    process.stdout.write(bundle.files[0].content);\n    return;\n  }\n  if (group === \"reference\" && command === \"bundle\") {\n    const requested = String(valueAfter(\"--files\") || \"\").split(\",\").map(value => value.trim()).filter(Boolean);\n    const bundle = currentReferenceBundle(requested);\n    process.stdout.write(JSON.stringify({\n      version: 1,\n      generation_id: bundle.generationId,\n      files: bundle.files.map(file => ({ path: file.path, content: String(file.content), sha256: file.sha256 })),\n    }) + \"\\\\n\");\n    return;\n  }\n  if (group === \"message\" && command === \"send\") {\n    const target = valueAfter(\"--target\");\n    const kind = valueAfter(\"--kind\");\n    const evidenceFile = valueAfter(\"--evidence\");\n    const text = (valueAfter(\"--text\") || valueAfter(\"--content\") || await stdin() || positionalText()).trim();\n    if (!text) throw new Error(\"message text is required; use --text, --content, stdin, or a positional message\");\n    const attachmentIds = (valueAfter(\"--attachment-ids\") || \"\").split(\",\").map(s => s.trim()).filter(Boolean);\n    const body = { text, attachment_ids: attachmentIds };\n    const turn = currentTurn(args);\n    if (target) body.target = target;\n    if (kind) body.kind = kind;\n    if (evidenceFile) body.evidence = JSON.parse(fs.readFileSync(path.resolve(evidenceFile), \"utf8\"));\n    else if (kind === \"answer\") body.evidence = defaultAnswerEvidence(turn);\n    const sourceDeliveryId = typeof turn.delivery_id === \"string\" ? turn.delivery_id.trim() : \"\";\n    if (sourceDeliveryId) body.source_delivery_id = sourceDeliveryId;\n    const idempotencyKey = replyIdempotencyKey(turn, body);\n    if (idempotencyKey) body.idempotency_key = idempotencyKey;\n    const outbox = writePlatformReplyOutbox(turn, body);\n    const requestBody = outbox ? outbox.body : body;\n    const result = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/send\\`, requestBody);\n    if (outbox) fs.rmSync(outbox.filePath, { force: true });\n    const payload = {\n      message: result.message,\n      messageId: result.messageId,\n      replyTargetHint: result.replyTargetHint,\n      recentUnread: result.recentUnread || []\n    };\n    printResult(payload, formatSendResult(payload, target));\n    return;\n  }\n  if (group === \"dm\" && command === \"send\") {\n    const toAgentId = valueAfter(\"--to-agent-id\");\n    if (!toAgentId) throw new Error(\"--to-agent-id is required\");\n    const text = (valueAfter(\"--text\") || valueAfter(\"--content\") || await stdin() || positionalText()).trim();\n    if (!text) throw new Error(\"message text is required; use --text, --content, stdin, or a positional message\");\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/dm/send\\`, {\n      to_ai_employee_id: toAgentId,\n      text,\n      wait_for_reply: hasFlag(\"--wait-for-reply\"),\n      timeout_ms: valueAfter(\"--timeout\") ? Number(valueAfter(\"--timeout\")) : undefined,\n    });\n    printResult(payload, formatDmSendResult(payload));\n    return;\n  }\n  if (group === \"message\" && command === \"check\") {\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/receive\\`);\n    printResult(payload, formatMessages(payload).replace(\"No messages.\", \"No new messages.\"));\n    return;\n  }\n  if (group === \"message\" && command === \"read\") {\n    const channel = valueAfter(\"--channel\") || valueAfter(\"--target\");\n    const around = valueAfter(\"--around\");\n    const params = new URLSearchParams();\n    if (channel) params.set(\"target\", channel);\n    if (around) params.set(\"around\", around);\n    const suffix = params.toString() ? \\`?\\${params.toString()}\\` : \"\";\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/history\\${suffix}\\`);\n    printResult(payload, formatMessages(payload));\n    return;\n  }\n  if (group === \"message\" && command === \"search\") {\n    const query = valueAfter(\"--query\") || valueAfter(\"--q\") || positionalText();\n    if (!query) throw new Error(\"--query is required\");\n    const target = valueAfter(\"--target\") || valueAfter(\"--channel\");\n    const params = new URLSearchParams({ query });\n    if (target) params.set(\"target\", target);\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/search?\\${params.toString()}\\`);\n    printResult(payload, formatSearch(payload));\n    return;\n  }\n  if (group === \"server\" && command === \"info\") {\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/server\\`);\n    printResult(payload, formatServerInfo(payload));\n    return;\n  }\n  if ((group === \"channel\" || group === \"channel\") && command === \"members\") {\n    const target = valueAfter(\"--target\") || valueAfter(\"--channel\");\n    const params = target ? \\`?target=\\${encodeURIComponent(target)}\\` : \"\";\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/channel/members\\${params}\\`);\n    printResult(payload, formatMembers(payload));\n    return;\n  }\n  if (group === \"member\" && command === \"find\") {\n    const openId = (valueAfter(\"--feishu-open-id\") || valueAfter(\"--open-id\") || \"\").trim();\n    if (!openId) throw new Error(\"--feishu-open-id is required\");\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/members/find?feishu_open_id=\\${encodeURIComponent(openId)}\\`);\n    printResult(payload, formatMemberFind(payload));\n    return;\n  }\n  if (group === \"inbox\" && command === \"feishu-draft\") {\n    const action = args[2];\n    if (action === \"create\") {\n      const draftText = (valueAfter(\"--draft-text\") || await stdin()).trim();\n      const turn = currentTurn(args);\n      const attachments = currentTurnAttachments(turn);\n      const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/inbox/feishu-draft\\`, {\n        delegation_id: valueAfter(\"--delegation-id\") || turn.delegation_id || \"\",\n        routine_id: valueAfter(\"--routine-id\") || turn.routine_id || \"\",\n        human_id: valueAfter(\"--human-id\") || turn.owner_human_id || turn.human_id || \"\",\n        feishu_message_id: valueAfter(\"--feishu-message-id\") || turn.feishu_message_id || \"\",\n        chat_id: valueAfter(\"--chat-id\") || turn.chat_id || \"\",\n        sender_name: valueAfter(\"--sender-name\") || turn.sender_name || \"\",\n        sender_open_id: valueAfter(\"--sender-open-id\") || turn.sender_open_id || \"\",\n        original_text: valueAfter(\"--original-text\") || turn.original_text || \"\",\n        draft_text: draftText,\n        risk: valueAfter(\"--risk\"),\n        status: valueAfter(\"--status\"),\n        approval_mode: valueAfter(\"--approval-mode\"),\n        sent_message_id: valueAfter(\"--sent-message-id\") || valueAfter(\"--message-id\"),\n        error: valueAfter(\"--error\"),\n        feishu_activity_key: turn.feishu_activity_key || \"\",\n        message_ids: Array.isArray(turn.message_ids) ? turn.message_ids : [],\n        recent_messages: Array.isArray(turn.recent_messages) ? turn.recent_messages : [],\n        received_at: turn.received_at,\n        attachment_ids: attachments.attachment_ids,\n        attachments: attachments.attachments,\n      });\n      printResult(payload, formatInboxDraft(payload, \"Feishu draft created\"));\n      return;\n    }\n    if (action === \"sent\") {\n      const inboxId = valueAfter(\"--id\");\n      if (!inboxId) throw new Error(\"--id is required\");\n      const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/inbox/feishu-draft/\\${encodeURIComponent(inboxId)}/sent\\`, {\n        message_id: valueAfter(\"--message-id\"),\n      });\n      printResult(payload, formatInboxDraft(payload, \"Feishu draft sent\"));\n      return;\n    }\n    if (action === \"failed\") {\n      const inboxId = valueAfter(\"--id\");\n      if (!inboxId) throw new Error(\"--id is required\");\n      const error = (valueAfter(\"--error\") || await stdin()).trim();\n      if (!error) throw new Error(\"--error is required\");\n      const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/inbox/feishu-draft/\\${encodeURIComponent(inboxId)}/failed\\`, { error });\n      printResult(payload, formatInboxDraft(payload, \"Feishu draft failed\"));\n      return;\n    }\n  }\n  if (group === \"routine\" && command === \"list\") {\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/routine\\`);\n    printResult(payload, JSON.stringify(payload, null, 2));\n    return;\n  }\n  if (group === \"routine\" && command === \"get\") {\n    const routineId = args[2];\n    if (!routineId || routineId.startsWith(\"-\")) throw new Error(\"routine id is required\");\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/routine/\\${encodeURIComponent(routineId)}\\`);\n    printResult(payload, JSON.stringify(payload, null, 2));\n    return;\n  }\n  if (group === \"routine\" && [\"pause\", \"resume\", \"archive\"].includes(command)) {\n    const routineId = args[2];\n    if (!routineId || routineId.startsWith(\"-\")) throw new Error(\"routine id is required\");\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/routine/\\${encodeURIComponent(routineId)}/\\${command}\\`);\n    printResult(payload, JSON.stringify(payload, null, 2));\n    return;\n  }\n  if (group === \"retro\" && command === \"inputs\") {\n    const transport = retroTransportContext();\n    const windowMs = valueAfter(\"--window-ms\");\n    const suffix = windowMs ? \\`?window_ms=\\${encodeURIComponent(windowMs)}\\` : \"\";\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/retro/inputs\\${suffix}\\`);\n    const batch = retroInputBatch(payload);\n    if (batch) {\n      const staging = prepareRetroStaging(transport, batch);\n      writeJsonAtomically(transport.cachePath, batch);\n      payload.inputs = { ...payload.inputs, memory_files: staging.memoryFiles };\n    }\n    else fs.rmSync(transport.cachePath, { force: true });\n    printResult(payload, formatRetroInputs(payload));\n    return;\n  }\n  if (group === \"retro\" && command === \"complete\") {\n    const transport = retroTransportContext();\n    const batch = readRetroJsonSafely(path.resolve(__dirname, \"..\"), transport.cachePath);\n    if (!batch || typeof batch !== \"object\" || Array.isArray(batch)) {\n      throw new Error(\"retro inputs cache is missing; run wm retro inputs for this maintenance turn first\");\n    }\n    const summary = (valueAfter(\"--summary\") || await stdin()).trim();\n    const explicitFeedbackIds = valueAfter(\"--feedback-ids\");\n    const feedbackIds = explicitFeedbackIds === undefined\n      ? (Array.isArray(batch.feedback_ids) ? batch.feedback_ids.map(String).filter(Boolean) : [])\n      : explicitFeedbackIds.split(\",\").map(s => s.trim()).filter(Boolean);\n    const workspaceRoot = path.resolve(__dirname, \"..\");\n    const candidatesFile = valueAfter(\"--candidates-file\");\n    let candidates;\n    if (candidatesFile !== undefined) {\n      const candidatePath = path.resolve(workspaceRoot, candidatesFile);\n      const relativeCandidatePath = path.relative(workspaceRoot, candidatePath).split(path.sep).join(\"/\");\n      if (!relativeCandidatePath || relativeCandidatePath.startsWith(\"../\") || path.isAbsolute(relativeCandidatePath)) {\n        throw new Error(\"--candidates-file must resolve to a file inside the AI employee workspace\");\n      }\n      const parsed = JSON.parse(readCandidateFileFromOpenedFd(workspaceRoot, relativeCandidatePath, 256 * 1024).toString(\"utf8\"));\n      if (!Array.isArray(parsed)) throw new Error(\"--candidates-file must contain a JSON array\");\n      candidates = parsed.map(candidate => ({\n        kind: candidate?.kind,\n        statement: candidate?.statement,\n        source_refs: Array.isArray(candidate?.source_refs)\n          ? candidate.source_refs.map(ref => ({ type: ref?.type, id: ref?.id }))\n          : candidate?.source_refs,\n      }));\n    }\n    const body = {\n      summary,\n      retro_note_path: valueAfter(\"--retro-note\") || valueAfter(\"--note\"),\n      lessons_added: Number(valueAfter(\"--lessons-added\") || 0),\n      proposal_id: valueAfter(\"--proposal-id\"),\n      run_id: valueAfter(\"--run-id\"),\n      feedback_ids: feedbackIds,\n      batch_id: batch.batch_id,\n      period_start: batch.period?.start,\n      period_end: batch.period?.end,\n      maintenance_message_id: transport.messageId,\n      ...(candidates !== undefined ? { candidates } : {}),\n    };\n    const stageDir = retroStageDirectory(transport, batch.batch_id);\n    const previousCompletion = readRetroJsonSafely(workspaceRoot, path.join(stageDir, \"completion.json\"));\n    const frozenTargets = Array.isArray(previousCompletion?.targets)\n      ? previousCompletion.targets\n      : freezeRetroTargets(workspaceRoot, stageDir);\n    if (previousCompletion) {\n      try {\n        validateFrozenRetroTargets(workspaceRoot, stageDir, frozenTargets);\n      } catch (error) {\n        writeJsonAtomically(path.join(stageDir, \"completion.json\"), {\n          ...previousCompletion,\n          status: \"conflict\",\n          targets: frozenTargets,\n          conflict_reason: error.message,\n          completed_at: Date.now(),\n        });\n        throw new Error(\"[retro_staging_conflict] \" + error.message);\n      }\n    }\n    writeJsonAtomically(path.join(stageDir, \"completion.json\"), {\n      version: 1,\n      status: \"sending\",\n      batch_id: batch.batch_id,\n      maintenance_message_id: transport.messageId,\n      targets: frozenTargets,\n      completed_at: Date.now(),\n    });\n    let payload;\n    try {\n      payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/retro/complete\\`, body);\n    } catch (error) {\n      const permanentStatus = error?.code === \"retro_batch_stale\"\n        ? \"stale\"\n        : error?.code === \"retro_batch_rejected\" ? \"rejected\" : undefined;\n      if (permanentStatus) {\n        writeJsonAtomically(path.join(stageDir, \"completion.json\"), {\n          version: 1,\n          status: permanentStatus,\n          batch_id: batch.batch_id,\n          maintenance_message_id: transport.messageId,\n          completed_at: Date.now(),\n        });\n        fs.rmSync(stageDir, { recursive: true, force: true });\n        fs.rmSync(transport.cachePath, { force: true });\n      } else {\n        const retryStatus = Number(error?.status) >= 500 ? \"retryable\" : \"unknown_after_send\";\n        writeJsonAtomically(path.join(stageDir, \"completion.json\"), {\n          version: 1,\n          status: retryStatus,\n          batch_id: batch.batch_id,\n          maintenance_message_id: transport.messageId,\n          http_status: error?.status,\n          error_code: error?.code,\n          targets: frozenTargets,\n          completed_at: Date.now(),\n        });\n        error.message = \\`[retro_complete_\\${retryStatus}] \\${error.message}\\`;\n      }\n      throw error;\n    }\n    const returnedMaintenanceMessageId = String(payload.retro?.maintenance_message_id || \"\").trim();\n    const returnedBatchId = String(payload.retro?.inputs_summary?._retro_batch?.batch_id || \"\").trim();\n    if (returnedMaintenanceMessageId !== transport.messageId) {\n      writeJsonAtomically(path.join(stageDir, \"completion.json\"), { version: 1, status: \"unknown_after_send\", batch_id: batch.batch_id, maintenance_message_id: transport.messageId, targets: frozenTargets, completed_at: Date.now() });\n      throw new Error(\"[retro_complete_unknown_after_send] retro complete response maintenance message mismatch\");\n    }\n    if (returnedBatchId !== batch.batch_id) {\n      writeJsonAtomically(path.join(stageDir, \"completion.json\"), { version: 1, status: \"unknown_after_send\", batch_id: batch.batch_id, maintenance_message_id: transport.messageId, targets: frozenTargets, completed_at: Date.now() });\n      throw new Error(\"[retro_complete_unknown_after_send] retro complete response batch mismatch\");\n    }\n    writeJsonAtomically(path.join(stageDir, \"completion.json\"), {\n      version: 1,\n      status: \"server_committed\",\n      batch_id: batch.batch_id,\n      maintenance_message_id: transport.messageId,\n      retro_id: payload.retro?.id || \"\",\n      targets: frozenTargets,\n      completed_at: Date.now(),\n    });\n    fs.rmSync(transport.cachePath, { force: true });\n    printResult(payload, \\`Retro completed: \\${payload.retro?.id || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"proxy\" && command === \"verify\") {\n    const dir = valueAfter(\"--dir\");\n    if (!dir) throw new Error(\"--dir is required\");\n    const resolvedDir = path.resolve(dir);\n    const result = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/proxy/verify\\`, { dir: resolvedDir });\n    printResult(result, JSON.stringify(result, null, 2));\n    if (!result.ok) process.exit(1);\n    return;\n  }\n  if (group === \"proxy\" && command === \"probe\") {\n    const dir = valueAfter(\"--dir\");\n    if (!dir) throw new Error(\"--dir is required\");\n    const resolvedDir = path.resolve(dir);\n    const result = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/proxy/probe\\`, { dir: resolvedDir });\n    printResult(result, JSON.stringify(result, null, 2));\n    if (result.ready === false) process.exit(1);\n    return;\n  }\n  if (group === \"proxy\" && command === \"create\") {\n    const dir = valueAfter(\"--dir\");\n    if (!dir) throw new Error(\"--dir is required\");\n    const resolvedDir = path.resolve(dir);\n    const verifyResult = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/proxy/verify\\`, { dir: resolvedDir });\n    if (!verifyResult.ok) {\n      printResult(verifyResult, JSON.stringify(verifyResult, null, 2));\n      process.exit(1);\n      return;\n    }\n    const body = readProxyModuleDir(dir);\n    body.verify_result = verifyResult;\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/proxy\\`, body);\n    printResult(payload, JSON.stringify(payload, null, 2));\n    return;\n  }\n  if (group === \"task\" && command === \"list\") {\n    const status = valueAfter(\"--status\");\n    const suffix = status ? \\`?status=\\${encodeURIComponent(status)}\\` : \"\";\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/tasks\\${suffix}\\`);\n    const tasks = payload.tasks || [];\n    printResult(payload, tasks.length ? tasks.map((task) => \\`- \\${task.id} [\\${task.status}] \\${task.title}\\`).join(\"\\\\n\") : \"No tasks.\");\n    return;\n  }\n  if (group === \"task\" && command === \"claim\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/task/claim\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\") });\n    printResult(payload, \\`Task claimed: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"task\" && command === \"unclaim\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/task/unclaim\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\") });\n    printResult(payload, \\`Task unclaimed: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"task\" && command === \"update\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/task/update\\`, { task_id: valueAfter(\"--id\") || valueAfter(\"--task-id\"), status: valueAfter(\"--status\") });\n    printResult(payload, \\`Task updated: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"task\" && command === \"create\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/task/create\\`, { target: valueAfter(\"--target\"), title: valueAfter(\"--title\"), description: valueAfter(\"--description\") || await stdin() });\n    printResult(payload, \\`Task created: \\${payload.task?.id || \"unknown\"} status=\\${payload.task?.status || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"attachment\" && command === \"upload\") {\n    const file = valueAfter(\"--file\");\n    if (!file) throw new Error(\"--file is required\");\n    const buffer = fs.readFileSync(file);\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/upload\\`, {\n      filename: path.basename(file),\n      mime_type: \"application/octet-stream\",\n      content_base64: buffer.toString(\"base64\")\n    });\n    printResult(payload, \\`Attachment uploaded: \\${payload.attachment?.id || \"unknown\"} \\${payload.attachment?.filename || \"\"}\\`);\n    return;\n  }\n  if (group === \"attachment\" && command === \"view\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/download-attachment\\`, { attachment_id: valueAfter(\"--id\") });\n    printResult(payload, \\`Attachment: \\${payload.attachment?.filename || payload.attachment?.id || \"unknown\"} size=\\${payload.attachment?.size || 0}\\\\n\\${payload.content_base64 || \"\"}\\`);\n    return;\n  }\n  if (group === \"profile\" && command === \"show\") {\n    const target = valueAfter(\"--target\");\n    const params = target ? \\`?target=\\${encodeURIComponent(target)}\\` : \"\";\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/profile\\${params}\\`);\n    printResult(payload, Object.entries(payload.profile || {}).map(([key, value]) => \\`\\${key}: \\${value}\\`).join(\"\\\\n\"));\n    return;\n  }\n  if (group === \"profile\" && command === \"update\") {\n    const payload = await request(\"PATCH\", \\`/internal/ai-employee/\\${aiEmployeeId}/profile\\`, { role: valueAfter(\"--role\") || valueAfter(\"--description\"), instructions: valueAfter(\"--instructions\") || await stdin() });\n    printResult(payload, \"Profile updated.\");\n    return;\n  }\n  if (group === \"profile\" && command === \"propose\") {\n    const diffFile = valueAfter(\"--diff-file\") || valueAfter(\"--file\");\n    if (!diffFile) throw new Error(\"--diff-file is required\");\n    const body = JSON.parse(fs.readFileSync(path.resolve(diffFile), \"utf8\"));\n    if (!body || typeof body !== \"object\" || Array.isArray(body)) throw new Error(\"proposal file must contain a JSON object\");\n    if (valueAfter(\"--summary\") && !body.summary) body.summary = valueAfter(\"--summary\");\n    if (valueAfter(\"--retro-id\") && !body.retro_id) body.retro_id = valueAfter(\"--retro-id\");\n    if (valueAfter(\"--run-id\") && !body.run_id) body.run_id = valueAfter(\"--run-id\");\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/profile/propose\\`, body);\n    printResult(payload, \\`Profile proposal created: \\${payload.proposal?.id || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"profile\" && command === \"migration-ack\") {\n    const key = valueAfter(\"--key\");\n    if (!key) throw new Error(\"--key is required\");\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/runtime-profile/migration-ack\\`, { migration_key: key });\n    printResult(payload, \"Migration acknowledged.\");\n    return;\n  }\n  if (group === \"reminder\" && command === \"schedule\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/reminder\\`, { title: valueAfter(\"--title\"), fire_at: valueAfter(\"--at\"), recurrence: valueAfter(\"--every\") });\n    printResult(payload, \\`Reminder scheduled: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"reminder\" && command === \"list\") {\n    const payload = await request(\"GET\", \\`/internal/ai-employee/\\${aiEmployeeId}/reminders\\`);\n    const reminders = payload.reminders || [];\n    printResult(payload, reminders.length ? reminders.map((reminder) => \\`- \\${reminder.id} [\\${reminder.status}] \\${reminder.title} at \\${reminder.fire_at}\\`).join(\"\\\\n\") : \"No reminders.\");\n    return;\n  }\n  if (group === \"reminder\" && command === \"snooze\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/reminder/snooze\\`, { reminder_id: valueAfter(\"--id\"), fire_at: valueAfter(\"--at\") });\n    printResult(payload, \\`Reminder snoozed: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"reminder\" && command === \"update\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/reminder/update\\`, { reminder_id: valueAfter(\"--id\"), title: valueAfter(\"--title\"), body: valueAfter(\"--body\"), fire_at: valueAfter(\"--at\"), recurrence: valueAfter(\"--every\") });\n    printResult(payload, \\`Reminder updated: \\${payload.reminder?.id || \"unknown\"} at \\${payload.reminder?.fire_at || \"unknown\"}\\`);\n    return;\n  }\n  if (group === \"reminder\" && command === \"cancel\") {\n    const payload = await request(\"POST\", \\`/internal/ai-employee/\\${aiEmployeeId}/reminder/cancel\\`, { reminder_id: valueAfter(\"--id\") });\n    printResult(payload, \\`Reminder cancelled: \\${payload.reminder?.id || \"unknown\"}\\`);\n    return;\n  }\n  console.error(\"Unknown wm command\");\n  process.exit(2);\n}\n\nmain().catch((error) => {\n  console.error(error && error.message ? error.message : String(error));\n  process.exit(1);\n});\n`;\n}\n", "import { access } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { constants as fsConstants } from \"node:fs\";\n\nconst require = createRequire(__filename);\n\nexport async function resolveLarkCliBinary(): Promise<string> {\n  const configured = process.env.WM_LARK_CLI_BIN?.trim();\n  if (configured) return configured;\n\n  const bundled = await resolveBundledLarkCliBinary();\n  if (bundled) return bundled;\n\n  for (const entry of (process.env.PATH ?? \"\").split(path.delimiter)) {\n    if (!entry) continue;\n    const candidate = path.join(entry, process.platform === \"win32\" ? \"lark-cli.cmd\" : \"lark-cli\");\n    if (await canExecute(candidate)) return candidate;\n  }\n  return \"lark-cli\";\n}\n\nexport function resolveLarkCliPackageVersion(): string {\n  try {\n    const packageJsonPath = require.resolve(\"@larksuite/cli/package.json\");\n    const packageJson = require(packageJsonPath) as { version?: unknown };\n    if (typeof packageJson.version === \"string\" && packageJson.version.trim()) return packageJson.version;\n  } catch {\n    // Keep the installer usable in development environments without the package.\n  }\n  return \"latest\";\n}\n\nasync function resolveBundledLarkCliBinary(): Promise<string | undefined> {\n  try {\n    const packageJsonPath = require.resolve(\"@larksuite/cli/package.json\");\n    const packageDir = path.dirname(packageJsonPath);\n    const binaryName = process.platform === \"win32\" ? \"lark-cli.cmd\" : \"lark-cli\";\n    const candidates = [\n      path.join(packageDir, \"bin\", binaryName),\n      path.join(packageDir, \"node_modules\", \".bin\", binaryName),\n    ];\n    for (const candidate of candidates) {\n      if (await canExecute(candidate)) return candidate;\n    }\n  } catch {\n    // Fall back to PATH for development environments without the bundled CLI.\n  }\n  return undefined;\n}\n\nasync function canExecute(filePath: string): Promise<boolean> {\n  try {\n    await access(filePath, fsConstants.X_OK);\n    return true;\n  } catch {\n    return false;\n  }\n}\n", "import type { Dirent } from \"node:fs\";\nimport { lstat, mkdir, readdir, rm, symlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { RuntimeId } from \"@claude-console/shared\";\nimport { defaultGlobalSkillsRoot } from \"./global-store\";\nimport { ensureHermesExternalDir } from \"./hermes-config\";\n\n/**\n * For each runtime, the relative paths inside the AI employee workspace cwd where\n * the runtime auto-discovers SKILL.md directories. We materialize a \"skill\n * farm\" at each path: a real directory of symlinks merging the platform\n * global store, agent-specific skills, and any future sources.\n *\n * Hermes does NOT scan cwd \u2014 it reads config.yaml `external_dirs` \u2014 so it is\n * handled by hermes-config.ts instead.\n */\nconst RUNTIME_CWD_SKILL_DIRS: Record<RuntimeId, string[]> = {\n  claude: [\".claude/skills\"],\n  codex: [\".agents/skills\"],\n  kimi: [\".agents/skills\"],\n  antigravity: [\".gemini/skills\"],\n  cursor: [\".cursor/skills\"],\n  opencode: [\".opencode/skills\"],\n  hermes: [],\n};\n\nexport interface InjectOptions {\n  workspaceDir: string;\n  runtime: RuntimeId;\n  /**\n   * Source directories merged into each runtime cwd skill farm.\n   * Earlier entries shadow later ones on name collision.\n   * Default: [<workspaceDir>/.wm/skills, ~/.wm/skills] \u2014 agent-specific first, then global.\n   */\n  sources?: string[];\n  /** Override the hermes config.yaml path (test injection point). */\n  hermesConfigPath?: string;\n  /** Skill dir to register with hermes external_dirs. Default: ~/.wm/skills */\n  hermesSkillDir?: string;\n}\n\nfunction defaultSources(workspaceDir: string): string[] {\n  return [path.join(workspaceDir, \".wm\", \"skills\"), defaultGlobalSkillsRoot()];\n}\n\nasync function buildSkillFarm(farmDir: string, sources: string[]): Promise<void> {\n  await rm(farmDir, { recursive: true, force: true });\n  await mkdir(farmDir, { recursive: true });\n  const used = new Set<string>();\n  for (const source of sources) {\n    let entries: Dirent[];\n    try {\n      entries = (await readdir(source, { withFileTypes: true })) as Dirent[];\n    } catch {\n      continue;\n    }\n    for (const entry of entries) {\n      if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n      if (entry.name.startsWith(\".\")) continue;\n      if (used.has(entry.name)) continue;\n      const targetPath = path.join(source, entry.name);\n      try {\n        const info = await lstat(targetPath);\n        if (!info.isDirectory() && !info.isSymbolicLink()) continue;\n      } catch {\n        continue;\n      }\n      used.add(entry.name);\n      await symlink(targetPath, path.join(farmDir, entry.name), \"dir\");\n    }\n  }\n}\n\n/**\n * Materialize per-runtime skill farms in the AI employee workspace cwd so the\n * runtime's native progressive disclosure can discover platform skills\n * without modifying any user-owned config.\n *\n * Idempotent \u2014 re-running rebuilds the farm dirs cleanly.\n */\nexport async function injectAll(options: InjectOptions): Promise<void> {\n  const sources = options.sources ?? defaultSources(options.workspaceDir);\n  const relPaths = RUNTIME_CWD_SKILL_DIRS[options.runtime] ?? [];\n  for (const rel of relPaths) {\n    const farmDir = path.join(options.workspaceDir, rel);\n    await buildSkillFarm(farmDir, sources);\n  }\n  if (options.runtime === \"hermes\") {\n    await ensureHermesExternalDir({\n      skillDir: options.hermesSkillDir ?? defaultGlobalSkillsRoot(),\n      configPath: options.hermesConfigPath,\n    });\n  }\n}\n\nexport const __testing = { RUNTIME_CWD_SKILL_DIRS };\n", "import { mkdir, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { skillTemplatesForWorkspace } from \"./templates\";\n\nexport interface EnsureSeededOptions {\n  /** Override the global skill root. Default: ~/.wm/skills */\n  root?: string;\n}\n\nexport function defaultGlobalSkillsRoot(): string {\n  return path.join(os.homedir(), \".wm\", \"skills\");\n}\n\nasync function pathExists(target: string): Promise<boolean> {\n  try {\n    await stat(target);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Seed the global skill root (~/.wm/skills) with daemon-bundled SKILL.md files.\n * Idempotent \u2014 existing SKILL.md files are preserved so user edits survive across daemon restarts.\n */\nexport async function ensureSeeded(options: EnsureSeededOptions = {}): Promise<string> {\n  const root = options.root ?? defaultGlobalSkillsRoot();\n  await mkdir(root, { recursive: true });\n  for (const tpl of skillTemplatesForWorkspace()) {\n    const skillDir = path.join(root, tpl.name);\n    const skillFile = path.join(skillDir, \"SKILL.md\");\n    if (await pathExists(skillFile)) continue;\n    await mkdir(skillDir, { recursive: true });\n    await writeFile(skillFile, tpl.content, \"utf8\");\n  }\n  return root;\n}\n", "export interface WorkspaceSkillTemplate {\n  name: string;\n  content: string;\n}\n\nconst WM_PLATFORM_SKILL = `---\nname: wm-platform\ndescription: WM platform tools\nversion: 0.1.0\n---\n# wm-platform\n\nUse this skill whenever you need to interact with NiuMa platform state: channel messages, threads, DMs, tasks, attachments, profiles, reminders, server membership, or collaboration with another AI employee.\n\n## Core rules\n\n- Use \\`wm message send\\` for platform-visible replies.\n- Use the exact target from delivered messages when replying.\n- For channel requests that ask you to contact another AI employee, reply in the original message thread and @mention the target AI employee there.\n- Do not answer what another AI employee is doing by inspecting local processes or workspace files.\n- Use \\`wm message check\\` at natural breakpoints in long work.\n- Task commands are for explicit user-visible task-list items. Delivered channel, DM, and thread messages are already assigned work and do not need claiming.\n\n## Common commands\n\n- \\`wm auth whoami\\`\n- \\`wm message check\\`\n- \\`wm message read --target <target>\\`\n- \\`wm message send --target <target> --text <text>\\`\n- \\`wm server info\\`\n- \\`wm channel members --target <target>\\`\n- \\`wm task list --target <target>\\`\n- \\`wm task update --id <task-id> --status <status>\\`\n`;\n\nexport const WM_ROUTINE_SKILL = `---\nname: wm-routine\ndescription: How to build a proxy that lets this agent persistently watch external data\nversion: 1.0.0\n---\n\n# wm-routine\n\n## When to use this skill\n\nThe user wants you to keep watching some external source (mailbox, chat, RSS feed, issue tracker, anything) and surface relevant items into their inbox without them having to ask each time.\n\n## Why proxies exist\n\nYou are a long-running agent. The user does not expect to chat with you to fetch new data \u2014 they expect the data to arrive on its own.\n\nA \"proxy\" is a small program you author and the daemon runs on a schedule (or on inbound event). Each run produces zero or more inbox drafts the user reviews. The proxy is your hands and eyes outside this conversation.\n\nThe platform does not know what specific external services are. You do. The platform only defines the contract a proxy must satisfy. Everything else \u2014 how to authenticate, how to paginate, how to deduplicate, how to filter \u2014 is your business.\n\n## The contract\n\nA proxy is a directory at \\`.wm/proxies/<proxy-id>/\\` containing:\n\n- \\`proxy.json\\` (required) \u2014 configuration\n- \\`handler.ts\\` (required) \u2014 entry point\n- \\`README.md\\` (optional) \u2014 your notes for the user\n\n### proxy.json\n\n\\`\\`\\`json\n{\n  \"kind\": \"proxy_module\",\n  \"version\": 1,\n  \"name\": \"<short title for the user, 1-60 chars>\",\n  \"description\": \"<one-paragraph what it does, 1-500 chars>\",\n  \"trigger\": { \"type\": \"interval\", \"interval_seconds\": 180 }\n}\n\\`\\`\\`\n\n\\`kind\\` and \\`version\\` are required and must be exactly the values shown; do not change them.\n\n\\`trigger\\` is one of:\n\n- \\`{ \"type\": \"interval\", \"interval_seconds\": <30..86400> }\\` \u2014 daemon polls on this cadence\n- \\`{ \"type\": \"event\" }\\` \u2014 daemon exposes \\`POST /proxy/<proxy-id>/inbound\\`, passes the request to your handler verbatim. You verify signatures yourself if the source requires it.\n\n### handler.ts\n\n\\`\\`\\`typescript\nexport async function run(ctx: ProxyContext): Promise<void> {\n  // your logic\n}\n\\`\\`\\`\n\nOnly \\`run\\` is consumed. It must be an async function.\n\n### ctx\n\n\\`\\`\\`typescript\ninterface ProxyContext {\n  trigger: {\n    kind: \"interval\" | \"event\";\n    received_at: number;\n    headers?: Record<string, string>;\n    body?: unknown;\n  };\n  fetch(url: string, init?: RequestInit): Promise<Response>;\n  cursor: { get(key: string): unknown; set(key: string, value: unknown): void };\n  dedupe: { seen(key: string): boolean; mark(key: string): void };\n  inbox: {\n    createDraft(draft: {\n      title: string;\n      description: string;\n      dedupeKey?: string;\n      metadata?: Record<string, unknown>;\n    }): Promise<{ id: string }>;\n  };\n  log: {\n    info(msg: string, meta?: Record<string, unknown>): void;\n    warn(msg: string, meta?: Record<string, unknown>): void;\n    error(msg: string, meta?: Record<string, unknown>): void;\n  };\n}\n\\`\\`\\`\n\nThat is the entire surface. There is no other API. \\`ctx.fetch\\` has SSRF protection. \\`cursor\\` and \\`dedupe\\` persist across runs.\n\n## Platform limits (you cannot configure these)\n\n- one run at a time per proxy (overlapping triggers are skipped)\n- 30 second hard timeout per run; over that the run is killed\n- minimum interval 30 seconds\n- inbox drafts are the only outbound channel in v1\n\n## Workflow\n\n1. **Clarify** what the user wants watched. Trigger type? Cadence if interval? What counts as relevant?\n\n2. **Prepare** whatever the source needs (install CLI, OAuth, API token, signing secret \u2014 whatever). The platform does not provision anything for you. When prep involves a user-action link, forward the link verbatim and wait.\n\n3. **Probe and fixture** before claiming the source works. Run a read-only source probe and save a sanitized positive sample under \\`.wm/proxies/<proxy-id>/fixtures/positive.json\\`. If the source currently returns no sample, ask the user to create one test event and stop there; do not treat \"0 drafts\" as acceptance.\n\n4. **Author** the proxy at \\`.wm/proxies/<proxy-id>/\\`. Write \\`proxy.json\\`, \\`contract.json\\`, \\`handler.ts\\`, \\`fixtures/positive.json\\`, and a short \\`README.md\\` describing what the user will see in their inbox. \\`proxy.json\\` is runtime config only. \\`contract.json\\` is the business contract: source, watched event classes, output \\`inbox_draft\\`, delivery policy \\`draft_only\\`, and acceptance such as \\`min_drafts_from_fixture\\`.\n\n5. **Verify** by running \\`wm proxy verify --dir .wm/proxies/<proxy-id> --json\\`. The verifier checks structure, config schema, contract, handler shape, empty dry-run, and positive fixture output. Fix every error it reports. Iterate until \\`ok: true\\` and positive fixture creates at least one inbox draft.\n\n6. **Create** by running \\`wm proxy create --dir .wm/proxies/<proxy-id> --json\\`. Create re-runs verify and refuses if contract or positive fixture verification fails.\n\n## Authentication and credentials\n\nMost external sources need some form of credential before you can read from them. Treat this as part of the proxy's job, not the platform's.\n\nBefore writing handler code, walk through these in order:\n\n1. **Tool availability** \u2014 is the CLI / library / API client even installed on this machine? If not, install it (npm/pip/curl/whatever the source recommends). Confirm with a read-only probe (\\`which X\\`, \\`X --version\\`, \\`X status\\`).\n\n2. **Configuration** \u2014 is the tool configured for this user? Many tools need a one-time \\`init\\` / app credential setup before login is possible.\n\n3. **Authorization** \u2014 does the tool currently hold a valid token for the user? If not, run the source's recommended login flow. If the flow prints a URL or QR code, **forward it to the user verbatim** \u2014 never paraphrase, summarize, or analyze the link. Wait for the user to confirm completion.\n\n4. **Scope** \u2014 is the token scoped to what this proxy needs (read this mailbox, watch this channel, etc.)? A token that authenticates but cannot see the target is a different failure mode than no token.\n\n5. **Verification** \u2014 re-run a read-only probe (\\`X status\\`, \\`X whoami\\`, list one item) before declaring prep done. Do not assume.\n\nWhen a step fails, name which of the five layers failed. \"Authentication missing\" is rarely the right diagnosis \u2014 most of the time it is one of: tool missing / installed but unconfigured / configured but unauthorized / authorized but scope insufficient.\n\nNever write tokens, passwords, app secrets, or session cookies into \\`handler.ts\\` or \\`proxy.json\\`. If a credential needs to be readable from handler code, store it in the source's own keychain/credential store and read it via the source's CLI/SDK at runtime.\n\n## wm wrapper commands relevant to proxies\n\n\\`\\`\\`shell\nwm proxy verify --dir <module-dir> --json\nwm proxy probe --dir <module-dir> --json\nwm proxy create --dir <module-dir> --json\nwm routine list --json\n\\`\\`\\`\n\nThese are the only proxy-related commands. Do not probe with \\`--help\\`; the wrapper does not implement per-subcommand help.\n`;\n\nexport const REFERENCE_INDEX_BUILDER_SKILL = `---\nname: reference-index-builder\ndescription: Build and maintain the AI employee reference index from work-rule links, local paths, slow answers, and wrong-answer retrospectives.\n---\n# reference-index-builder\n\nUse this skill when:\n\n- The current employee profile or work rules mention Feishu/Lark docs, Wiki nodes, Drive folders, web URLs, or local paths.\n- A user question depends on product, policy, compliance, or document-backed facts from those references.\n- A retrospective finds an answer was slow, wrong, or routed through the wrong source.\n\n## Fixed workspace layout\n\nThe daemon owns the directory and creates the initial files:\n\n\\`\\`\\`text\n.wm/knowledge/\n  current.json\n  generations/<generation-id>/manifest.json\n  generations/<generation-id>/index.md\n  generations/<generation-id>/routing.md\n  generations/<generation-id>/source-map.json\n  generations/<generation-id>/facts/quick-reference.md\n  generations/<generation-id>/facts/reference-facts.md\n  facts/candidate-facts.md\n  retros/slow-queries.md\n  retros/mistakes.md\n\\`\\`\\`\n\n\\`current.json\\` is the only publication pointer. Never choose a generation directory directly; use one implemented \\`wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md\\` call per answer so all files come from one validated generation. Do not rename these files. Do not store secrets, App Secrets, tokens, cookies, private links requiring personal access, or raw CLI logs here.\n\n## Answer-time workflow\n\n1. For simple greetings or non-reference questions, answer directly.\n2. For a question that likely depends on rule-linked references, run \\`wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md\\` once.\n3. Use the quick reference first, then the index, routes, and relevant full facts from that same returned bundle.\n4. Use \\`wm reference read --file source-map.json\\` only when you separately need structured source metadata.\n5. Follow the route for the most relevant source. For Feishu customer-service app resources, read rule-linked reference documents with user identity after authorization; keep bot identity for customer-message send/reply operations.\n6. If the indexed sources do not cover the answer, say the referenced material did not cover it before using any allowed fallback search.\n7. For difference, comparison, identity, policy, model, or person questions, verify the exact requested names against the quick reference, the \"Known Exact Names\" section, or the original referenced material before answering. If one requested name is absent, say the configured material has no explicit entry for that name; do not compare it with the closest similar name. If a structured row maps aliases across regions, versions, departments, or document titles, include those explicit mapped names before explaining differences.\n8. Do not expose source IDs, CLI commands, internal file paths, or retrieval logs in the user-facing answer unless the user explicitly asks for diagnostics.\n\n## Retro workflow\n\nDuring daily or weekly review, inspect slow answers, failed retrievals, user corrections, and wrong-answer feedback.\n\nWrite candidate improvements, not final facts:\n\n- Slow retrieval or repeated broad search: append a concise case to \\`.wm/knowledge/retros/slow-queries.md\\`.\n- Wrong answer or user correction: append a concise case to \\`.wm/knowledge/retros/mistakes.md\\`.\n- Candidate facts extracted from references: append them to \\`.wm/knowledge/facts/candidate-facts.md\\` with the source and confidence.\n\nPromote only stable, reusable behavior rules into \\`notes/lessons.md\\` or \\`MEMORY.md\\`. Keep incident details in the knowledge retro files.\n\n## Case format\n\n\\`\\`\\`markdown\n### YYYY-MM-DD - <short title>\n\n- Trigger: <user question or failure pattern>\n- Source route: <source id or path, if known>\n- What happened: <slow/wrong/missing coverage>\n- Proposed index change: <routing, candidate fact, or source note>\n- Promote to memory: yes/no, with reason\n\\`\\`\\`\n\n## Boundaries\n\n- This skill maintains retrieval efficiency and learning artifacts; it does not approve new facts by itself.\n- Do not broaden Feishu Drive search beyond the employee tool policy.\n- Do not overwrite \\`index.md\\`, \\`routing.md\\`, \\`source-map.json\\`, or \\`manifest.json\\` unless the daemon or an explicit user request asks for regeneration.\n`;\n\nexport function skillTemplatesForWorkspace(): WorkspaceSkillTemplate[] {\n  return [\n    { name: \"wm-platform\", content: WM_PLATFORM_SKILL },\n    { name: \"wm-routine\", content: WM_ROUTINE_SKILL },\n    { name: \"reference-index-builder\", content: REFERENCE_INDEX_BUILDER_SKILL },\n  ];\n}\n", "import { copyFile, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { parseDocument, isSeq, YAMLSeq, Document } from \"yaml\";\nimport { defaultGlobalSkillsRoot } from \"./global-store\";\n\nexport interface EnsureHermesExternalDirOptions {\n  /** Path to hermes config.yaml. Default: ~/.hermes/config.yaml */\n  configPath?: string;\n  /** Skill dir to inject into skills.external_dirs. Default: ~/.wm/skills */\n  skillDir?: string;\n}\n\nexport function defaultHermesConfigPath(): string {\n  return path.join(os.homedir(), \".hermes\", \"config.yaml\");\n}\n\nfunction backupPath(configPath: string): string {\n  return `${configPath}.wm-backup`;\n}\n\nasync function pathExists(target: string): Promise<boolean> {\n  try {\n    await stat(target);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Ensure ~/.hermes/config.yaml has `skills.external_dirs` containing the\n * given dir (default ~/.wm/skills). The first time we modify the file we\n * write a .wm-backup sibling; subsequent calls never overwrite the original\n * backup, so the very first user state is always recoverable.\n *\n * Idempotent \u2014 re-running does not duplicate entries or re-backup.\n */\nexport async function ensureHermesExternalDir(\n  options: EnsureHermesExternalDirOptions = {}\n): Promise<{ configPath: string; modified: boolean; backupCreated: boolean }> {\n  const configPath = options.configPath ?? defaultHermesConfigPath();\n  const skillDir = options.skillDir ?? defaultGlobalSkillsRoot();\n\n  await mkdir(path.dirname(configPath), { recursive: true });\n  const text = (await pathExists(configPath)) ? await readFile(configPath, \"utf8\") : \"\";\n  const doc = text.trim().length > 0 ? parseDocument(text) : new Document({});\n\n  let skills = doc.get(\"skills\") as unknown;\n  if (skills == null) {\n    doc.set(\"skills\", { external_dirs: [skillDir] });\n    return await writeWithBackup(configPath, text, doc);\n  }\n\n  // skills exists \u2014 find or create external_dirs sequence\n  const skillsNode = doc.getIn([\"skills\"]) as unknown;\n  let extDirs = doc.getIn([\"skills\", \"external_dirs\"]) as unknown;\n  if (extDirs == null) {\n    doc.setIn([\"skills\", \"external_dirs\"], [skillDir]);\n    return await writeWithBackup(configPath, text, doc);\n  }\n  if (!isSeq(extDirs)) {\n    // Malformed (e.g., scalar). Replace with a fresh seq containing both.\n    doc.setIn([\"skills\", \"external_dirs\"], [skillDir]);\n    return await writeWithBackup(configPath, text, doc);\n  }\n\n  const seq = extDirs as YAMLSeq;\n  const already = seq.items.some((item) => {\n    const v = (item as { value?: unknown }).value ?? item;\n    return typeof v === \"string\" && v === skillDir;\n  });\n  if (already) {\n    return { configPath, modified: false, backupCreated: false };\n  }\n  seq.add(skillDir);\n  return await writeWithBackup(configPath, text, doc);\n}\n\nasync function writeWithBackup(\n  configPath: string,\n  originalText: string,\n  doc: Document\n): Promise<{ configPath: string; modified: true; backupCreated: boolean }> {\n  let backupCreated = false;\n  if (originalText.length > 0 && !(await pathExists(backupPath(configPath)))) {\n    await copyFile(configPath, backupPath(configPath));\n    backupCreated = true;\n  }\n  await writeFile(configPath, String(doc), \"utf8\");\n  return { configPath, modified: true, backupCreated };\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { constants as fsConstants } from \"node:fs\";\nimport { chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AIEmployeeWorkContext } from \"@claude-console/shared\";\n\nexport interface ReferenceIndexSource {\n  id: string;\n  key?: string;\n  type: \"feishu_drive_folder\" | \"feishu_doc\" | \"feishu_wiki\" | \"web_url\" | \"local_path\";\n  title: string;\n  url?: string;\n  path?: string;\n  token?: string;\n  hint?: string;\n  remote_revision?: string;\n}\n\nexport interface ReferenceIndexSeedInput {\n  aiEmployeeId: string;\n  aiEmployeeName: string;\n  aiEmployeeWorkContext?: AIEmployeeWorkContext;\n  now?: Date;\n}\n\nexport interface ReferenceIndexCommandResult {\n  code: number;\n  stdout: string;\n  stderr: string;\n}\n\nexport interface MaterializeReferenceIndexInput {\n  sources?: ReferenceIndexSource[];\n  now?: Date;\n  mode?: \"if-stale\" | \"refresh\" | \"force\";\n  maxFolderItems?: number;\n  maxDocuments?: number;\n  maxDocumentChars?: number;\n  maxLinkedDocuments?: number;\n  maxLinkedDocumentChars?: number;\n  maxFactsChars?: number;\n  maxFolderConcurrency?: number;\n  maxDocumentConcurrency?: number;\n  publishWrite?: (filePath: string, content: string) => Promise<void>;\n  publishRename?: (fromPath: string, toPath: string) => Promise<void>;\n  publishRemove?: (targetPath: string) => Promise<void>;\n  integrityHooks?: ReferenceIndexIntegrityHooks;\n  runLarkCli(args: string[], label: string): Promise<ReferenceIndexCommandResult>;\n}\n\nexport interface ReferenceIndexIntegrityHooks {\n  afterReadParentsValidated?: (input: { rootDir: string; relativePath: string }) => Promise<void>;\n  afterStagingParentsValidated?: (input: { stagingDir: string; relativePath: string }) => Promise<void>;\n}\n\nexport interface MaterializeReferenceIndexResult {\n  sourceCount: number;\n  indexedDocumentCount: number;\n  failedSourceCount: number;\n  failedDocumentCount: number;\n  skippedSourceCount: number;\n  factsPath: string;\n  errorsPath: string;\n  updatedAt: string;\n  warnings: string[];\n  preservedPreviousIndex: boolean;\n  status: ReferenceIndexContentStatus;\n  sourceDigest: string;\n  generatorVersion: number;\n  staleDocumentCount: number;\n  truncatedSourceCount: number;\n}\n\nexport type ReferenceIndexContentStatus = \"fresh\" | \"stale\" | \"degraded\";\n\ninterface ReferenceIndexContentState {\n  status: ReferenceIndexContentStatus;\n  source_digest: string;\n  generator_version: number;\n  updated_at: string;\n  indexed_document_count: number;\n  stale_document_count: number;\n  truncated_source_count: number;\n  skipped_source_count?: number;\n  output_hashes: Record<string, string>;\n}\n\ninterface ReferenceIndexManifest {\n  version?: number;\n  generated_by?: string;\n  ai_employee_id?: string;\n  ai_employee_name?: string;\n  updated_at?: string;\n  source_digest?: string;\n  source_count?: number;\n  sources?: ReferenceIndexSource[];\n  checked_at?: string;\n  next_check_at?: string;\n  remote_freshness?: {\n    status: \"fresh\" | \"degraded\";\n    error?: string;\n  };\n  content_state?: ReferenceIndexContentState;\n  content_index?: {\n    updated_at: string;\n    indexed_document_count: number;\n    failed_source_count: number;\n    failed_document_count: number;\n    quick_reference_path?: string;\n    facts_path: string;\n    errors_path: string;\n  };\n  [key: string]: unknown;\n}\n\ninterface ReferenceIndexPointer {\n  version: 1;\n  generation_id: string;\n  manifest_sha256: string;\n  published_at: string;\n}\n\ninterface ReferenceIndexPublicationIO {\n  write?: (filePath: string, content: string) => Promise<void>;\n  rename?: (fromPath: string, toPath: string) => Promise<void>;\n  remove?: (targetPath: string) => Promise<void>;\n}\n\ninterface DocumentReference {\n  sourceId: string;\n  sourceKey?: string;\n  sourceType?: ReferenceIndexSource[\"type\"];\n  title: string;\n  doc: string;\n  url?: string;\n  token?: string;\n  type?: string;\n  depth?: number;\n  parentTitle?: string;\n  metadataFingerprint?: string;\n}\n\ninterface IndexedDocument {\n  sourceId: string;\n  sourceKey?: string;\n  sourceType?: ReferenceIndexSource[\"type\"];\n  title: string;\n  doc: string;\n  content: string;\n  kind: IndexedDocumentKind;\n  depth?: number;\n  parentTitle?: string;\n}\n\ninterface CachedReferenceDocument {\n  version: 1;\n  document_key: string;\n  source_id: string;\n  source_key: string;\n  source_type?: ReferenceIndexSource[\"type\"];\n  title: string;\n  doc: string;\n  kind: IndexedDocumentKind;\n  depth: number;\n  parent_title?: string;\n  metadata_fingerprint?: string;\n  content: string;\n  content_sha256: string;\n  full_content_sha256?: string;\n  content_char_limit?: number;\n  content_truncated?: boolean;\n  fetched_at: string;\n  last_success_at: string;\n  status: \"fresh\" | \"stale\" | \"failed\";\n  error?: string;\n}\n\ninterface CachedReferenceDocumentInventoryEntry {\n  filePath: string;\n  cached: CachedReferenceDocument;\n}\n\ninterface StaleDocumentRoute {\n  sourceId: string;\n  sourceKey?: string;\n  title: string;\n  doc: string;\n  kind: IndexedDocumentKind;\n  depth: number;\n  parentTitle?: string;\n  contentSha256: string;\n  error: string;\n}\n\ninterface ReferenceSourceCoverage {\n  source_id: string;\n  source_key: string;\n  listed_item_count: number;\n  truncated: boolean;\n  skipped: boolean;\n}\n\ninterface FolderPage {\n  items: Record<string, unknown>[];\n  nextPageToken?: string;\n  hasMore: boolean;\n}\n\ntype RemoteFreshnessCheck = {\n  kind: \"unchanged\" | \"changed\";\n  sources: ReferenceIndexSource[];\n  preloadedCommandResults: Map<string, ReferenceIndexCommandResult>;\n} | {\n  kind: \"error\";\n  error: string;\n};\n\ntype IndexedDocumentKind = \"reference\" | \"feedback\";\n\ninterface ShortcutFactGroup {\n  title: string;\n  facts: string[];\n}\n\nconst GENERATOR_VERSION = 2;\nconst GENERATED_BY = \"wm-daemon-reference-index-v1\";\nconst MATERIALIZED_SECTION_START = \"<!-- wm-reference-index:materialized:start -->\";\nconst MATERIALIZED_SECTION_END = \"<!-- wm-reference-index:materialized:end -->\";\nconst PUBLISHED_OUTPUT_PATHS = [\n  \"index.md\",\n  \"routing.md\",\n  \"source-map.json\",\n  \"facts/quick-reference.md\",\n  \"facts/reference-facts.md\",\n  \"index-errors.md\",\n] as const;\nconst PENDING_REFRESH_FILE = \".reference-refresh-pending.json\";\nconst REMOTE_FRESHNESS_TTL_MS = 6 * 60 * 60 * 1000;\nconst REMOTE_FAILURE_RETRY_MS = 15 * 60 * 1000;\nconst REMOTE_FRESHNESS_JITTER_RATIO = 0.2;\nconst REFERENCE_GENERATIONS_DIR = \"generations\";\nconst REFERENCE_CURRENT_POINTER = \"current.json\";\nconst REFERENCE_CURRENT_POINTER_TEMP = \"current.json.tmp\";\nconst REFERENCE_GENERATION_RETENTION = 5;\nconst REFERENCE_MANIFEST_MAX_BYTES = 2 * 1024 * 1024;\nconst REFERENCE_OUTPUT_MAX_BYTES = 4 * 1024 * 1024;\nconst referenceIndexPublisherChains = new Map<string, Promise<void>>();\nconst referenceIndexPublisherLockContext = new AsyncLocalStorage<{ lockDir: string; token: string }>();\nconst referenceIndexIntegrityHookContext = new AsyncLocalStorage<ReferenceIndexIntegrityHooks>();\nconst REFERENCE_PUBLISH_LOCK_ROOT = \".wm-reference-publisher-locks\";\nconst REFERENCE_PUBLISH_LOCK_WAIT_MS = 10_000;\nconst REFERENCE_PUBLISH_LOCK_STALE_MS = 30_000;\n\nexport async function ensureReferenceIndex(aiEmployeeDir: string, input: ReferenceIndexSeedInput): Promise<ReferenceIndexSource[]> {\n  return withReferenceIndexPublisherLock(aiEmployeeDir, () => ensureReferenceIndexUnlocked(aiEmployeeDir, input));\n}\n\nasync function ensureReferenceIndexUnlocked(aiEmployeeDir: string, input: ReferenceIndexSeedInput): Promise<ReferenceIndexSource[]> {\n  const sourceText = [\n    input.aiEmployeeWorkContext?.role,\n    input.aiEmployeeWorkContext?.instructions,\n    input.aiEmployeeWorkContext?.workRules,\n  ].filter(Boolean).join(\"\\n\\n\");\n  const sources = extractReferenceSources(sourceText);\n  const knowledgeDir = path.join(aiEmployeeDir, \".wm\", \"knowledge\");\n\n  await mkdir(path.join(knowledgeDir, \"facts\"), { recursive: true });\n  await mkdir(path.join(knowledgeDir, \"retros\"), { recursive: true });\n  await writeIfMissing(path.join(knowledgeDir, \"facts\", \"candidate-facts.md\"), buildCandidateFactsTemplate());\n  await writeIfMissing(path.join(knowledgeDir, \"retros\", \"slow-queries.md\"), buildSlowQueriesTemplate());\n  await writeIfMissing(path.join(knowledgeDir, \"retros\", \"mistakes.md\"), buildMistakesTemplate());\n\n  await migrateLegacyReferenceGenerationIfNeeded(knowledgeDir);\n  const existingManifest = await readExistingManifest(knowledgeDir);\n  if (sources.length === 0 && !existingManifest && !await hasPublishedReferenceArtifacts(knowledgeDir)) return [];\n\n  const updatedAt = (input.now ?? new Date()).toISOString();\n  const sourceDigest = referenceSourceDigest(sources);\n  const manifest: ReferenceIndexManifest = {\n    version: 1,\n    generated_by: GENERATED_BY,\n    ai_employee_id: input.aiEmployeeId,\n    ai_employee_name: input.aiEmployeeName,\n    updated_at: updatedAt,\n    source_digest: sourceDigest,\n    source_count: sources.length,\n    sources,\n    usage: {\n      first_stop: [\"wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md\"],\n      durable_memory: [\"MEMORY.md\", \"notes/lessons.md\"],\n      retro_outputs: [\".wm/knowledge/retros/slow-queries.md\", \".wm/knowledge/retros/mistakes.md\"],\n    },\n  };\n\n  if (\n    existingManifest?.source_digest !== sourceDigest\n    || existingManifest?.generated_by !== GENERATED_BY\n    || existingManifest?.content_state?.generator_version !== GENERATOR_VERSION\n  ) {\n    const staleReason = \"Reference material sources changed. Materialized facts are stale and not trusted until refresh completes.\";\n    await publishReferenceGeneration(knowledgeDir, {\n      \"index.md\": buildIndexMarkdown(input, sources, updatedAt),\n      \"routing.md\": buildRoutingMarkdown(sources, updatedAt),\n      \"source-map.json\": `${JSON.stringify({ version: 1, updated_at: updatedAt, sources, documents: [] }, null, 2)}\\n`,\n      \"facts/quick-reference.md\": buildStaleQuickReferenceMarkdown(updatedAt, staleReason),\n      \"facts/reference-facts.md\": buildStaleReferenceFactsMarkdown(updatedAt, staleReason),\n      \"index-errors.md\": buildReferenceErrorsMarkdown([staleReason], updatedAt),\n    }, {\n      ...manifest,\n      content_state: {\n        status: \"stale\",\n        source_digest: sourceDigest,\n        generator_version: GENERATOR_VERSION,\n        updated_at: updatedAt,\n        indexed_document_count: 0,\n        stale_document_count: existingManifest?.content_state?.indexed_document_count\n          ?? existingManifest?.content_index?.indexed_document_count\n          ?? 0,\n        truncated_source_count: 0,\n        output_hashes: {},\n      },\n    });\n  }\n\n  if (sources.length === 0) {\n    try {\n      const documentCacheInventory = await readDocumentCacheInventory(path.join(knowledgeDir, \"cache\", \"documents\"));\n      await cleanupOrphanedDocumentCache(documentCacheInventory, {\n        activeSourceKeys: new Set(),\n        currentDocumentKeys: new Set(),\n        fullyEnumeratedSourceKeys: new Set(),\n      });\n    } catch {\n      // The safe empty generation is already published; derived cache cleanup is retryable housekeeping.\n    }\n  }\n\n  return sources;\n}\n\nasync function hasPublishedReferenceArtifacts(knowledgeDir: string): Promise<boolean> {\n  if (await resolveCurrentReferenceGeneration(knowledgeDir)) return true;\n  if (await pathExists(path.join(knowledgeDir, REFERENCE_CURRENT_POINTER))) return true;\n  for (const relativePath of PUBLISHED_OUTPUT_PATHS) {\n    if (await readFileIfExists(path.join(knowledgeDir, relativePath)) !== undefined) return true;\n  }\n  return false;\n}\n\nexport async function materializeReferenceIndex(aiEmployeeDir: string, input: MaterializeReferenceIndexInput): Promise<MaterializeReferenceIndexResult> {\n  return withReferenceIndexPublisherLock(aiEmployeeDir, () => referenceIndexIntegrityHookContext.run(\n    input.integrityHooks ?? {},\n    () => materializeReferenceIndexUnlocked(aiEmployeeDir, input),\n  ));\n}\n\nasync function materializeReferenceIndexUnlocked(aiEmployeeDir: string, input: MaterializeReferenceIndexInput): Promise<MaterializeReferenceIndexResult> {\n  const knowledgeDir = path.join(aiEmployeeDir, \".wm\", \"knowledge\");\n  const publicationIO = publicationIOFromInput(input);\n  await migrateLegacyReferenceGenerationIfNeeded(knowledgeDir, publicationIO);\n  const manifest = await readManifest(knowledgeDir);\n  const sources = (input.sources ?? manifest?.sources ?? []).map((source) => ({ ...source }));\n  const now = input.now ?? new Date();\n  const updatedAt = now.toISOString();\n  const sourceDigest = referenceSourceDigest(sources);\n  const maxFolderItems = input.maxFolderItems ?? 40;\n  const maxDocuments = input.maxDocuments ?? 12;\n  const maxDocumentChars = input.maxDocumentChars ?? 5000;\n  const maxLinkedDocuments = input.maxLinkedDocuments ?? 6;\n  const maxLinkedDocumentChars = input.maxLinkedDocumentChars ?? 3000;\n  const maxFactsChars = input.maxFactsChars ?? 60000;\n  const maxFolderConcurrency = Math.max(1, input.maxFolderConcurrency ?? 2);\n  const maxDocumentConcurrency = Math.max(1, input.maxDocumentConcurrency ?? 3);\n  const factsDir = path.join(knowledgeDir, \"facts\");\n  const sourcesDir = path.join(knowledgeDir, \"sources\");\n  const documentCacheDir = path.join(knowledgeDir, \"cache\", \"documents\");\n  const factsPath = \"facts/reference-facts.md\";\n  const errorsPath = \"index-errors.md\";\n  const pendingRefreshPath = path.join(knowledgeDir, PENDING_REFRESH_FILE);\n\n  await mkdir(factsDir, { recursive: true });\n  await mkdir(sourcesDir, { recursive: true });\n  await mkdir(documentCacheDir, { recursive: true });\n  await cleanupReferenceIndexTempFiles(knowledgeDir);\n\n  const refreshPending = await readFileIfExists(pendingRefreshPath) !== undefined;\n  let remoteFreshnessTriggered = false;\n  const publishedGenerationIsFresh = !refreshPending\n    && await isFreshPublishedGeneration(knowledgeDir, manifest, sourceDigest);\n  if (input.mode === \"if-stale\" && publishedGenerationIsFresh) {\n    const nextCheckAt = Date.parse(manifest?.next_check_at ?? \"\");\n    const hasRemoteSources = sources.some(isRemotelyCheckableSource);\n    if (!hasRemoteSources || (Number.isFinite(nextCheckAt) && now.getTime() < nextCheckAt)) {\n      return cachedMaterializationResult({ sources, manifest, factsPath, errorsPath, updatedAt, sourceDigest });\n    }\n\n    const freshness = await checkRemoteFreshness({\n      sources,\n      manifest,\n      documentCacheDir,\n      maxFolderItems,\n      maxFolderConcurrency,\n      maxDocuments,\n      maxDocumentChars,\n      maxDocumentConcurrency,\n      runLarkCli: input.runLarkCli,\n    });\n    if (freshness.kind === \"error\") {\n      const preservedSources = preserveRemoteRevisions(sources, manifest?.sources);\n      const nextManifest = withRemoteFreshness(manifest ?? {}, preservedSources, now, sourceDigest, {\n        status: \"degraded\",\n        error: freshness.error,\n      });\n      await publishManifestOnlyGeneration(knowledgeDir, nextManifest, publicationIO);\n      return {\n        ...cachedMaterializationResult({\n          sources: preservedSources,\n          manifest: nextManifest,\n          factsPath,\n          errorsPath,\n          updatedAt,\n          sourceDigest,\n        }),\n        warnings: [freshness.error],\n        preservedPreviousIndex: true,\n        status: \"degraded\",\n      };\n    }\n    for (const source of freshness.sources) {\n      const current = sources.find((candidate) => referenceSourceKey(candidate) === referenceSourceKey(source));\n      if (current) current.remote_revision = source.remote_revision;\n    }\n    if (freshness.kind === \"unchanged\") {\n      const nextManifest = withRemoteFreshness(manifest ?? {}, sources, now, sourceDigest, { status: \"fresh\" });\n      await publishManifestOnlyGeneration(knowledgeDir, nextManifest, publicationIO);\n      return cachedMaterializationResult({\n        sources,\n        manifest: nextManifest,\n        factsPath,\n        errorsPath,\n        updatedAt,\n        sourceDigest,\n      });\n    }\n    remoteFreshnessTriggered = true;\n    input = { ...input, runLarkCli: usePreloadedCommandResults(input.runLarkCli, freshness.preloadedCommandResults) };\n  }\n\n  function cachedMaterializationResult(cache: {\n    sources: ReferenceIndexSource[];\n    manifest: ReferenceIndexManifest | null;\n    factsPath: string;\n    errorsPath: string;\n    updatedAt: string;\n    sourceDigest: string;\n  }): MaterializeReferenceIndexResult {\n    return {\n      sourceCount: cache.sources.length,\n      indexedDocumentCount: cache.manifest?.content_state?.indexed_document_count ?? 0,\n      failedSourceCount: cache.manifest?.content_index?.failed_source_count ?? 0,\n      failedDocumentCount: cache.manifest?.content_index?.failed_document_count ?? 0,\n      skippedSourceCount: cache.manifest?.content_state?.skipped_source_count\n        ?? cache.sources.filter((source) => source.type === \"web_url\" || source.type === \"local_path\").length,\n      factsPath: cache.factsPath,\n      errorsPath: cache.errorsPath,\n      updatedAt: cache.manifest?.content_state?.updated_at ?? cache.updatedAt,\n      warnings: cache.manifest?.remote_freshness?.error ? [cache.manifest.remote_freshness.error] : [],\n      preservedPreviousIndex: cache.manifest?.remote_freshness?.status === \"degraded\",\n      status: cache.manifest?.remote_freshness?.status === \"degraded\" ? \"degraded\" : \"fresh\",\n      sourceDigest: cache.sourceDigest,\n      generatorVersion: GENERATOR_VERSION,\n      staleDocumentCount: 0,\n      truncatedSourceCount: cache.manifest?.content_state?.truncated_source_count ?? 0,\n    };\n  }\n\n  await writeFileAtomically(pendingRefreshPath, `${JSON.stringify({\n    version: 1,\n    source_digest: sourceDigest,\n    started_at: updatedAt,\n  }, null, 2)}\\n`);\n\n  const documentCacheInventory = await readDocumentCacheInventory(documentCacheDir);\n\n  const warnings: string[] = [];\n  const documentRefs: DocumentReference[] = [];\n  const staleDocuments: StaleDocumentRoute[] = [];\n  const sourceCoverage: ReferenceSourceCoverage[] = [];\n  let skippedSourceCount = 0;\n  let failedSourceCount = 0;\n  const fullyEnumeratedSourceKeys = new Set<string>();\n\n  const folderSources = sources.filter((source) => source.type === \"feishu_drive_folder\");\n  const folderResults = new Array<Awaited<ReturnType<typeof listFolderDocumentReferences>> | undefined>(folderSources.length);\n  await runWithConcurrency(folderSources.map((source, index) => ({ source, index })), maxFolderConcurrency, async ({ source, index }) => {\n    folderResults[index] = await listFolderDocumentReferences(source, maxFolderItems, input.runLarkCli);\n  });\n  for (let index = 0; index < folderSources.length; index += 1) {\n    const source = folderSources[index];\n    const result = folderResults[index];\n    if (!source || !result) continue;\n    sourceCoverage.push(result.coverage);\n    if (result.error) {\n      failedSourceCount += 1;\n      warnings.push(`${source.id}: list folder failed: ${result.error}`);\n      staleDocuments.push(...await markCachedSourceDocumentsStale(documentCacheInventory, source, result.error));\n      continue;\n    }\n    source.remote_revision = folderRemoteRevision(result.references);\n    if (!result.coverage.truncated) fullyEnumeratedSourceKeys.add(referenceSourceKey(source));\n    await writeFileAtomically(path.join(sourcesDir, `${source.id}.json`), `${JSON.stringify(result.pages, null, 2)}\\n`);\n    documentRefs.push(...result.references);\n  }\n\n  for (const source of sources) {\n    if (source.type === \"feishu_drive_folder\") continue;\n    if (source.type === \"feishu_doc\" || source.type === \"feishu_wiki\") {\n      documentRefs.push({\n        sourceId: source.id,\n        sourceKey: referenceSourceKey(source),\n        sourceType: source.type,\n        title: source.title,\n        doc: source.url ?? source.token ?? source.title,\n        url: source.url,\n        token: source.token,\n        type: source.type,\n        depth: 0,\n        metadataFingerprint: source.remote_revision ? remoteRevisionFingerprint(source.remote_revision) : undefined,\n      });\n      sourceCoverage.push({\n        source_id: source.id,\n        source_key: referenceSourceKey(source),\n        listed_item_count: 1,\n        truncated: false,\n        skipped: false,\n      });\n      fullyEnumeratedSourceKeys.add(referenceSourceKey(source));\n      continue;\n    }\n\n    skippedSourceCount += 1;\n    sourceCoverage.push({\n      source_id: source.id,\n      source_key: referenceSourceKey(source),\n      listed_item_count: 0,\n      truncated: false,\n      skipped: true,\n    });\n  }\n\n  const currentDocumentKeys = new Set(documentRefs.map(documentReferenceKey));\n  const uniqueRefs = dedupeDocumentReferences(documentRefs).slice(0, maxDocuments);\n  const indexedDocuments: IndexedDocument[] = [];\n  let failedDocumentCount = 0;\n\n  const fetchDocumentReferences = async (refs: DocumentReference[], charLimit: number): Promise<IndexedDocument[]> => {\n    const results = new Array<IndexedDocument | null>(refs.length).fill(null);\n    await runWithConcurrency(refs.map((docRef, index) => ({ docRef, index })), maxDocumentConcurrency, async ({ docRef, index }) => {\n      const cached = await readCachedDocument(documentCacheDir, documentReferenceKey(docRef));\n      if (\n        input.mode !== \"force\"\n        && docRef.metadataFingerprint\n        && cached?.status === \"fresh\"\n        && cached.metadata_fingerprint === docRef.metadataFingerprint\n        && cachedDocumentCoversLimit(cached, charLimit)\n      ) {\n        results[index] = indexedDocumentFromCache(cached, docRef, charLimit);\n        return;\n      }\n      const fetchResult = await input.runLarkCli(documentFetchArgs(docRef.doc), `fetch ${docRef.title}`);\n      if (fetchResult.code !== 0) {\n        failedDocumentCount += 1;\n        const error = compactCommandError(fetchResult);\n        warnings.push(`${docRef.sourceId}: fetch ${docRef.title} failed: ${error}`);\n        const staleRoute = await markCachedDocumentStale(documentCacheDir, docRef, error);\n        if (staleRoute) staleDocuments.push(staleRoute);\n        return;\n      }\n      const fullContent = extractFetchedDocumentContent(fetchResult.stdout);\n      const content = fullContent.slice(0, charLimit).trim();\n      if (!content) {\n        failedDocumentCount += 1;\n        const error = \"returned empty content\";\n        warnings.push(`${docRef.sourceId}: fetch ${docRef.title} ${error}`);\n        const staleRoute = await markCachedDocumentStale(documentCacheDir, docRef, error);\n        if (staleRoute) staleDocuments.push(staleRoute);\n        return;\n      }\n      const indexedDocument: IndexedDocument = {\n        sourceId: docRef.sourceId,\n        sourceKey: docRef.sourceKey,\n        sourceType: docRef.sourceType,\n        title: docRef.title,\n        doc: docRef.doc,\n        content,\n        kind: classifyIndexedDocumentKind(docRef.title, content),\n        depth: docRef.depth ?? 0,\n        parentTitle: docRef.parentTitle,\n      };\n      await writeCachedDocument(\n        documentCacheDir,\n        docRef,\n        indexedDocument,\n        updatedAt,\n        charLimit,\n        fullContent.length > charLimit,\n        sha256(fullContent),\n      );\n      results[index] = indexedDocument;\n    });\n    return results.filter((doc): doc is IndexedDocument => Boolean(doc));\n  };\n\n  indexedDocuments.push(...await fetchDocumentReferences(uniqueRefs, maxDocumentChars));\n\n  const seenPrimaryRefs = new Set(uniqueRefs.map(documentReferenceKey));\n  const linkedBudget = Math.max(0, Math.min(maxLinkedDocuments, maxDocuments - indexedDocuments.length));\n  if (linkedBudget > 0) {\n    const allLinkedRefs = dedupeDocumentReferences(indexedDocuments\n      .filter((doc) => shouldExpandLinkedReferences(doc))\n      .flatMap((doc) => extractLinkedDocumentReferencesFromContent(doc, maxLinkedDocuments * 3)));\n    for (const linkedRef of allLinkedRefs) currentDocumentKeys.add(documentReferenceKey(linkedRef));\n    const linkedRefs = allLinkedRefs\n      .filter((ref) => !seenPrimaryRefs.has(documentReferenceKey(ref)))\n      .slice(0, linkedBudget);\n    indexedDocuments.push(...await fetchDocumentReferences(linkedRefs, maxLinkedDocumentChars));\n  }\n\n  const truncatedSourceCount = sourceCoverage.filter((coverage) => coverage.truncated).length;\n  const hasFailures = failedSourceCount > 0 || failedDocumentCount > 0;\n  if (remoteFreshnessTriggered && hasFailures) {\n    const error = warnings.join(\"; \").slice(0, 1000) || \"remote reference refresh failed\";\n    const previousSources = manifest?.sources?.map((source) => ({ ...source })) ?? sources;\n    const nextManifest = withRemoteFreshness(manifest ?? {}, previousSources, now, sourceDigest, {\n      status: \"degraded\",\n      error,\n    });\n    await publishManifestOnlyGeneration(knowledgeDir, nextManifest, publicationIO);\n    await unlinkIfExists(pendingRefreshPath);\n    return {\n      ...cachedMaterializationResult({\n        sources: previousSources,\n        manifest: nextManifest,\n        factsPath,\n        errorsPath,\n        updatedAt,\n        sourceDigest,\n      }),\n      warnings,\n      preservedPreviousIndex: true,\n      status: \"degraded\",\n    };\n  }\n  const status: ReferenceIndexContentStatus = hasFailures ? \"degraded\" : \"fresh\";\n  const hasTrustedDocuments = indexedDocuments.length > 0;\n  const noTrustedFactsReason = \"Reference material refresh produced no trusted documents. Previous facts are stale and not trusted.\";\n  const quickReference = hasTrustedDocuments\n    ? buildQuickReferenceMarkdown(indexedDocuments, updatedAt)\n    : buildStaleQuickReferenceMarkdown(updatedAt, noTrustedFactsReason);\n  const referenceFacts = hasTrustedDocuments\n    ? buildReferenceFactsMarkdown(indexedDocuments, updatedAt, maxFactsChars)\n    : buildStaleReferenceFactsMarkdown(updatedAt, noTrustedFactsReason);\n  const currentIndex = (await resolveCurrentReferenceGeneration(knowledgeDir))?.outputs.get(\"index.md\")?.toString(\"utf8\");\n  const indexContent = buildIndexWithMaterializedSection(currentIndex, {\n    updatedAt,\n    quickReferencePath: \"facts/quick-reference.md\",\n    factsPath: \"facts/reference-facts.md\",\n    errorsPath: \"index-errors.md\",\n    indexedDocuments,\n    warnings,\n  });\n  const baseManifest: ReferenceIndexManifest = manifest ?? {};\n  const nextManifest: ReferenceIndexManifest = withRemoteFreshness({\n    ...baseManifest,\n    version: 1,\n    generated_by: GENERATED_BY,\n    updated_at: updatedAt,\n    source_digest: sourceDigest,\n    source_count: sources.length,\n    sources,\n    content_index: {\n      updated_at: updatedAt,\n      indexed_document_count: indexedDocuments.length,\n      failed_source_count: failedSourceCount,\n      failed_document_count: failedDocumentCount,\n      quick_reference_path: \"facts/quick-reference.md\",\n      facts_path: \"facts/reference-facts.md\",\n      errors_path: \"index-errors.md\",\n    },\n    content_state: {\n      status,\n      source_digest: sourceDigest,\n      generator_version: GENERATOR_VERSION,\n      updated_at: updatedAt,\n      indexed_document_count: indexedDocuments.length,\n      stale_document_count: staleDocuments.length,\n      truncated_source_count: truncatedSourceCount,\n      skipped_source_count: skippedSourceCount,\n      output_hashes: {},\n    },\n    ...(hasFailures ? {\n      last_refresh_error: {\n        updated_at: updatedAt,\n        failed_source_count: failedSourceCount,\n        failed_document_count: failedDocumentCount,\n        warnings,\n      },\n    } : { last_refresh_error: undefined }),\n  }, sources, now, sourceDigest, hasFailures\n    ? { status: \"degraded\", error: warnings.join(\"; \").slice(0, 1000) }\n    : { status: \"fresh\" });\n  await publishReferenceGeneration(knowledgeDir, {\n    \"index.md\": indexContent,\n    \"routing.md\": buildRoutingMarkdown(sources, updatedAt),\n    \"source-map.json\": `${JSON.stringify(buildSourceMap(sources, indexedDocuments, updatedAt, staleDocuments, sourceCoverage), null, 2)}\\n`,\n    \"facts/quick-reference.md\": quickReference,\n    \"facts/reference-facts.md\": referenceFacts,\n    \"index-errors.md\": buildReferenceErrorsMarkdown(warnings, updatedAt),\n  }, nextManifest, publicationIO);\n  await unlinkIfExists(pendingRefreshPath);\n  await cleanupOrphanedDocumentCache(documentCacheInventory, {\n    activeSourceKeys: new Set(sources.map(referenceSourceKey)),\n    currentDocumentKeys,\n    fullyEnumeratedSourceKeys,\n  });\n\n  return {\n    sourceCount: sources.length,\n    indexedDocumentCount: indexedDocuments.length,\n    failedSourceCount,\n    failedDocumentCount,\n    skippedSourceCount,\n    factsPath,\n    errorsPath,\n    updatedAt,\n    warnings,\n    preservedPreviousIndex: false,\n    status,\n    sourceDigest,\n    generatorVersion: GENERATOR_VERSION,\n    staleDocumentCount: staleDocuments.length,\n    truncatedSourceCount,\n  };\n}\n\nasync function withReferenceIndexPublisherLock<T>(aiEmployeeDir: string, fn: () => Promise<T>): Promise<T> {\n  const resolvedDir = path.resolve(aiEmployeeDir);\n  let publisherKey = resolvedDir;\n  try {\n    publisherKey = await realpath(resolvedDir);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") throw error;\n  }\n\n  const previous = referenceIndexPublisherChains.get(publisherKey) ?? Promise.resolve();\n  let release!: () => void;\n  const gate = new Promise<void>((resolve) => {\n    release = resolve;\n  });\n  referenceIndexPublisherChains.set(publisherKey, gate);\n  await previous.catch(() => undefined);\n  let fileLock: { lockDir: string; token: string } | undefined;\n  try {\n    fileLock = await acquireReferenceIndexPublisherFileLock(publisherKey);\n    return await referenceIndexPublisherLockContext.run(fileLock, fn);\n  } finally {\n    try {\n      if (fileLock) await releaseReferenceIndexPublisherFileLock(fileLock);\n    } finally {\n      release();\n      if (referenceIndexPublisherChains.get(publisherKey) === gate) {\n        referenceIndexPublisherChains.delete(publisherKey);\n      }\n    }\n  }\n}\n\nasync function acquireReferenceIndexPublisherFileLock(aiEmployeeDir: string): Promise<{ lockDir: string; token: string }> {\n  const canonicalEmployeeDir = await realpath(aiEmployeeDir);\n  const canonicalParent = await realpath(path.dirname(canonicalEmployeeDir));\n  const lockRoot = path.join(canonicalParent, REFERENCE_PUBLISH_LOCK_ROOT);\n  await mkdir(lockRoot, { recursive: true, mode: 0o700 });\n  const lockRootStat = await lstat(lockRoot);\n  if (lockRootStat.isSymbolicLink() || !lockRootStat.isDirectory()) throw new Error(\"reference index publisher lock root is unsafe\");\n  await chmod(lockRoot, 0o700);\n  const lockDir = path.join(lockRoot, sha256(canonicalEmployeeDir));\n  const token = randomUUID();\n  const deadline = Date.now() + REFERENCE_PUBLISH_LOCK_WAIT_MS;\n  while (true) {\n    try {\n      await mkdir(lockDir);\n      const owner = { version: 1, token, pid: process.pid, acquired_at: new Date().toISOString() };\n      await writeFileDurably(path.join(lockDir, \"owner.json\"), `${JSON.stringify(owner)}\\n`);\n      await fsyncDirectory(lockDir);\n      await fsyncDirectory(lockRoot);\n      return { lockDir, token };\n    } catch (error) {\n      if ((error as NodeJS.ErrnoException)?.code !== \"EEXIST\") throw error;\n    }\n    await recoverStaleReferenceIndexPublisherLock(lockDir, token);\n    if (Date.now() >= deadline) throw new Error(\"timed out waiting for reference index publisher lock\");\n    await new Promise((resolve) => setTimeout(resolve, 25));\n  }\n}\n\nasync function recoverStaleReferenceIndexPublisherLock(lockDir: string, contenderToken: string): Promise<void> {\n  let lockStat;\n  try {\n    lockStat = await lstat(lockDir);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return;\n    throw error;\n  }\n  if (lockStat.isSymbolicLink() || !lockStat.isDirectory() || Date.now() - lockStat.mtimeMs < REFERENCE_PUBLISH_LOCK_STALE_MS) return;\n  let owner: { token?: unknown; pid?: unknown } | undefined;\n  try {\n    owner = JSON.parse(await readFile(path.join(lockDir, \"owner.json\"), \"utf8\")) as { token?: unknown; pid?: unknown };\n  } catch {\n    owner = undefined;\n  }\n  if (typeof owner?.pid === \"number\" && isProcessAlive(owner.pid)) return;\n  const quarantine = `${lockDir}.stale.${contenderToken}`;\n  try {\n    await rename(lockDir, quarantine);\n  } catch (error) {\n    if ([\"ENOENT\", \"EEXIST\", \"ENOTEMPTY\"].includes((error as NodeJS.ErrnoException)?.code ?? \"\")) return;\n    throw error;\n  }\n  await rm(quarantine, { recursive: true, force: true });\n}\n\nfunction isProcessAlive(pid: number): boolean {\n  try {\n    process.kill(pid, 0);\n    return true;\n  } catch (error) {\n    return (error as NodeJS.ErrnoException)?.code !== \"ESRCH\";\n  }\n}\n\nasync function releaseReferenceIndexPublisherFileLock(lock: { lockDir: string; token: string }): Promise<void> {\n  let owner: { token?: unknown } | undefined;\n  try {\n    owner = JSON.parse(await readFile(path.join(lock.lockDir, \"owner.json\"), \"utf8\")) as { token?: unknown };\n  } catch {\n    return;\n  }\n  if (owner.token !== lock.token) return;\n  const releaseDir = `${lock.lockDir}.release.${lock.token}`;\n  try {\n    await rename(lock.lockDir, releaseDir);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return;\n    throw error;\n  }\n  const movedOwner = JSON.parse(await readFile(path.join(releaseDir, \"owner.json\"), \"utf8\")) as { token?: unknown };\n  if (movedOwner.token !== lock.token) {\n    await rename(releaseDir, lock.lockDir).catch(() => undefined);\n    return;\n  }\n  await rm(releaseDir, { recursive: true, force: true });\n  await fsyncDirectory(path.dirname(lock.lockDir));\n}\n\nasync function assertReferenceIndexPublisherFileLockOwned(): Promise<void> {\n  const lock = referenceIndexPublisherLockContext.getStore();\n  if (!lock) throw new Error(\"reference index publisher lock context is unavailable\");\n  const owner = JSON.parse(await readFile(path.join(lock.lockDir, \"owner.json\"), \"utf8\")) as { token?: unknown };\n  if (owner.token !== lock.token) throw new Error(\"reference index publisher lock ownership was lost\");\n}\n\nexport function extractReferenceSources(text: string): ReferenceIndexSource[] {\n  const sources: ReferenceIndexSource[] = [];\n  const seen = new Set<string>();\n\n  for (const rawUrl of extractUrls(text)) {\n    const source = classifyUrl(rawUrl);\n    if (!source) continue;\n    const key = `${source.type}:${source.url ?? source.path ?? source.token ?? source.title}`;\n    if (seen.has(key)) continue;\n    seen.add(key);\n    const next = { ...source, id: sourceId(sources.length + 1) };\n    sources.push({ ...next, key: referenceSourceKey(next) });\n  }\n\n  for (const localPath of extractLocalPaths(text)) {\n    const normalizedPath = localPath.trim();\n    const key = `local_path:${normalizedPath}`;\n    if (seen.has(key)) continue;\n    seen.add(key);\n    const next: ReferenceIndexSource = {\n      id: sourceId(sources.length + 1),\n      type: \"local_path\",\n      title: normalizedPath,\n      path: normalizedPath,\n      hint: \"Read directory listings and files directly from the local workspace before answering document-backed questions.\",\n    };\n    sources.push({ ...next, key: referenceSourceKey(next) });\n  }\n\n  return sources;\n}\n\nfunction extractUrls(text: string): string[] {\n  const urls: string[] = [];\n  const pattern = /https?:\\/\\/[^\\s<>\"'\uFF0C\u3002\uFF1B\u3001)\uFF09\\]}]+/g;\n  for (const match of text.matchAll(pattern)) {\n    urls.push(match[0].replace(/[.,;:!?]+$/, \"\"));\n  }\n  return urls;\n}\n\nfunction extractLocalPaths(text: string): string[] {\n  const paths: string[] = [];\n  const unixPattern = /(?:^|[\\s\uFF1A:])((?:~|\\/(?:Users|home|workspace|mnt|var|tmp))\\/[^\\s\uFF0C\u3002\uFF1B\u3001)\uFF09\\]}]+)/g;\n  for (const match of text.matchAll(unixPattern)) {\n    paths.push(match[1].replace(/[.,;:!?]+$/, \"\"));\n  }\n  const windowsPattern = /(?:^|[\\s\uFF1A:])([A-Za-z]:\\\\[^\\s\uFF0C\u3002\uFF1B\u3001)\uFF09\\]}]+)/g;\n  for (const match of text.matchAll(windowsPattern)) {\n    paths.push(match[1].replace(/[.,;:!?]+$/, \"\"));\n  }\n  return paths;\n}\n\nfunction classifyUrl(rawUrl: string): Omit<ReferenceIndexSource, \"id\"> | null {\n  let parsed: URL;\n  try {\n    parsed = new URL(rawUrl);\n  } catch {\n    return null;\n  }\n  const host = parsed.hostname.toLowerCase();\n  const pathname = parsed.pathname;\n  const isFeishu = host.includes(\"feishu.cn\") || host.includes(\"larksuite.com\");\n\n  if (isFeishu) {\n    const driveFolderToken = pathname.match(/\\/drive\\/folder\\/([^/?#]+)/)?.[1];\n    if (driveFolderToken) {\n      return {\n        type: \"feishu_drive_folder\",\n        title: `Feishu drive folder ${driveFolderToken}`,\n        url: rawUrl,\n        token: driveFolderToken,\n        hint: \"Inspect this folder first, then fetch only the relevant doc/sheet/wiki nodes.\",\n      };\n    }\n    const docToken = pathname.match(/\\/(?:docx|docs)\\/([^/?#]+)/)?.[1];\n    if (docToken) {\n      return {\n        type: \"feishu_doc\",\n        title: `Feishu document ${docToken}`,\n        url: rawUrl,\n        token: docToken,\n        hint: \"Fetch this document before answering questions that depend on it.\",\n      };\n    }\n    const wikiToken = pathname.match(/\\/wiki\\/([^/?#]+)/)?.[1];\n    if (wikiToken) {\n      return {\n        type: \"feishu_wiki\",\n        title: `Feishu wiki ${wikiToken}`,\n        url: rawUrl,\n        token: wikiToken,\n        hint: \"Resolve the wiki node, then fetch the underlying document content.\",\n      };\n    }\n  }\n\n  return {\n    type: \"web_url\",\n    title: rawUrl,\n    url: rawUrl,\n    hint: \"Use this URL as a declared reference source before broad web search.\",\n  };\n}\n\nfunction buildIndexMarkdown(input: ReferenceIndexSeedInput, sources: ReferenceIndexSource[], updatedAt: string): string {\n  const lines = [\n    \"# Reference Index\",\n    \"\",\n    `Generated for: ${input.aiEmployeeName} (${input.aiEmployeeId})`,\n    `Updated at: ${updatedAt}`,\n    \"\",\n    \"## How to use\",\n    \"\",\n    \"- For questions that depend on rule-linked reference material, use one `wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md` call per answer.\",\n    \"- Prefer the indexed sources below. If they do not cover the answer, say that clearly before using allowed fallback search.\",\n    \"- Do not expose internal source IDs, CLI logs, tokens, or index maintenance details to the user.\",\n    \"- During retrospectives, append slow-answer and wrong-answer analysis to `.wm/knowledge/retros/` and promote only stable lessons into `notes/lessons.md` or `MEMORY.md`.\",\n    \"\",\n    \"## Sources\",\n    \"\",\n  ];\n  if (sources.length === 0) {\n    lines.push(\"- No rule-linked reference sources were detected.\");\n  } else {\n    for (const source of sources) {\n      lines.push(`### ${source.id} ${source.title}`, \"\");\n      lines.push(`- Type: ${source.type}`);\n      if (source.url) lines.push(`- URL: ${source.url}`);\n      if (source.path) lines.push(`- Path: ${source.path}`);\n      if (source.token) lines.push(`- Token: ${source.token}`);\n      if (source.hint) lines.push(`- Retrieval hint: ${source.hint}`);\n      lines.push(\"\");\n    }\n  }\n  return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nfunction buildRoutingMarkdown(sources: ReferenceIndexSource[], updatedAt: string): string {\n  const lines = [\n    \"# Reference Routing\",\n    \"\",\n    `Updated at: ${updatedAt}`,\n    \"\",\n    \"Use this routing file to pick the cheapest reliable lookup path for the current user question.\",\n    \"\",\n  ];\n  if (sources.length === 0) {\n    lines.push(\"- No source-specific routes are configured yet.\");\n    return `${lines.join(\"\\n\")}\\n`;\n  }\n  for (const source of sources) {\n    lines.push(`## ${source.id} ${source.type}`, \"\");\n    lines.push(\"- First read local indexed facts as one validated generation bundle:\", \"\", \"```bash\", \"wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md\", \"```\");\n    lines.push(\"- Only if local facts do not contain the answer, use the source-specific fallback below.\");\n    if (source.type === \"feishu_drive_folder\" && source.url) {\n      lines.push(\"- Fallback: inspect the folder:\", \"\", \"```bash\", `.wm/lark-cli drive +inspect --as user --url ${shellQuoteForDoc(source.url)} --format json`, \"```\");\n      lines.push(\"- Fetch the specific document/sheet/wiki node selected from the folder result; do not search all Drive.\");\n    } else if (source.type === \"feishu_doc\" && source.url) {\n      lines.push(\"- Fallback: fetch the document directly:\", \"\", \"```bash\", `.wm/lark-cli docs +fetch --api-version v2 --as user --doc ${shellQuoteForDoc(source.url)}`, \"```\");\n    } else if (source.type === \"feishu_wiki\" && source.url) {\n      lines.push(\"- Fallback: inspect or resolve the wiki node, then fetch the underlying document:\", \"\", \"```bash\", `.wm/lark-cli drive +inspect --as user --url ${shellQuoteForDoc(source.url)} --format json`, \"```\");\n    } else if (source.type === \"local_path\" && source.path) {\n      lines.push(\"- Fallback: inspect local files before answering:\", \"\", \"```bash\", `find ${shellQuoteForDoc(source.path)} -maxdepth 2 -type f`, `rg -n \\\"<keywords>\\\" ${shellQuoteForDoc(source.path)}`, \"```\");\n    } else if (source.url) {\n      lines.push(`- Fallback: read URL: ${source.url}`);\n    }\n    lines.push(\"\");\n  }\n  return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nfunction buildCandidateFactsTemplate(): string {\n  return [\n    \"# Candidate Facts\",\n    \"\",\n    \"Facts extracted from indexed references can be drafted here before they are trusted as durable knowledge.\",\n    \"\",\n    \"## Pending\",\n    \"\",\n    \"- No candidate facts yet.\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction buildSlowQueriesTemplate(): string {\n  return [\n    \"# Slow Query Retrospective\",\n    \"\",\n    \"Append cases where answering was slow because retrieval, routing, or missing index coverage was inefficient.\",\n    \"\",\n    \"## Pending\",\n    \"\",\n    \"- No slow-query cases yet.\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction buildMistakesTemplate(): string {\n  return [\n    \"# Mistake Retrospective\",\n    \"\",\n    \"Append wrong-answer cases and the index or memory change that would prevent repetition.\",\n    \"\",\n    \"## Pending\",\n    \"\",\n    \"- No mistake cases yet.\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction publicationIOFromInput(input: MaterializeReferenceIndexInput): ReferenceIndexPublicationIO {\n  return {\n    write: input.publishWrite,\n    rename: input.publishRename,\n    remove: input.publishRemove,\n  };\n}\n\nasync function readExistingManifest(knowledgeDir: string): Promise<ReferenceIndexManifest | null> {\n  return readManifest(knowledgeDir);\n}\n\nasync function readManifest(knowledgeDir: string): Promise<ReferenceIndexManifest | null> {\n  const current = await resolveCurrentReferenceGeneration(knowledgeDir);\n  if (current) return current.manifest;\n  if (await pathExists(path.join(knowledgeDir, REFERENCE_CURRENT_POINTER))) return null;\n  return readManifestFile(path.join(knowledgeDir, \"manifest.json\"));\n}\n\nasync function readManifestFile(manifestPath: string): Promise<ReferenceIndexManifest | null> {\n  try {\n    const parsed = JSON.parse(await readFile(manifestPath, \"utf8\")) as ReferenceIndexManifest;\n    return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? parsed : null;\n  } catch {\n    return null;\n  }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n  try {\n    await stat(filePath);\n    return true;\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return false;\n    throw error;\n  }\n}\n\nasync function resolveCurrentReferenceGeneration(knowledgeDir: string): Promise<{\n  pointer: ReferenceIndexPointer;\n  generationDir: string;\n  manifest: ReferenceIndexManifest;\n  outputs: Map<(typeof PUBLISHED_OUTPUT_PATHS)[number], Buffer>;\n} | null> {\n  let pointer: ReferenceIndexPointer;\n  try {\n    pointer = JSON.parse((await readStrictReferenceFile(\n      knowledgeDir,\n      REFERENCE_CURRENT_POINTER,\n      64 * 1024,\n    )).toString(\"utf8\")) as ReferenceIndexPointer;\n  } catch {\n    return null;\n  }\n  if (\n    pointer?.version !== 1\n    || typeof pointer.generation_id !== \"string\"\n    || !/^ref-[a-f0-9]{64}$/.test(pointer.generation_id)\n    || typeof pointer.manifest_sha256 !== \"string\"\n    || !/^[a-f0-9]{64}$/.test(pointer.manifest_sha256)\n    || pointer.generation_id !== `ref-${pointer.manifest_sha256}`\n    || typeof pointer.published_at !== \"string\"\n  ) return null;\n\n  const generationsDir = path.join(knowledgeDir, REFERENCE_GENERATIONS_DIR);\n  const generationDir = path.join(generationsDir, pointer.generation_id);\n  try {\n    const [resolvedRoot, resolvedGeneration, generationsStat, generationStat] = await Promise.all([\n      realpath(generationsDir),\n      realpath(generationDir),\n      lstat(generationsDir),\n      lstat(generationDir),\n    ]);\n    if (\n      generationsStat.isSymbolicLink()\n      || !generationsStat.isDirectory()\n      || generationStat.isSymbolicLink()\n      || !generationStat.isDirectory()\n      || !isContainedPath(resolvedRoot, resolvedGeneration)\n    ) return null;\n    const manifestContent = await readStrictReferenceFile(\n      resolvedGeneration,\n      \"manifest.json\",\n      REFERENCE_MANIFEST_MAX_BYTES,\n    );\n    const manifestSha256 = sha256(manifestContent);\n    if (\n      manifestSha256 !== pointer.manifest_sha256\n      || pointer.generation_id !== `ref-${manifestSha256}`\n    ) return null;\n    const manifest = JSON.parse(manifestContent.toString(\"utf8\")) as ReferenceIndexManifest;\n    if (!manifest || typeof manifest !== \"object\" || Array.isArray(manifest)) return null;\n    const outputHashes = manifest.content_state?.output_hashes;\n    if (!outputHashes || typeof outputHashes !== \"object\" || Array.isArray(outputHashes)) return null;\n    const outputs = new Map<(typeof PUBLISHED_OUTPUT_PATHS)[number], Buffer>();\n    for (const relativePath of PUBLISHED_OUTPUT_PATHS) {\n      const content = await readStrictReferenceFile(resolvedGeneration, relativePath, REFERENCE_OUTPUT_MAX_BYTES);\n      if (!outputHashes[relativePath] || sha256(content) !== outputHashes[relativePath]) return null;\n      outputs.set(relativePath, content);\n    }\n    return { pointer, generationDir: resolvedGeneration, manifest, outputs };\n  } catch {\n    return null;\n  }\n}\n\ntype ReferenceDirectoryIdentity = { path: string; dev: number; ino: number; canonicalPath: string };\n\nasync function captureReferenceDirectoryChain(\n  rootDir: string,\n  relativePath: string,\n): Promise<ReferenceDirectoryIdentity[]> {\n  const identities: ReferenceDirectoryIdentity[] = [];\n  const canonicalRoot = await realpath(rootDir);\n  let parent = rootDir;\n  for (const segment of [\"\", ...relativePath.split(\"/\").slice(0, -1)]) {\n    if (segment) parent = path.join(parent, segment);\n    const [info, canonicalPath] = await Promise.all([lstat(parent), realpath(parent)]);\n    if (info.isSymbolicLink() || !info.isDirectory() || !isContainedPath(canonicalRoot, canonicalPath)) {\n      throw new Error(`reference index unsafe parent: ${relativePath}`);\n    }\n    identities.push({ path: parent, dev: info.dev, ino: info.ino, canonicalPath });\n  }\n  return identities;\n}\n\nasync function revalidateReferenceDirectoryChain(\n  identities: ReferenceDirectoryIdentity[],\n  relativePath: string,\n): Promise<void> {\n  const canonicalRoot = identities[0]?.canonicalPath;\n  for (const identity of identities) {\n    const [info, canonicalPath] = await Promise.all([lstat(identity.path), realpath(identity.path)]);\n    if (\n      info.isSymbolicLink()\n      || !info.isDirectory()\n      || info.dev !== identity.dev\n      || info.ino !== identity.ino\n      || canonicalPath !== identity.canonicalPath\n      || !canonicalRoot\n      || !isContainedPath(canonicalRoot, canonicalPath)\n    ) throw new Error(`reference index parent changed during access: ${relativePath}`);\n  }\n}\n\nasync function readStrictReferenceFile(\n  rootDir: string,\n  relativePath: string,\n  maxBytes: number,\n): Promise<Buffer> {\n  const identities = await captureReferenceDirectoryChain(rootDir, relativePath);\n  await referenceIndexIntegrityHookContext.getStore()?.afterReadParentsValidated?.({ rootDir, relativePath });\n  const filePath = path.join(rootDir, ...relativePath.split(\"/\"));\n  const before = await lstat(filePath);\n  if (before.isSymbolicLink() || !before.isFile() || before.nlink !== 1 || before.size > maxBytes) {\n    throw new Error(`reference index unsafe output: ${relativePath}`);\n  }\n  const handle = await open(filePath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);\n  try {\n    const opened = await handle.stat();\n    if (\n      !opened.isFile()\n      || opened.nlink !== 1\n      || opened.dev !== before.dev\n      || opened.ino !== before.ino\n      || opened.size > maxBytes\n    ) throw new Error(`reference index output changed during open: ${relativePath}`);\n    await revalidateReferenceDirectoryChain(identities, relativePath);\n    const content = await handle.readFile();\n    const after = await handle.stat();\n    if (\n      after.dev !== opened.dev\n      || after.ino !== opened.ino\n      || after.size !== opened.size\n      || after.mtimeMs !== opened.mtimeMs\n      || after.ctimeMs !== opened.ctimeMs\n      || content.byteLength !== opened.size\n    ) throw new Error(`reference index output changed during read: ${relativePath}`);\n    await revalidateReferenceDirectoryChain(identities, relativePath);\n    return content;\n  } finally {\n    await handle.close();\n  }\n}\n\nfunction isContainedPath(parentPath: string, childPath: string): boolean {\n  const relative = path.relative(parentPath, childPath);\n  return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nexport async function readReferenceIndexOutput(\n  aiEmployeeDir: string,\n  relativePath: (typeof PUBLISHED_OUTPUT_PATHS)[number],\n  hooks: ReferenceIndexIntegrityHooks = {},\n): Promise<Buffer | null> {\n  return referenceIndexIntegrityHookContext.run(hooks, async () => {\n    const current = await resolveCurrentReferenceGeneration(path.join(aiEmployeeDir, \".wm\", \"knowledge\"));\n    return current?.outputs.get(relativePath) ?? null;\n  });\n}\n\nasync function isFreshPublishedGeneration(\n  knowledgeDir: string,\n  manifest: ReferenceIndexManifest | null,\n  sourceDigest: string,\n): Promise<boolean> {\n  const current = await resolveCurrentReferenceGeneration(knowledgeDir);\n  if (!current) return false;\n  const state = manifest?.content_state;\n  if (\n    manifest?.generated_by !== GENERATED_BY\n    || manifest.source_digest !== sourceDigest\n    || state?.status !== \"fresh\"\n    || state.source_digest !== sourceDigest\n    || state.generator_version !== GENERATOR_VERSION\n  ) return false;\n\n  const outputHashes = state.output_hashes;\n  if (!outputHashes || typeof outputHashes !== \"object\" || Array.isArray(outputHashes)) return false;\n\n  for (const relativePath of PUBLISHED_OUTPUT_PATHS) {\n    const expected = outputHashes[relativePath];\n    if (!expected) return false;\n    const content = current.outputs.get(relativePath);\n    if (!content || sha256(content) !== expected) return false;\n  }\n  return true;\n}\n\nasync function publishReferenceGeneration(\n  knowledgeDir: string,\n  outputs: Record<(typeof PUBLISHED_OUTPUT_PATHS)[number], string>,\n  manifest: ReferenceIndexManifest,\n  io: ReferenceIndexPublicationIO = {},\n): Promise<void> {\n  const outputHashes: Record<string, string> = {};\n  for (const relativePath of PUBLISHED_OUTPUT_PATHS) {\n    outputHashes[relativePath] = sha256(outputs[relativePath]);\n  }\n  const nextManifest: ReferenceIndexManifest = {\n    ...manifest,\n    content_state: {\n      ...(manifest.content_state ?? {\n        status: \"stale\" as const,\n        source_digest: typeof manifest.source_digest === \"string\" ? manifest.source_digest : \"\",\n        generator_version: GENERATOR_VERSION,\n        updated_at: typeof manifest.updated_at === \"string\" ? manifest.updated_at : new Date().toISOString(),\n        indexed_document_count: manifest.content_index?.indexed_document_count ?? 0,\n        stale_document_count: 0,\n        truncated_source_count: 0,\n      }),\n      output_hashes: outputHashes,\n    },\n  };\n  const manifestContent = `${JSON.stringify(nextManifest, null, 2)}\\n`;\n  const generationId = `ref-${sha256(manifestContent)}`;\n  const generationsDir = path.join(knowledgeDir, REFERENCE_GENERATIONS_DIR);\n  const generationDir = path.join(generationsDir, generationId);\n  const stagingDir = path.join(generationsDir, `.${generationId}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);\n  const pointerPath = path.join(knowledgeDir, REFERENCE_CURRENT_POINTER);\n  const pointerToken = `${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}`;\n  const pointerTempPath = path.join(knowledgeDir, `.current.json.${pointerToken}.tmp`);\n  const previousPointer = await readPointerIfValid(pointerPath);\n  const previousPointerContent = await readStrictReferenceFile(\n    knowledgeDir,\n    REFERENCE_CURRENT_POINTER,\n    64 * 1024,\n  ).catch((error: NodeJS.ErrnoException) => {\n    if (error.code === \"ENOENT\") return undefined;\n    throw error;\n  });\n  const writePublicationFile = io.write ?? writeFileDurably;\n  const renamePublicationPath = io.rename ?? rename;\n  const removePublicationPath = io.remove ?? ((targetPath: string) => rm(targetPath, { recursive: true, force: true }));\n  let pointerCommitAttempted = false;\n  try {\n    await mkdir(generationsDir, { recursive: true });\n    await assertPublicationDirectory(generationsDir, \"reference generations root\");\n    if (!await pathExists(generationDir)) {\n      await mkdir(stagingDir, { recursive: true });\n      await assertPublicationDirectory(stagingDir, \"reference generation staging directory\");\n      for (const relativePath of PUBLISHED_OUTPUT_PATHS) {\n        await writeStagingPublicationFile(stagingDir, relativePath, outputs[relativePath], io.write);\n      }\n      await writeStagingPublicationFile(stagingDir, \"manifest.json\", manifestContent, io.write);\n      await validateReferenceGeneration(stagingDir, nextManifest);\n      await fsyncDirectoryTree(stagingDir);\n      await assertReferenceIndexPublisherFileLockOwned();\n      try {\n        await renamePublicationPath(stagingDir, generationDir);\n      } catch (error) {\n        if (![\"EEXIST\", \"ENOTEMPTY\"].includes((error as NodeJS.ErrnoException)?.code ?? \"\")) throw error;\n        await validateReferenceGeneration(generationDir, nextManifest);\n        await rm(stagingDir, { recursive: true, force: true });\n      }\n      await fsyncDirectory(generationsDir);\n    } else {\n      await validateReferenceGeneration(generationDir, nextManifest);\n    }\n\n    const pointer: ReferenceIndexPointer = {\n      version: 1,\n      generation_id: generationId,\n      manifest_sha256: sha256(manifestContent),\n      published_at: typeof nextManifest.updated_at === \"string\" ? nextManifest.updated_at : new Date().toISOString(),\n    };\n    await writePublicationFile(pointerTempPath, `${JSON.stringify(pointer, null, 2)}\\n`);\n    await assertReferenceIndexPublisherFileLockOwned();\n    pointerCommitAttempted = true;\n    await renamePublicationPath(pointerTempPath, pointerPath);\n    await fsyncDirectory(knowledgeDir);\n    const published = await resolveCurrentReferenceGeneration(knowledgeDir);\n    if (!published || published.pointer.generation_id !== generationId) {\n      throw new Error(\"reference index pointer validation failed after publication\");\n    }\n  } catch (error) {\n    await rm(stagingDir, { recursive: true, force: true }).catch(() => undefined);\n    await unlink(pointerTempPath).catch(() => undefined);\n    if (pointerCommitAttempted) {\n      try {\n        if (previousPointerContent === undefined) {\n          await unlink(pointerPath).catch((unlinkError: NodeJS.ErrnoException) => {\n            if (unlinkError.code !== \"ENOENT\") throw unlinkError;\n          });\n        } else {\n          const rollbackPath = path.join(knowledgeDir, `.current.json.rollback.${pointerToken}.tmp`);\n          try {\n            await writeFileDurably(rollbackPath, previousPointerContent.toString(\"utf8\"));\n            await rename(rollbackPath, pointerPath);\n          } finally {\n            await unlink(rollbackPath).catch(() => undefined);\n          }\n        }\n        await fsyncDirectory(knowledgeDir);\n      } catch (rollbackError) {\n        throw new AggregateError([error, rollbackError], \"reference index publication failed and pointer rollback failed\");\n      }\n    }\n    throw error;\n  }\n\n  await cleanupLegacyPublishedOutputs(knowledgeDir).catch(() => undefined);\n  await cleanupOldReferenceGenerations(\n    knowledgeDir,\n    generationId,\n    previousPointer?.generation_id,\n    removePublicationPath,\n  ).catch(() => undefined);\n}\n\nasync function assertPublicationDirectory(directoryPath: string, label: string): Promise<void> {\n  const info = await lstat(directoryPath);\n  if (info.isSymbolicLink() || !info.isDirectory()) throw new Error(`${label} is unsafe`);\n}\n\nasync function prepareSafeStagingFile(\n  stagingDir: string,\n  relativePath: (typeof PUBLISHED_OUTPUT_PATHS)[number] | \"manifest.json\",\n): Promise<ReferenceDirectoryIdentity[]> {\n  let parent = stagingDir;\n  for (const segment of relativePath.split(\"/\").slice(0, -1)) {\n    parent = path.join(parent, segment);\n    await mkdir(parent, { recursive: false }).catch((error: NodeJS.ErrnoException) => {\n      if (error.code !== \"EEXIST\") throw error;\n    });\n    await assertPublicationDirectory(parent, `reference generation parent ${relativePath}`);\n  }\n  const leafPath = path.join(stagingDir, relativePath);\n  try {\n    const leaf = await lstat(leafPath);\n    if (leaf.isSymbolicLink() || !leaf.isFile() || leaf.nlink !== 1) {\n      throw new Error(`reference generation leaf ${relativePath} is unsafe`);\n    }\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") throw error;\n  }\n  return captureReferenceDirectoryChain(stagingDir, relativePath);\n}\n\nasync function writeStagingPublicationFile(\n  stagingDir: string,\n  relativePath: (typeof PUBLISHED_OUTPUT_PATHS)[number] | \"manifest.json\",\n  content: string,\n  customWrite?: (filePath: string, content: string) => Promise<void>,\n): Promise<void> {\n  const identities = await prepareSafeStagingFile(stagingDir, relativePath);\n  await referenceIndexIntegrityHookContext.getStore()?.afterStagingParentsValidated?.({ stagingDir, relativePath });\n  const filePath = path.join(stagingDir, relativePath);\n  let openedIdentity: { dev: number; ino: number } | undefined;\n  try {\n    if (customWrite) {\n      await customWrite(filePath, content);\n      const written = await lstat(filePath);\n      if (written.isSymbolicLink() || !written.isFile() || written.nlink !== 1) {\n        throw new Error(`reference generation leaf ${relativePath} is unsafe after write`);\n      }\n      openedIdentity = { dev: written.dev, ino: written.ino };\n    } else {\n      const handle = await open(\n        filePath,\n        fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | fsConstants.O_NOFOLLOW,\n        0o600,\n      );\n      try {\n        const opened = await handle.stat();\n        if (!opened.isFile() || opened.nlink !== 1) throw new Error(`reference generation leaf ${relativePath} is unsafe after open`);\n        openedIdentity = { dev: opened.dev, ino: opened.ino };\n        await handle.writeFile(content, \"utf8\");\n        await handle.sync();\n      } finally {\n        await handle.close();\n      }\n    }\n    await revalidateReferenceDirectoryChain(identities, relativePath);\n  } catch (error) {\n    if (openedIdentity) {\n      await lstat(filePath).then(async (leaf) => {\n        if (leaf.isFile() && leaf.nlink === 1 && leaf.dev === openedIdentity!.dev && leaf.ino === openedIdentity!.ino) {\n          await unlink(filePath);\n        }\n      }).catch(() => undefined);\n    }\n    throw error;\n  }\n}\n\nasync function publishManifestOnlyGeneration(\n  knowledgeDir: string,\n  manifest: ReferenceIndexManifest,\n  io: ReferenceIndexPublicationIO,\n): Promise<void> {\n  const current = await resolveCurrentReferenceGeneration(knowledgeDir);\n  if (!current) throw new Error(\"reference index current generation is unavailable or unsafe\");\n  const outputs = {} as Record<(typeof PUBLISHED_OUTPUT_PATHS)[number], string>;\n  for (const relativePath of PUBLISHED_OUTPUT_PATHS) outputs[relativePath] = current.outputs.get(relativePath)!.toString(\"utf8\");\n  await publishReferenceGeneration(knowledgeDir, outputs, manifest, io);\n}\n\nasync function validateReferenceGeneration(generationDir: string, manifest: ReferenceIndexManifest): Promise<void> {\n  await assertPublicationDirectory(generationDir, \"reference generation directory\");\n  const outputHashes = manifest.content_state?.output_hashes;\n  if (!outputHashes) throw new Error(\"reference index generation has no output hashes\");\n  for (const relativePath of PUBLISHED_OUTPUT_PATHS) {\n    const content = await readStrictReferenceFile(generationDir, relativePath, REFERENCE_OUTPUT_MAX_BYTES);\n    if (sha256(content) !== outputHashes[relativePath]) {\n      throw new Error(`reference index generation hash mismatch: ${relativePath}`);\n    }\n  }\n  const manifestContent = await readStrictReferenceFile(generationDir, \"manifest.json\", REFERENCE_MANIFEST_MAX_BYTES);\n  const expectedGenerationId = `ref-${sha256(manifestContent)}`;\n  const directoryName = path.basename(generationDir);\n  if (directoryName !== expectedGenerationId && !directoryName.startsWith(`.${expectedGenerationId}.`)) {\n    throw new Error(\"reference index generation id does not match its manifest\");\n  }\n  const storedManifest = JSON.parse(manifestContent.toString(\"utf8\")) as ReferenceIndexManifest;\n  if (!storedManifest || JSON.stringify(storedManifest) !== JSON.stringify(manifest)) {\n    throw new Error(\"reference index generation manifest mismatch\");\n  }\n}\n\nasync function readPointerIfValid(pointerPath: string): Promise<ReferenceIndexPointer | null> {\n  try {\n    const pointer = JSON.parse((await readStrictReferenceFile(\n      path.dirname(pointerPath),\n      path.basename(pointerPath),\n      64 * 1024,\n    )).toString(\"utf8\")) as ReferenceIndexPointer;\n    return pointer?.version === 1\n      && /^ref-[a-f0-9]{64}$/.test(pointer.generation_id)\n      && /^[a-f0-9]{64}$/.test(pointer.manifest_sha256)\n      && pointer.generation_id === `ref-${pointer.manifest_sha256}`\n      && typeof pointer.published_at === \"string\"\n      ? pointer\n      : null;\n  } catch {\n    return null;\n  }\n}\n\nasync function migrateLegacyReferenceGenerationIfNeeded(\n  knowledgeDir: string,\n  io: ReferenceIndexPublicationIO = {},\n): Promise<void> {\n  if (await pathExists(path.join(knowledgeDir, REFERENCE_CURRENT_POINTER))) return;\n  const manifest = await readManifestFile(path.join(knowledgeDir, \"manifest.json\"));\n  if (!manifest) return;\n  const outputs = {} as Record<(typeof PUBLISHED_OUTPUT_PATHS)[number], string>;\n  for (const relativePath of PUBLISHED_OUTPUT_PATHS) {\n    const content = await readFileIfExists(path.join(knowledgeDir, relativePath));\n    if (content === undefined) return;\n    outputs[relativePath] = content;\n  }\n  await publishReferenceGeneration(knowledgeDir, outputs, manifest, io);\n}\n\nasync function cleanupLegacyPublishedOutputs(knowledgeDir: string): Promise<void> {\n  for (const relativePath of [...PUBLISHED_OUTPUT_PATHS, \"manifest.json\"] as const) {\n    await unlink(path.join(knowledgeDir, relativePath)).catch((error: NodeJS.ErrnoException) => {\n      if (error.code !== \"ENOENT\") throw error;\n    });\n  }\n}\n\nasync function cleanupOldReferenceGenerations(\n  knowledgeDir: string,\n  currentGenerationId: string,\n  previousGenerationId?: string,\n  removeGeneration: (targetPath: string) => Promise<void> = (targetPath) => rm(targetPath, { recursive: true, force: true }),\n): Promise<void> {\n  const generationsDir = path.join(knowledgeDir, REFERENCE_GENERATIONS_DIR);\n  const entries = await readdir(generationsDir, { withFileTypes: true });\n  const complete = await Promise.all(entries\n    .filter((entry) => entry.isDirectory() && /^ref-[a-f0-9]{64}$/.test(entry.name))\n    .map(async (entry) => ({ name: entry.name, mtimeMs: (await stat(path.join(generationsDir, entry.name))).mtimeMs })));\n  complete.sort((left, right) => right.mtimeMs - left.mtimeMs || left.name.localeCompare(right.name));\n  const retain = new Set([\n    currentGenerationId,\n    ...(previousGenerationId ? [previousGenerationId] : []),\n    ...complete.slice(0, REFERENCE_GENERATION_RETENTION).map((entry) => entry.name),\n  ]);\n  for (const entry of complete.filter((candidate) => !retain.has(candidate.name))) {\n    await removeGeneration(path.join(generationsDir, entry.name));\n  }\n}\n\nasync function writeFileDurably(filePath: string, content: string): Promise<void> {\n  await mkdir(path.dirname(filePath), { recursive: true });\n  const handle = await open(\n    filePath,\n    fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | fsConstants.O_NOFOLLOW,\n    0o600,\n  );\n  try {\n    await handle.writeFile(content, \"utf8\");\n    await handle.sync();\n  } finally {\n    await handle.close();\n  }\n}\n\nasync function fsyncDirectory(directoryPath: string): Promise<void> {\n  const handle = await open(directoryPath, \"r\");\n  try {\n    await handle.sync();\n  } catch (error) {\n    if (!([\"EINVAL\", \"ENOTSUP\", \"EBADF\"] as Array<string | undefined>).includes((error as NodeJS.ErrnoException).code)) throw error;\n  } finally {\n    await handle.close();\n  }\n}\n\nasync function fsyncDirectoryTree(rootDir: string): Promise<void> {\n  const entries = await readdir(rootDir, { withFileTypes: true });\n  for (const entry of entries) {\n    if (entry.isDirectory()) await fsyncDirectoryTree(path.join(rootDir, entry.name));\n  }\n  await fsyncDirectory(rootDir);\n}\n\nasync function readFileIfExists(filePath: string): Promise<string | undefined> {\n  try {\n    return await readFile(filePath, \"utf8\");\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return undefined;\n    throw error;\n  }\n}\n\nasync function unlinkIfExists(filePath: string): Promise<void> {\n  try {\n    await unlink(filePath);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code !== \"ENOENT\") throw error;\n  }\n}\n\nasync function writeFileAtomically(\n  filePath: string,\n  content: string,\n  renameFile: (fromPath: string, toPath: string) => Promise<void> = rename,\n): Promise<void> {\n  await mkdir(path.dirname(filePath), { recursive: true });\n  const tempPath = path.join(\n    path.dirname(filePath),\n    `.${path.basename(filePath)}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`,\n  );\n  try {\n    await writeFile(tempPath, content, \"utf8\");\n    await renameFile(tempPath, filePath);\n  } catch (error) {\n    await unlink(tempPath).catch(() => undefined);\n    throw error;\n  }\n}\n\nasync function cleanupReferenceIndexTempFiles(directory: string): Promise<void> {\n  await unlink(path.join(directory, REFERENCE_CURRENT_POINTER_TEMP)).catch((error: NodeJS.ErrnoException) => {\n    if (error.code !== \"ENOENT\") throw error;\n  });\n  const rootEntries = await readdir(directory, { withFileTypes: true }).catch((error: NodeJS.ErrnoException) => {\n    if (error.code === \"ENOENT\") return [];\n    throw error;\n  });\n  await Promise.all(rootEntries\n    .filter((entry) => entry.isFile() && /^\\.current\\.json(?:\\.rollback)?\\.\\d+\\.\\d+\\.[a-f0-9]+\\.tmp$/.test(entry.name))\n    .map((entry) => unlink(path.join(directory, entry.name))));\n  const generationsDir = path.join(directory, REFERENCE_GENERATIONS_DIR);\n  let entries;\n  try {\n    entries = await readdir(generationsDir, { withFileTypes: true });\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return;\n    throw error;\n  }\n  await Promise.all(entries\n    .filter((entry) => entry.isDirectory() && /^\\.ref-[a-f0-9]{64}\\.\\d+\\.\\d+\\.[a-f0-9]+\\.tmp$/.test(entry.name))\n    .map((entry) => rm(path.join(generationsDir, entry.name), { recursive: true, force: true })));\n}\n\nasync function writeCachedDocument(\n  cacheDir: string,\n  ref: DocumentReference,\n  document: IndexedDocument,\n  updatedAt: string,\n  contentCharLimit: number,\n  contentTruncated: boolean,\n  fullContentSha256: string,\n): Promise<void> {\n  const cache: CachedReferenceDocument = {\n    version: 1,\n    document_key: documentReferenceKey(ref),\n    source_id: ref.sourceId,\n    source_key: ref.sourceKey ?? ref.sourceId,\n    source_type: ref.sourceType,\n    title: document.title,\n    doc: document.doc,\n    kind: document.kind,\n    depth: document.depth ?? 0,\n    parent_title: document.parentTitle,\n    metadata_fingerprint: ref.metadataFingerprint,\n    content: document.content,\n    content_sha256: sha256(document.content),\n    full_content_sha256: fullContentSha256,\n    content_char_limit: contentCharLimit,\n    content_truncated: contentTruncated,\n    fetched_at: updatedAt,\n    last_success_at: updatedAt,\n    status: \"fresh\",\n  };\n  await writeFileAtomically(documentCachePath(cacheDir, cache.document_key), `${JSON.stringify(cache, null, 2)}\\n`);\n}\n\nasync function markCachedDocumentStale(\n  cacheDir: string,\n  ref: DocumentReference,\n  error: string,\n): Promise<StaleDocumentRoute | undefined> {\n  const cached = await readCachedDocument(cacheDir, documentReferenceKey(ref));\n  if (!cached) return undefined;\n  const stale: CachedReferenceDocument = { ...cached, status: \"stale\", error };\n  await writeFileAtomically(documentCachePath(cacheDir, stale.document_key), `${JSON.stringify(stale, null, 2)}\\n`);\n  return {\n    sourceId: ref.sourceId,\n    sourceKey: ref.sourceKey ?? cached.source_key,\n    title: ref.title || cached.title,\n    doc: ref.doc,\n    kind: cached.kind,\n    depth: ref.depth ?? cached.depth,\n    parentTitle: ref.parentTitle ?? cached.parent_title,\n    contentSha256: cached.content_sha256,\n    error,\n  };\n}\n\nasync function readDocumentCacheInventory(cacheDir: string): Promise<CachedReferenceDocumentInventoryEntry[]> {\n  let entries;\n  try {\n    entries = await readdir(cacheDir, { withFileTypes: true });\n  } catch (readError) {\n    if ((readError as NodeJS.ErrnoException)?.code === \"ENOENT\") return [];\n    throw readError;\n  }\n\n  const inventory: CachedReferenceDocumentInventoryEntry[] = [];\n  for (const entry of entries) {\n    if (!entry.isFile() || !entry.name.endsWith(\".json\")) continue;\n    const filePath = path.join(cacheDir, entry.name);\n    try {\n      const cached = JSON.parse(await readFile(filePath, \"utf8\")) as CachedReferenceDocument;\n      if (cached?.version === 1 && typeof cached.document_key === \"string\") {\n        inventory.push({ filePath, cached });\n      }\n    } catch {\n      continue;\n    }\n  }\n  return inventory;\n}\n\nasync function cleanupOrphanedDocumentCache(\n  inventory: CachedReferenceDocumentInventoryEntry[],\n  input: {\n    activeSourceKeys: Set<string>;\n    currentDocumentKeys: Set<string>;\n    fullyEnumeratedSourceKeys: Set<string>;\n  },\n): Promise<void> {\n  for (const { filePath, cached } of inventory) {\n    if (input.currentDocumentKeys.has(cached.document_key)) continue;\n    const sourceRemoved = !input.activeSourceKeys.has(cached.source_key);\n    const documentRemoved = cached.depth === 0 && input.fullyEnumeratedSourceKeys.has(cached.source_key);\n    if (sourceRemoved || documentRemoved) {\n      await unlinkIfExists(filePath).catch(() => undefined);\n    }\n  }\n}\n\nasync function markCachedSourceDocumentsStale(\n  inventory: CachedReferenceDocumentInventoryEntry[],\n  source: ReferenceIndexSource,\n  error: string,\n): Promise<StaleDocumentRoute[]> {\n  const sourceKey = referenceSourceKey(source);\n  const routes: StaleDocumentRoute[] = [];\n  for (const { filePath, cached } of inventory) {\n    if (cached.version !== 1 || cached.source_key !== sourceKey) continue;\n    const stale: CachedReferenceDocument = { ...cached, status: \"stale\", error };\n    await writeFileAtomically(filePath, `${JSON.stringify(stale, null, 2)}\\n`);\n    routes.push({\n      sourceId: source.id,\n      sourceKey,\n      title: cached.title,\n      doc: cached.doc,\n      kind: cached.kind,\n      depth: cached.depth,\n      parentTitle: cached.parent_title,\n      contentSha256: cached.content_sha256,\n      error,\n    });\n  }\n  return routes;\n}\n\nasync function readCachedDocument(cacheDir: string, documentKey: string): Promise<CachedReferenceDocument | null> {\n  try {\n    const parsed = JSON.parse(await readFile(documentCachePath(cacheDir, documentKey), \"utf8\")) as CachedReferenceDocument;\n    if (parsed?.version !== 1 || parsed.document_key !== documentKey) return null;\n    if (typeof parsed.content !== \"string\" || parsed.content_sha256 !== sha256(parsed.content)) return null;\n    return parsed;\n  } catch {\n    return null;\n  }\n}\n\nfunction cachedDocumentCoversLimit(cached: CachedReferenceDocument, requestedLimit: number): boolean {\n  if (cached.content_truncated === false) return true;\n  return cached.content_truncated === true\n    && typeof cached.content_char_limit === \"number\"\n    && cached.content_char_limit >= requestedLimit;\n}\n\nfunction indexedDocumentFromCache(cached: CachedReferenceDocument, ref: DocumentReference, charLimit: number): IndexedDocument {\n  return {\n    sourceId: ref.sourceId,\n    sourceKey: ref.sourceKey ?? cached.source_key,\n    sourceType: ref.sourceType ?? cached.source_type,\n    title: ref.title || cached.title,\n    doc: ref.doc,\n    content: cached.content.slice(0, charLimit).trim(),\n    kind: cached.kind,\n    depth: ref.depth ?? cached.depth,\n    parentTitle: ref.parentTitle ?? cached.parent_title,\n  };\n}\n\nfunction documentCachePath(cacheDir: string, documentKey: string): string {\n  return path.join(cacheDir, `${sha256(documentKey)}.json`);\n}\n\nasync function writeIfMissing(filePath: string, content: string): Promise<void> {\n  await writeFile(filePath, content, { flag: \"wx\" }).catch((error) => {\n    if ((error as NodeJS.ErrnoException)?.code !== \"EEXIST\") throw error;\n  });\n}\n\nfunction sourceId(index: number): string {\n  return `src-${String(index).padStart(3, \"0\")}`;\n}\n\nfunction referenceSourceDigest(sources: ReferenceIndexSource[]): string {\n  const stableProjection = sources\n    .map((source) => ({ key: referenceSourceKey(source), type: source.type }))\n    .sort((left, right) => left.key.localeCompare(right.key));\n  return sha256(JSON.stringify(stableProjection));\n}\n\nfunction isRemotelyCheckableSource(source: ReferenceIndexSource): boolean {\n  return source.type === \"feishu_drive_folder\" || source.type === \"feishu_doc\" || source.type === \"feishu_wiki\";\n}\n\nfunction withRemoteFreshness(\n  manifest: ReferenceIndexManifest,\n  sources: ReferenceIndexSource[],\n  checkedAt: Date,\n  sourceDigest: string,\n  freshness: { status: \"fresh\" | \"degraded\"; error?: string },\n): ReferenceIndexManifest {\n  return {\n    ...manifest,\n    sources,\n    checked_at: checkedAt.toISOString(),\n    next_check_at: nextRemoteCheckAt(\n      checkedAt,\n      sourceDigest,\n      freshness.status === \"degraded\" ? REMOTE_FAILURE_RETRY_MS : REMOTE_FRESHNESS_TTL_MS,\n    ).toISOString(),\n    remote_freshness: freshness,\n  };\n}\n\nfunction preserveRemoteRevisions(\n  sources: ReferenceIndexSource[],\n  previousSources: ReferenceIndexSource[] | undefined,\n): ReferenceIndexSource[] {\n  return sources.map((source) => ({\n    ...source,\n    remote_revision: source.remote_revision\n      ?? previousSources?.find((previous) => referenceSourceKey(previous) === referenceSourceKey(source))?.remote_revision,\n  }));\n}\n\nfunction nextRemoteCheckAt(checkedAt: Date, sourceDigest: string, intervalMs: number): Date {\n  const sample = Number.parseInt(sourceDigest.slice(0, 8), 16) / 0xffffffff;\n  const jitter = (sample * 2 - 1) * REMOTE_FRESHNESS_JITTER_RATIO;\n  return new Date(checkedAt.getTime() + Math.round(intervalMs * (1 + jitter)));\n}\n\nasync function checkRemoteFreshness(input: {\n  sources: ReferenceIndexSource[];\n  manifest: ReferenceIndexManifest | null;\n  documentCacheDir: string;\n  maxFolderItems: number;\n  maxFolderConcurrency: number;\n  maxDocuments: number;\n  maxDocumentChars: number;\n  maxDocumentConcurrency: number;\n  runLarkCli: MaterializeReferenceIndexInput[\"runLarkCli\"];\n}): Promise<RemoteFreshnessCheck> {\n  const sources = input.sources.map((source) => ({ ...source }));\n  const previousSources = input.manifest?.sources ?? [];\n  const preloadedCommandResults = new Map<string, ReferenceIndexCommandResult>();\n  let changed = false;\n\n  const folderSources = sources.filter((candidate) => candidate.type === \"feishu_drive_folder\");\n  const folderProbeResults: Array<{\n    source: ReferenceIndexSource;\n    folder: Awaited<ReturnType<typeof listFolderDocumentReferences>>;\n  } | undefined> = new Array(folderSources.length);\n  await runWithConcurrency(folderSources.map((source, index) => ({ source, index })), input.maxFolderConcurrency, async ({ source, index }) => {\n    const folder = await listFolderDocumentReferences(source, input.maxFolderItems, async (args, label) => {\n      const result = await input.runLarkCli(args, label);\n      preloadedCommandResults.set(JSON.stringify(args), result);\n      return result;\n    });\n    folderProbeResults[index] = { source, folder };\n  });\n  const folderProbes = folderProbeResults.filter((probe): probe is NonNullable<typeof probe> => probe !== undefined);\n  const failedFolderProbe = folderProbes.find(({ folder }) => folder.error);\n  if (failedFolderProbe?.folder.error) {\n    return { kind: \"error\", error: `${failedFolderProbe.source.id}: remote metadata failed: ${failedFolderProbe.folder.error}` };\n  }\n\n  const permittedFolderDocumentKeys = new Set(dedupeDocumentReferences(\n    folderProbes.flatMap(({ folder }) => folder.references),\n  ).slice(0, input.maxDocuments).map(documentReferenceKey));\n  const inventory = await readDocumentCacheInventory(input.documentCacheDir);\n  const folderFallbacks: Array<{ source: ReferenceIndexSource; ref: DocumentReference; cached: CachedReferenceDocument | null }> = [];\n  const scheduledFolderDocumentKeys = new Set<string>();\n\n  for (const { source, folder } of folderProbes) {\n      const revision = folderRemoteRevision(folder.references);\n      const previousRevision = previousSources.find((candidate) => referenceSourceKey(candidate) === referenceSourceKey(source))?.remote_revision;\n      source.remote_revision = revision;\n      if (revision) {\n        if (revision !== previousRevision) changed = true;\n        continue;\n      }\n\n      const currentKeys = new Set(folder.references.map(documentReferenceKey));\n      if (inventory.some(({ cached }) => cached.source_key === referenceSourceKey(source)\n        && cached.depth === 0\n        && !currentKeys.has(cached.document_key))) changed = true;\n      for (const ref of folder.references) {\n        const documentKey = documentReferenceKey(ref);\n        if (!permittedFolderDocumentKeys.has(documentKey) || scheduledFolderDocumentKeys.has(documentKey)) continue;\n        scheduledFolderDocumentKeys.add(documentKey);\n        const cached = await readCachedDocument(input.documentCacheDir, documentKey);\n        if (ref.metadataFingerprint\n          && cached?.status === \"fresh\"\n          && cached.metadata_fingerprint === ref.metadataFingerprint\n          && cachedDocumentCoversLimit(cached, input.maxDocumentChars)) continue;\n        folderFallbacks.push({ source, ref, cached });\n      }\n  }\n\n  let folderFallbackError: string | undefined;\n  await runWithConcurrency(folderFallbacks, input.maxDocumentConcurrency, async ({ source, ref, cached }) => {\n    if (folderFallbackError) return;\n    const fetchArgs = documentFetchArgs(ref.doc);\n    const fetchResult = await input.runLarkCli(fetchArgs, `fetch ${ref.title}`);\n    if (fetchResult.code !== 0) {\n      folderFallbackError = `${source.id}: remote content fallback failed: ${compactCommandError(fetchResult)}`;\n      return;\n    }\n    preloadedCommandResults.set(JSON.stringify(fetchArgs), fetchResult);\n    const fullContentDigest = sha256(extractFetchedDocumentContent(fetchResult.stdout));\n    if (cached?.status !== \"fresh\"\n      || cached.full_content_sha256 !== fullContentDigest\n      || !cachedDocumentCoversLimit(cached, input.maxDocumentChars)) changed = true;\n  });\n  if (folderFallbackError) return { kind: \"error\", error: folderFallbackError };\n\n  for (const source of sources.filter((candidate) => candidate.type === \"feishu_doc\" || candidate.type === \"feishu_wiki\")) {\n    const metadata = await input.runLarkCli([\n      \"drive\",\n      \"metas\",\n      \"batch_query\",\n      \"--as\",\n      \"user\",\n      \"--data\",\n      JSON.stringify({\n        request_docs: [{\n          doc_token: source.token ?? source.url ?? source.title,\n          doc_type: remoteMetadataDocType(source),\n        }],\n        with_url: false,\n      }),\n      \"--format\",\n      \"json\",\n    ], `check ${source.title}`);\n    if (metadata.code !== 0) {\n      return { kind: \"error\", error: `${source.id}: remote metadata failed: ${compactCommandError(metadata)}` };\n    }\n\n    const revision = extractRemoteMetadataRevision(metadata.stdout);\n    const previousRevision = previousSources.find((candidate) => referenceSourceKey(candidate) === referenceSourceKey(source))?.remote_revision;\n    if (revision) {\n      source.remote_revision = revision;\n      if (previousRevision && previousRevision === revision) continue;\n      if (previousRevision && previousRevision !== revision) {\n        changed = true;\n        continue;\n      }\n    }\n\n    const doc = source.url ?? source.token ?? source.title;\n    const fetchArgs = documentFetchArgs(doc);\n    const fetchResult = await input.runLarkCli(fetchArgs, `fetch ${source.title}`);\n    if (fetchResult.code !== 0) {\n      return { kind: \"error\", error: `${source.id}: remote content fallback failed: ${compactCommandError(fetchResult)}` };\n    }\n    const documentKey = documentReferenceKey({\n      sourceId: source.id,\n      sourceKey: referenceSourceKey(source),\n      sourceType: source.type,\n      title: source.title,\n      doc,\n      url: source.url,\n      token: source.token,\n    });\n    const cached = await readCachedDocument(input.documentCacheDir, documentKey);\n    const fullContentDigest = sha256(extractFetchedDocumentContent(fetchResult.stdout));\n    if (cached?.status === \"fresh\"\n      && cached.full_content_sha256 === fullContentDigest\n      && cachedDocumentCoversLimit(cached, input.maxDocumentChars)) {\n      continue;\n    }\n    changed = true;\n    preloadedCommandResults.set(JSON.stringify(fetchArgs), fetchResult);\n  }\n\n  return {\n    kind: changed ? \"changed\" : \"unchanged\",\n    sources,\n    preloadedCommandResults,\n  };\n}\n\nfunction usePreloadedCommandResults(\n  runLarkCli: MaterializeReferenceIndexInput[\"runLarkCli\"],\n  preloaded: Map<string, ReferenceIndexCommandResult>,\n): MaterializeReferenceIndexInput[\"runLarkCli\"] {\n  return async (args, label) => {\n    const key = JSON.stringify(args);\n    const cached = preloaded.get(key);\n    if (cached) {\n      preloaded.delete(key);\n      return cached;\n    }\n    return runLarkCli(args, label);\n  };\n}\n\nfunction remoteMetadataDocType(source: ReferenceIndexSource): \"folder\" | \"docx\" | \"wiki\" {\n  if (source.type === \"feishu_drive_folder\") return \"folder\";\n  return source.type === \"feishu_wiki\" ? \"wiki\" : \"docx\";\n}\n\nfunction documentFetchArgs(doc: string): string[] {\n  return [\"docs\", \"+fetch\", \"--as\", \"user\", \"--doc\", doc, \"--doc-format\", \"markdown\", \"--format\", \"json\"];\n}\n\nfunction extractRemoteMetadataRevision(stdout: string): string | undefined {\n  const metas = findFirstObjectArray(parseLooseJson(stdout), [\"metas\"]);\n  return findFirstScalarValue(metas, [\n    \"latest_modify_time\",\n    \"revision_id\",\n    \"revision\",\n    \"modified_time\",\n    \"updated_at\",\n  ]);\n}\n\nfunction findFirstScalarValue(value: unknown, keys: string[]): string | undefined {\n  if (!value || typeof value !== \"object\") return undefined;\n  if (Array.isArray(value)) {\n    for (const child of value) {\n      const nested = findFirstScalarValue(child, keys);\n      if (nested) return nested;\n    }\n    return undefined;\n  }\n  const record = value as Record<string, unknown>;\n  for (const key of keys) {\n    const candidate = record[key];\n    if ((typeof candidate === \"string\" || typeof candidate === \"number\") && String(candidate).trim()) {\n      return String(candidate).trim();\n    }\n  }\n  for (const child of Object.values(record)) {\n    const nested = findFirstScalarValue(child, keys);\n    if (nested) return nested;\n  }\n  return undefined;\n}\n\nfunction remoteRevisionFingerprint(revision: string): string {\n  return sha256(`remote-revision:${revision}`);\n}\n\nfunction folderRemoteRevision(references: DocumentReference[]): string | undefined {\n  if (references.some((reference) => !reference.metadataFingerprint)) return undefined;\n  const revisions = references\n    .map((reference) => `${documentReferenceKey(reference)}:${reference.metadataFingerprint}`)\n    .sort();\n  return sha256(JSON.stringify(revisions));\n}\n\nfunction referenceSourceKey(source: ReferenceIndexSource): string {\n  const canonical = source.token\n    ?? source.path\n    ?? canonicalUrl(source.url)\n    ?? source.title.trim();\n  return `${source.type}:${canonical}`;\n}\n\nfunction canonicalUrl(value: string | undefined): string | undefined {\n  if (!value) return undefined;\n  try {\n    const parsed = new URL(value);\n    parsed.hash = \"\";\n    parsed.hostname = parsed.hostname.toLowerCase();\n    if (parsed.pathname.length > 1) parsed.pathname = parsed.pathname.replace(/\\/+$/, \"\");\n    parsed.searchParams.sort();\n    return parsed.toString();\n  } catch {\n    return value.trim();\n  }\n}\n\nfunction sha256(content: string | Buffer): string {\n  return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction shellQuoteForDoc(value: string): string {\n  return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction compactCommandError(result: ReferenceIndexCommandResult): string {\n  return [result.stderr.trim(), result.stdout.trim()].filter(Boolean).join(\"\\n\").slice(0, 500) || `exit ${result.code}`;\n}\n\nfunction parseLooseJson(text: string): unknown {\n  const trimmed = text.trim();\n  if (!trimmed) return null;\n  try {\n    return JSON.parse(trimmed);\n  } catch {\n    const objectStart = trimmed.search(/[{\\[]/);\n    if (objectStart < 0) return null;\n    const candidate = trimmed.slice(objectStart);\n    try {\n      return JSON.parse(candidate);\n    } catch {\n      return null;\n    }\n  }\n}\n\nasync function listFolderDocumentReferences(\n  source: ReferenceIndexSource,\n  maxFolderItems: number,\n  runLarkCli: MaterializeReferenceIndexInput[\"runLarkCli\"],\n): Promise<{\n  references: DocumentReference[];\n  coverage: ReferenceSourceCoverage;\n  pages: unknown[];\n  error?: string;\n}> {\n  const references: DocumentReference[] = [];\n  const pages: unknown[] = [];\n  let listedItemCount = 0;\n  let pageToken: string | undefined;\n  let truncated = false;\n  const seenPageTokens = new Set<string>();\n\n  while (listedItemCount < maxFolderItems) {\n    const remaining = maxFolderItems - listedItemCount;\n    const params = {\n      folder_token: source.token ?? source.url ?? \"\",\n      page_size: Math.min(50, remaining),\n      ...(pageToken ? { page_token: pageToken } : {}),\n    };\n    const result = await runLarkCli([\n      \"drive\",\n      \"files\",\n      \"list\",\n      \"--as\",\n      \"user\",\n      \"--params\",\n      JSON.stringify(params),\n      \"--format\",\n      \"json\",\n    ], `list ${source.id}${pageToken ? ` page ${pageToken}` : \"\"}`);\n    if (result.code !== 0) {\n      return {\n        references,\n        coverage: {\n          source_id: source.id,\n          source_key: referenceSourceKey(source),\n          listed_item_count: listedItemCount,\n          truncated,\n          skipped: false,\n        },\n        pages,\n        error: compactCommandError(result),\n      };\n    }\n\n    const parsed = parseLooseJson(result.stdout);\n    pages.push(parsed ?? { stdout: result.stdout });\n    const page = parseFolderPage(parsed);\n    const acceptedItems = page.items.slice(0, remaining);\n    references.push(...extractDocumentReferencesFromFolder(source, { files: acceptedItems }, acceptedItems.length));\n    listedItemCount += acceptedItems.length;\n\n    if (page.items.length > acceptedItems.length) truncated = true;\n    if (listedItemCount >= maxFolderItems) {\n      if (page.hasMore) truncated = true;\n      break;\n    }\n    if (!page.hasMore) break;\n    if (acceptedItems.length === 0) {\n      truncated = true;\n      break;\n    }\n    if (!page.nextPageToken) {\n      truncated = true;\n      break;\n    }\n    if (seenPageTokens.has(page.nextPageToken)) {\n      truncated = true;\n      break;\n    }\n    seenPageTokens.add(page.nextPageToken);\n    pageToken = page.nextPageToken;\n  }\n\n  return {\n    references,\n    coverage: {\n      source_id: source.id,\n      source_key: referenceSourceKey(source),\n      listed_item_count: listedItemCount,\n      truncated,\n      skipped: false,\n    },\n    pages,\n  };\n}\n\nfunction parseFolderPage(parsed: unknown): FolderPage {\n  return {\n    items: findFirstObjectArray(parsed, [\"files\", \"items\", \"records\"]),\n    nextPageToken: findFirstStringValue(parsed, [\"page_token\", \"next_page_token\", \"nextPageToken\"]),\n    hasMore: findFirstBooleanValue(parsed, [\"has_more\", \"hasMore\"]) ?? false,\n  };\n}\n\nfunction findFirstObjectArray(value: unknown, keys: string[]): Record<string, unknown>[] {\n  if (!value || typeof value !== \"object\") return [];\n  if (!Array.isArray(value)) {\n    const record = value as Record<string, unknown>;\n    for (const key of keys) {\n      const candidate = record[key];\n      if (Array.isArray(candidate)) return candidate.filter((item): item is Record<string, unknown> => Boolean(item) && typeof item === \"object\" && !Array.isArray(item));\n    }\n    for (const child of Object.values(record)) {\n      const nested = findFirstObjectArray(child, keys);\n      if (nested.length > 0) return nested;\n    }\n  }\n  return [];\n}\n\nfunction findFirstStringValue(value: unknown, keys: string[]): string | undefined {\n  if (!value || typeof value !== \"object\") return undefined;\n  if (Array.isArray(value)) {\n    for (const child of value) {\n      const nested = findFirstStringValue(child, keys);\n      if (nested) return nested;\n    }\n    return undefined;\n  }\n  const record = value as Record<string, unknown>;\n  for (const key of keys) {\n    const candidate = record[key];\n    if (typeof candidate === \"string\" && candidate.trim()) return candidate.trim();\n  }\n  for (const child of Object.values(record)) {\n    const nested = findFirstStringValue(child, keys);\n    if (nested) return nested;\n  }\n  return undefined;\n}\n\nfunction findFirstBooleanValue(value: unknown, keys: string[]): boolean | undefined {\n  if (!value || typeof value !== \"object\") return undefined;\n  if (Array.isArray(value)) {\n    for (const child of value) {\n      const nested = findFirstBooleanValue(child, keys);\n      if (nested !== undefined) return nested;\n    }\n    return undefined;\n  }\n  const record = value as Record<string, unknown>;\n  for (const key of keys) {\n    if (typeof record[key] === \"boolean\") return record[key] as boolean;\n  }\n  for (const child of Object.values(record)) {\n    const nested = findFirstBooleanValue(child, keys);\n    if (nested !== undefined) return nested;\n  }\n  return undefined;\n}\n\nfunction extractDocumentReferencesFromFolder(source: ReferenceIndexSource, parsed: unknown, maxFolderItems: number): DocumentReference[] {\n  const refs: DocumentReference[] = [];\n  const pageItems = findFirstObjectArray(parsed, [\"files\", \"items\", \"records\"]);\n  const candidates = pageItems.length > 0 ? pageItems : collectPlainObjects(parsed);\n  for (const item of candidates.slice(0, maxFolderItems)) {\n    const title = firstString(item, [\"name\", \"title\", \"file_name\", \"display_name\"]) ?? \"Untitled Feishu document\";\n    const rawType = firstString(item, [\"type\", \"file_type\", \"obj_type\", \"node_type\"]);\n    const url = firstString(item, [\"url\", \"link\", \"web_url\", \"docs_url\"]);\n    const token = firstString(item, [\"token\", \"file_token\", \"obj_token\", \"doc_token\", \"document_id\", \"wiki_token\"]);\n    const docFromUrl = url ? classifyUrl(url) : null;\n    const looksDocument = docFromUrl?.type === \"feishu_doc\" || docFromUrl?.type === \"feishu_wiki\" || /doc|wiki/i.test(rawType ?? \"\");\n    if (!looksDocument) continue;\n    const doc = url ?? token;\n    if (!doc) continue;\n    refs.push({\n      sourceId: source.id,\n      sourceKey: referenceSourceKey(source),\n      sourceType: source.type,\n      title,\n      doc,\n      url,\n      token,\n      type: rawType,\n      depth: 0,\n      metadataFingerprint: stableDocumentMetadataFingerprint(item),\n    });\n  }\n  return refs;\n}\n\nfunction collectPlainObjects(value: unknown): Record<string, unknown>[] {\n  const objects: Record<string, unknown>[] = [];\n  const visit = (current: unknown): void => {\n    if (!current || typeof current !== \"object\") return;\n    if (Array.isArray(current)) {\n      for (const item of current) visit(item);\n      return;\n    }\n    const record = current as Record<string, unknown>;\n    objects.push(record);\n    for (const child of Object.values(record)) {\n      if (child && typeof child === \"object\") visit(child);\n    }\n  };\n  visit(value);\n  return objects;\n}\n\nfunction firstString(record: Record<string, unknown>, keys: string[]): string | undefined {\n  for (const key of keys) {\n    const value = record[key];\n    if (typeof value === \"string\" && value.trim()) return value.trim();\n  }\n  return undefined;\n}\n\nfunction stableDocumentMetadataFingerprint(record: Record<string, unknown>): string | undefined {\n  const stableKeys = [\n    \"revision\",\n    \"revision_id\",\n    \"version\",\n    \"modified_time\",\n    \"modified_at\",\n    \"updated_at\",\n    \"update_time\",\n    \"edited_time\",\n  ];\n  const values: Array<[string, string]> = [];\n  for (const key of stableKeys) {\n    const value = record[key];\n    if (typeof value === \"string\" || typeof value === \"number\") values.push([key, String(value)]);\n  }\n  return values.length > 0 ? sha256(JSON.stringify(values)) : undefined;\n}\n\nfunction dedupeDocumentReferences(refs: DocumentReference[]): DocumentReference[] {\n  const seen = new Set<string>();\n  const deduped: DocumentReference[] = [];\n  for (const ref of refs) {\n    const key = documentReferenceKey(ref);\n    if (seen.has(key)) continue;\n    seen.add(key);\n    deduped.push(ref);\n  }\n  return deduped;\n}\n\nfunction documentReferenceKey(ref: DocumentReference): string {\n  const token = ref.token ?? classifyUrl(ref.url ?? ref.doc)?.token;\n  if (token) return `token:${token}`;\n  return `url:${canonicalUrl(ref.url ?? ref.doc) ?? ref.doc}`;\n}\n\nfunction shouldExpandLinkedReferences(doc: IndexedDocument): boolean {\n  return (doc.sourceType === \"feishu_doc\" || doc.sourceType === \"feishu_wiki\") && (doc.depth ?? 0) === 0 && doc.kind !== \"feedback\";\n}\n\nfunction extractLinkedDocumentReferencesFromContent(doc: IndexedDocument, maxRefs: number): DocumentReference[] {\n  const refs: DocumentReference[] = [];\n  const titleByUrl = new Map<string, string>();\n  const markdownLinkPattern = /\\[([^\\]\\n]{1,120})\\]\\((https?:\\/\\/[^)\\s]+)\\)/g;\n  for (const match of doc.content.matchAll(markdownLinkPattern)) {\n    const title = normalizeFactLine(match[1] ?? \"\");\n    const url = stripTrailingUrlPunctuation(match[2] ?? \"\");\n    if (title && url && !isGenericLinkTitle(title)) titleByUrl.set(url, title);\n  }\n  for (const [url, title] of extractLinkedDocumentTitlesFromTables(doc.content)) {\n    titleByUrl.set(url, title);\n  }\n\n  for (const rawUrl of extractUrls(doc.content)) {\n    const url = stripTrailingUrlPunctuation(rawUrl);\n    const classified = classifyUrl(url);\n    if (!classified || (classified.type !== \"feishu_doc\" && classified.type !== \"feishu_wiki\")) continue;\n    if ((classified.url ?? url) === doc.doc || classified.token === doc.doc) continue;\n    refs.push({\n      sourceId: doc.sourceId,\n      sourceKey: doc.sourceKey,\n      sourceType: classified.type,\n      title: titleByUrl.get(url) ?? classified.title,\n      doc: classified.url ?? classified.token ?? url,\n      url: classified.url,\n      token: classified.token,\n      type: classified.type,\n      depth: (doc.depth ?? 0) + 1,\n      parentTitle: doc.title,\n    });\n    if (refs.length >= maxRefs) break;\n  }\n  return refs;\n}\n\nfunction extractLinkedDocumentTitlesFromTables(content: string): Map<string, string> {\n  const titles = new Map<string, string>();\n  for (const rawLine of content.split(\"\\n\")) {\n    const line = rawLine.trim();\n    if (!line.startsWith(\"|\") || !line.endsWith(\"|\")) continue;\n    if (/^\\|[\\s:-]+\\|/.test(line)) continue;\n    const cells = line.split(\"|\").slice(1, -1).map((cell) => cell.trim());\n    for (let index = 0; index < cells.length; index += 1) {\n      const cell = cells[index] ?? \"\";\n      const url = extractUrls(cell).find((candidate) => {\n        const classified = classifyUrl(candidate);\n        return classified?.type === \"feishu_doc\" || classified?.type === \"feishu_wiki\";\n      });\n      if (!url) continue;\n      const normalizedUrl = stripTrailingUrlPunctuation(url);\n      const linkTitle = normalizeFactLine(cell.replace(/\\[[^\\]]+\\]\\([^)]+\\)/g, \"\").replace(normalizedUrl, \"\"));\n      const sameCellTitleMatch = /\\[([^\\]\\n]{1,120})\\]\\(https?:\\/\\/[^)\\s]+\\)/.exec(cell);\n      const sameCellTitle = normalizeFactLine(sameCellTitleMatch?.[1] ?? linkTitle);\n      const rowTitle = pickTableRowTitle(cells, index);\n      const title = rowTitle || (!isGenericLinkTitle(sameCellTitle) ? sameCellTitle : \"\");\n      if (title) titles.set(normalizedUrl, title);\n    }\n  }\n  return titles;\n}\n\nfunction pickTableRowTitle(cells: string[], linkCellIndex: number): string {\n  const candidates = [\n    ...cells.slice(0, linkCellIndex).reverse(),\n    ...cells.slice(linkCellIndex + 1),\n  ];\n  for (const rawCandidate of candidates) {\n    const candidate = normalizeFactLine(rawCandidate\n      .replace(/\\[[^\\]]+\\]\\([^)]+\\)/g, \"\")\n      .replace(/https?:\\/\\/\\S+/g, \"\"));\n    if (!candidate || candidate.length > 80) continue;\n    if (isGenericLinkTitle(candidate)) continue;\n    if (/^(\u6A21\u5757|\u6587\u6863|\u94FE\u63A5|\u5165\u53E3|\u5907\u6CE8|\u72B6\u6001|\u7C7B\u578B|\u8BF4\u660E|\u8D1F\u8D23\u4EBA|\u7EF4\u62A4\u4EBA)$/i.test(candidate)) continue;\n    return candidate;\n  }\n  return \"\";\n}\n\nfunction isGenericLinkTitle(title: string): boolean {\n  return /^(\u67E5\u770B|\u6253\u5F00|\u9605\u8BFB|\u70B9\u51FB)?\\s*(\u4E13\u9898)?\\s*(\u6587\u6863|\u94FE\u63A5|\u8BE6\u60C5|\u8D44\u6599|\u66F4\u591A)|^(here|link|document|details)$/i.test(title.trim());\n}\n\nfunction stripTrailingUrlPunctuation(value: string): string {\n  return value.replace(/[.,;:!?\uFF0C\u3002\uFF1B\u3001)\uFF09\\]}]+$/, \"\");\n}\n\nfunction extractFetchedDocumentContent(stdout: string): string {\n  const parsed = parseLooseJson(stdout);\n  if (!parsed) return stdout.trim();\n  const candidates: string[] = [];\n  const visit = (value: unknown, keyHint = \"\"): void => {\n    if (typeof value === \"string\") {\n      if (/markdown|content|text|body|raw/i.test(keyHint) || value.length > 200) candidates.push(value);\n      return;\n    }\n    if (!value || typeof value !== \"object\") return;\n    if (Array.isArray(value)) {\n      for (const item of value) visit(item, keyHint);\n      return;\n    }\n    for (const [key, child] of Object.entries(value as Record<string, unknown>)) visit(child, key);\n  };\n  visit(parsed);\n  return (candidates.sort((a, b) => b.length - a.length)[0] ?? JSON.stringify(parsed, null, 2)).trim();\n}\n\nfunction buildStaleQuickReferenceMarkdown(updatedAt: string, reason: string): string {\n  return [\n    \"# Quick Reference\",\n    \"\",\n    `Updated at: ${updatedAt}`,\n    \"Status: stale\",\n    \"\",\n    \"## No Trusted Quick Facts\",\n    \"\",\n    \"No shortcut facts extracted yet.\",\n    reason,\n    \"Do not answer from previously materialized facts. Read the current routed source after refresh succeeds.\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction buildStaleReferenceFactsMarkdown(updatedAt: string, reason: string): string {\n  return [\n    \"# Reference Facts\",\n    \"\",\n    `Updated at: ${updatedAt}`,\n    \"Status: stale\",\n    \"\",\n    \"## No Trusted Reference Facts\",\n    \"\",\n    \"No reference documents were fetched yet.\",\n    reason,\n    \"Previously materialized document content is not available for answers.\",\n    \"\",\n  ].join(\"\\n\");\n}\n\nfunction buildReferenceFactsMarkdown(documents: IndexedDocument[], updatedAt: string, maxFactsChars: number): string {\n  const lines = [\n    \"# Reference Facts\",\n    \"\",\n    `Updated at: ${updatedAt}`,\n    \"\",\n    \"Use this file as the first local lookup for questions that depend on configured reference material.\",\n    \"Do not quote source IDs or indexing details to users.\",\n    \"\",\n    \"## Answer Guards\",\n    \"\",\n    \"- Exact-name guard: if the user's product, model, policy, person, or process name does not appear exactly in this file, the quick reference, or the known exact names list, say the configured material has no explicit entry for it; do not infer from a similar name.\",\n    \"- Comparison guard: for difference/comparison questions, every compared name must be present in the configured material. If one side is missing, explain that the missing name is not covered instead of comparing it to the closest known item.\",\n    \"- Scope guard: answer from configured reference material first. If the configured material is silent and fallback search is allowed by the employee rules, state that the configured material did not cover it before using fallback information.\",\n    \"- Feedback guard: feedback, evaluation, retrospective, or mistake documents are for improving the index and memory; do not treat them as primary business facts unless a reference document confirms the same fact.\",\n    \"\",\n  ];\n  if (documents.length === 0) {\n    lines.push(\"## No indexed documents\", \"\", \"- No reference documents were fetched yet.\", \"\");\n    return lines.join(\"\\n\");\n  }\n  const referenceDocuments = documents.filter((doc) => doc.kind !== \"feedback\");\n  const feedbackDocuments = documents.filter((doc) => doc.kind === \"feedback\");\n  let remaining = maxFactsChars;\n  if (referenceDocuments.length > 0) {\n    lines.push(\"## Product Reference Documents\", \"\");\n    for (const doc of referenceDocuments) {\n      if (remaining <= 0) break;\n      const excerpt = sanitizeMarkdownExcerpt(doc.content).slice(0, remaining);\n      remaining -= excerpt.length;\n      lines.push(`### ${doc.title}`, \"\", `Source: ${doc.sourceId}`, \"\", excerpt, \"\");\n    }\n  }\n  if (feedbackDocuments.length > 0 && remaining > 0) {\n    lines.push(\"## Feedback And Retrospective Documents\", \"\");\n    lines.push(\"These documents may contain evaluation notes, corrections, or proposed improvements. Use them for retrospectives and candidate facts, not as primary product truth unless the same fact is confirmed in a product reference document.\", \"\");\n    for (const doc of feedbackDocuments) {\n      if (remaining <= 0) break;\n      const excerpt = sanitizeMarkdownExcerpt(doc.content).slice(0, remaining);\n      remaining -= excerpt.length;\n      lines.push(`### ${doc.title}`, \"\", `Source: ${doc.sourceId}`, \"\", excerpt, \"\");\n    }\n  }\n  return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nfunction buildQuickReferenceMarkdown(documents: IndexedDocument[], updatedAt: string): string {\n  const lines = [\n    \"# Quick Reference\",\n    \"\",\n    `Updated at: ${updatedAt}`,\n    \"\",\n    \"Use this file before reading the full `reference-facts.md`.\",\n    \"Pick the route below, then answer directly from the shortcut facts when they are explicit.\",\n    \"If a requested value is not explicit here, verify in `reference-facts.md` before answering.\",\n    \"Exact-name guard: do not treat similar product, model, policy, person, or process names as the same thing. If the exact requested name is missing from this file, reference-facts, and the known exact names list, say the configured material has no explicit entry for it.\",\n    \"Comparison guard: for difference/comparison questions, verify every compared name first. If one side is not listed, do not compare it to the closest known item.\",\n    \"Alias guard: when a structured row maps names across regions, versions, departments, or document titles, include the explicit mapped names before explaining differences.\",\n    \"\",\n    \"## Query Router\",\n    \"\",\n    \"| User intent | Primary lookup | Notes |\",\n    \"|-|-|-|\",\n  ];\n\n  const referenceDocuments = documents.filter((doc) => doc.kind !== \"feedback\");\n  const feedbackDocuments = documents.filter((doc) => doc.kind === \"feedback\");\n  for (const route of buildDocumentRoutes(referenceDocuments)) {\n    lines.push(`| ${route.intent} | ${route.lookup} | ${route.notes} |`);\n  }\n  if (feedbackDocuments.length > 0) {\n    lines.push(\"| \u8BC4\u6D4B\u3001\u65E5\u62A5\u3001\u590D\u76D8\u3001\u9519\u8BEF\u56DE\u7B54\u8BB0\u5F55 | reference-facts.md \u7684 Feedback And Retrospective Documents | \u53EA\u7528\u4E8E\u6539\u8FDB\u7D22\u5F15\u548C\u590D\u76D8\uFF0C\u4E0D\u4F5C\u4E3A\u5BA2\u670D\u4EA7\u54C1\u4E8B\u5B9E\u76F4\u63A5\u56DE\u7B54\u3002 |\");\n  }\n\n  lines.push(\"\", \"## Shortcut Facts\", \"\");\n  const shortcutGroups = [\n    ...buildKnownEntityGroups(referenceDocuments),\n    ...buildStructuredShortcutGroups(referenceDocuments),\n    ...buildShortcutFactGroups(referenceDocuments),\n  ];\n  if (shortcutGroups.length === 0) {\n    lines.push(\"- No shortcut facts extracted yet.\", \"\");\n  } else {\n    for (const group of shortcutGroups) {\n      lines.push(`### ${group.title}`, \"\");\n      for (const fact of group.facts) lines.push(`- ${fact}`);\n      lines.push(\"\");\n    }\n  }\n\n  return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nfunction buildKnownEntityGroups(documents: IndexedDocument[]): ShortcutFactGroup[] {\n  const entities = extractKnownEntities(documents, 80);\n  if (entities.length === 0) return [];\n  const facts: string[] = [];\n  for (let index = 0; index < entities.length; index += 12) {\n    facts.push(entities.slice(index, index + 12).join(\"\u3001\"));\n    if (facts.length >= 6) break;\n  }\n  return [{\n    title: \"Known Exact Names\",\n    facts: [\n      \"Use this list as a quick exact-name check before answering comparisons or identity-sensitive questions.\",\n      ...facts,\n    ],\n  }];\n}\n\nfunction extractKnownEntities(documents: IndexedDocument[], maxEntities: number): string[] {\n  const candidates: Array<{ value: string; priority: number; docIndex: number }> = [];\n  const seen = new Set<string>();\n  const entities: string[] = [];\n  const addCandidate = (value: string, priority: number, docIndex: number): void => {\n    const normalized = normalizeEntityName(value);\n    if (!normalized) return;\n    candidates.push({ value: normalized, priority, docIndex });\n  };\n\n  documents.forEach((doc, docIndex) => {\n    if (isRoutingOnlyDocument(doc)) return;\n    addCandidate(doc.title.replace(/^KB[-_\\s]*\\d+\\s*[:\uFF1A-]?\\s*/i, \"\"), 5, docIndex);\n    for (const heading of extractMarkdownHeadings(doc.content, 10)) addCandidate(heading, 4, docIndex);\n    for (const row of extractMarkdownTableRows(doc.content).slice(0, 100)) {\n      const rowPriority = isHighValueStructuredRow(row) ? 8 : 3;\n      for (const cell of row) {\n        for (const entity of splitEntityCell(cell)) addCandidate(entity, rowPriority, docIndex);\n      }\n    }\n  });\n\n  candidates\n    .sort((left, right) => {\n      if (right.priority !== left.priority) return right.priority - left.priority;\n      if (left.docIndex !== right.docIndex) return left.docIndex - right.docIndex;\n      return left.value.length - right.value.length;\n    })\n    .forEach((candidate) => {\n      const key = candidate.value.toLowerCase();\n      if (seen.has(key)) return;\n      seen.add(key);\n      entities.push(candidate.value);\n    });\n\n  return entities.slice(0, maxEntities);\n}\n\nfunction splitEntityCell(cell: string): string[] {\n  const clean = normalizeFactLine(cell)\n    .replace(/\\[[^\\]]{1,80}\\]\\((?:https?:\\/\\/)?[^)]+\\)/g, \" \")\n    .replace(/https?:\\/\\/\\S+/g, \" \")\n    .replace(/\\([^)]{0,30}\\)/g, \" \")\n    .replace(/\uFF08[^\uFF09]{0,30}\uFF09/g, \" \");\n  return clean\n    .split(/[\u3001,\uFF0C;\uFF1B/]|(?:\\s+\u6216\\s+)|(?:\\s+\u548C\\s+)|(?:\\s+\u4E0E\\s+)|(?:\\s+\u53CA\\s+)/)\n    .map((part) => part.trim())\n    .filter(Boolean);\n}\n\nfunction normalizeEntityName(value: string): string {\n  const normalized = normalizeFactLine(value)\n    .replace(/^[:\uFF1A-]+/, \"\")\n    .replace(/^(\u65E0|\u6682\u65E0|\u4E0D\u9002\u7528|N\\/A|\\/)$/i, \"\")\n    .trim();\n  if (!normalized) return \"\";\n  if (normalized.length < 2 || normalized.length > 60) return \"\";\n  if (/https?:|www\\.|feishu\\.cn|larksuite\\.com|docx|wiki|drive|folder/i.test(normalized)) return \"\";\n  if (/[\u3002\uFF01\uFF1F!?\uFF1B;]/.test(normalized)) return \"\";\n  if (/(\u652F\u6301|\u4E0D\u652F\u6301|\u53EF\u5F55\u5236|\u53EF\u67E5\u770B|\u7528\u4E8E|\u901A\u8FC7|\u7528\u6237|\u4E3B\u6253|\u9002\u5408|\u9700\u8981|\u65E0\u9700|\u5FC5\u987B|\u5EFA\u8BAE|\u5305\u62EC|\u4E0A\u9650|\u9650\u5236|\u542F\u52A8|\u8FDE\u63A5|\u64AD\u653E|\u6536\u5F55|\u7FFB\u8BD1\u540E\u7684|\u4E0D\u80FD|\u4ECD\u9700|\u6682\u65E0|\u9ED8\u8BA4)/.test(normalized)) return \"\";\n  if (/^(Source|Updated at|Quick Reference|Reference Facts|Product Reference Documents|Shortcut Facts|Structured Table Shortcuts)$/i.test(normalized)) return \"\";\n  if (/^(\u9002\u7528\u8303\u56F4|\u5F53\u524D\u5728\u552E|\u5DEE\u5F02\u7279\u6027|\u5907\u6CE8|\u8DEF\u5F84|\u5165\u53E3|\u6B65\u9AA4|\u8BF4\u660E|\u89C4\u5219|\u72B6\u6001|\u578B\u53F7|\u4EA7\u54C1\u7EBF|\u6743\u9650|\u7248\u672C|\u90E8\u95E8|\u54A8\u8BE2\u5BF9\u8C61)$/i.test(normalized)) return \"\";\n  const hasNameSignal = /[A-Za-z][A-Za-z0-9+-]*|\\d|[\\u4e00-\\u9fa5]{2,}/.test(normalized);\n  if (!hasNameSignal) return \"\";\n  return normalized;\n}\n\nfunction buildSourceMap(\n  sources: ReferenceIndexSource[],\n  documents: IndexedDocument[],\n  updatedAt: string,\n  staleDocuments: StaleDocumentRoute[] = [],\n  sourceCoverage: ReferenceSourceCoverage[] = [],\n): {\n  version: number;\n  updated_at: string;\n  sources: ReferenceIndexSource[];\n  source_coverage: ReferenceSourceCoverage[];\n  documents: Array<{\n    source_id: string;\n    title: string;\n    doc: string;\n    kind: IndexedDocumentKind;\n    depth: number;\n    parent_title?: string;\n    content_sha256: string;\n    status: \"fresh\" | \"stale\";\n    error?: string;\n  }>;\n} {\n  return {\n    version: 1,\n    updated_at: updatedAt,\n    sources,\n    source_coverage: sourceCoverage,\n    documents: [\n      ...documents.map((doc) => ({\n      source_id: doc.sourceId,\n      title: doc.title,\n      doc: doc.doc,\n      kind: doc.kind,\n      depth: doc.depth ?? 0,\n      parent_title: doc.parentTitle,\n      content_sha256: sha256(doc.content),\n      status: \"fresh\" as const,\n      })),\n      ...staleDocuments.map((doc) => ({\n        source_id: doc.sourceId,\n        title: doc.title,\n        doc: doc.doc,\n        kind: doc.kind,\n        depth: doc.depth,\n        parent_title: doc.parentTitle,\n        content_sha256: doc.contentSha256,\n        status: \"stale\" as const,\n        error: doc.error,\n      })),\n    ],\n  };\n}\n\nfunction buildDocumentRoutes(documents: IndexedDocument[]): Array<{ intent: string; lookup: string; notes: string }> {\n  const routes = documents.slice(0, 12).map((doc) => ({\n    intent: inferDocumentIntent(doc),\n    lookup: `${doc.title} in reference-facts.md`,\n    notes: inferDocumentRouteNote(doc),\n  }));\n  return routes.length > 0\n    ? routes\n    : [{ intent: \"\u53C2\u8003\u8D44\u6599\u95EE\u9898\", lookup: \"reference-facts.md\", notes: \"No route-specific document title was recognized.\" }];\n}\n\nfunction inferDocumentIntent(doc: IndexedDocument): string {\n  const title = doc.title.replace(/^KB[-_\\s]*\\d+\\s*[:\uFF1A-]?\\s*/i, \"\").trim();\n  if (title.length > 0 && title.length <= 40) return title;\n  const headings = extractMarkdownHeadings(doc.content, 2).map((heading) => heading.replace(/^KB[-_\\s]*\\d+\\s*[:\uFF1A-]?\\s*/i, \"\").trim());\n  const heading = headings.find((candidate) => candidate.length > 0 && candidate.length <= 40);\n  return heading ?? (title.slice(0, 40) || \"\u53C2\u8003\u8D44\u6599\");\n}\n\nfunction inferDocumentRouteNote(doc: IndexedDocument): string {\n  const sample = `${doc.title}\\n${doc.content.slice(0, 800)}`;\n  if (/(\u7248\u672C|version|\u5730\u533A|\u56FD\u5185|\u6D77\u5916|\u533A\u57DF|edition)/i.test(sample)) return \"\u5148\u786E\u8BA4\u7248\u672C\u3001\u5730\u533A\u3001\u5BF9\u8C61\u6216\u524D\u7F6E\u6761\u4EF6\u3002\";\n  if (/(\u53C2\u6570|\u89C4\u683C|\u7EED\u822A|\u91CD\u91CF|\u5BB9\u91CF|\u4EF7\u683C|\u5957\u9910|\u9650\u5236|\u4E0A\u9650|quota|limit|spec)/i.test(sample)) return \"\u6570\u503C\u5FC5\u987B\u4EE5\u8D44\u6599\u4E2D\u7684\u663E\u5F0F\u53E3\u5F84\u4E3A\u51C6\u3002\";\n  if (/(\u8DEF\u5F84|\u5165\u53E3|\u6B65\u9AA4|\u8BBE\u7F6E|\u914D\u7F6E|\u5B89\u88C5|\u6388\u6743|permission|setup)/i.test(sample)) return \"\u4F18\u5148\u7ED9\u53EF\u6267\u884C\u8DEF\u5F84\u6216\u64CD\u4F5C\u6B65\u9AA4\u3002\";\n  if (/(\u9690\u79C1|\u5B89\u5168|\u5408\u89C4|\u8BA4\u8BC1|policy|security|privacy)/i.test(sample)) return \"\u9AD8\u98CE\u9669\u53E3\u5F84\u4E0D\u80FD\u5916\u63A8\uFF0C\u8D44\u6599\u672A\u5199\u660E\u5219\u4FDD\u6301\u8C28\u614E\u3002\";\n  return \"\u5148\u7528\u672C\u5730\u7D22\u5F15\u5B9A\u4F4D\uFF0C\u518D\u6309\u539F\u8D44\u6599\u6838\u9A8C\u3002\";\n}\n\nfunction buildStructuredShortcutGroups(documents: IndexedDocument[]): ShortcutFactGroup[] {\n  const facts: string[] = [];\n  const seen = new Set<string>();\n  for (const doc of documents) {\n    if (isRoutingOnlyDocument(doc)) continue;\n    let perDocumentCount = 0;\n    const rows = extractMarkdownTableRows(doc.content)\n      .filter((row) => isHighValueStructuredRow(row))\n      .sort((left, right) => scoreStructuredRow(right) - scoreStructuredRow(left));\n    for (const row of rows) {\n      const fact = `${doc.title}: ${row.join(\" | \")}`;\n      const compact = fact.length > 320 ? `${fact.slice(0, 317)}...` : fact;\n      if (seen.has(compact)) continue;\n      seen.add(compact);\n      facts.push(compact);\n      perDocumentCount += 1;\n      if (perDocumentCount >= 3) break;\n      if (facts.length >= 8) break;\n    }\n    if (facts.length >= 8) break;\n  }\n  return facts.length > 0 ? [{ title: \"Structured Table Shortcuts\", facts }] : [];\n}\n\nfunction extractMarkdownTableRows(content: string): string[][] {\n  const rows: string[][] = [];\n  for (const rawLine of content.split(\"\\n\")) {\n    const line = rawLine.trim();\n    if (!line.startsWith(\"|\") || !line.endsWith(\"|\")) continue;\n    if (/^\\|[\\s:-]+\\|/.test(line)) continue;\n    const cells = line.split(\"|\").slice(1, -1).map((cell) => normalizeFactLine(cell));\n    if (cells.length < 3 || cells.every((cell) => !cell)) continue;\n    rows.push(cells);\n  }\n  return rows;\n}\n\nfunction isHighValueStructuredRow(cells: string[]): boolean {\n  const joined = cells.join(\" \");\n  if (joined.length < 18 || joined.length > 900) return false;\n  const hasMappingSignal = cells.some((cell) => /[,\uFF0C\u3001/]|\u53CA|\u548C|\u4E0E/.test(cell) && /[A-Za-z0-9\\u4e00-\\u9fa5]/.test(cell));\n  const hasCapabilitySignal = /(\u652F\u6301|\u4E0D\u652F\u6301|\u4EC5|\u9700\u8981|\u9ED8\u8BA4|\u4E0A\u9650|\u7EED\u822A|\u5206\u949F|\u5C0F\u65F6|\u6743\u9650|\u7248\u672C|\u578B\u53F7|\u8BA4\u8BC1|\u5957\u9910|\u9000\u6B3E|\u9690\u79C1|\u5408\u89C4|\u8DEF\u5F84|\u5165\u53E3)/i.test(joined);\n  const hasEntitySignal = /([A-Z][A-Za-z0-9+-]{1,}|[a-z][A-Za-z0-9+-]{2,}|\\d)/.test(joined);\n  const metadataCellCount = cells.filter((cell) => isDateOrStatusCell(cell)).length;\n  const nonEmptyCellCount = cells.filter(Boolean).length;\n  const looksLikeEntityMappingTable = cells.length >= 4 && nonEmptyCellCount >= 3 && metadataCellCount === 0;\n  return hasEntitySignal && (hasMappingSignal || hasCapabilitySignal || looksLikeEntityMappingTable);\n}\n\nfunction scoreStructuredRow(cells: string[]): number {\n  const joined = cells.join(\" \");\n  let score = 0;\n  if (cells.length >= 4) score += 2;\n  const metadataCellCount = cells.filter((cell) => isDateOrStatusCell(cell)).length;\n  const mappingCellCount = cells.filter((cell) => !isDateOrStatusCell(cell) && /[,\uFF0C\u3001/]|\u53CA|\u548C|\u4E0E/.test(cell)).length;\n  const nonEmptyCellCount = cells.filter(Boolean).length;\n  if (cells.length >= 4 && metadataCellCount === 0 && nonEmptyCellCount >= 3) score += 5;\n  if (mappingCellCount > 0) score += 4 + mappingCellCount;\n  if (/(\u652F\u6301|\u4E0D\u652F\u6301|\u4EC5|\u9700\u8981|\u9ED8\u8BA4|\u4E0A\u9650|\u7EED\u822A|\u5206\u949F|\u5C0F\u65F6|\u6743\u9650|\u7248\u672C|\u578B\u53F7|\u8BA4\u8BC1|\u5957\u9910|\u9000\u6B3E|\u9690\u79C1|\u5408\u89C4|\u8DEF\u5F84|\u5165\u53E3)/i.test(joined)) {\n    score += 2;\n  }\n  if (/\\d/.test(joined)) score += 1;\n  score -= metadataCellCount * 3;\n  if (joined.length > 280) score -= 2;\n  return score;\n}\n\nfunction isDateOrStatusCell(cell: string): boolean {\n  return /^\\d{4}[-/]\\d{1,2}[-/]\\d{1,2}$/.test(cell) || /^(\u5728\u552E|\u5DF2\u505C\u4EA7|\u670D\u52A1\u4E2D|\u5728\u552E\\s*\\/\\s*\u670D\u52A1\u4E2D|active|inactive|deprecated)$/i.test(cell);\n}\n\nfunction buildShortcutFactGroups(documents: IndexedDocument[]): ShortcutFactGroup[] {\n  const groups: ShortcutFactGroup[] = [];\n  for (const doc of documents) {\n    if (isRoutingOnlyDocument(doc)) continue;\n    const facts = extractHighSignalLines(doc.content, 3);\n    if (facts.length === 0) continue;\n    groups.push({ title: doc.title, facts });\n  }\n  return groups.slice(0, 6);\n}\n\nfunction isRoutingOnlyDocument(doc: IndexedDocument): boolean {\n  return /KB[-_\\s]*00|\u77E5\u8BC6\u5E93\u8BF4\u660E|\u76EE\u5F55|\u7D22\u5F15|router|routing/i.test(doc.title);\n}\n\nfunction classifyIndexedDocumentKind(title: string, content: string): IndexedDocumentKind {\n  const sample = `${title}\\n${content.slice(0, 1200)}`;\n  if (/(\u65E5\u62A5|\u5468\u62A5|\u8BC4\u6D4B|\u6D4B\u8BD5\u7ED3\u679C|\u56DE\u7B54\u8D28\u91CF|\u8D28\u91CF\u62A5\u544A|\u9519\u8BEF\u56DE\u7B54|\u7EA0\u9519|\u590D\u76D8|slow quer|mistake|retro|evaluation|eval report|benchmark|stress test)/i.test(sample)) {\n    return \"feedback\";\n  }\n  return \"reference\";\n}\n\nfunction extractMarkdownHeadings(content: string, maxHeadings: number): string[] {\n  const headings: string[] = [];\n  for (const rawLine of content.split(\"\\n\")) {\n    const line = rawLine.trim();\n    const match = /^(#{1,4})\\s+(.+)$/.exec(line);\n    if (!match) continue;\n    const heading = normalizeFactLine(match[2] ?? \"\");\n    if (!heading || heading.length > 80) continue;\n    headings.push(heading);\n    if (headings.length >= maxHeadings) break;\n  }\n  return headings;\n}\n\nfunction extractHighSignalLines(content: string, maxLines: number): string[] {\n  const seen = new Set<string>();\n  const facts: string[] = [];\n  for (const rawLine of content.split(\"\\n\")) {\n    if (/^\\s{0,3}#{1,6}\\s+/.test(rawLine)) continue;\n    const line = normalizeFactLine(rawLine);\n    if (!line || line.length < 8 || line.length > 360) continue;\n    if (line.startsWith(\"|\")) continue;\n    if (!isGenericHighSignalLine(line)) continue;\n    if (seen.has(line)) continue;\n    seen.add(line);\n    facts.push(line);\n    if (facts.length >= maxLines) break;\n  }\n  return facts;\n}\n\nfunction isGenericHighSignalLine(line: string): boolean {\n  const hasEntityOrNumber = /([A-Z][A-Za-z0-9+-]{1,}|[a-z][A-Za-z0-9+-]{2,}|\\d)/.test(line);\n  const hasDecisionSignal = /(\u652F\u6301|\u4E0D\u652F\u6301|\u4EC5|\u4E0D\u80FD|\u9700\u8981|\u65E0\u9700|\u5FC5\u987B|\u9ED8\u8BA4|\u5EFA\u8BAE|\u9002\u5408|\u4E0A\u9650|\u9650\u5236|\u7EED\u822A|\u5BB9\u91CF|\u4EF7\u683C|\u5957\u9910|\u9000\u6B3E|\u8BA4\u8BC1|\u5408\u89C4|\u9690\u79C1|\u5B89\u5168|\u8DEF\u5F84|\u5165\u53E3|\u6B65\u9AA4|\u914D\u7F6E|\u6388\u6743|\u5B89\u88C5|\u5F00\u542F|\u5173\u95ED|download|install|enable|disable|must|only|limit|quota|support)/i.test(line);\n  const hasUnitOrContact = /(\\d+\\s*(\u5206\u949F|\u5C0F\u65F6|\u5929|GB|MB|KB|mAh|W|V|\u5143|\u6B21|%|mm|g)\\b|@|https?:\\/\\/)/i.test(line);\n  return hasDecisionSignal && (hasEntityOrNumber || hasUnitOrContact);\n}\n\nfunction normalizeFactLine(value: string): string {\n  return value\n    .replace(/^\\s{0,3}(?:[-*]|\\d+[.)])\\s+/, \"\")\n    .replace(/\\s+/g, \" \")\n    .trim();\n}\n\nfunction sanitizeMarkdownExcerpt(content: string): string {\n  return content\n    .replace(/\\r\\n/g, \"\\n\")\n    .replace(/\\n{4,}/g, \"\\n\\n\\n\")\n    .trim();\n}\n\nfunction buildReferenceErrorsMarkdown(warnings: string[], updatedAt: string): string {\n  const lines = [\n    \"# Reference Index Errors\",\n    \"\",\n    `Updated at: ${updatedAt}`,\n    \"\",\n  ];\n  if (warnings.length === 0) {\n    lines.push(\"- No indexing errors.\");\n  } else {\n    for (const warning of warnings) lines.push(`- ${warning}`);\n  }\n  return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nfunction buildIndexWithMaterializedSection(currentIndex: string | undefined, input: {\n  updatedAt: string;\n  quickReferencePath: string;\n  factsPath: string;\n  errorsPath: string;\n  indexedDocuments: IndexedDocument[];\n  warnings: string[];\n}): string {\n  const current = currentIndex ?? \"# Reference Index\\n\";\n  const section = [\n    MATERIALIZED_SECTION_START,\n    \"## Indexed Content\",\n    \"\",\n    `Updated at: ${input.updatedAt}`,\n    `Quick reference: ${input.quickReferencePath}`,\n    `Facts: ${input.factsPath}`,\n    `Errors: ${input.errorsPath}`,\n    `Indexed documents: ${input.indexedDocuments.length}`,\n    `Warnings: ${input.warnings.length}`,\n    \"\",\n    ...input.indexedDocuments.map((doc) => `- ${doc.title} (${doc.sourceId})`),\n    MATERIALIZED_SECTION_END,\n  ].join(\"\\n\");\n  const pattern = new RegExp(`${escapeRegExp(MATERIALIZED_SECTION_START)}[\\\\s\\\\S]*?${escapeRegExp(MATERIALIZED_SECTION_END)}`);\n  const next = pattern.test(current)\n    ? current.replace(pattern, section)\n    : `${current.trimEnd()}\\n\\n${section}\\n`;\n  return next.endsWith(\"\\n\") ? next : `${next}\\n`;\n}\n\nasync function runWithConcurrency<T>(items: T[], concurrency: number, worker: (item: T) => Promise<void>): Promise<void> {\n  const workers = Array.from({ length: Math.min(concurrency, items.length) }, async (_, workerIndex) => {\n    for (let index = workerIndex; index < items.length; index += concurrency) {\n      await worker(items[index]);\n    }\n  });\n  await Promise.all(workers);\n}\n\nfunction escapeRegExp(value: string): string {\n  return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n", "import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { stdin as defaultInput, stdout as defaultOutput } from \"node:process\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { PersistentRuntimeAdapter, RuntimeEvent, RuntimeRunResult } from \"../runtime/adapter\";\nimport type { RuntimeDoctorResult } from \"../runtime/doctor\";\nimport { doctorRuntimes } from \"../runtime/doctor\";\nimport { createPersistentRuntimeAdapter } from \"../runtime/registry\";\nimport { supportedRuntimeIds, type RuntimeId } from \"../runtime/capabilities\";\nimport {\n  clearLabServerCache,\n  createLabAIEmployee,\n  defaultLabRootDir,\n  defaultLabServerNamespace,\n  listLabAIEmployees,\n  readLastRuntimeSessionId,\n  recordLabRun,\n  type LabAIEmployee,\n} from \"./lab-store\";\nimport {\n  PromptDriver,\n  normalizeTerminalLine,\n  shouldUseTerminalEditing,\n} from \"./lab-prompts\";\nimport {\n  createLabUi,\n  formatTable,\n  heading,\n  kv,\n  shortPath,\n  statusLabel,\n  type LabUi,\n} from \"./lab-ui\";\n\nexport { normalizeTerminalLine, shouldUseTerminalEditing };\n\nexport interface InteractiveLabOptions {\n  rootDir?: string;\n  serverNamespace?: string;\n  input?: Readable;\n  output?: Writable;\n  timeoutMs?: number;\n  doctor?: typeof doctorRuntimes;\n  adapterFactory?: (runtime: RuntimeId) => PersistentRuntimeAdapter | undefined;\n}\n\ninterface LabContext {\n  rootDir: string;\n  serverNamespace: string;\n  prompt?: PromptDriver;\n  output: Writable;\n  input: Readable;\n  ui: LabUi;\n  timeoutMs: number;\n  doctors: RuntimeDoctorResult[];\n  doctor: typeof doctorRuntimes;\n  adapterFactory: (runtime: RuntimeId) => PersistentRuntimeAdapter | undefined;\n}\n\nexport async function runInteractiveLab(\n  options: InteractiveLabOptions = {}\n): Promise<void> {\n  const output = options.output ?? defaultOutput;\n  const outputIsTty = Boolean((output as { isTTY?: boolean }).isTTY);\n  const context: LabContext = {\n    rootDir: options.rootDir ?? defaultLabRootDir,\n    serverNamespace: options.serverNamespace ?? defaultLabServerNamespace,\n    input: options.input ?? defaultInput,\n    output,\n    ui: createLabUi({ color: outputIsTty && !process.env.NO_COLOR }),\n    timeoutMs: options.timeoutMs ?? 180000,\n    doctors: [],\n    doctor: options.doctor ?? doctorRuntimes,\n    adapterFactory: options.adapterFactory ?? createPersistentRuntimeAdapter,\n  };\n\n  try {\n    printHeader(context);\n    await clearLabServerCache(context.rootDir, context.serverNamespace);\n    writeLine(context, context.ui.dim(`cleared ${shortPath(path.join(context.rootDir, context.serverNamespace))}`));\n    context.doctors = await context.doctor();\n    printDoctors(context);\n    context.prompt = new PromptDriver(context.input, output);\n    await mainMenu(context);\n  } catch (error) {\n    if (isPromptExitError(error)) {\n      writeLine(context, \"\");\n      writeLine(context, context.ui.muted(\"closed\"));\n      return;\n    }\n    throw error;\n  } finally {\n    context.prompt?.close();\n  }\n}\n\nasync function mainMenu(context: LabContext): Promise<void> {\n  for (;;) {\n    const action = await choose(context, \"Main\", [\n      { label: \"Create AI employee\", value: \"create AI employee\" },\n      { label: \"List AI employees\", value: \"list AI employees\" },\n      { label: \"AIEmployee detail\", value: \"AI employee detail\" },\n      { label: \"Chat with AI employee\", value: \"chat with AI employee\" },\n      { label: \"Doctor runtimes\", value: \"doctor runtimes\" },\n      { label: \"Quit\", value: \"quit\" },\n    ]);\n\n    if (action === \"create AI employee\") {\n      await createAIEmployeeFlow(context);\n    } else if (action === \"list AI employees\") {\n      await listAIEmployeesFlow(context);\n    } else if (action === \"AI employee detail\") {\n      await aiEmployeeDetailFlow(context);\n    } else if (action === \"chat with AI employee\") {\n      await chatFlow(context);\n    } else if (action === \"doctor runtimes\") {\n      context.doctors = await context.doctor();\n      printDoctors(context);\n    } else {\n      return;\n    }\n  }\n}\n\nasync function createAIEmployeeFlow(context: LabContext): Promise<void> {\n  const runtime = await chooseRuntime(context);\n  const aiEmployeeName = await askRequired(context, \"AIEmployee name\");\n  const description = await askRequired(context, \"Description\");\n  const aiEmployee = await createLabAIEmployee({\n    rootDir: context.rootDir,\n    serverNamespace: context.serverNamespace,\n    runtime,\n    aiEmployeeName,\n    description,\n  });\n\n  writeLine(context, \"\");\n  writeLine(context, `${context.ui.good(\"created\")} ${aiEmployee.aiEmployeeName} ${context.ui.muted(`(${aiEmployee.aiEmployeeId})`)}`);\n  printAIEmployeeDetail(context, aiEmployee);\n}\n\nasync function listAIEmployeesFlow(context: LabContext): Promise<void> {\n  const aiEmployees = await listLabAIEmployees(context.rootDir, context.serverNamespace);\n  writeLine(context, \"\");\n  if (aiEmployees.length === 0) {\n    writeLine(context, context.ui.muted(\"No AI employees yet.\"));\n    return;\n  }\n  writeLine(context, heading(context.ui, \"AI Employees\"));\n  writeLine(context, formatTable([\n    [\"NAME\", \"RUNTIME\", \"STATUS\", \"CWD\"],\n    ...aiEmployees.map((aiEmployee) => {\n    const doctor = findDoctor(context, aiEmployee.runtime);\n      return [\n        aiEmployee.aiEmployeeName,\n        aiEmployee.runtime,\n        statusLabel(context.ui, doctor?.status ?? \"unknown\"),\n        shortPath(aiEmployee.cwd),\n      ];\n    }),\n  ]));\n}\n\nasync function aiEmployeeDetailFlow(context: LabContext): Promise<void> {\n  const aiEmployee = await selectAIEmployee(context);\n  if (!aiEmployee) return;\n  printAIEmployeeDetail(context, aiEmployee);\n}\n\nasync function chatFlow(context: LabContext): Promise<void> {\n  const aiEmployee = await selectAIEmployee(context);\n  if (!aiEmployee) return;\n  const adapter = context.adapterFactory(aiEmployee.runtime);\n  if (!adapter) {\n    writeLine(context, context.ui.bad(`runtime ${aiEmployee.runtime} does not support persistent execution`));\n    return;\n  }\n\n  writeLine(context, \"\");\n  writeLine(context, heading(context.ui, `Chat ${aiEmployee.aiEmployeeName} / ${aiEmployee.runtime}`));\n  writeLine(context, kv(context.ui, \"CWD\", shortPath(aiEmployee.cwd)));\n  writeLine(context, kv(context.ui, \"Exit\", \"exit, quit, /exit, /quit, /back\"));\n\n  try {\n    for (;;) {\n      const prompt = await ask(context, \"you\");\n      if (!prompt.trim()) continue;\n      if (isChatExitCommand(prompt)) return;\n\n      const renderer = createRealtimeRenderer(context);\n      writeLine(context, \"\");\n      writeLine(context, `${context.ui.muted(\"run\")} ${context.ui.warn(\"started\")}`);\n\n      if (!adapter.alive) {\n        const systemPrompt = await readFile(aiEmployee.workspace.systemPromptPath, \"utf8\");\n        const runtimeSessionId = await readLastRuntimeSessionId(aiEmployee);\n        if (runtimeSessionId) {\n          writeLine(context, `${context.ui.muted(\"session\")} resume ${runtimeSessionId}`);\n        }\n        await adapter.start({\n          aiEmployeeId: aiEmployee.aiEmployeeId,\n          cwd: aiEmployee.cwd,\n          systemPrompt,\n          systemPromptPath: aiEmployee.workspace.systemPromptPath,\n          runtimeSessionId,\n          timeoutMs: context.timeoutMs,\n          onEvent: renderer.onEvent,\n        });\n      }\n\n      const result = await adapter.prompt({\n        prompt,\n        timeoutMs: context.timeoutMs,\n      });\n      renderer.flush();\n      await printResultAndRecord(context, aiEmployee, prompt, result);\n    }\n  } finally {\n    adapter.destroy(\"interactive lab chat ended\");\n  }\n}\n\nfunction isChatExitCommand(value: string): boolean {\n  return [\"exit\", \"quit\", \"/exit\", \"/quit\", \"/back\"].includes(\n    value.trim().toLowerCase()\n  );\n}\n\nasync function printResultAndRecord(\n  context: LabContext,\n  aiEmployee: LabAIEmployee,\n  prompt: string,\n  result: RuntimeRunResult\n): Promise<void> {\n  writeLine(context, \"\");\n  writeLine(context, `${context.ui.muted(\"run\")} ${statusLabel(context.ui, result.status)}`);\n  if (result.runtimeSessionId) {\n    writeLine(context, `${context.ui.muted(\"session\")} ${result.runtimeSessionId}`);\n  }\n  if (result.finalMessage.trim()) {\n    writeLine(context, \"\");\n    writeLine(context, context.ui.muted(\"assistant final\"));\n    writeLine(context, result.finalMessage.trim());\n  }\n  if (result.errorMessage) {\n    writeLine(context, \"\");\n    writeLine(context, \"error:\");\n    writeLine(context, result.errorMessage);\n  }\n  const runPath = await recordLabRun({ aiEmployee, prompt, result });\n  writeLine(context, \"\");\n  writeLine(context, kv(context.ui, \"log\", shortPath(runPath)));\n  writeLine(context, kv(context.ui, \"AI employee dir\", shortPath(aiEmployee.workspace.aiEmployeeDir)));\n  writeLine(context, kv(context.ui, \"cwd\", shortPath(aiEmployee.cwd)));\n}\n\nasync function selectAIEmployee(context: LabContext): Promise<LabAIEmployee | undefined> {\n  const aiEmployees = await listLabAIEmployees(context.rootDir, context.serverNamespace);\n  if (aiEmployees.length === 0) {\n    writeLine(context, \"\");\n    writeLine(context, \"No AI employees yet. Create one first.\");\n    return undefined;\n  }\n  const value = await choose(\n    context,\n    \"Select AI employee\",\n    aiEmployees.map((aiEmployee) => ({\n      label: `${aiEmployee.aiEmployeeName} (${aiEmployee.runtime})`,\n      value: aiEmployee.aiEmployeeId,\n    }))\n  );\n  return aiEmployees.find((aiEmployee) => aiEmployee.aiEmployeeId === value);\n}\n\nasync function chooseRuntime(context: LabContext): Promise<RuntimeId> {\n  return choose(context, \"Runtime\", supportedRuntimeIds.map((runtime) => {\n    const doctor = findDoctor(context, runtime);\n    return {\n      label: `${runtime} ${statusLabel(context.ui, doctor?.status ?? \"unknown\")}${\n        doctor?.version ? ` ${context.ui.muted(doctor.version)}` : \"\"\n      }`,\n      value: runtime,\n    };\n  }));\n}\n\nfunction printDoctors(context: LabContext): void {\n  writeLine(context, \"\");\n  writeLine(context, heading(context.ui, \"Runtime adapters\"));\n  writeLine(context, formatTable([\n    [\"STATUS\", \"RUNTIME\", \"VERSION\"],\n    ...context.doctors.map((result) => [\n      statusLabel(context.ui, result.status),\n      result.runtime,\n      result.version ?? context.ui.muted(\"-\"),\n    ]),\n  ]));\n}\n\nfunction printAIEmployeeDetail(context: LabContext, aiEmployee: LabAIEmployee): void {\n  writeLine(context, \"\");\n  writeLine(context, heading(context.ui, \"AIEmployee\"));\n  writeLine(context, kv(context.ui, \"Name\", aiEmployee.aiEmployeeName));\n  writeLine(context, kv(context.ui, \"ID\", aiEmployee.aiEmployeeId));\n  writeLine(context, kv(context.ui, \"Description\", aiEmployee.description));\n  writeLine(context, kv(context.ui, \"Runtime\", aiEmployee.runtime));\n  writeLine(context, kv(context.ui, \"Server\", aiEmployee.serverNamespace));\n  writeLine(context, kv(context.ui, \"AIEmployee dir\", shortPath(aiEmployee.workspace.aiEmployeeDir)));\n  writeLine(context, kv(context.ui, \"CWD\", shortPath(aiEmployee.cwd)));\n  writeLine(context, \"\");\n  writeLine(context, heading(context.ui, \"Files\"));\n  writeLine(context, kv(context.ui, \"MEMORY\", shortPath(aiEmployee.workspace.memoryPath)));\n  writeLine(context, kv(context.ui, \"Notes\", shortPath(aiEmployee.workspace.notesDir)));\n  writeLine(context, kv(context.ui, \"Prompt\", shortPath(aiEmployee.workspace.systemPromptPath)));\n  writeLine(context, kv(context.ui, \"Sessions\", shortPath(aiEmployee.workspace.runtimeSessionsDir)));\n  writeLine(context, kv(context.ui, \"Wrapper\", shortPath(aiEmployee.workspace.wrapperPath)));\n}\n\nasync function choose<T extends string>(\n  context: LabContext,\n  title: string,\n  options: Array<{ label: string; value: T }>\n): Promise<T> {\n  if (!context.prompt) throw new Error(\"Interactive lab input is not initialized\");\n  return context.prompt.choose(\n    title,\n    options.map((option) => ({ name: option.label, value: option.value }))\n  );\n}\n\nasync function askRequired(context: LabContext, label: string): Promise<string> {\n  for (;;) {\n    const value = await ask(context, label);\n    if (value.trim()) return value.trim();\n    writeLine(context, `${label} is required.`);\n  }\n}\n\nasync function ask(context: LabContext, label: string): Promise<string> {\n  if (!context.prompt) throw new Error(\"Interactive lab input is not initialized\");\n  return context.prompt.inputText(label);\n}\n\nfunction findDoctor(\n  context: LabContext,\n  runtime: RuntimeId\n): RuntimeDoctorResult | undefined {\n  return context.doctors.find((item) => item.runtime === runtime);\n}\n\nfunction createRealtimeRenderer(context: LabContext): {\n  onEvent(event: RuntimeEvent): void;\n  flush(): void;\n} {\n  let stdoutBuffer = \"\";\n\n  return {\n    onEvent(event) {\n      if (event.type === \"assistant_delta\" && event.content) {\n        context.output.write(event.content);\n        return;\n      }\n      if (event.type === \"runtime_stdout\" && event.content) {\n        stdoutBuffer += event.content;\n        const lines = stdoutBuffer.split(/\\r?\\n/);\n        stdoutBuffer = lines.pop() ?? \"\";\n        for (const line of lines) {\n          renderRuntimeLine(context, line);\n        }\n        return;\n      }\n      if (event.type === \"runtime_stderr\" && event.content) {\n        writeLine(context, `[stderr] ${event.content.trim()}`);\n      }\n    },\n    flush() {\n      if (stdoutBuffer.trim()) {\n        renderRuntimeLine(context, stdoutBuffer);\n        stdoutBuffer = \"\";\n      }\n    },\n  };\n}\n\nfunction renderRuntimeLine(context: LabContext, line: string): void {\n  if (!line.trim()) return;\n  const text = extractTextFromRuntimeJsonLine(line);\n  if (text) {\n    writeLine(context, `assistant > ${text}`);\n    return;\n  }\n  writeLine(context, `[event] ${line}`);\n}\n\nfunction extractTextFromRuntimeJsonLine(line: string): string | undefined {\n  try {\n    const record = JSON.parse(line) as Record<string, unknown>;\n    const direct = stringValue(record.result ?? record.text ?? record.content);\n    if (direct) return direct;\n\n    const message = record.message as Record<string, unknown> | undefined;\n    const messageText = message\n      ? stringValue(message.text ?? message.content)\n      : undefined;\n    if (messageText) return messageText;\n    const content = Array.isArray(message?.content) ? message?.content : [];\n    const parts = content\n      .map((part) =>\n        typeof part === \"object\" && part\n          ? stringValue((part as Record<string, unknown>).text)\n          : undefined\n      )\n      .filter(Boolean);\n    return parts.length > 0 ? parts.join(\"\") : undefined;\n  } catch {\n    return line;\n  }\n}\n\nfunction stringValue(value: unknown): string | undefined {\n  return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction writeLine(context: LabContext, line: string): void {\n  context.output.write(`${line}\\n`);\n}\n\nfunction printHeader(context: LabContext): void {\n  writeLine(context, heading(context.ui, \"wm-daemon lab\"));\n  writeLine(context, kv(context.ui, \"Root\", shortPath(context.rootDir)));\n  writeLine(context, kv(context.ui, \"Server\", context.serverNamespace));\n  writeLine(context, \"\");\n}\n\nexport function isPromptExitError(error: unknown): boolean {\n  return (\n    error instanceof Error &&\n    (error.name === \"ExitPromptError\" ||\n      error.message.includes(\"force closed the prompt\") ||\n      error.message.includes(\"User force closed\"))\n  );\n}\n", "import { mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeRunResult } from \"../runtime/adapter\";\nimport type { RuntimeId } from \"../runtime/capabilities\";\nimport {\n  createAIEmployeeWorkspace,\n  type AIEmployeeWorkspace,\n} from \"../workspace/ai-employee-workspace\";\n\nexport const defaultLabRootDir = path.join(os.homedir(), \".wm\");\nexport const defaultLabServerNamespace = \"lab-local\";\n\nexport interface LabAIEmployee {\n  aiEmployeeId: string;\n  aiEmployeeName: string;\n  description: string;\n  runtime: RuntimeId;\n  cwd: string;\n  serverNamespace: string;\n  createdAt: string;\n  updatedAt: string;\n  workspace: AIEmployeeWorkspace;\n}\n\nexport interface CreateLabAIEmployeeInput {\n  rootDir: string;\n  serverNamespace: string;\n  runtime: RuntimeId;\n  aiEmployeeName: string;\n  description: string;\n  cwd?: string;\n  aiEmployeeId?: string;\n  now?: () => Date;\n}\n\nexport interface RecordLabRunInput {\n  aiEmployee: LabAIEmployee;\n  prompt: string;\n  result: RuntimeRunResult;\n  now?: () => Date;\n}\n\nconst labMetadataName = \"lab-ai-employee.json\";\nconst legacyLabMetadataName = \"lab-agent.json\";\n\nexport async function clearLabServerCache(\n  rootDir: string,\n  serverNamespace: string\n): Promise<void> {\n  await rm(path.join(rootDir, serverNamespace), { recursive: true, force: true });\n  await mkdir(path.join(rootDir, serverNamespace), { recursive: true });\n}\n\nexport async function createLabAIEmployee(input: CreateLabAIEmployeeInput): Promise<LabAIEmployee> {\n  const now = (input.now ?? (() => new Date()))().toISOString();\n  const aiEmployeeId = await findAvailableAIEmployeeId(\n    input.rootDir,\n    input.serverNamespace,\n    input.aiEmployeeId ?? slugifyAIEmployeeName(input.aiEmployeeName)\n  );\n  const workspace = await createAIEmployeeWorkspace({\n    rootDir: input.rootDir,\n    serverNamespace: input.serverNamespace,\n    serverId: `lab:${input.serverNamespace}`,\n    machineDirectoryName: input.serverNamespace,\n    aiEmployeeDirectoryName: aiEmployeeId,\n    daemonId: os.hostname() || \"local\",\n    aiEmployeeId,\n    aiEmployeeName: input.aiEmployeeName,\n    runtime: input.runtime,\n    role: input.description,\n  });\n  const cwd = input.cwd?.trim() || workspace.aiEmployeeDir;\n  await mkdir(cwd, { recursive: true });\n\n  const aiEmployee: LabAIEmployee = {\n    aiEmployeeId,\n    aiEmployeeName: input.aiEmployeeName,\n    description: input.description,\n    runtime: input.runtime,\n    cwd,\n    serverNamespace: input.serverNamespace,\n    createdAt: now,\n    updatedAt: now,\n    workspace,\n  };\n\n  await writeAIEmployeeMetadata(aiEmployee);\n  return aiEmployee;\n}\n\nexport async function listLabAIEmployees(\n  rootDir: string,\n  serverNamespace: string\n): Promise<LabAIEmployee[]> {\n  const serverDir = path.join(rootDir, serverNamespace);\n  const entries = await readdir(serverDir, { withFileTypes: true }).catch((error) => {\n    if (error?.code === \"ENOENT\") return [];\n    throw error;\n  });\n  const aiEmployees: LabAIEmployee[] = [];\n\n  for (const entry of entries) {\n    if (!entry.isDirectory()) continue;\n    const metadata = await readLabMetadata(serverDir, entry.name);\n    if (!metadata) continue;\n    aiEmployees.push(hydrateAIEmployee(JSON.parse(metadata) as StoredLabAIEmployee, rootDir));\n  }\n\n  return aiEmployees.sort((a, b) => a.aiEmployeeName.localeCompare(b.aiEmployeeName));\n}\n\nexport async function readLastRuntimeSessionId(\n  aiEmployee: LabAIEmployee\n): Promise<string | undefined> {\n  const sessionPath = path.join(\n    aiEmployee.workspace.runtimeSessionsDir,\n    `${aiEmployee.runtime}.json`\n  );\n  const raw = await readFile(sessionPath, \"utf8\").catch((error) => {\n    if (error?.code === \"ENOENT\") return undefined;\n    throw error;\n  });\n  if (!raw) return undefined;\n  const payload = JSON.parse(raw) as { runtimeSessionId?: unknown; status?: unknown };\n  return payload.status === \"ok\" && typeof payload.runtimeSessionId === \"string\"\n    ? payload.runtimeSessionId\n    : undefined;\n}\n\nexport async function recordLabRun(input: RecordLabRunInput): Promise<string> {\n  const at = (input.now ?? (() => new Date()))().toISOString();\n  const runId = at.replace(/[:.]/g, \"-\");\n  const runsDir = path.join(input.aiEmployee.workspace.wmDir, \"runs\");\n  const runPath = path.join(runsDir, `${runId}.jsonl`);\n  await mkdir(runsDir, { recursive: true });\n\n  const records = [\n    { type: \"prompt\", at, content: input.prompt },\n    ...input.result.events.map((event) => ({ ...event, at })),\n    {\n      type: \"final\",\n      at,\n      status: input.result.status,\n      content: input.result.finalMessage,\n      runtimeSessionId: input.result.runtimeSessionId,\n      errorMessage: input.result.errorMessage,\n    },\n  ];\n\n  await writeFile(\n    runPath,\n    `${records.map((record) => JSON.stringify(record)).join(\"\\n\")}\\n`,\n    \"utf8\"\n  );\n  await writeRuntimeSession(input.aiEmployee, input.result);\n  return runPath;\n}\n\nasync function writeRuntimeSession(\n  aiEmployee: LabAIEmployee,\n  result: RuntimeRunResult\n): Promise<void> {\n  await mkdir(aiEmployee.workspace.runtimeSessionsDir, { recursive: true });\n  await writeFile(\n    path.join(aiEmployee.workspace.runtimeSessionsDir, `${aiEmployee.runtime}.json`),\n    `${JSON.stringify(\n      {\n        runtime: aiEmployee.runtime,\n        status: result.status,\n        runtimeSessionId: result.runtimeSessionId,\n        updatedAt: new Date().toISOString(),\n        note:\n          result.status === \"ok\"\n            ? \"Runtime session handoff recorded by wm-daemon lab.\"\n            : result.errorMessage,\n      },\n      null,\n      2\n    )}\\n`,\n    \"utf8\"\n  );\n}\n\nasync function writeAIEmployeeMetadata(aiEmployee: LabAIEmployee): Promise<void> {\n  await writeFile(\n    path.join(aiEmployee.workspace.wmDir, labMetadataName),\n    `${JSON.stringify(toStoredAIEmployee(aiEmployee), null, 2)}\\n`,\n    \"utf8\"\n  );\n}\n\nasync function readLabMetadata(serverDir: string, directoryName: string): Promise<string | undefined> {\n  const wmDir = path.join(serverDir, directoryName, \".wm\");\n  for (const name of [labMetadataName, legacyLabMetadataName]) {\n    const metadata = await readFile(path.join(wmDir, name), \"utf8\").catch((error) => {\n      if (error?.code === \"ENOENT\") return undefined;\n      throw error;\n    });\n    if (metadata) return metadata;\n  }\n  return undefined;\n}\n\nasync function findAvailableAIEmployeeId(\n  rootDir: string,\n  serverNamespace: string,\n  preferred: string\n): Promise<string> {\n  const base = preferred || \"ai-employee\";\n  for (let index = 0; index < 1000; index += 1) {\n    const candidate = index === 0 ? base : `${base}-${index + 1}`;\n    const aiEmployees = await listLabAIEmployees(rootDir, serverNamespace);\n    if (!aiEmployees.some((aiEmployee) => aiEmployee.aiEmployeeId === candidate)) return candidate;\n  }\n  throw new Error(`Cannot allocate AI employee id for ${preferred}`);\n}\n\nfunction slugifyAIEmployeeName(name: string): string {\n  const slug = name\n    .trim()\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, \"-\")\n    .replace(/^-+|-+$/g, \"\");\n  return slug || \"ai-employee\";\n}\n\ninterface StoredLabAIEmployee {\n  aiEmployeeId: string;\n  aiEmployeeName: string;\n  description: string;\n  runtime: RuntimeId;\n  cwd: string;\n  serverNamespace: string;\n  createdAt: string;\n  updatedAt: string;\n}\n\nfunction toStoredAIEmployee(aiEmployee: LabAIEmployee): StoredLabAIEmployee {\n  return {\n    aiEmployeeId: aiEmployee.aiEmployeeId,\n    aiEmployeeName: aiEmployee.aiEmployeeName,\n    description: aiEmployee.description,\n    runtime: aiEmployee.runtime,\n    cwd: aiEmployee.cwd,\n    serverNamespace: aiEmployee.serverNamespace,\n    createdAt: aiEmployee.createdAt,\n    updatedAt: aiEmployee.updatedAt,\n  };\n}\n\nfunction hydrateAIEmployee(stored: StoredLabAIEmployee, rootDir: string): LabAIEmployee {\n  const serverDir = path.join(rootDir, stored.serverNamespace);\n  const aiEmployeeDir = path.join(serverDir, stored.aiEmployeeId);\n  const wmDir = path.join(aiEmployeeDir, \".wm\");\n  return {\n    ...stored,\n    workspace: {\n      serverDir,\n      aiEmployeeDir,\n      wmDir,\n      knowledgeDir: path.join(wmDir, \"knowledge\"),\n      referenceIndex: {\n        sourceCount: 0,\n        sources: [],\n      },\n      memoryPath: path.join(aiEmployeeDir, \"MEMORY.md\"),\n      notesDir: path.join(aiEmployeeDir, \"notes\"),\n      runtimeSessionsDir: path.join(wmDir, \"runtime-sessions\"),\n      runsDir: path.join(wmDir, \"runs\"),\n      aiEmployeeTokenPath: path.join(wmDir, \"ai-employee-token\"),\n      wrapperPath: path.join(wmDir, \"wm\"),\n      wrapperCliPath: path.join(wmDir, \"wm-cli.js\"),\n      platformSystemPromptPath: path.join(wmDir, \"platform-system-prompt.md\"),\n      employeeProfilePromptPath: path.join(wmDir, \"employee-profile-prompt.md\"),\n      systemPromptPath: path.join(wmDir, \"system-prompt.md\"),\n    },\n  };\n}\n", "import readline from \"node:readline\";\nimport type { Readable, Writable } from \"node:stream\";\n\ntype InquirerPrompts = typeof import(\"@inquirer/prompts\");\n\nexport class PromptDriver {\n  private readonly linePrompt: LinePrompt;\n  private readonly useInquirer: boolean;\n  private inquirerPromise: Promise<InquirerPrompts> | undefined;\n\n  constructor(private readonly input: Readable, private readonly output: Writable) {\n    this.useInquirer = shouldUseTerminalEditing(input, output);\n    this.linePrompt = new LinePrompt(input, output);\n  }\n\n  async choose<T extends string>(message: string, choices: Array<{ name: string; value: T }>): Promise<T> {\n    if (this.useInquirer) {\n      const prompts = await this.loadInquirer();\n      return prompts.select(\n        {\n          message,\n          choices,\n          pageSize: Math.min(Math.max(choices.length, 6), 12),\n        },\n        { input: this.input, output: this.output }\n      );\n    }\n\n    for (;;) {\n      this.output.write(`\\n${message}:\\n`);\n      choices.forEach((choice, index) => {\n        this.output.write(`  ${index + 1}. ${choice.name}\\n`);\n      });\n      const answer = await this.linePrompt.question(\"Choose > \");\n      const index = Number(answer.trim()) - 1;\n      if (Number.isInteger(index) && choices[index]) return choices[index].value;\n      this.output.write(\"Invalid choice.\\n\");\n    }\n  }\n\n  async inputText(message: string, options?: { required?: boolean }): Promise<string> {\n    for (;;) {\n      const value = this.useInquirer\n        ? await (await this.loadInquirer()).input(\n            { message, required: options?.required ?? false },\n            { input: this.input, output: this.output }\n          )\n        : await this.linePrompt.question(`${message}: `);\n      const normalized = normalizeTerminalLine(value);\n      if (!options?.required || normalized.trim()) return normalized.trim();\n      this.output.write(`${message} is required.\\n`);\n    }\n  }\n\n  close(): void {\n    this.linePrompt.close();\n  }\n\n  private loadInquirer(): Promise<InquirerPrompts> {\n    if (!this.inquirerPromise) {\n      const dynamicImport = new Function(\n        \"specifier\",\n        \"return import(specifier)\"\n      ) as (specifier: string) => Promise<InquirerPrompts>;\n      this.inquirerPromise = dynamicImport(\"@inquirer/prompts\");\n    }\n    return this.inquirerPromise;\n  }\n}\n\nclass LinePrompt {\n  private readonly rl: readline.Interface;\n  private readonly queued: string[] = [];\n  private readonly waiters: Array<(line: string) => void> = [];\n  private readonly terminalEditing: boolean;\n  private readonly inputWasRaw: boolean | undefined;\n  private closed = false;\n\n  constructor(private readonly input: Readable, private readonly output: Writable) {\n    this.terminalEditing = shouldUseTerminalEditing(input, output);\n    this.inputWasRaw = (input as { isRaw?: boolean }).isRaw;\n    if (this.terminalEditing) {\n      (input as { setRawMode?: (mode: boolean) => void }).setRawMode?.(true);\n    }\n    this.rl = readline.createInterface({\n      input,\n      output: this.terminalEditing ? output : undefined,\n      terminal: this.terminalEditing,\n    });\n    this.rl.on(\"line\", (line) => {\n      const normalizedLine = normalizeTerminalLine(line);\n      const waiter = this.waiters.shift();\n      if (waiter) {\n        waiter(normalizedLine);\n        return;\n      }\n      this.queued.push(normalizedLine);\n    });\n    this.rl.on(\"close\", () => {\n      this.closed = true;\n    });\n  }\n\n  question(label: string): Promise<string> {\n    const queued = this.queued.shift();\n    if (queued !== undefined) {\n      this.output.write(label);\n      this.output.write(\"\\n\");\n      return Promise.resolve(queued);\n    }\n    if (this.closed) {\n      return Promise.reject(new Error(\"Interactive input closed\"));\n    }\n    if (this.terminalEditing) {\n      this.rl.setPrompt(label);\n      this.rl.prompt();\n    } else {\n      this.output.write(label);\n    }\n    return new Promise((resolve, reject) => {\n      const onClose = () => {\n        reject(new Error(\"Interactive input closed\"));\n      };\n      this.rl.once(\"close\", onClose);\n      this.waiters.push((line) => {\n        this.rl.off(\"close\", onClose);\n        resolve(line);\n      });\n    });\n  }\n\n  close(): void {\n    if (this.terminalEditing && this.inputWasRaw !== undefined) {\n      (this.input as { setRawMode?: (mode: boolean) => void }).setRawMode?.(this.inputWasRaw);\n    }\n    this.rl.close();\n  }\n}\n\nexport function shouldUseTerminalEditing(input: Readable, output: Writable): boolean {\n  return Boolean(\n    (input as { isTTY?: boolean }).isTTY && (output as { isTTY?: boolean }).isTTY\n  );\n}\n\nexport function normalizeTerminalLine(line: string): string {\n  const chars: string[] = [];\n  for (const char of line) {\n    if (char === \"\\x7f\" || char === \"\\b\") {\n      chars.pop();\n      continue;\n    }\n    chars.push(char);\n  }\n  return chars.join(\"\");\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeDoctorResult } from \"../runtime/doctor\";\nimport type { RuntimeRunStatus } from \"../runtime/adapter\";\n\ntype ColorName = \"dim\" | \"accent\" | \"good\" | \"warn\" | \"bad\" | \"muted\" | \"strong\";\n\nconst codes: Record<ColorName, [number, number]> = {\n  dim: [2, 22],\n  accent: [36, 39],\n  good: [32, 39],\n  warn: [33, 39],\n  bad: [31, 39],\n  muted: [90, 39],\n  strong: [1, 22],\n};\n\nexport interface LabUi {\n  colorEnabled: boolean;\n  dim(value: string): string;\n  accent(value: string): string;\n  good(value: string): string;\n  warn(value: string): string;\n  bad(value: string): string;\n  muted(value: string): string;\n  strong(value: string): string;\n}\n\nexport function createLabUi(options?: { color?: boolean }): LabUi {\n  const colorEnabled = options?.color ?? !process.env.NO_COLOR;\n  const paint = (name: ColorName, value: string): string => {\n    if (!colorEnabled) return value;\n    const [open, close] = codes[name];\n    return `\\x1b[${open}m${value}\\x1b[${close}m`;\n  };\n  return {\n    colorEnabled,\n    dim: (value) => paint(\"dim\", value),\n    accent: (value) => paint(\"accent\", value),\n    good: (value) => paint(\"good\", value),\n    warn: (value) => paint(\"warn\", value),\n    bad: (value) => paint(\"bad\", value),\n    muted: (value) => paint(\"muted\", value),\n    strong: (value) => paint(\"strong\", value),\n  };\n}\n\nexport function heading(ui: LabUi, title: string): string {\n  return ui.accent(ui.strong(title));\n}\n\nexport function kv(ui: LabUi, key: string, value: string): string {\n  return `${ui.muted(key.padEnd(12))} ${value}`;\n}\n\nexport function statusLabel(\n  ui: LabUi,\n  status: RuntimeDoctorResult[\"status\"] | RuntimeRunStatus\n): string {\n  if (status === \"available\" || status === \"ok\") return ui.good(\"OK\");\n  if (status === \"not_installed\") return ui.bad(\"MISSING\");\n  if (status === \"not_logged_in\") return ui.warn(\"LOGIN\");\n  if (status === \"timeout\") return ui.warn(\"TIMEOUT\");\n  if (status === \"runtime_error\") return ui.bad(\"ERROR\");\n  if (status === \"unsupported_version\") return ui.warn(\"UNSUPPORTED\");\n  return ui.warn(\"UNKNOWN\");\n}\n\nexport function formatTable(rows: string[][], options?: { padding?: number }): string {\n  if (rows.length === 0) return \"\";\n  const padding = options?.padding ?? 2;\n  const widths = rows[0]?.map((_, index) =>\n    Math.max(...rows.map((row) => visibleLength(row[index] ?? \"\")))\n  ) ?? [];\n  return rows\n    .map((row) =>\n      row\n        .map((cell, index) => {\n          const suffix = index === row.length - 1 ? 0 : padding;\n          return `${cell}${\" \".repeat(widths[index] - visibleLength(cell) + suffix)}`;\n        })\n        .join(\"\")\n        .trimEnd()\n    )\n    .join(\"\\n\");\n}\n\nexport function shortPath(value: string): string {\n  const home = os.homedir();\n  if (value === home) return \"~\";\n  if (value.startsWith(`${home}${path.sep}`)) {\n    return path.join(\"~\", value.slice(home.length + 1));\n  }\n  return value;\n}\n\nexport function visibleLength(value: string): number {\n  return value.replace(/\\x1b\\[[0-9;]*m/g, \"\").length;\n}\n", "import os from \"node:os\";\nimport WebSocket from \"ws\";\nimport type { ContainerEngineInfo, ContainerRuntimeStatus, DaemonToServerMessage, MachineExecutionBackend, RuntimeId, ServerToDaemonMessage } from \"@claude-console/shared\";\nimport { supportedRuntimeIds } from \"../runtime/capabilities\";\nimport { doctorRuntimes } from \"../runtime/doctor\";\nimport packageJson from \"../../package.json\";\n\nexport class ServerConnection {\n  private ws?: WebSocket;\n  private reconnectTimer?: NodeJS.Timeout;\n  private terminateTimer?: NodeJS.Timeout;\n  private livenessTimer?: NodeJS.Timeout;\n  private lastServerMessageAt = 0;\n  private messageHandler: (msg: ServerToDaemonMessage) => void = () => {};\n  private stopped = false;\n  private reconnectAttempt = 0;\n\n  constructor(private readonly options: {\n    serverUrl: string;\n    apiKey: string;\n    spaceId?: string;\n    machineId?: string;\n    name?: string;\n    daemonVersion?: string;\n    daemonServiceMode?: \"temporary\" | \"persistent\" | \"unknown\";\n    executionBackend?: MachineExecutionBackend;\n    containerImage?: string;\n    containerRuntimeStatusProvider?: () => Promise<ContainerRuntimeStatus | undefined>;\n    runningAIEmployeesProvider?: () => string[];\n    wakeableAIEmployeesProvider?: () => NonNullable<Extract<DaemonToServerMessage, { type: \"ready\" }>[\"wakeableAIEmployees\"]>;\n    processedDeliveryIdsProvider?: () => string[];\n    runtimesProvider?: () => RuntimeId[] | Promise<RuntimeId[]>;\n    containerEngineProvider?: () => Promise<ContainerEngineInfo | null>;\n    log?: (line: string) => void;\n    reconnectBaseDelayMs?: number;\n    reconnectMaxDelayMs?: number;\n    serverLivenessTimeoutMs?: number;\n    serverLivenessCheckMs?: number;\n  }) {}\n\n  get connected(): boolean {\n    return this.ws?.readyState === WebSocket.OPEN;\n  }\n\n  connect(): void {\n    this.stopped = false;\n    this.log(`connecting server=${this.options.serverUrl}`);\n    this.open();\n  }\n\n  disconnect(): void {\n    this.stopped = true;\n    if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n    if (this.terminateTimer) clearTimeout(this.terminateTimer);\n    if (this.livenessTimer) clearInterval(this.livenessTimer);\n    this.reconnectTimer = undefined;\n    this.terminateTimer = undefined;\n    this.livenessTimer = undefined;\n    this.reconnectAttempt = 0;\n    this.log(\"disconnect requested\");\n    const socket = this.ws;\n    if (!socket) return;\n    if (socket.readyState === WebSocket.CLOSED) {\n      this.ws = undefined;\n      return;\n    }\n    socket.close(1000, \"daemon stopping\");\n    this.terminateTimer = setTimeout(() => {\n      if (socket.readyState !== WebSocket.CLOSED) socket.terminate();\n    }, 1_000);\n  }\n\n  send(msg: DaemonToServerMessage): void {\n    if (!this.connected) {\n      if (this.stopped) return;\n      this.log(`send skipped socket=closed msg=${summarizeDaemonMessage(msg)}`);\n      return;\n    }\n    if (shouldLogDaemonMessage(msg)) {\n      this.log(`send ${summarizeDaemonMessage(msg)}`);\n    }\n    this.ws?.send(JSON.stringify(msg));\n  }\n\n  onMessage(handler: (msg: ServerToDaemonMessage) => void): void {\n    this.messageHandler = handler;\n  }\n\n  private open(): void {\n    const url = new URL(\"/daemon/connect\", this.options.serverUrl.replace(/^http/, \"ws\"));\n    url.searchParams.set(\"key\", this.options.apiKey);\n    if (this.options.spaceId) url.searchParams.set(\"space_id\", this.options.spaceId);\n    const ws = new WebSocket(url);\n    this.ws = ws;\n    ws.on(\"open\", () => {\n      this.reconnectAttempt = 0;\n      this.lastServerMessageAt = Date.now();\n      this.log(`socket open url=${redactUrl(url)}`);\n      this.startServerLivenessWatch(ws);\n      void this.sendReady();\n    });\n    ws.on(\"message\", (raw: WebSocket.RawData) => {\n      this.lastServerMessageAt = Date.now();\n      const msg = JSON.parse(String(raw)) as ServerToDaemonMessage;\n      if (shouldLogServerMessage(msg)) {\n        this.log(`recv ${summarizeServerMessage(msg)}`);\n      }\n      if (msg.type === \"ping\") {\n        this.send({ type: \"pong\" });\n        return;\n      }\n      this.messageHandler(msg);\n    });\n    ws.on(\"close\", (code, reason) => {\n      if (this.ws === ws) this.ws = undefined;\n      if (this.livenessTimer) {\n        clearInterval(this.livenessTimer);\n        this.livenessTimer = undefined;\n      }\n      if (this.terminateTimer) {\n        clearTimeout(this.terminateTimer);\n        this.terminateTimer = undefined;\n      }\n      const reasonText = reason.toString() || \"-\";\n      this.log(`socket close code=${code} reason=${reasonText}`);\n      if (this.stopped) return;\n      if (code === 1008 && reasonText.includes(\"machine removed\")) {\n        this.stopped = true;\n        this.log(\"reconnect disabled reason=machine_removed\");\n        return;\n      }\n      this.scheduleReconnect();\n    });\n    ws.on(\"error\", (error) => {\n      this.log(`socket error ${error instanceof Error ? error.message : String(error)}`);\n      this.scheduleReconnect();\n    });\n  }\n\n  private async sendReady(): Promise<void> {\n    const [containerEngine, containerRuntimeStatus] = await Promise.all([\n      this.options.containerEngineProvider?.(),\n      this.options.containerRuntimeStatusProvider?.(),\n    ]);\n    this.send({\n      type: \"ready\",\n      capabilities: [\n        \"ai_employee:start\",\n        \"ai_employee:delivery-generation-v1\",\n        \"ai_employee:stop\",\n        \"ai_employee:deliver\",\n        \"ai_employee:reset-workspace\",\n        \"ai_employee:reset-workspace:memory-generation-v2\",\n        \"ai_employee:diagnostic\",\n        \"workspace:list\",\n        \"workspace:read\",\n        \"ai_employee:skills:list\",\n        \"machine:runtime_models:detect\",\n        \"machine:workspace:scan\",\n        \"machine:workspace:delete\",\n        \"reminder-cache\",\n        \"native_session_collaboration:v1\",\n      ],\n      runtimes: await this.detectAvailableRuntimes(),\n      runningAIEmployees: this.options.runningAIEmployeesProvider?.() ?? [],\n      wakeableAIEmployees: this.options.wakeableAIEmployeesProvider?.() ?? [],\n      processedDeliveryIds: this.options.processedDeliveryIdsProvider?.() ?? [],\n      machineId: this.options.machineId,\n      hostname: os.hostname() || \"local\",\n      name: this.options.name,\n      os: `${process.platform}/${process.arch}`,\n      daemonVersion: this.options.daemonVersion ?? packageJson.version,\n      daemonServiceMode: this.options.daemonServiceMode,\n      containerImage: this.options.containerImage,\n      containerRuntimeStatus,\n      sandboxCapable: containerEngine !== undefined ? containerEngine !== null : undefined,\n      containerEngine,\n    });\n  }\n\n  private async detectAvailableRuntimes(): Promise<RuntimeId[]> {\n    if (this.options.runtimesProvider) return this.options.runtimesProvider();\n    if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") return [\"codex\"];\n    try {\n      const results = await doctorRuntimes(supportedRuntimeIds as RuntimeId[]);\n      return results.filter((result) => result.detected).map((result) => result.runtime);\n    } catch (error) {\n      this.log(`runtime detection failed ${error instanceof Error ? error.message : String(error)}`);\n      return [];\n    }\n  }\n\n  private scheduleReconnect(): void {\n    if (this.stopped || this.reconnectTimer) return;\n    const delay = this.nextReconnectDelayMs();\n    this.log(`reconnect scheduled delay=${delay}ms`);\n    this.reconnectTimer = setTimeout(() => {\n      this.reconnectTimer = undefined;\n      this.open();\n    }, delay);\n  }\n\n  private startServerLivenessWatch(ws: WebSocket): void {\n    if (this.livenessTimer) clearInterval(this.livenessTimer);\n    const timeout = this.options.serverLivenessTimeoutMs ?? 75_000;\n    const interval = this.options.serverLivenessCheckMs ?? Math.max(5_000, Math.min(15_000, Math.floor(timeout / 3)));\n    this.livenessTimer = setInterval(() => {\n      if (this.stopped || this.ws !== ws) return;\n      if (Date.now() - this.lastServerMessageAt <= timeout) return;\n      this.log(`server liveness timeout elapsed=${Date.now() - this.lastServerMessageAt}ms`);\n      ws.terminate();\n    }, interval);\n  }\n\n  private nextReconnectDelayMs(): number {\n    const base = this.options.reconnectBaseDelayMs ?? 1_000;\n    const max = this.options.reconnectMaxDelayMs ?? 30_000;\n    const delay = Math.min(max, base * 2 ** this.reconnectAttempt);\n    this.reconnectAttempt += 1;\n    return delay;\n  }\n\n  private log(line: string): void {\n    this.options.log?.(`[connection] ${line}`);\n  }\n}\n\nfunction summarizeDaemonMessage(msg: DaemonToServerMessage): string {\n  const base = `type=${msg.type}`;\n  if (\"aiEmployeeId\" in msg) return `${base} ai_employee=${msg.aiEmployeeId}`;\n  return base;\n}\n\nfunction shouldLogDaemonMessage(msg: DaemonToServerMessage): boolean {\n  if (msg.type === \"pong\") return false;\n  return !(msg.type === \"ai_employee:activity\" && (msg.detail === \"assistant_delta\" || msg.detail === \"tool_progress\"));\n}\n\nfunction shouldLogServerMessage(msg: ServerToDaemonMessage): boolean {\n  return msg.type !== \"ping\";\n}\n\nfunction summarizeServerMessage(msg: ServerToDaemonMessage): string {\n  const base = `type=${msg.type}`;\n  if (\"aiEmployeeId\" in msg) return `${base} ai_employee=${msg.aiEmployeeId}`;\n  return base;\n}\n\nfunction redactUrl(url: URL): string {\n  const copy = new URL(url.toString());\n  if (copy.searchParams.has(\"key\")) copy.searchParams.set(\"key\", \"***\");\n  return copy.toString();\n}\n", "{\n  \"name\": \"@wagemule/daemon\",\n  \"version\": \"0.1.67\",\n  \"private\": false,\n  \"description\": \"NiuMa local daemon for connecting local agent runtimes to Workspace Server.\",\n  \"main\": \"./dist/main.cjs\",\n  \"bin\": {\n    \"wm-daemon\": \"dist/main.cjs\",\n    \"wm\": \"dist/main.cjs\",\n    \"niuma-collab\": \"dist/main.cjs\"\n  },\n  \"files\": [\n    \"assets\",\n    \"container\",\n    \"dist\",\n    \"README.md\",\n    \"package.json\"\n  ],\n  \"engines\": {\n    \"node\": \">=20\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"dev\": \"tsx watch src/main.ts\",\n    \"build\": \"node scripts/build.mjs\",\n    \"start\": \"node dist/main.cjs\",\n    \"prepack\": \"npm run build\",\n    \"pack:check\": \"node scripts/pack-check.mjs\",\n    \"test\": \"node --import tsx src/testing/test-entry-coverage.test.ts && node scripts/run-tests.mjs\",\n    \"test:real\": \"node --import tsx src/testing/integration-real.test.ts\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^20.0.0\",\n    \"@types/ws\": \"^8.0.0\",\n    \"tsx\": \"^4.0.0\",\n    \"typescript\": \"^5.4.0\"\n  },\n  \"dependencies\": {\n    \"@anthropic-ai/claude-agent-sdk\": \"^0.2.138\",\n    \"@inquirer/prompts\": \"^8.4.2\",\n    \"@larksuite/cli\": \"^1.0.56\",\n    \"commander\": \"^14.0.3\",\n    \"esbuild\": \"^0.25.0\",\n    \"ws\": \"^8.0.0\",\n    \"yaml\": \"^2.9.0\"\n  }\n}\n", "import { execFile, type ChildProcess } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { chmod, copyFile, mkdir, readdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type {\n  DaemonToServerMessage,\n  DeliveredMessage,\n  AIEmployeeRoutine,\n  AIEmployeeWorkContext,\n  AIEmployeeActivity,\n  AIEmployeeActivitySignal,\n  AIEmployeeMemoryStats,\n  AIEmployeeMemorySnapshotFile,\n  AIEmployeeTemplateSetupReasonCode,\n  AIEmployeeReferenceIndexReadiness,\n  MachineWorkspaceEntry,\n  RuntimeId,\n  RuntimeModelDescriptor,\n  RuntimeModelDetectionResult,\n  RuntimeSessionScope,\n  ServerToDaemonMessage,\n  AIEmployeeDiagnosticSnapshot,\n  ContainerEngineInfo,\n  ActivityEntry,\n  ReferenceIndexPrepareMode,\n  AnswerEvidenceLogPayload,\n} from \"@claude-console/shared\";\nimport { externalScope, formatDeliveredMessage, isFeishuIntegratedAIEmployeeTemplateKey } from \"@claude-console/shared\";\nimport { createPersistentRuntimeAdapter } from \"../runtime/registry\";\nimport type { PersistentRuntimeAdapter, RuntimeEvent, RuntimePermissionDecision, RuntimePermissionRequest, RuntimeRunResult } from \"../runtime/adapter\";\nimport { getRuntimeCapability } from \"../runtime/capabilities\";\nimport { RuntimeModelDetector } from \"../runtime/model-detector\";\nimport type { ExecutionBackend } from \"../runtime/execution-backend\";\nimport { hostBackend } from \"../runtime/execution-backend\";\nimport { ContainerBackend, containerNameForEmployee } from \"../runtime/container-backend\";\nimport { readRuntimeSessionDiagnostic, writeRuntimeSessionDiagnostic } from \"../runtime/session-diagnostics\";\nimport { isRuntimeSessionRecoveryFailure } from \"../runtime/session-recovery\";\nimport { ReminderCache } from \"../reminder/reminder-cache\";\nimport { EmployeeFileMutex } from \"./employee-file-mutex\";\nimport { RuntimeSlotManager } from \"./runtime-slot-manager\";\nimport { buildAllowlistedEnv } from \"./runtime-env-allowlist\";\nimport {\n  captureMemoryFingerprint,\n  collectMemorySnapshot,\n  createAIEmployeeWorkspace,\n  diffMemoryFingerprints,\n  finalizePromotedRetroStaging,\n  reconcileCommittedRetroStaging,\n  resolveAIEmployeeToolPolicy,\n  rebaseAIEmployeeWorkspace,\n  validateMemorySnapshotFiles,\n  type AIEmployeeRuntime,\n  type AIEmployeeWorkspace,\n  type MemoryFingerprintCache,\n  type MemoryPathOperationHooks,\n} from \"../workspace/ai-employee-workspace\";\nimport { materializeReferenceIndex, type MaterializeReferenceIndexResult } from \"../workspace/reference-index\";\nimport { ActivityTracker } from \"./activity-tracker\";\n\nexport function resolveReferenceIndexPrepareMode(input: {\n  materializeReferenceIndex?: boolean;\n  referenceIndexPrepareMode?: ReferenceIndexPrepareMode;\n}): ReferenceIndexPrepareMode {\n  return input.referenceIndexPrepareMode\n    ?? (input.materializeReferenceIndex === false ? \"skip\" : \"if-stale\");\n}\nimport { scanAgentSkills } from \"./skill-scanner\";\nimport { loadFeishuSessions, removeAllFeishuSessions, removeFeishuSession, saveFeishuSession } from \"./feishu-session-store\";\nimport { displayNameToWorkspaceDirectoryName, isSafeWorkspaceDirectoryName, namedWorkspaceDirectoryName, WorkspaceBrowser } from \"./workspace-browser\";\nimport { buildPlatformNoProxy, withPlatformProxyBypass } from \"../platform-proxy\";\nimport { AIEmployeeLocalProxy } from \"../agent-proxy/ai-employee-local-proxy\";\nimport { checkFeishuTemplateSetup, checkUserAuth, completeUserAuth, createFeishuRuntimeExecRunner, initFeishuCredential, initFeishuCredentialInRuntime, larkConfigDir, larkRuntimeHomeEnv, larkWorkspaceHomeEnv, startUserAuth } from \"../employee/lark-credential\";\nimport type { ExecRunner } from \"../employee/lark-credential\";\nimport { resolveLarkCliBinary, resolveLarkCliPackageVersion } from \"../employee/lark-cli-bin\";\nimport { feishuPersonalAgentChatListArgs } from \"../employee/feishu-personal-agent-poller\";\nimport { injectEmployeeSkills } from \"../skills/employee-skills\";\n\ntype TemplatePrepareRecorder = {\n  entries: ActivityEntry[];\n  step<T>(label: string, fn: () => Promise<T>): Promise<T>;\n};\n\ninterface RunningAIEmployee {\n  aiEmployeeId: string;\n  scopedKey: string;\n  workspace: AIEmployeeWorkspace;\n  sessionId?: string;\n  config: AIEmployeeConfig;\n  controller: AbortController;\n  adapter?: PersistentRuntimeAdapter;\n  runtimeSessionScope?: RuntimeSessionScope;\n  state?: \"busy\" | \"idle\" | \"stopping\" | \"error\";\n  runtimeEnv?: NodeJS.ProcessEnv;\n  launchId?: string;\n  stopped?: boolean;\n  done?: Promise<void>;\n  compacting?: boolean;\n  compactionStartedAt?: number;\n  compactionWatchdog?: ReturnType<typeof setTimeout>;\n  lastRuntimeEventAt?: number;\n}\n\ntype AIEmployeeConfig = Extract<ServerToDaemonMessage, { type: \"ai_employee:start\" }>[\"config\"];\n\nconst AI_EMPLOYEE_RUNTIME_TURN_TIMEOUT_MS = 300_000;\nconst MEMORY_SNAPSHOT_SERIALIZED_MESSAGE_LIMIT_BYTES = 8 * 1024 * 1024;\n\nfunction assertMemorySnapshotMessageWithinLimit(\n  message: Extract<DaemonToServerMessage, { type: \"ai_employee:memory_snapshot\" }>,\n): void {\n  const serializedByteLength = Buffer.byteLength(JSON.stringify(message), \"utf8\");\n  if (serializedByteLength > MEMORY_SNAPSHOT_SERIALIZED_MESSAGE_LIMIT_BYTES) {\n    throw new Error(`memory snapshot exceeds 8 MiB serialized message limit (${serializedByteLength} bytes)`);\n  }\n}\n\nfunction memorySnapshotIdentity(files: AIEmployeeMemorySnapshotFile[]): string {\n  return JSON.stringify(files.map((file) => ({\n    path: file.path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\"),\n    hash: file.hash,\n    byteLength: typeof file.byteLength === \"number\"\n      ? file.byteLength\n      : Buffer.byteLength(file.content, \"utf8\"),\n  })));\n}\ninterface StartRequest {\n  aiEmployeeId: string;\n  config: AIEmployeeConfig;\n  wakeMessage?: DeliveredMessage;\n  deliveredMessages?: DeliveredMessage[];\n  launchId?: string;\n  taskId?: string;\n}\n\ntype CodexPlatformReplyAttempt =\n  | { status: \"none\" | \"sent\" }\n  | { status: \"retryable\"; detail: string }\n  | { status: \"permanent\"; detail: string };\n\ntype CodexPlatformReplySettlement =\n  | { status: \"settled\" }\n  | { status: \"permanent\" | \"aborted\"; detail: string };\n\ntype WakeableAIEmployeeSnapshot = NonNullable<\n  Extract<DaemonToServerMessage, { type: \"ready\" }>[\"wakeableAIEmployees\"]\n>[number];\n\ntype ProcessedDeliveryMessage = Extract<DaemonToServerMessage, { type: \"ai_employee:deliver:processed\" }>;\n\ntype DeliveryReceipt =\n    | { deliveryId: string; status: \"accepted\"; updatedAt: number }\n    | { deliveryId: string; status: \"processed\"; updatedAt: number; messages: ProcessedDeliveryMessage[] };\n\ntype DeliveryReceiptLedger = {\n  version: 1;\n  receipts: DeliveryReceipt[];\n};\n\nexport function defaultRuntimeSlotLimits(input: {\n  freeMemoryBytes?: number;\n  globalLimit?: number;\n  perEmployeeLimit?: number;\n  idleTtlMs?: number;\n} = {}): { globalLimit: number; perEmployeeLimit: number; idleTtlMs?: number } {\n  const perEmployeeLimit = input.perEmployeeLimit ?? 5;\n  return {\n    globalLimit: input.globalLimit ?? Math.max(perEmployeeLimit, Math.floor((input.freeMemoryBytes ?? os.freemem()) / (500 * 1024 * 1024))),\n    perEmployeeLimit,\n    idleTtlMs: input.idleTtlMs,\n  };\n}\n\ninterface IdleAIEmployeeConfig {\n  aiEmployeeId: string;\n  config: AIEmployeeConfig;\n  sessionId?: string;\n  workspace?: AIEmployeeWorkspace;\n  runtimeSessionScope: RuntimeSessionScope;\n}\n\ninterface RuntimeModelDetectorLike {\n  detect(runtime: RuntimeId): Promise<RuntimeModelDetectionResult>;\n  detectAll?(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]>;\n}\n\nexport class AIEmployeeProcessManager {\n  // running/starting/preparingStarts/startingInboxes/runningInboxes \u5747\u4EE5 scopedKey\n  // \uFF08scopedAIEmployeeKey(aiEmployeeId, scope)\uFF09\u4E3A\u952E\uFF1A\u540C\u4E00\u5458\u5DE5\u4E0D\u540C scope \u662F\u76F8\u4E92\u72EC\u7ACB\u7684 runtime \u5B9E\u4F8B\u3002\n  // startCancellationEpochs \u4F8B\u5916\uFF1A\u4EE5 aiEmployeeId \u4E3A\u952E\u2014\u2014stop \u662F\u6574\u5458\u5DE5\u8BED\u4E49\uFF0C\n  // \u901A\u8FC7\u5355\u8C03 epoch \u53D6\u6D88\u8BE5\u5458\u5DE5 stop \u4E4B\u524D\u5DF2\u8FDB\u5165\u5F02\u6B65\u542F\u52A8\u94FE\u7684\u5168\u90E8 scope\u3002\n  private readonly running = new Map<string, RunningAIEmployee>();\n  private readonly starting = new Map<string, Promise<void>>();\n  private readonly preparingStarts = new Set<string>();\n  private readonly preparingStartStates = new Map<string, { epoch: number; settled: Promise<void>; resolve: () => void }>();\n  private readonly startingEpochs = new Map<string, number>();\n  private readonly startCancellationEpochs = new Map<string, number>();\n  private readonly idleConfigs = new Map<string, IdleAIEmployeeConfig>();\n  private readonly startingInboxes = new Map<string, DeliveredMessage[]>();\n  private readonly runningInboxes = new Map<string, DeliveredMessage[]>();\n  private readonly queuedLaunchIds = new Map<string, string>();\n  private readonly queuedTaskIds = new Map<string, string>();\n  private readonly queuedRuntimeScopes = new Map<string, RuntimeSessionScope>();\n  private readonly queuedRuntimeSessionIds = new Map<string, string>();\n  private readonly acceptedDeliveryIds = new Map<string, number>();\n  private readonly recoveredAcceptedDeliveryIds = new Map<string, number>();\n  private readonly processedDeliveryMessages = new Map<string, ProcessedDeliveryMessage[]>();\n  private readonly deliveryDispatchGenerations = new Map<string, number>();\n  private readonly disposeController = new AbortController();\n  private readonly stoppedLaunches = new Set<string>();\n  private readonly lastActivities = new Map<string, { activity: AIEmployeeActivity; detail: string; launchId?: string; clientSeq?: number }>();\n  private readonly lastWakeableSnapshots = new Map<string, WakeableAIEmployeeSnapshot>();\n  private readonly pendingMigrations = new Map<string, string>();\n  private readonly pendingPermissions = new Map<string, {\n    aiEmployeeId: string;\n    timeout: ReturnType<typeof setTimeout>;\n    resolve: (decision: RuntimePermissionDecision) => void;\n  }>();\n  private readonly fakeRuntimeChildren = new Map<string, ChildProcess>();\n  private readonly aiEmployeeLocalProxy: AIEmployeeLocalProxy;\n  private readonly aiEmployeeProxyHandles = new Map<string, { proxyUrl: string; proxyToken: string; proxyTokenFile: string }>();\n  private readonly userAuthSessions = new Map<string, { status: \"pending\" | \"authorized\" | \"expired\" | \"error\"; expiresAt: number; error?: string; openId?: string }>();\n  private readonly modelDetector: RuntimeModelDetectorLike;\n  private readonly executionBackend: ExecutionBackend;\n  private readonly sandboxExecutionBackend?: ExecutionBackend;\n  private readonly reminderCache = new ReminderCache();\n  private readonly memoryFingerprintCaches = new Map<string, MemoryFingerprintCache>();\n  private readonly suppressedMemoryFingerprintCaches = new Set<string>();\n  private readonly pendingMemorySnapshotAcks = new Map<string, {\n    timeout: ReturnType<typeof setTimeout>;\n    resolve: () => void;\n    reject: (error: Error) => void;\n  }>();\n  // scope \u5E76\u53D1\u540E\u540C\u5458\u5DE5\u591A\u5B9E\u4F8B\u53EF\u80FD\u540C\u65F6\u5199\u5458\u5DE5\u7EA7\u5171\u4EAB\u5E73\u53F0\u6587\u4EF6\uFF08runtime-env\u3001\n  // agent-proxy-token\u3001runtime-sessions/current.json \u7B49\uFF09\uFF0C\u7528\u8FDB\u7A0B\u5185\u5199\u9501\u4E32\u884C\u5316\u3002\n  private readonly employeeFileMutex = new EmployeeFileMutex();\n  private readonly templatePrepareMutex = new EmployeeFileMutex();\n  private readonly slotManager: RuntimeSlotManager;\n  private readonly idleEvictionTimer: ReturnType<typeof setInterval>;\n  private strandedDrainScheduled = false;\n  private readonly browser: WorkspaceBrowser;\n\n  constructor(\n    private readonly options: {\n      rootDir: string;\n      machineDisplayName: string;\n      sendToServer: (msg: DaemonToServerMessage) => void;\n      log?: (line: string) => void;\n      modelDetector?: RuntimeModelDetectorLike;\n      executionBackend?: ExecutionBackend;\n      sandboxExecutionBackend?: ExecutionBackend;\n      containerEngineProvider?: () => Promise<ContainerEngineInfo | null>;\n      slotLimits?: { globalLimit?: number; perEmployeeLimit?: number; idleTtlMs?: number };\n      resetWorkspaceOperations?: {\n        rename?: typeof rename;\n        remove?: typeof rm;\n        memoryRestoreHooks?: MemoryPathOperationHooks;\n      };\n      memorySnapshotAckTimeoutMs?: number;\n    }\n  ) {\n    this.loadDeliveryReceiptLedger();\n    this.modelDetector = options.modelDetector ?? new RuntimeModelDetector();\n    this.executionBackend = options.executionBackend ?? hostBackend();\n    this.sandboxExecutionBackend = options.sandboxExecutionBackend;\n    this.aiEmployeeLocalProxy = new AIEmployeeLocalProxy(this.sandboxExecutionBackend?.kind === \"container\"\n      ? {\n          bindHost: process.env.WM_DAEMON_CONTAINER_PROXY_BIND_HOST ?? \"0.0.0.0\",\n          advertiseHost: process.env.WM_DAEMON_CONTAINER_PROXY_ADVERTISE_HOST ?? \"host.docker.internal\",\n          log: (message) => this.log(message),\n        }\n      : { log: (message) => this.log(message) });\n    this.slotManager = new RuntimeSlotManager(defaultRuntimeSlotLimits(options.slotLimits));\n    this.idleEvictionTimer = setInterval(() => {\n      void this.evictExpiredIdleInstances();\n    }, 60_000);\n    this.idleEvictionTimer.unref?.();\n    this.browser = new WorkspaceBrowser({\n      rootDir: this.options.rootDir,\n      workspaceDirectoryForAIEmployee: (aiEmployeeId, serverNamespace, machineId) => {\n        const config = this.firstRunningEntryFor(aiEmployeeId)?.config ?? this.firstIdleConfigForAIEmployee(aiEmployeeId)?.config;\n        if (config) return this.resolveWorkspaceDirectory(config, aiEmployeeId);\n        if (serverNamespace && machineId) return this.resolveWorkspaceDirectoryForParts(machineId, machineId, aiEmployeeId, aiEmployeeId);\n        return undefined;\n      },\n    });\n    this.reminderCache.onFire((job) => {\n      this.options.sendToServer({\n        type: \"reminder.fire_attempt\",\n        reminderId: job.reminderId,\n        aiEmployeeId: job.ownerAIEmployeeId,\n        version: job.version,\n      });\n    });\n  }\n\n  private runtimeSessionScopeForConfig(config: AIEmployeeConfig): RuntimeSessionScope {\n    return config.runtimeSessionScope ?? externalScope(\"system\", \"default\");\n  }\n\n  private executionBackendForConfig(config?: Pick<AIEmployeeConfig, \"sandboxMode\">): ExecutionBackend {\n    if (config?.sandboxMode === \"container\" && this.sandboxExecutionBackend) return this.sandboxExecutionBackend;\n    return this.executionBackend;\n  }\n\n  private containerBackendForCleanup(): ExecutionBackend | undefined {\n    if (this.sandboxExecutionBackend?.kind === \"container\") return this.sandboxExecutionBackend;\n    if (this.executionBackend.kind === \"container\") return this.executionBackend;\n    return undefined;\n  }\n\n  private async destroySandboxContainerIfPresent(aiEmployeeId: string): Promise<void> {\n    const backend = this.containerBackendForCleanup();\n    if (backend) await backend.destroyEmployee(aiEmployeeId);\n  }\n\n  private scopedAIEmployeeKey(aiEmployeeId: string, scope: RuntimeSessionScope): string {\n    return `${aiEmployeeId}\\u0000${scope.type}\\u0000${scope.id}`;\n  }\n\n  private feishuChatIdFromScope(scope: RuntimeSessionScope | undefined): string | undefined {\n    if (scope?.type !== \"external\") return undefined;\n    if (scope.id.startsWith(\"feishu:\")) return scope.id.slice(\"feishu:\".length);\n    if (scope.id.startsWith(\"external:feishu:\")) return scope.id.slice(\"external:feishu:\".length);\n    return undefined;\n  }\n\n  private currentTurnContextFile(workspace: AIEmployeeWorkspace, config: AIEmployeeConfig): string {\n    const scope = this.runtimeSessionScopeForConfig(config);\n    const raw = `${scope.type}\\u0000${scope.id}`;\n    const hash = createHash(\"sha256\").update(raw).digest(\"hex\").slice(0, 16);\n    const readable = `${scope.type}-${scope.id}`.replace(/[^a-zA-Z0-9_.-]/g, \"_\").slice(0, 80);\n    return path.join(workspace.wmDir, \"current-turns\", `${readable}-${hash}.json`);\n  }\n\n  private scopedToolPolicyFile(workspace: AIEmployeeWorkspace, config: AIEmployeeConfig): string {\n    const scope = this.runtimeSessionScopeForConfig(config);\n    const hash = createHash(\"sha256\").update(`${scope.type}\\u0000${scope.id}`).digest(\"hex\").slice(0, 16);\n    return path.join(workspace.wmDir, \"tool-policies\", `${hash}.json`);\n  }\n\n  private scopedKeyPrefix(aiEmployeeId: string): string {\n    return `${aiEmployeeId}\\u0000`;\n  }\n\n  /** \u5458\u5DE5\u805A\u5408\u89C6\u56FE\uFF1A\u8BE5\u5458\u5DE5\u5F53\u524D\u5168\u90E8 per-scope running \u5B9E\u4F8B\u3002 */\n  private runningEntriesFor(aiEmployeeId: string): RunningAIEmployee[] {\n    const entries: RunningAIEmployee[] = [];\n    for (const entry of this.running.values()) {\n      if (entry.aiEmployeeId === aiEmployeeId) entries.push(entry);\n    }\n    return entries;\n  }\n\n  private firstRunningEntryFor(aiEmployeeId: string): RunningAIEmployee | undefined {\n    for (const entry of this.running.values()) {\n      if (entry.aiEmployeeId === aiEmployeeId) return entry;\n    }\n    return undefined;\n  }\n\n  private hasRunningFor(aiEmployeeId: string): boolean {\n    return this.firstRunningEntryFor(aiEmployeeId) !== undefined;\n  }\n\n  private startingKeysFor(aiEmployeeId: string): string[] {\n    const prefix = this.scopedKeyPrefix(aiEmployeeId);\n    const keys: string[] = [];\n    for (const key of this.starting.keys()) {\n      if (key.startsWith(prefix)) keys.push(key);\n    }\n    return keys;\n  }\n\n  private isPreparingFor(aiEmployeeId: string): boolean {\n    const prefix = this.scopedKeyPrefix(aiEmployeeId);\n    for (const key of this.preparingStarts) {\n      if (key.startsWith(prefix)) return true;\n    }\n    return false;\n  }\n\n  private isStartingFor(aiEmployeeId: string): boolean {\n    return this.startingKeysFor(aiEmployeeId).length > 0 || this.isPreparingFor(aiEmployeeId);\n  }\n\n  private inboxKeysFor(map: Map<string, DeliveredMessage[]>, aiEmployeeId: string): string[] {\n    const prefix = this.scopedKeyPrefix(aiEmployeeId);\n    const keys: string[] = [];\n    for (const key of map.keys()) {\n      if (key.startsWith(prefix)) keys.push(key);\n    }\n    return keys;\n  }\n\n  /** \u91CA\u653E\u5B9A\u65F6\u5668\uFF0C\u6D4B\u8BD5\u4E0E daemon \u5173\u95ED\u65F6\u8C03\u7528\u3002 */\n  dispose(): void {\n    clearInterval(this.idleEvictionTimer);\n    if (!this.disposeController.signal.aborted) this.disposeController.abort();\n    for (const pending of this.pendingMemorySnapshotAcks.values()) {\n      clearTimeout(pending.timeout);\n      pending.reject(new Error(\"daemon disposed before memory snapshot ACK\"));\n    }\n    this.pendingMemorySnapshotAcks.clear();\n    const queuedAIEmployeeIds = new Set<string>();\n    for (const key of [\n      ...this.starting.keys(),\n      ...this.preparingStarts,\n      ...this.startingInboxes.keys(),\n      ...this.runningInboxes.keys(),\n    ]) {\n      const aiEmployeeId = key.split(\"\\u0000\")[0];\n      if (aiEmployeeId) queuedAIEmployeeIds.add(aiEmployeeId);\n    }\n    for (const aiEmployeeId of queuedAIEmployeeIds) {\n      this.cancelPendingStarts(aiEmployeeId);\n      this.terminalizeQueuedMessages(aiEmployeeId, this.startingInboxes, \"daemon disposed while queued\");\n      this.terminalizeQueuedMessages(aiEmployeeId, this.runningInboxes, \"daemon disposed while queued\");\n    }\n    for (const running of this.running.values()) {\n      running.stopped = true;\n      if (running.launchId) this.stoppedLaunches.add(running.launchId);\n      running.controller.abort();\n      void Promise.resolve(running.adapter?.destroy(\"dispose\")).catch(() => undefined);\n      this.slotManager.release(running.aiEmployeeId, running.scopedKey);\n    }\n    this.running.clear();\n  }\n\n  private async evictExpiredIdleInstances(): Promise<void> {\n    for (const slot of this.slotManager.expiredIdle(Date.now())) {\n      await this.destroyIdleInstanceByKey(slot.employeeId, slot.scopedKey, \"idle ttl expired\");\n    }\n  }\n\n  /** destroy \u4E00\u4E2A idle/error per-scope \u5B9E\u4F8B\u5E76\u91CA\u653E slot\uFF1Bbusy/stopping \u5B9E\u4F8B\u4E0D\u5904\u7406\u3002 */\n  private async destroyIdleInstanceByKey(aiEmployeeId: string, scopedKey: string, reason: string): Promise<boolean> {\n    const entry = this.running.get(scopedKey);\n    // error \u72B6\u6001\uFF08runtime \u5DF2\u9000\u51FA\uFF09\u540C\u6837\u53EF\u6E05\u7406\uFF0C\u5426\u5219 slot \u6C38\u4E45\u5360\u7528\u4E14\u9A71\u9010\u5019\u9009\u53CD\u590D\u9009\u4E2D\u5B83\u3002\n    if (entry && entry.state !== \"idle\" && entry.state !== \"error\") return false;\n    // \u5148\u91CA\u653E slot \u518D await destroy\uFF1Adestroy \u671F\u95F4\u540C key \u53EF\u80FD\u88AB\u91CD\u65B0 acquire\uFF0C\n    // \u91CA\u653E\u653E\u5728 await \u4E4B\u540E\u4F1A\u628A\u65B0\u5360\u7528\u8BEF\u5220\u3002\n    if (this.slotManager.release(aiEmployeeId, scopedKey)) this.scheduleStrandedQueueDrain();\n    if (entry) {\n      this.running.delete(scopedKey);\n      await Promise.resolve(entry.adapter?.destroy(reason)).catch(() => undefined);\n    }\n    this.log(`runtime slot evicted ai_employee=${aiEmployeeId} reason=${reason}`);\n    return true;\n  }\n\n  /**\n   * \u4E3A scopedKey \u7533\u8BF7 runtime slot\uFF1B\u6EE1\u5458\u65F6\u5C1D\u8BD5\u9A71\u9010\u6700\u4E45 idle \u5B9E\u4F8B\uFF08\u540C\u5458\u5DE5\u4F18\u5148\uFF09\u540E\u91CD\u8BD5\u3002\n   * \u8FD4\u56DE false \u8868\u793A\u7533\u8BF7\u5931\u8D25\uFF0C\u8C03\u7528\u65B9\u5E94\u5C06\u6D88\u606F\u5165\u961F\u3002\n   */\n  private async acquireRuntimeSlot(aiEmployeeId: string, scopedKey: string, perEmployeeOverride?: number): Promise<boolean> {\n    let result = this.slotManager.tryAcquire(aiEmployeeId, scopedKey, perEmployeeOverride);\n    if (!result.ok && result.reason !== \"key_conflict\") {\n      const candidate = this.slotManager.evictionCandidate(result.reason === \"employee_limit\" ? aiEmployeeId : undefined);\n      if (candidate) {\n        await this.destroyIdleInstanceByKey(candidate.employeeId, candidate.scopedKey, `slot pressure (${result.reason})`);\n        result = this.slotManager.tryAcquire(aiEmployeeId, scopedKey, perEmployeeOverride);\n      }\n    }\n    if (!result.ok && result.reason === \"key_conflict\") {\n      // scopedKey \u542B employeeId\uFF0C\u7406\u8BBA\u4E0A\u4E0D\u53EF\u80FD\u8DE8\u5458\u5DE5\u51B2\u7A81\uFF1B\u51FA\u73B0\u8BF4\u660E\u8BB0\u8D26\u51FA bug\u3002\n      this.log(`[error] runtime slot key conflict ai_employee=${aiEmployeeId}`);\n      return false;\n    }\n    return result.ok;\n  }\n\n  private startCancellationEpoch(aiEmployeeId: string): number {\n    return this.startCancellationEpochs.get(aiEmployeeId) ?? 0;\n  }\n\n  private cancelPendingStarts(aiEmployeeId: string): void {\n    this.startCancellationEpochs.set(aiEmployeeId, this.startCancellationEpoch(aiEmployeeId) + 1);\n  }\n\n  private beginPreparingStart(scopedKey: string, epoch: number): void {\n    let resolve!: () => void;\n    const settled = new Promise<void>((done) => { resolve = done; });\n    this.preparingStarts.add(scopedKey);\n    this.preparingStartStates.set(scopedKey, { epoch, settled, resolve });\n  }\n\n  private finishPreparingStart(scopedKey: string): void {\n    this.preparingStarts.delete(scopedKey);\n    const state = this.preparingStartStates.get(scopedKey);\n    this.preparingStartStates.delete(scopedKey);\n    state?.resolve();\n  }\n\n  /** start/turn \u7ED3\u675F\u540E\u6838\u5BF9\uFF1AscopedKey \u5DF2\u4E0D\u5728 running/starting \u4E2D\u5219\u91CA\u653E slot\u3002 */\n  private syncSlotAfterRemoval(aiEmployeeId: string, scopedKey: string): void {\n    if (this.running.has(scopedKey) || this.starting.has(scopedKey) || this.preparingStarts.has(scopedKey)) return;\n    if (this.slotManager.release(aiEmployeeId, scopedKey)) this.scheduleStrandedQueueDrain();\n  }\n\n  /**\n   * I-3 \u515C\u5E95\uFF1Aglobal slot \u88AB\u5176\u4ED6\u5458\u5DE5\u5360\u6EE1\u65F6\u5165\u961F\u7684\u6D88\u606F\uFF0C\u6CA1\u6709\u5176\u4ED6 drain \u89E6\u53D1\u70B9\u2014\u2014\n   * Server \u5BF9\u5DF2 ack \u7684\u6295\u9012\u4E0D\u505A\u91CD\u6295\u9012\uFF08postgres-platform \u7684 ai_employee_delivery_needed\n   * \u53EA\u5728\u65B0\u6D88\u606F\u65F6\u89E6\u53D1\u4E00\u6B21\uFF09\uFF0CdrainQueuedMessagesAfterTurn \u53EA\u626B\u540C\u5458\u5DE5\u961F\u5217\u3002\n   * \u56E0\u6B64\u4EFB\u4F55 slot \u91CA\u653E\u6216\u5B9E\u4F8B\u8F6C idle\uFF08\u53EF\u88AB\u9A71\u9010\uFF09\u540E\uFF0C\u626B\u4E00\u904D\"\u6709\u6D88\u606F\u6392\u961F\u4F46\u65E0\u5B9E\u4F8B/\u65E0\u542F\u52A8\u4E2D\"\u7684\n   * scopedKey\uFF0C\u4EE3\u4E3A\u8865\u542F\u52A8\u3002setImmediate \u5408\u5E76\u540C\u4E00\u8F6E\u5185\u7684\u591A\u6B21\u89E6\u53D1\u3002\n   */\n  private scheduleStrandedQueueDrain(): void {\n    if (this.disposeController.signal.aborted) return;\n    if (this.strandedDrainScheduled) return;\n    this.strandedDrainScheduled = true;\n    setImmediate(() => {\n      this.strandedDrainScheduled = false;\n      if (this.disposeController.signal.aborted) return;\n      void this.drainStrandedQueues().catch((error) => {\n        this.log(`stranded queue drain failed error=${error instanceof Error ? error.message : String(error)}`);\n      });\n    });\n  }\n\n  private async drainStrandedQueues(): Promise<void> {\n    if (this.disposeController.signal.aborted) return;\n    for (const [key, pending] of [...this.runningInboxes.entries()]) {\n      if (pending.length === 0) continue;\n      if (this.running.has(key) || this.starting.has(key) || this.preparingStarts.has(key)) continue;\n      const scope = this.scopeFromScopedKey(key);\n      if (!scope) continue;\n      const aiEmployeeId = key.split(\"\\u0000\")[0];\n      const scopedIdle = this.idleConfigFor(aiEmployeeId, scope);\n      const fallbackConfig = scopedIdle?.config\n        ?? this.firstIdleConfigForAIEmployee(aiEmployeeId)?.config\n        ?? this.firstRunningEntryFor(aiEmployeeId)?.config;\n      if (!fallbackConfig) continue;\n      // \u5148\u786E\u8BA4\u62FF\u5F97\u5230 slot \u518D\u51FA\u961F\uFF0C\u907F\u514D\u5931\u8D25\u56DE\u63D2\u5BFC\u81F4\u961F\u5217\u4E71\u5E8F\uFF1B\u540C key acquire \u5E42\u7B49\uFF0C\n      // \u968F\u540E enqueueStart \u5185\u90E8\u7684 acquire \u76F4\u63A5\u547D\u4E2D\u3002\n      if (!(await this.acquireRuntimeSlot(aiEmployeeId, key, fallbackConfig.concurrencyLimit))) return;\n      const queued = pending.slice(0, 1);\n      const remaining = pending.slice(1);\n      if (remaining.length > 0) this.runningInboxes.set(key, remaining);\n      else this.runningInboxes.delete(key);\n      const firstQueuedKey = queued[0] ? queuedDeliveryMetadataKey(aiEmployeeId, queued[0]) : \"\";\n      const launchId = firstQueuedKey ? this.queuedLaunchIds.get(firstQueuedKey) : undefined;\n      const taskId = (firstQueuedKey ? this.queuedTaskIds.get(firstQueuedKey) : undefined) ?? queued[0]?.message_id;\n      const sessionId = (firstQueuedKey ? this.queuedRuntimeSessionIds.get(firstQueuedKey) : undefined)\n        ?? scopedIdle?.sessionId ?? scopedIdle?.config.sessionId;\n      if (queued[0]) this.clearQueuedMessageMetadata(aiEmployeeId, queued[0]);\n      this.log(`stranded queue drain ai_employee=${aiEmployeeId} scope=${scope.type}/${scope.id} pending=${pending.length}`);\n      await this.enqueueStart({\n        aiEmployeeId,\n        config: { ...fallbackConfig, sessionId, runtimeSessionScope: scope },\n        wakeMessage: queued[0],\n        deliveredMessages: queued,\n        launchId,\n        taskId,\n      }).catch((error) => {\n        const detail = error instanceof Error ? error.message : String(error);\n        this.sendDeliverProcessedForMessages(aiEmployeeId, queued, launchId, \"failed\", scope, detail);\n        this.log(`stranded queue start failed ai_employee=${aiEmployeeId} error=${detail}`);\n      });\n      // \u4E00\u6B21\u53EA\u8865\u4E00\u4E2A\uFF1A\u8BE5\u5B9E\u4F8B turn \u7ED3\u675F / slot \u518D\u91CA\u653E\u65F6\u4F1A\u63A5\u7740 drain \u4F59\u4E0B\u961F\u5217\u3002\n      return;\n    }\n  }\n\n  private idleConfigFor(aiEmployeeId: string, scope: RuntimeSessionScope): IdleAIEmployeeConfig | undefined {\n    return this.idleConfigs.get(this.scopedAIEmployeeKey(aiEmployeeId, scope));\n  }\n\n  private firstIdleConfigForAIEmployee(aiEmployeeId: string): IdleAIEmployeeConfig | undefined {\n    for (const idle of this.idleConfigs.values()) {\n      if (idle.aiEmployeeId === aiEmployeeId) return idle;\n    }\n    return undefined;\n  }\n\n  private setIdleConfig(aiEmployeeId: string, input: { config: AIEmployeeConfig; sessionId?: string; workspace?: AIEmployeeWorkspace }): void {\n    const runtimeSessionScope = this.runtimeSessionScopeForConfig(input.config);\n    this.idleConfigs.set(this.scopedAIEmployeeKey(aiEmployeeId, runtimeSessionScope), {\n      aiEmployeeId,\n      runtimeSessionScope,\n      config: input.config,\n      sessionId: input.sessionId,\n      workspace: input.workspace,\n    });\n    const feishuChatId = this.feishuChatIdFromScope(runtimeSessionScope);\n    if (input.sessionId && input.workspace && feishuChatId) {\n      const chatId = feishuChatId;\n      void saveFeishuSession(input.workspace.aiEmployeeDir, chatId, input.sessionId).catch(() => undefined);\n    }\n  }\n\n  private deleteIdleConfigForScope(aiEmployeeId: string, scope: RuntimeSessionScope): void {\n    const scopedKey = this.scopedAIEmployeeKey(aiEmployeeId, scope);\n    this.idleConfigs.delete(scopedKey);\n    this.lastWakeableSnapshots.delete(scopedKey);\n  }\n\n  private deleteIdleConfigsForAIEmployee(aiEmployeeId: string): void {\n    for (const [key, idle] of this.idleConfigs.entries()) {\n      if (idle.aiEmployeeId !== aiEmployeeId) continue;\n      this.idleConfigs.delete(key);\n      this.lastWakeableSnapshots.delete(key);\n      if (idle.workspace) {\n        void removeAllFeishuSessions(idle.workspace.aiEmployeeDir).catch(() => undefined);\n      }\n    }\n  }\n\n  getRunningAIEmployeeIds(): string[] {\n    const ids = new Set<string>();\n    for (const running of this.running.values()) {\n      if (running.state !== \"idle\") ids.add(running.aiEmployeeId);\n    }\n    return [...ids];\n  }\n\n  getProcessedDeliveryIds(): string[] {\n    return Array.from(this.processedDeliveryMessages.keys());\n  }\n\n  getWakeableAgents(): WakeableAIEmployeeSnapshot[] {\n    const persistentIdle = Array.from(this.running.values())\n      .filter((running) => running.state === \"idle\")\n      .map((running) => {\n        const remembered = this.lastWakeableSnapshots.get(running.scopedKey);\n        return {\n          ...remembered,\n          aiEmployeeId: running.aiEmployeeId,\n          sessionId: running.sessionId ?? remembered?.sessionId,\n          launchId: remembered?.launchId ?? running.launchId,\n          runtimeSessionScope: running.runtimeSessionScope ?? remembered?.runtimeSessionScope,\n        };\n      });\n    const cachedIdle = Array.from(this.idleConfigs.entries())\n      .filter(([key]) => !this.running.has(key) && !this.starting.has(key) && !this.preparingStarts.has(key))\n      .map(([key, idle]) => ({\n        ...this.lastWakeableSnapshots.get(key),\n        aiEmployeeId: idle.aiEmployeeId,\n        sessionId: idle.sessionId ?? this.lastWakeableSnapshots.get(key)?.sessionId,\n        runtimeSessionScope: idle.runtimeSessionScope,\n      }));\n    return [...persistentIdle, ...cachedIdle];\n  }\n\n  private sendAvailability(\n    message: Extract<DaemonToServerMessage, { type: \"ai_employee:availability\" }>\n  ): void {\n    if (message.daemonState === \"wakeable\" && message.turnOutcome && message.runtimeSessionScope) {\n      const scopedKey = this.scopedAIEmployeeKey(message.aiEmployeeId, message.runtimeSessionScope);\n      this.lastWakeableSnapshots.set(scopedKey, {\n        aiEmployeeId: message.aiEmployeeId,\n        sessionId: message.sessionId,\n        launchId: message.launchId,\n        runtimeSessionScope: message.runtimeSessionScope,\n        turnOutcome: message.turnOutcome,\n        failureReason: message.failureReason,\n        workspaceReady: message.workspaceReady,\n      });\n    }\n    this.options.sendToServer(message);\n  }\n\n  rememberRoutineConfig(aiEmployeeId: string, _routine: AIEmployeeRoutine, config: AIEmployeeConfig): void {\n    const running = this.running.get(this.scopedAIEmployeeKey(aiEmployeeId, this.runtimeSessionScopeForConfig(config)));\n    const idle = this.idleConfigFor(aiEmployeeId, this.runtimeSessionScopeForConfig(config)) ?? this.firstIdleConfigForAIEmployee(aiEmployeeId);\n    if (running) running.config = config;\n    this.setIdleConfig(aiEmployeeId, {\n      config,\n      sessionId: config.sessionId,\n      workspace: running?.workspace ?? idle?.workspace,\n    });\n  }\n\n  async prepareRoutineWorkspace(aiEmployeeId: string, routine: AIEmployeeRoutine, config: AIEmployeeConfig): Promise<void> {\n    this.rememberRoutineConfig(aiEmployeeId, routine, config);\n    const { workspace } = await this.ensureAIEmployeeWorkspace(aiEmployeeId, config, { refresh: true });\n    if (!workspace) return;\n    await this.writeRuntimeEnv(workspace, config, aiEmployeeId);\n    const runtimeEnv = this.buildRuntimeEnv(workspace, config, aiEmployeeId);\n    const executionBackend = this.executionBackendForConfig(config);\n    if (executionBackend.kind === \"container\") {\n      await executionBackend.prepareEmployee({\n        employeeId: aiEmployeeId,\n        workspaceDir: workspace.aiEmployeeDir,\n        runtime: config.runtime,\n        env: runtimeEnv,\n      });\n    }\n    await this.ensureWorkspaceTemplateTools(aiEmployeeId, config, workspace, executionBackend, runtimeEnv);\n  }\n\n  async handleEmployeeMessage(message: Extract<ServerToDaemonMessage, { type: \"ai_employee:skill:inject\" }>): Promise<void> {\n    try {\n      const running = this.firstRunningEntryFor(message.aiEmployeeId);\n      const idle = this.firstIdleConfigForAIEmployee(message.aiEmployeeId);\n      const config = running?.config ?? idle?.config;\n      if (!config) throw new Error(`AI employee config not found for employee runtime setup: ${message.aiEmployeeId}`);\n      const workspace = running?.workspace ?? idle?.workspace ?? await this.employeeFileMutex.withLock(message.aiEmployeeId, () => createAIEmployeeWorkspace({\n        rootDir: this.options.rootDir,\n        serverNamespace: config.serverNamespace,\n        serverId: config.spaceId,\n        machineDirectoryName: this.machineDirectoryName(config),\n        machineId: config.machineId,\n        aiEmployeeDirectoryName: this.aiEmployeeDirectoryName(config, message.aiEmployeeId),\n        daemonId: os.hostname() || \"local-daemon\",\n        aiEmployeeId: message.aiEmployeeId,\n        aiEmployeeName: config.aiEmployeeName,\n        runtime: config.runtime,\n        sandboxMode: config.sandboxMode,\n        role: config.role,\n        aiEmployeeWorkContext: config.aiEmployeeWorkContext,\n        profileRevision: config.profileRevision,\n        systemPromptRevision: config.systemPromptRevision,\n        memoryRestore: config.memoryRestore,\n        profileApplyGeneration: config.profileApplyGeneration,\n        learningCandidateSnapshot: config.learningCandidateSnapshot,\n      }));\n      this.setIdleConfig(message.aiEmployeeId, { config, sessionId: config.sessionId, workspace });\n      // \u5BB9\u5668\u6A21\u5F0F\u4E0B ensureWorkspaceTemplateTools \u5185\u90E8\u4F1A\u62A2 employeeFileMutex\uFF0C\n      // \u4E0D\u80FD\u5728 withLock \u91CC\u8C03\u2014\u2014\u5148\u5728\u9501\u5916\u88C5\u597D\u5DE5\u5177\uFF0C\u9501\u5185 fast-path \u76F4\u63A5\u8DF3\u8FC7\u3002\n      {\n        const eb = this.executionBackendForConfig(config);\n        if (eb.kind === \"container\" && isFeishuIntegratedAIEmployeeTemplateKey(config.aiEmployeeWorkContext?.templateKey)) {\n          const runtimeEnv = this.buildRuntimeEnv(workspace, config, message.aiEmployeeId);\n          await eb.prepareEmployee({ employeeId: message.aiEmployeeId, workspaceDir: workspace.aiEmployeeDir, runtime: config.runtime, env: runtimeEnv });\n          await this.ensureWorkspaceTemplateTools(message.aiEmployeeId, config, workspace, eb, runtimeEnv);\n        }\n      }\n      // skills \u76EE\u5F55\u4E0E lark credential \u662F\u5458\u5DE5\u7EA7\u5171\u4EAB\u6587\u4EF6\uFF0Cscope \u5E76\u53D1\u4E0B\u53EF\u80FD\n      // \u4E0E\u5176\u4ED6\u5199\u65B9\u7ADE\u4E89\uFF0C\u7EDF\u4E00\u8D70\u5458\u5DE5\u7EA7\u5199\u9501\u4E32\u884C\u5316\u3002\n      await this.employeeFileMutex.withLock(message.aiEmployeeId, async () => {\n        await injectEmployeeSkills({ workspaceDir: workspace.aiEmployeeDir, runtime: config.runtime, skills: message.skills });\n        await this.initFeishuCredentialForExecutionBackend(message.aiEmployeeId, config, workspace, message.feishu);\n      });\n      this.log(`employee runtime injected ai_employee=${message.aiEmployeeId} skills=${message.skills.join(\",\")}`);\n      this.options.sendToServer({ type: \"ai_employee:skill:inject/result\", requestId: message.requestId, aiEmployeeId: message.aiEmployeeId, ok: true });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:skill:inject/result\",\n        requestId: message.requestId,\n        aiEmployeeId: message.aiEmployeeId,\n        ok: false,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  async handleEmployeeTemplateSetupPrepare(message: Extract<ServerToDaemonMessage, { type: \"ai_employee:template_setup:prepare\" }>): Promise<void> {\n    const recorder = this.createTemplatePrepareRecorder();\n    try {\n      const referenceIndexPrepareMode = resolveReferenceIndexPrepareMode(message);\n      const result = await this.templatePrepareMutex.withLock(\n        message.aiEmployeeId,\n        () => this.prepareEmployeeTemplateRuntime({\n          aiEmployeeId: message.aiEmployeeId,\n          config: message.config,\n          skills: message.skills,\n          feishu: message.feishu,\n          referenceIndexPrepareMode,\n          recorder,\n        }),\n      );\n      this.log(`employee template runtime prepared ai_employee=${message.aiEmployeeId} skills=${message.skills.join(\",\")}`);\n      this.options.sendToServer({\n        type: \"ai_employee:template_setup:prepare/result\",\n        requestId: message.requestId,\n        aiEmployeeId: message.aiEmployeeId,\n        ok: true,\n        runtimePrepared: true,\n        skillsInjected: result.skillsInjected,\n        feishuBound: result.feishuBound,\n        referenceIndex: result.referenceIndex,\n        prepareEntries: recorder.entries,\n      });\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.options.sendToServer({\n        type: \"ai_employee:template_setup:prepare/result\",\n        requestId: message.requestId,\n        aiEmployeeId: message.aiEmployeeId,\n        ok: false,\n        error: detail,\n        reasonCode: this.templatePrepareReasonCode(detail),\n        prepareEntries: recorder.entries,\n      });\n    }\n  }\n\n  private async prepareEmployeeTemplateRuntime(input: {\n    aiEmployeeId: string;\n    config: AIEmployeeConfig;\n    skills: string[];\n    feishu: { app_id: string; app_secret: string };\n    referenceIndexPrepareMode: ReferenceIndexPrepareMode;\n    recorder: TemplatePrepareRecorder;\n  }): Promise<{ workspace: AIEmployeeWorkspace; skillsInjected: boolean; feishuBound: boolean; referenceIndex?: AIEmployeeReferenceIndexReadiness }> {\n    const { workspace } = await input.recorder.step(\"\u51C6\u5907\u5458\u5DE5\u5DE5\u4F5C\u533A\", () => this.ensureAIEmployeeWorkspace(input.aiEmployeeId, input.config, { refresh: true }));\n    if (!workspace) throw new Error(`AI employee workspace unavailable for template setup: ${input.aiEmployeeId}`);\n    appendReferenceIndexPrepareEntry(input.recorder.entries, workspace);\n    await input.recorder.step(\"\u5199\u5165\u8FD0\u884C\u73AF\u5883\", () => this.writeRuntimeEnv(workspace, input.config, input.aiEmployeeId));\n    const runtimeEnv = this.buildRuntimeEnv(workspace, input.config, input.aiEmployeeId);\n    const executionBackend = this.executionBackendForConfig(input.config);\n    if (executionBackend.kind === \"container\") {\n      await input.recorder.step(\"\u51C6\u5907\u5BB9\u5668\", () => executionBackend.prepareEmployee({\n        employeeId: input.aiEmployeeId,\n        workspaceDir: workspace.aiEmployeeDir,\n        runtime: input.config.runtime,\n        env: runtimeEnv,\n      }));\n    }\n    await input.recorder.step(\"\u5B89\u88C5\u6A21\u677F\u5DE5\u5177\", () => this.ensureWorkspaceTemplateTools(input.aiEmployeeId, input.config, workspace, executionBackend, runtimeEnv));\n    await input.recorder.step(\"\u6CE8\u5165\u5458\u5DE5\u6280\u80FD\", () => this.employeeFileMutex.withLock(input.aiEmployeeId, async () => {\n      await injectEmployeeSkills({ workspaceDir: workspace.aiEmployeeDir, runtime: input.config.runtime, skills: input.skills });\n    }));\n    await input.recorder.step(\"\u5199\u5165\u98DE\u4E66\u51ED\u8BC1\", () => this.initFeishuCredentialForExecutionBackend(input.aiEmployeeId, input.config, workspace, input.feishu));\n    let referenceIndex: AIEmployeeReferenceIndexReadiness | undefined;\n    const referenceIndexPrepareMode = input.referenceIndexPrepareMode;\n    if (referenceIndexPrepareMode !== \"skip\") {\n      const indexResult = await input.recorder.step(\"\u751F\u6210\u53C2\u8003\u8D44\u6599\u7D22\u5F15\", () => this.materializeReferenceIndexForExecutionBackend(\n        input.aiEmployeeId,\n        input.config,\n        workspace,\n        runtimeEnv,\n        referenceIndexPrepareMode,\n      ));\n      appendReferenceIndexMaterializeEntry(input.recorder.entries, indexResult);\n      referenceIndex = referenceIndexReadinessFromResult(indexResult);\n    }\n    this.setIdleConfig(input.aiEmployeeId, { config: input.config, sessionId: input.config.sessionId, workspace });\n    return { workspace, skillsInjected: true, feishuBound: true, referenceIndex };\n  }\n\n  private createTemplatePrepareRecorder(): TemplatePrepareRecorder {\n    const entries: ActivityEntry[] = [];\n    return {\n      entries,\n      step: async <T>(label: string, fn: () => Promise<T>): Promise<T> => {\n        const startedAt = Date.now();\n        entries.push({ kind: \"status\", text: label, summary: \"\u5F00\u59CB\", timestamp: startedAt });\n        try {\n          const result = await fn();\n          const durationMs = Date.now() - startedAt;\n          entries.push({ kind: \"status\", text: label, summary: `\u5B8C\u6210\uFF08${formatDurationForActivityEntry(durationMs)}\uFF09`, timestamp: Date.now() });\n          return result;\n        } catch (error) {\n          const durationMs = Date.now() - startedAt;\n          const detail = error instanceof Error ? error.message : String(error);\n          entries.push({ kind: \"error\", text: label, summary: `\u5931\u8D25\uFF08${formatDurationForActivityEntry(durationMs)}\uFF09\uFF1A${detail}`, timestamp: Date.now(), is_error: true });\n          throw error;\n        }\n      },\n    };\n  }\n\n  private templatePrepareReasonCode(detail: string): AIEmployeeTemplateSetupReasonCode {\n    if (/machine offline/i.test(detail)) return \"machine_offline\";\n    if (/lark-cli|tool/i.test(detail)) return \"tool_missing\";\n    return \"runtime_prepare_failed\";\n  }\n\n  private async initFeishuCredentialForExecutionBackend(\n    aiEmployeeId: string,\n    config: AIEmployeeConfig,\n    workspace: AIEmployeeWorkspace,\n    feishu: { app_id: string; app_secret: string }\n  ): Promise<void> {\n    const executionBackend = this.executionBackendForConfig(config);\n    if (executionBackend.kind !== \"container\") {\n      await initFeishuCredential({\n        workspaceDir: workspace.aiEmployeeDir,\n        appId: feishu.app_id,\n        appSecret: feishu.app_secret,\n      });\n      return;\n    }\n    const runtimeEnv = this.buildRuntimeEnv(workspace, config, aiEmployeeId);\n    await executionBackend.prepareEmployee({\n      employeeId: aiEmployeeId,\n      workspaceDir: workspace.aiEmployeeDir,\n      runtime: config.runtime,\n      env: runtimeEnv,\n    });\n    await this.ensureWorkspaceTemplateTools(aiEmployeeId, config, workspace, executionBackend, runtimeEnv);\n    await initFeishuCredentialInRuntime({\n      workspaceDir: workspace.aiEmployeeDir,\n      runtimeWorkspaceDir: \"/workspace\",\n      appId: feishu.app_id,\n      appSecret: feishu.app_secret,\n      employeeId: aiEmployeeId,\n      runtime: config.runtime,\n      env: runtimeEnv,\n      command: \"/workspace/.wm/lark-cli\",\n    }, executionBackend);\n  }\n\n  private async materializeReferenceIndexForExecutionBackend(\n    aiEmployeeId: string,\n    config: AIEmployeeConfig,\n    workspace: AIEmployeeWorkspace,\n    runtimeEnv: NodeJS.ProcessEnv,\n    mode: Exclude<ReferenceIndexPrepareMode, \"skip\">,\n  ): Promise<MaterializeReferenceIndexResult> {\n    if (workspace.referenceIndex.sourceCount === 0) {\n      return materializeReferenceIndex(workspace.aiEmployeeDir, {\n        sources: workspace.referenceIndex.sources,\n        mode,\n        runLarkCli: async () => ({ code: 0, stdout: \"\", stderr: \"\" }),\n      });\n    }\n    const executionBackend = this.executionBackendForConfig(config);\n    const command = executionBackend.kind === \"container\"\n      ? \"/workspace/.wm/lark-cli\"\n      : path.join(workspace.wmDir, \"lark-cli\");\n    return materializeReferenceIndex(workspace.aiEmployeeDir, {\n      sources: workspace.referenceIndex.sources,\n      mode,\n      runLarkCli: async (args, label) => {\n        const child = executionBackend.spawnRuntime({\n          command,\n          args,\n          cwd: workspace.aiEmployeeDir,\n          runtime: config.runtime,\n          env: runtimeEnv,\n          employeeId: aiEmployeeId,\n          stdio: \"ignore-stdin\",\n        });\n        return waitForChildResult(child, `reference index ${label}`, 20_000);\n      },\n    });\n  }\n\n  private async resolveEmployeeFeishuUserAuthSessionContext(input: {\n    aiEmployeeId: string;\n    config?: AIEmployeeConfig;\n    feishu?: { app_id: string; app_secret: string };\n  }): Promise<{ workspaceDir: string; runner?: ExecRunner }> {\n    if (input.config && input.feishu) {\n      const { workspace } = await this.ensureAIEmployeeWorkspace(input.aiEmployeeId, input.config);\n      if (!workspace) throw new Error(`AI employee workspace unavailable for user auth: ${input.aiEmployeeId}`);\n      await this.writeRuntimeEnv(workspace, input.config, input.aiEmployeeId);\n      const executionBackend = this.executionBackendForConfig(input.config);\n      if (executionBackend.kind === \"container\") {\n        const runtimeEnv = this.buildRuntimeEnv(workspace, input.config, input.aiEmployeeId);\n        await executionBackend.prepareEmployee({\n          employeeId: input.aiEmployeeId,\n          workspaceDir: workspace.aiEmployeeDir,\n          runtime: input.config.runtime,\n          env: runtimeEnv,\n        });\n        await this.ensureWorkspaceTemplateTools(input.aiEmployeeId, input.config, workspace, executionBackend, runtimeEnv);\n        await this.employeeFileMutex.withLock(input.aiEmployeeId, async () => {\n          await initFeishuCredentialInRuntime({\n            workspaceDir: workspace.aiEmployeeDir,\n            runtimeWorkspaceDir: \"/workspace\",\n            appId: input.feishu!.app_id,\n            appSecret: input.feishu!.app_secret,\n            employeeId: input.aiEmployeeId,\n            runtime: input.config!.runtime,\n            env: runtimeEnv,\n            command: \"/workspace/.wm/lark-cli\",\n          }, executionBackend);\n        });\n        this.setIdleConfig(input.aiEmployeeId, { config: input.config, sessionId: input.config.sessionId, workspace });\n        return {\n          workspaceDir: workspace.aiEmployeeDir,\n          runner: createFeishuRuntimeExecRunner({\n            workspaceDir: workspace.aiEmployeeDir,\n            runtimeWorkspaceDir: \"/workspace\",\n            employeeId: input.aiEmployeeId,\n            runtime: input.config.runtime,\n            env: runtimeEnv,\n            command: \"/workspace/.wm/lark-cli\",\n          }, executionBackend),\n        };\n      }\n      await this.employeeFileMutex.withLock(input.aiEmployeeId, async () => {\n        await initFeishuCredential({\n          workspaceDir: workspace.aiEmployeeDir,\n          appId: input.feishu!.app_id,\n          appSecret: input.feishu!.app_secret,\n        });\n      });\n      this.setIdleConfig(input.aiEmployeeId, { config: input.config, sessionId: input.config.sessionId, workspace });\n      return { workspaceDir: workspace.aiEmployeeDir };\n    }\n    return this.resolveEmployeeFeishuCommandContext(input.aiEmployeeId);\n  }\n\n  // \u89E3\u6790\u5458\u5DE5 agent \u7684 workspace \u76EE\u5F55\uFF08\u7528\u4E8E user \u6388\u6743\u547D\u4EE4\u7684 lark config dir\uFF09\u3002\n  // device flow \u547D\u4EE4\u8981\u6C42 config dir \u5DF2\u7531 ai_employee:skill:inject \u5EFA\u7ACB\u3002\n  private async resolveEmployeeWorkspaceDir(aiEmployeeId: string): Promise<string | undefined> {\n    const running = this.firstRunningEntryFor(aiEmployeeId);\n    const idle = this.firstIdleConfigForAIEmployee(aiEmployeeId);\n    const active = running?.workspace?.aiEmployeeDir ?? idle?.workspace?.aiEmployeeDir;\n    if (active) return active;\n    return this.findCredentialedWorkspaceDir(aiEmployeeId);\n  }\n\n  async resolveEmployeeFeishuCommandContext(aiEmployeeId: string): Promise<{ workspaceDir: string; runner?: ExecRunner }> {\n    const running = this.firstRunningEntryFor(aiEmployeeId);\n    const idle = this.firstIdleConfigForAIEmployee(aiEmployeeId);\n    const config = running?.config ?? idle?.config;\n    const workspace = running?.workspace ?? idle?.workspace;\n    if (config && workspace) {\n      const executionBackend = this.executionBackendForConfig(config);\n      if (executionBackend.kind === \"container\") {\n        const runtimeEnv = running?.runtimeEnv ?? this.buildRuntimeEnv(workspace, config, aiEmployeeId);\n        await executionBackend.prepareEmployee({\n          employeeId: aiEmployeeId,\n          workspaceDir: workspace.aiEmployeeDir,\n          runtime: config.runtime,\n          env: runtimeEnv,\n        });\n        await this.ensureWorkspaceTemplateTools(aiEmployeeId, config, workspace, executionBackend, runtimeEnv);\n        return {\n          workspaceDir: workspace.aiEmployeeDir,\n          runner: createFeishuRuntimeExecRunner({\n            workspaceDir: workspace.aiEmployeeDir,\n            runtimeWorkspaceDir: \"/workspace\",\n            employeeId: aiEmployeeId,\n            runtime: config.runtime,\n            env: runtimeEnv,\n            command: \"/workspace/.wm/lark-cli\",\n          }, executionBackend),\n        };\n      }\n      return { workspaceDir: workspace.aiEmployeeDir };\n    }\n\n    const workspaceDir = await this.findCredentialedWorkspaceDir(aiEmployeeId);\n    if (!workspaceDir) throw new Error(\"employee workspace not found; inject bot credential first\");\n    return { workspaceDir };\n  }\n\n  private async replyEmployeeFeishuChatsList(requestId: string, aiEmployeeId: string): Promise<void> {\n    try {\n      const context = await this.resolveEmployeeFeishuCommandContext(aiEmployeeId);\n      const env = {\n        ...(process.env as Record<string, string>),\n        ...larkWorkspaceHomeEnv(context.workspaceDir),\n        LARKSUITE_CLI_CONFIG_DIR: larkConfigDir(context.workspaceDir),\n      };\n      const runner = context.runner ?? ((command: string, args: string[], options?: { cwd?: string; env?: NodeJS.ProcessEnv; timeoutMs?: number }) => new Promise<{ code: number; stdout: string; stderr: string }>((resolve) => {\n        const child = execFile(command, args, {\n          cwd: options?.cwd,\n          env: options?.env,\n          timeout: options?.timeoutMs,\n          maxBuffer: 10 * 1024 * 1024,\n        }, (error, stdout, stderr) => {\n          const code = typeof (error as NodeJS.ErrnoException | null)?.code === \"number\"\n            ? Number((error as NodeJS.ErrnoException).code)\n            : error ? 1 : 0;\n          resolve({ code, stdout: String(stdout ?? \"\"), stderr: String(stderr ?? \"\") });\n        });\n        child.stdin?.end();\n      }));\n      const bin = context.runner ? \"lark-cli\" : await resolveLarkCliBinary();\n      const result = await runner(bin, feishuPersonalAgentChatListArgs(), { cwd: context.workspaceDir, env, timeoutMs: 15000 });\n      if (result.code !== 0) {\n        this.options.sendToServer({\n          type: \"ai_employee:feishu_chats:list/result\",\n          requestId,\n          aiEmployeeId,\n          ok: false,\n          error: `lark-cli chat list failed code=${result.code}: ${result.stderr || result.stdout}`,\n        });\n        return;\n      }\n      const parsed = JSON.parse(result.stdout) as { data?: { chats?: Array<Record<string, unknown>> } };\n      const seen = new Set<string>();\n      const chats = (parsed.data?.chats ?? []).flatMap((chat) => {\n        const chatId = typeof chat.chat_id === \"string\" ? chat.chat_id.trim() : \"\";\n        if (!chatId || seen.has(chatId)) return [];\n        seen.add(chatId);\n        const chatMode = typeof chat.chat_mode === \"string\" ? chat.chat_mode : \"\";\n        return [{\n          chat_id: chatId,\n          chat_type: chatMode === \"p2p\" ? \"p2p\" as const : \"group\" as const,\n          name: typeof chat.name === \"string\" ? chat.name : undefined,\n          external: typeof chat.external === \"boolean\" ? chat.external : undefined,\n        }];\n      });\n      this.options.sendToServer({ type: \"ai_employee:feishu_chats:list/result\", requestId, aiEmployeeId, ok: true, chats });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:feishu_chats:list/result\",\n        requestId,\n        aiEmployeeId,\n        ok: false,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  async findEmployeeWorkspaceDir(aiEmployeeId: string): Promise<string | undefined> {\n    return this.findCredentialedWorkspaceDir(aiEmployeeId);\n  }\n\n  private async findCredentialedWorkspaceDir(aiEmployeeId: string): Promise<string | undefined> {\n    const root = path.resolve(this.options.rootDir);\n    let machineEntries: import(\"node:fs\").Dirent[];\n    try {\n      machineEntries = await readdir(root, { withFileTypes: true });\n    } catch {\n      return undefined;\n    }\n    for (const machineEntry of machineEntries) {\n      if (!machineEntry.isDirectory()) continue;\n      const machineDir = path.resolve(root, machineEntry.name);\n      if (machineDir !== root && !machineDir.startsWith(`${root}${path.sep}`)) continue;\n      let employeeEntries: import(\"node:fs\").Dirent[];\n      try {\n        employeeEntries = await readdir(machineDir, { withFileTypes: true });\n      } catch {\n        continue;\n      }\n      for (const employeeEntry of employeeEntries) {\n        if (!employeeEntry.isDirectory()) continue;\n        if (employeeEntry.name !== aiEmployeeId && !employeeEntry.name.endsWith(`-${aiEmployeeId}`)) continue;\n        const workspaceDir = path.resolve(machineDir, employeeEntry.name);\n        if (workspaceDir !== machineDir && !workspaceDir.startsWith(`${machineDir}${path.sep}`)) continue;\n        if (existsSync(path.join(larkConfigDir(workspaceDir), \"config.json\"))) return workspaceDir;\n      }\n    }\n    return undefined;\n  }\n\n  private async replyEmployeeUserAuthStart(requestId: string, aiEmployeeId: string, domains: string[], scopes: string[] = []): Promise<void> {\n    try {\n      const context = await this.resolveEmployeeFeishuCommandContext(aiEmployeeId);\n      const result = await startUserAuth({ workspaceDir: context.workspaceDir, domains, scopes }, context.runner);\n      this.options.sendToServer({\n        type: \"ai_employee:user_auth:start/result\",\n        requestId,\n        aiEmployeeId,\n        ok: result.ok,\n        verificationUrl: result.verificationUrl,\n        deviceCode: result.deviceCode,\n        expiresInSec: result.expiresInSec,\n        error: result.error,\n      });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:user_auth:start/result\",\n        requestId,\n        aiEmployeeId,\n        ok: false,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async replyEmployeeUserAuthComplete(requestId: string, aiEmployeeId: string, deviceCode: string): Promise<void> {\n    try {\n      const context = await this.resolveEmployeeFeishuCommandContext(aiEmployeeId);\n      const result = await completeUserAuth({ workspaceDir: context.workspaceDir, deviceCode }, context.runner);\n      this.options.sendToServer({\n        type: \"ai_employee:user_auth:complete/result\",\n        requestId,\n        aiEmployeeId,\n        status: result.status,\n        error: result.error,\n      });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:user_auth:complete/result\",\n        requestId,\n        aiEmployeeId,\n        status: \"error\",\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async replyEmployeeUserAuthStatus(requestId: string, aiEmployeeId: string): Promise<void> {\n    try {\n      const context = await this.resolveEmployeeFeishuCommandContext(aiEmployeeId);\n      const result = await checkUserAuth({ workspaceDir: context.workspaceDir }, context.runner);\n      this.options.sendToServer({\n        type: \"ai_employee:user_auth:status/result\",\n        requestId,\n        aiEmployeeId,\n        authorized: result.authorized,\n        operatorOpenId: result.openId,\n        error: result.error,\n      });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:user_auth:status/result\",\n        requestId,\n        aiEmployeeId,\n        authorized: false,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async replyEmployeeTemplateSetupCheck(\n    requestId: string,\n    aiEmployeeId: string,\n    appId: string | undefined,\n    inspectorScopes: string[],\n    botScopes: string[],\n    businessScopes: string[],\n    requiredEvents?: string[],\n    webhookVerified?: boolean,\n    skillsInjected?: boolean\n  ): Promise<void> {\n    try {\n      const context = await this.resolveEmployeeFeishuCommandContext(aiEmployeeId);\n      const setup = await checkFeishuTemplateSetup({ workspaceDir: context.workspaceDir, appId, inspectorScopes, botScopes, businessScopes, requiredEvents, webhookVerified, skillsInjected }, context.runner);\n      this.options.sendToServer({ type: \"ai_employee:template_setup:check/result\", requestId, aiEmployeeId, ok: setup.status !== \"error\", setup, error: setup.steps.find((step) => step.error)?.error });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:template_setup:check/result\",\n        requestId,\n        aiEmployeeId,\n        ok: false,\n        setup: { status: \"error\", steps: [{ id: \"credential_check\", status: \"error\", action: \"recheck\", error: error instanceof Error ? error.message : String(error), checked_at: Date.now() }] },\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async replyEmployeeUserAuthSessionStart(message: Extract<ServerToDaemonMessage, { type: \"ai_employee:user_auth:session_start\" }>): Promise<void> {\n    const { requestId, aiEmployeeId, domains } = message;\n    const scopes = message.scopes ?? [];\n    try {\n      const context = await this.resolveEmployeeFeishuUserAuthSessionContext({ aiEmployeeId, config: message.config, feishu: message.feishu });\n      const result = await startUserAuth({ workspaceDir: context.workspaceDir, domains, scopes, skipScopePrecheck: true }, context.runner);\n      if (!result.ok || !result.deviceCode || !result.verificationUrl) {\n        this.userAuthSessions.set(aiEmployeeId, { status: \"error\", expiresAt: Date.now() + 300000, error: result.error || \"device authorization failed to start\" });\n        this.options.sendToServer({ type: \"ai_employee:user_auth:session_start/result\", requestId, aiEmployeeId, ok: false, status: \"error\", error: result.error || \"device authorization failed to start\" });\n        return;\n      }\n      const expiresAt = Date.now() + (result.expiresInSec ?? 300) * 1000;\n      this.userAuthSessions.set(aiEmployeeId, { status: \"pending\", expiresAt });\n      this.options.sendToServer({\n        type: \"ai_employee:user_auth:session_start/result\",\n        requestId,\n        aiEmployeeId,\n        ok: true,\n        verificationUrl: result.verificationUrl,\n        expiresInSec: result.expiresInSec ?? 300,\n        status: \"pending\",\n      });\n      void completeUserAuth({ workspaceDir: context.workspaceDir, deviceCode: result.deviceCode, timeoutMs: Math.min((result.expiresInSec ?? 300) * 1000, 120000) }, context.runner)\n        .then(async (complete) => {\n          const authorized = complete.status === \"authorized\" ? await checkUserAuth({ workspaceDir: context.workspaceDir }, context.runner) : { authorized: false, error: complete.error };\n          this.userAuthSessions.set(aiEmployeeId, {\n            status: authorized.authorized ? \"authorized\" : complete.status,\n            expiresAt: Date.now() + 300000,\n            error: authorized.error ?? complete.error,\n            openId: \"openId\" in authorized ? authorized.openId : undefined,\n          });\n        })\n        .catch((error) => {\n          this.userAuthSessions.set(aiEmployeeId, { status: \"error\", expiresAt: Date.now() + 300000, error: error instanceof Error ? error.message : String(error) });\n        });\n    } catch (error) {\n      const message = error instanceof Error ? error.message : String(error);\n      this.userAuthSessions.set(aiEmployeeId, { status: \"error\", expiresAt: Date.now() + 300000, error: message });\n      this.options.sendToServer({ type: \"ai_employee:user_auth:session_start/result\", requestId, aiEmployeeId, ok: false, status: \"error\", error: message });\n    }\n  }\n\n  private async replyEmployeeUserAuthSessionStatus(requestId: string, aiEmployeeId: string): Promise<void> {\n    const session = this.userAuthSessions.get(aiEmployeeId);\n    if (!session || session.expiresAt <= Date.now()) {\n      if (session) this.userAuthSessions.delete(aiEmployeeId);\n      this.options.sendToServer({ type: \"ai_employee:user_auth:session_status/result\", requestId, aiEmployeeId, status: \"expired\", authorized: false });\n      return;\n    }\n    this.options.sendToServer({\n      type: \"ai_employee:user_auth:session_status/result\",\n      requestId,\n      aiEmployeeId,\n      status: session.status,\n      authorized: session.status === \"authorized\",\n      operatorOpenId: session.openId,\n      error: session.error,\n    });\n  }\n\n  async handle(message: ServerToDaemonMessage): Promise<void> {\n    this.log(`handle type=${message.type}${\"aiEmployeeId\" in message ? ` ai_employee=${message.aiEmployeeId}` : \"\"}`);\n    if (message.type === \"ai_employee:deliver:confirmed\") {\n      this.confirmProcessedDelivery(message.deliveryId);\n    } else if (message.type === \"ai_employee:memory_snapshot:ack\") {\n      const key = this.memorySnapshotAckKey(message.aiEmployeeId, message.generationId);\n      const pending = this.pendingMemorySnapshotAcks.get(key);\n      if (pending) {\n        clearTimeout(pending.timeout);\n        this.pendingMemorySnapshotAcks.delete(key);\n        pending.resolve();\n      }\n    } else if (message.type === \"ai_employee:start\") {\n      const deliveryBackedLaunchId = message.wakeMessage ? message.launchId : undefined;\n      if (deliveryBackedLaunchId) this.rememberDeliveryDispatchGeneration(deliveryBackedLaunchId, message.dispatchGeneration);\n      if (deliveryBackedLaunchId && this.hasAcceptedOrProcessedDeliveryId(deliveryBackedLaunchId)) {\n        this.log(`start duplicate ignored ai_employee=${message.aiEmployeeId} launch=${deliveryBackedLaunchId}`);\n        this.sendDeliverAck(\n          message.aiEmployeeId,\n          message.wakeMessage!.message_id,\n          message.wakeMessage!.seq,\n          deliveryBackedLaunchId,\n          true,\n          undefined,\n          message.dispatchGeneration,\n        );\n        this.resendProcessedDelivery(deliveryBackedLaunchId, message.dispatchGeneration);\n        return;\n      }\n      if (deliveryBackedLaunchId) {\n        this.rememberAcceptedDeliveryId(deliveryBackedLaunchId);\n        this.sendDeliverAck(\n          message.aiEmployeeId,\n          message.wakeMessage!.message_id,\n          message.wakeMessage!.seq,\n          deliveryBackedLaunchId,\n          true,\n          undefined,\n          message.dispatchGeneration,\n        );\n      }\n      try {\n        await this.enqueueStart({\n          aiEmployeeId: message.aiEmployeeId,\n          config: message.config,\n          wakeMessage: message.wakeMessage,\n          deliveredMessages: message.wakeMessage ? [message.wakeMessage] : undefined,\n          launchId: message.launchId,\n          taskId: message.taskId,\n        });\n      } catch (error) {\n        const detail = error instanceof Error ? error.message : String(error);\n        this.sendDeliverProcessedForMessages(\n          message.aiEmployeeId,\n          message.wakeMessage ? [message.wakeMessage] : undefined,\n          message.launchId,\n          \"failed\",\n          this.runtimeSessionScopeForConfig(message.config),\n          detail\n        );\n        this.options.sendToServer({\n          type: \"ai_employee:status\",\n          aiEmployeeId: message.aiEmployeeId,\n          status: \"inactive\",\n          launchId: message.launchId,\n          failureReason: detail,\n        });\n        if (deliveryBackedLaunchId && !this.processedDeliveryMessages.has(deliveryBackedLaunchId)) {\n          this.acceptedDeliveryIds.delete(deliveryBackedLaunchId);\n        }\n        throw error;\n      }\n    } else if (message.type === \"ai_employee:deliver\") {\n      await this.deliverMessage(message.aiEmployeeId, message.message, message.deliveryId, message.seq, message.runtimeSessionScope, message.sessionId, message.dispatchGeneration);\n    } else if (message.type === \"ai_employee:stop\") {\n      await this.stopAIEmployee(message.aiEmployeeId, \"requested\");\n    } else if (message.type === \"ai_employee:profile:update_and_restart\") {\n      await this.applyProfileUpdateAndFreshRestart(message);\n    } else if (message.type === \"ai_employee:destroy\") {\n      await this.replyDestroyAIEmployee(message.requestId, message.aiEmployeeId);\n    } else if (message.type === \"ai_employee:activity_probe\") {\n      // \u5458\u5DE5\u805A\u5408\uFF1A\u4EFB\u4E00\u5B9E\u4F8B\u975E idle \u5373 working\uFF0C\u5168\u90E8 idle \u624D idle\u3002\n      const entries = this.runningEntriesFor(message.aiEmployeeId);\n      const busy = entries.find((entry) => entry.state !== \"idle\");\n      const last = this.lastActivities.get(message.aiEmployeeId);\n      const hasIdle = Boolean(this.firstIdleConfigForAIEmployee(message.aiEmployeeId));\n      this.options.sendToServer({\n        type: \"ai_employee:activity\",\n        aiEmployeeId: message.aiEmployeeId,\n        activity: this.isStartingFor(message.aiEmployeeId)\n          ? \"working\"\n          : entries.length > 0\n            ? busy ? last?.activity ?? \"working\" : \"idle\"\n            : hasIdle\n              ? \"idle\"\n              : \"offline\",\n        detail: this.isStartingFor(message.aiEmployeeId)\n          ? \"Starting...\"\n          : entries.length > 0\n            ? busy ? last?.detail ?? \"Runtime running\" : \"Idle\"\n            : hasIdle\n              ? \"Idle\"\n              : \"AIEmployee not running\",\n        launchId: busy?.launchId ?? entries[0]?.launchId ?? last?.launchId,\n        probeId: message.probeId,\n        pendingInboxCount: this.queuedInboxCount(message.aiEmployeeId),\n        activeScopeCount: entries.length,\n        clientSeq: last?.clientSeq,\n      });\n    } else if (message.type === \"ai_employee:workspace:list\") {\n      await this.replyWorkspaceList(message.aiEmployeeId, message.requestId, message.path, message.serverNamespace, message.machineId, message.config);\n    } else if (message.type === \"ai_employee:workspace:read\") {\n      await this.replyWorkspaceRead(message.aiEmployeeId, message.requestId, message.path, message.serverNamespace, message.machineId, message.config);\n    } else if (message.type === \"ai_employee:workspace:write\") {\n      await this.replyWorkspaceWrite(message.aiEmployeeId, message.requestId, message.path, message.content, message.serverNamespace, message.machineId, message.config);\n    } else if (message.type === \"ai_employee:skills:list\") {\n      await this.replyAgentSkillsList(message.aiEmployeeId, message.requestId, message.runtime, message.serverNamespace, message.machineId, message.config);\n    } else if (message.type === \"ai_employee:workspace:init\") {\n      await this.replyWorkspaceInit(message.requestId, message.aiEmployeeId, message.config);\n    } else if (message.type === \"ai_employee:skill:inject\") {\n      await this.handleEmployeeMessage(message);\n    } else if (message.type === \"ai_employee:template_setup:prepare\") {\n      await this.handleEmployeeTemplateSetupPrepare(message);\n    } else if (message.type === \"ai_employee:user_auth:start\") {\n      await this.replyEmployeeUserAuthStart(message.requestId, message.aiEmployeeId, message.domains, message.scopes);\n    } else if (message.type === \"ai_employee:user_auth:complete\") {\n      await this.replyEmployeeUserAuthComplete(message.requestId, message.aiEmployeeId, message.deviceCode);\n    } else if (message.type === \"ai_employee:user_auth:status\") {\n      await this.replyEmployeeUserAuthStatus(message.requestId, message.aiEmployeeId);\n    } else if (message.type === \"ai_employee:template_setup:check\") {\n      await this.replyEmployeeTemplateSetupCheck(message.requestId, message.aiEmployeeId, message.appId, message.inspectorScopes, message.botScopes ?? [], message.businessScopes, message.requiredEvents, message.webhookVerified, message.skillsInjected);\n    } else if (message.type === \"ai_employee:feishu_chats:list\") {\n      await this.replyEmployeeFeishuChatsList(message.requestId, message.aiEmployeeId);\n    } else if (message.type === \"ai_employee:user_auth:session_start\") {\n      await this.replyEmployeeUserAuthSessionStart(message);\n    } else if (message.type === \"ai_employee:user_auth:session_status\") {\n      await this.replyEmployeeUserAuthSessionStatus(message.requestId, message.aiEmployeeId);\n    } else if (message.type === \"machine:runtime_models:detect\") {\n      const results = await this.detectRuntimeModels(message.runtimes ?? [\"cursor\", \"claude\", \"codex\", \"antigravity\", \"kimi\", \"hermes\", \"opencode\"]);\n      const containerEngine = await this.options.containerEngineProvider?.();\n      const containerBackend = this.sandboxExecutionBackend instanceof ContainerBackend\n        ? this.sandboxExecutionBackend\n        : this.executionBackend instanceof ContainerBackend\n          ? this.executionBackend\n          : undefined;\n      const containerRuntimeStatus = containerBackend\n        ? await containerBackend.runtimeStatus()\n        : undefined;\n      this.options.sendToServer({\n        type: \"machine:runtime_models:result\",\n        requestId: message.requestId,\n        results,\n        containerImage: containerRuntimeStatus?.image,\n        containerRuntimeStatus,\n        sandboxCapable: containerEngine !== undefined ? containerEngine !== null : undefined,\n        containerEngine,\n      });\n    } else if (message.type === \"machine:workspace:scan\") {\n      await this.replyMachineWorkspaceScan(message.requestId, message.serverNamespace, message.machineId, message.machineName, message.knownAIEmployeeIds ?? []);\n    } else if (message.type === \"machine:workspace:delete\") {\n      await this.replyMachineWorkspaceDelete(message.requestId, message.serverNamespace, message.machineId, message.machineName, message.directoryName);\n    } else if (message.type === \"ai_employee:reset-workspace\") {\n      await this.replyResetWorkspace(message.requestId, message.aiEmployeeId, message.config);\n    } else if (message.type === \"ai_employee:diagnostic\") {\n      await this.replyAgentDiagnostic(message.requestId, message.aiEmployeeId, message.config);\n    } else if (message.type === \"reminder.upsert\") {\n      this.reminderCache.upsert(message.reminder);\n    } else if (message.type === \"reminder.cancel\") {\n      this.reminderCache.cancel(message.reminderId);\n    } else if (message.type === \"reminder.snapshot\") {\n      this.reminderCache.snapshot(message.aiEmployeeId, message.reminders);\n    } else if (message.type === \"ai_employee:runtime_profile:migration\") {\n      this.pendingMigrations.set(message.aiEmployeeId, message.migrationKey);\n    } else if (message.type === \"ai_employee:permission_decision\") {\n      this.resolvePermissionDecision(message.aiEmployeeId, message.requestId, message.action, message.metadata);\n    }\n  }\n\n  private async applyProfileUpdateAndFreshRestart(message: Extract<ServerToDaemonMessage, { type: \"ai_employee:profile:update_and_restart\" }>): Promise<void> {\n    const config: AIEmployeeConfig = { ...message.config, sessionId: undefined, restartMode: \"fresh\" };\n    try {\n      this.options.sendToServer({ type: \"ai_employee:availability\", aiEmployeeId: message.aiEmployeeId, daemonState: \"applying_profile\" });\n      // Reject invalid model/reasoning synchronously so the request result cannot\n      // claim restarted=true after startAIEmployee has already emitted inactive.\n      await this.validateRuntimeConfig(config);\n      if (message.routine) this.rememberRoutineConfig(message.aiEmployeeId, message.routine, config);\n      await this.stopAIEmployee(message.aiEmployeeId, \"profile-update\");\n      this.deleteIdleConfigsForAIEmployee(message.aiEmployeeId);\n      this.options.sendToServer({ type: \"ai_employee:availability\", aiEmployeeId: message.aiEmployeeId, daemonState: \"restarting_fresh\" });\n      await this.enqueueStart({\n        aiEmployeeId: message.aiEmployeeId,\n        config,\n      });\n      this.options.sendToServer({\n        type: \"ai_employee:profile:update_and_restart/result\",\n        requestId: message.requestId,\n        aiEmployeeId: message.aiEmployeeId,\n        ok: true,\n        profileRevision: config.profileRevision,\n        systemPromptRevision: config.systemPromptRevision,\n        restarted: true,\n      });\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.log(`profile update restart failed ai_employee=${message.aiEmployeeId} error=${detail}`);\n      this.options.sendToServer({ type: \"ai_employee:availability\", aiEmployeeId: message.aiEmployeeId, daemonState: \"profile_update_failed\" });\n      this.options.sendToServer({\n        type: \"ai_employee:profile:update_and_restart/result\",\n        requestId: message.requestId,\n        aiEmployeeId: message.aiEmployeeId,\n        ok: false,\n        profileRevision: config.profileRevision,\n        systemPromptRevision: config.systemPromptRevision,\n        restarted: false,\n        error: detail,\n      });\n    }\n  }\n\n  private async replyDestroyAIEmployee(requestId: string, aiEmployeeId: string): Promise<void> {\n    try {\n      await this.stopAIEmployee(aiEmployeeId, \"destroy\");\n      this.memoryFingerprintCaches.delete(aiEmployeeId);\n      this.deleteIdleConfigsForAIEmployee(aiEmployeeId);\n      await this.destroySandboxContainerIfPresent(aiEmployeeId);\n      this.options.sendToServer({ type: \"ai_employee:destroy/result\", requestId, aiEmployeeId, ok: true });\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.log(`ai_employee destroy failed ai_employee=${aiEmployeeId} error=${detail}`);\n      this.options.sendToServer({ type: \"ai_employee:destroy/result\", requestId, aiEmployeeId, ok: false, error: detail });\n    } finally {\n      this.memoryFingerprintCaches.delete(aiEmployeeId);\n    }\n  }\n\n  private async enqueueStart(request: StartRequest): Promise<void> {\n    const requestScope = this.runtimeSessionScopeForConfig(request.config);\n    const scopedKey = this.scopedAIEmployeeKey(request.aiEmployeeId, requestScope);\n    const startCancellationEpoch = this.startCancellationEpoch(request.aiEmployeeId);\n    const staleStarting = this.starting.get(scopedKey);\n    if (staleStarting && this.startingEpochs.get(scopedKey) !== startCancellationEpoch) {\n      await staleStarting.catch(() => undefined);\n      return this.enqueueStart(request);\n    }\n    const preparingState = this.preparingStartStates.get(scopedKey);\n    if (preparingState && preparingState.epoch !== startCancellationEpoch) {\n      await preparingState.settled;\n      return this.enqueueStart(request);\n    }\n    if (this.running.has(scopedKey) || this.starting.has(scopedKey) || this.preparingStarts.has(scopedKey)) {\n      this.log(`ai_employee start deduped ai_employee=${request.aiEmployeeId} scope=${requestScope.type}/${requestScope.id}`);\n      this.setIdleConfig(request.aiEmployeeId, { config: request.config, sessionId: request.config.sessionId });\n      if (request.deliveredMessages?.length) {\n        this.rememberQueuedMessageLaunch(request.aiEmployeeId, request.deliveredMessages, request.launchId, request.taskId, requestScope, request.config.sessionId);\n        const running = this.running.get(scopedKey);\n        if (running?.state === \"idle\" && running.adapter) {\n          // scopedKey \u7CBE\u786E\u547D\u4E2D\uFF1A\u540C scope \u590D\u7528 idle \u5B9E\u4F8B\uFF0C\u65E0\u9700 destroy \u91CD\u5EFA\u3002\n          const controller = new AbortController();\n          this.slotManager.markBusy(request.aiEmployeeId, scopedKey);\n          running.controller = controller;\n          running.state = \"busy\";\n          running.config = request.config;\n          running.runtimeSessionScope = requestScope;\n          running.launchId = request.launchId;\n          running.done = this.runAIEmployeeRuntime({\n            aiEmployeeId: request.aiEmployeeId,\n            config: { ...request.config, sessionId: running.sessionId ?? request.config.sessionId, runtimeSessionScope: requestScope },\n            workspace: running.workspace,\n            wakeMessage: request.wakeMessage,\n            deliveredMessages: request.deliveredMessages,\n            launchId: request.launchId,\n            taskId: request.taskId,\n            runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(running.workspace, request.config, request.aiEmployeeId),\n            controller,\n          }).catch((error) => {\n            const detail = controller.signal.aborted ? \"stopped\" : error instanceof Error ? error.message : String(error);\n            this.sendDeliverProcessedForMessages(request.aiEmployeeId, request.deliveredMessages, request.launchId, \"failed\", requestScope, detail);\n            this.log(`deduped idle start failed ai_employee=${request.aiEmployeeId} error=${detail}`);\n          });\n          running.sessionId = running.sessionId ?? request.config.sessionId;\n        } else {\n          this.pushInbox(this.starting.has(scopedKey) || this.preparingStarts.has(scopedKey) ? this.startingInboxes : this.runningInboxes, scopedKey, request.deliveredMessages);\n        }\n      }\n      return;\n    }\n    // \u5148\u5360 preparingStarts \u518D\u505A\u4EFB\u4F55 await\uFF1Adedupe \u68C0\u67E5\u5230\u8FD9\u91CC\u4E4B\u95F4\u4E0D\u80FD\u6709\u8BA9\u51FA\u70B9\uFF0C\n    // \u5426\u5219\u540C scope \u4E24\u6761\u5E76\u53D1\u6295\u9012\u4F1A\u53CC\u53CC\u901A\u8FC7 dedupe\uFF0C\u5BFC\u81F4\u540C\u4E00 scopedKey \u53CC\u91CD\u542F\u52A8\u3002\n    this.beginPreparingStart(scopedKey, startCancellationEpoch);\n    let slotAcquired = false;\n    try {\n      slotAcquired = await this.acquireRuntimeSlot(request.aiEmployeeId, scopedKey, request.config.concurrencyLimit);\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.terminalizeQueuedMessagesForScopedKey(request.aiEmployeeId, this.startingInboxes, scopedKey, detail);\n      this.finishPreparingStart(scopedKey);\n      this.syncSlotAfterRemoval(request.aiEmployeeId, scopedKey);\n      throw error;\n    }\n    if (!slotAcquired) {\n      this.finishPreparingStart(scopedKey);\n      this.log(`runtime slot exhausted ai_employee=${request.aiEmployeeId} scope=${requestScope.type}/${requestScope.id} active=${this.slotManager.activeCount()}`);\n      this.terminalizeQueuedMessagesForScopedKey(\n        request.aiEmployeeId,\n        this.startingInboxes,\n        scopedKey,\n        \"runtime slots exhausted before startup delivery was consumed\"\n      );\n      this.setIdleConfig(request.aiEmployeeId, { config: request.config, sessionId: request.config.sessionId });\n      if (request.deliveredMessages?.length) {\n        this.rememberQueuedMessageLaunch(request.aiEmployeeId, request.deliveredMessages, request.launchId, request.taskId, requestScope, request.config.sessionId);\n        this.pushInbox(this.runningInboxes, scopedKey, request.deliveredMessages);\n        this.sendActivity({\n          aiEmployeeId: request.aiEmployeeId,\n          activity: \"working\",\n          detail: \"Message queued: runtime slots exhausted\",\n          launchId: request.launchId,\n          entries: [{ kind: \"status\", text: \"Message queued: runtime slots exhausted\", timestamp: Date.now() }],\n          pendingInboxCount: this.queuedInboxCount(request.aiEmployeeId),\n        });\n      } else {\n        // \u65E0\u6D88\u606F\u7684\u88F8 start \u6CA1\u6709\u961F\u5217\u53EF\u4EE5\u515C\u5E95\uFF1A\u660E\u786E\u56DE\u62A5 inactive\uFF0C\u907F\u514D Server \u505C\u5728 starting\u3002\n        this.sendActivity({\n          aiEmployeeId: request.aiEmployeeId,\n          activity: \"error\",\n          detail: \"Start rejected: runtime slots exhausted\",\n          launchId: request.launchId,\n          entries: [{ kind: \"error\", text: \"Start rejected: runtime slots exhausted\", timestamp: Date.now() }],\n        });\n        this.options.sendToServer({\n          type: \"ai_employee:status\",\n          aiEmployeeId: request.aiEmployeeId,\n          status: \"inactive\",\n          launchId: request.launchId,\n          failureReason: \"runtime slots exhausted\",\n        });\n      }\n      return;\n    }\n    let start: Promise<void>;\n    try {\n      request = await this.prepareStartRequestForRuntimeProfile(request);\n      if (this.startCancellationEpoch(request.aiEmployeeId) === startCancellationEpoch) {\n        this.suppressedMemoryFingerprintCaches.delete(request.aiEmployeeId);\n      }\n      if (request.launchId) this.stoppedLaunches.delete(request.launchId);\n      start = this.startAIEmployee(\n        request.aiEmployeeId,\n        request.config,\n        request.wakeMessage,\n        request.deliveredMessages,\n        request.launchId,\n        request.taskId,\n        startCancellationEpoch\n      );\n      this.starting.set(scopedKey, start);\n      this.startingEpochs.set(scopedKey, startCancellationEpoch);\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.terminalizeQueuedMessagesForScopedKey(request.aiEmployeeId, this.startingInboxes, scopedKey, detail);\n      this.finishPreparingStart(scopedKey);\n      this.syncSlotAfterRemoval(request.aiEmployeeId, scopedKey);\n      throw error;\n    } finally {\n      this.finishPreparingStart(scopedKey);\n    }\n    try {\n      await start;\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.terminalizeQueuedMessagesForScopedKey(request.aiEmployeeId, this.startingInboxes, scopedKey, detail);\n      throw error;\n    } finally {\n      this.starting.delete(scopedKey);\n      this.startingEpochs.delete(scopedKey);\n      this.syncSlotAfterRemoval(request.aiEmployeeId, scopedKey);\n    }\n  }\n\n  async startAIEmployee(\n    aiEmployeeId: string,\n    config: AIEmployeeConfig,\n    wakeMessage?: DeliveredMessage,\n    deliveredMessages?: DeliveredMessage[],\n    launchId?: string,\n    taskId?: string,\n    expectedStartCancellationEpoch = this.startCancellationEpoch(aiEmployeeId)\n  ): Promise<void> {\n    this.log(`ai_employee start ai_employee=${aiEmployeeId} runtime=${config.runtime} launch=${launchId ?? \"-\"} session=${config.sessionId ?? \"new\"}`);\n    const requestedMessages = deliveredMessages ?? (wakeMessage ? [wakeMessage] : undefined);\n    try {\n      await this.validateRuntimeConfig(config);\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.log(`AI employee config rejected ai_employee=${aiEmployeeId} error=${detail}`);\n      const validationScope = this.runtimeSessionScopeForConfig(config);\n      this.terminalizeQueuedMessagesForScopedKey(\n        aiEmployeeId,\n        this.startingInboxes,\n        this.scopedAIEmployeeKey(aiEmployeeId, validationScope),\n        detail\n      );\n      this.sendDeliverProcessedForMessages(\n        aiEmployeeId,\n        requestedMessages,\n        launchId,\n        \"failed\",\n        validationScope,\n        detail\n      );\n      this.sendActivity({\n        aiEmployeeId,\n        activity: \"error\",\n        detail,\n        launchId,\n        entries: [{ kind: \"error\", text: detail, timestamp: Date.now() }],\n      });\n      this.options.sendToServer({ type: \"ai_employee:status\", aiEmployeeId, status: \"inactive\", launchId, failureReason: detail });\n      return;\n    }\n    const startScope = this.runtimeSessionScopeForConfig(config);\n    const scopedKey = this.scopedAIEmployeeKey(aiEmployeeId, startScope);\n    if (this.finishCancelledStart({ aiEmployeeId, messages: requestedMessages, launchId, runtimeSessionScope: startScope, expectedStartCancellationEpoch })) return;\n    // createAIEmployeeWorkspace \u4F1A\u5199 system-prompt\u3001wrapper\u3001tool-policy \u7B49\u5458\u5DE5\u7EA7\u5171\u4EAB\u6587\u4EF6\uFF1B\n    // \u5E76\u53D1 scope \u540C\u65F6\u542F\u52A8\u65F6\u5FC5\u987B\u4E32\u884C\uFF08Task 4 \u540E\u662F\u771F\u5B9E\u573A\u666F\uFF09\u3002\n    const workspace = await this.employeeFileMutex.withLock(aiEmployeeId, async () => {\n      const created = await createAIEmployeeWorkspace({\n        rootDir: this.options.rootDir,\n        serverNamespace: config.serverNamespace,\n        serverId: config.spaceId,\n        machineDirectoryName: this.machineDirectoryName(config),\n        machineId: config.machineId,\n        aiEmployeeDirectoryName: this.aiEmployeeDirectoryName(config, aiEmployeeId),\n        daemonId: os.hostname() || \"local-daemon\",\n        aiEmployeeId,\n        aiEmployeeName: config.aiEmployeeName,\n        runtime: config.runtime,\n        sandboxMode: config.sandboxMode,\n        role: config.role,\n        aiEmployeeWorkContext: config.aiEmployeeWorkContext,\n        profileRevision: config.profileRevision,\n        systemPromptRevision: config.systemPromptRevision,\n        memoryRestore: config.memoryRestore,\n        profileApplyGeneration: config.profileApplyGeneration,\n        learningCandidateSnapshot: config.learningCandidateSnapshot,\n      });\n      await this.reconcileRetroBeforeWorkspaceMutation(aiEmployeeId, created.aiEmployeeDir);\n      return created;\n    });\n    if (this.finishCancelledStart({ aiEmployeeId, messages: requestedMessages, launchId, runtimeSessionScope: startScope, expectedStartCancellationEpoch })) return;\n    this.log(`workspace ready ai_employee=${aiEmployeeId} dir=${workspace.aiEmployeeDir}`);\n    // Restore persisted feishu session IDs on daemon restart.\n    // Covers both feishu_customer_service (webhook) and feishu_ai_employee (personal agent).\n    const startFeishuChatId = this.feishuChatIdFromScope(startScope);\n    if (!config.sessionId && startFeishuChatId) {\n      const chatId = startFeishuChatId;\n      const saved = await loadFeishuSessions(workspace.aiEmployeeDir);\n      if (this.finishCancelledStart({ aiEmployeeId, messages: requestedMessages, launchId, runtimeSessionScope: startScope, expectedStartCancellationEpoch })) return;\n      const savedSessionId = saved.get(chatId);\n      if (savedSessionId) {\n        config = { ...config, sessionId: savedSessionId };\n        this.log(`feishu session restored ai_employee=${aiEmployeeId} chat=${chatId} session=${savedSessionId}`);\n      }\n      // Pre-populate other feishu chats so they resume too when triggered.\n      for (const [cId, sId] of saved) {\n        if (cId === chatId) continue;\n        const cScope = externalScope(\"feishu\", cId);\n        const cKey = this.scopedAIEmployeeKey(aiEmployeeId, cScope);\n        if (!this.idleConfigs.has(cKey) && !this.running.has(cKey)) {\n          this.idleConfigs.set(cKey, { aiEmployeeId, runtimeSessionScope: cScope, config: { ...config, sessionId: sId }, sessionId: sId, workspace });\n        }\n      }\n    }\n    const startQueued = this.startingInboxes.get(scopedKey) ?? [];\n    this.startingInboxes.delete(scopedKey);\n    const initialMessages = dedupeDeliveredMessages(deliveredMessages ?? (wakeMessage ? [wakeMessage] : []));\n    const incomingMessages = dedupeDeliveredMessages([...initialMessages, ...startQueued]);\n    const messagesForTurn = incomingMessages.slice(0, 1);\n    const deferredMessages = incomingMessages.slice(1);\n    const initialMessageKeys = new Set(initialMessages.map(deliveredMessageKey));\n    const firstTurnMessage = messagesForTurn[0];\n    if (firstTurnMessage && !initialMessageKeys.has(deliveredMessageKey(firstTurnMessage))) {\n      const firstQueuedKey = queuedDeliveryMetadataKey(aiEmployeeId, firstTurnMessage);\n      const queuedScope = this.queuedRuntimeScopes.get(firstQueuedKey) ?? startScope;\n      launchId = this.queuedLaunchIds.get(firstQueuedKey) ?? launchId;\n      taskId = (this.queuedTaskIds.get(firstQueuedKey) ?? firstTurnMessage.message_id) || taskId;\n      config = {\n        ...config,\n        sessionId: this.queuedRuntimeSessionIds.get(firstQueuedKey) ?? config.sessionId,\n        runtimeSessionScope: queuedScope,\n      };\n      this.clearQueuedMessageMetadata(aiEmployeeId, firstTurnMessage);\n    }\n    const turnScope = this.runtimeSessionScopeForConfig(config);\n    if (deferredMessages.length > 0) {\n      const deferredInitialMessages = deferredMessages.filter((message) => initialMessageKeys.has(deliveredMessageKey(message)));\n      this.rememberQueuedMessageLaunch(aiEmployeeId, deferredInitialMessages, launchId, taskId, startScope, config.sessionId);\n      this.pushInbox(this.runningInboxes, scopedKey, deferredMessages);\n    }\n    try {\n      await this.writeRuntimeEnv(workspace, config, aiEmployeeId);\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.sendDeliverProcessedForMessages(aiEmployeeId, messagesForTurn, launchId, \"failed\", turnScope, detail);\n      this.terminalizeQueuedMessagesForScopedKey(aiEmployeeId, this.runningInboxes, scopedKey, detail);\n      throw error;\n    }\n    if (this.finishCancelledStart({ aiEmployeeId, messages: messagesForTurn, launchId, runtimeSessionScope: turnScope, expectedStartCancellationEpoch })) return;\n    const runtimeEnv = this.buildRuntimeEnv(workspace, config, aiEmployeeId);\n    const controller = new AbortController();\n    const running: RunningAIEmployee = { aiEmployeeId, scopedKey, workspace, sessionId: config.sessionId, config, controller, launchId, state: \"busy\", runtimeEnv, runtimeSessionScope: turnScope };\n    this.running.set(scopedKey, running);\n    const runDone = this.runAIEmployeeRuntime({ aiEmployeeId, config, workspace, wakeMessage, deliveredMessages: messagesForTurn, launchId, taskId, runtimeEnv, controller })\n      .catch((error) => {\n        const detail = controller.signal.aborted ? \"stopped\" : error instanceof Error ? error.message : String(error);\n        this.sendDeliverProcessedForMessages(aiEmployeeId, messagesForTurn, launchId, \"failed\", turnScope, detail);\n        if (controller.signal.aborted) return;\n        this.log(`AI employee runtime failed ai_employee=${aiEmployeeId} error=${detail}`);\n        this.sendActivity({\n          aiEmployeeId,\n          activity: \"error\",\n          detail,\n          launchId,\n          entries: [{ kind: \"error\", text: detail, timestamp: Date.now() }],\n        });\n        this.options.sendToServer({ type: \"ai_employee:status\", aiEmployeeId, status: \"inactive\", launchId, failureReason: detail });\n      })\n      .finally(() => {\n        const current = this.running.get(scopedKey);\n        if (current && current.launchId === launchId && !current.adapter) {\n          this.running.delete(scopedKey);\n          this.syncSlotAfterRemoval(aiEmployeeId, scopedKey);\n        }\n      });\n    running.done = runDone;\n    this.setIdleConfig(aiEmployeeId, { config, sessionId: config.sessionId, workspace });\n    this.options.sendToServer({ type: \"ai_employee:status\", aiEmployeeId, status: \"active\", launchId });\n    this.sendActivity({\n      aiEmployeeId,\n      activity: \"working\",\n      detail: \"Starting...\",\n      launchId,\n      entries: [{ kind: \"status\", text: \"Starting...\", timestamp: Date.now() }],\n      pendingInboxCount: this.queuedInboxCount(aiEmployeeId),\n    });\n  }\n\n  private async detectRuntimeModels(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]> {\n    if (this.modelDetector.detectAll) return this.modelDetector.detectAll(runtimes);\n    return Promise.all(runtimes.map((runtime) => this.modelDetector.detect(runtime)));\n  }\n\n  private async validateRuntimeConfig(config: AIEmployeeConfig): Promise<void> {\n    const detection = await this.modelDetector.detect(config.runtime);\n    const requestedModel = config.model?.trim() || \"default\";\n    const model = selectRuntimeModel(detection, requestedModel);\n    const reasoningEffort = config.reasoningEffort?.trim();\n    if (!reasoningEffort || reasoningEffort === \"default\") return;\n    const allowed = model?.reasoningEfforts?.length ? model.reasoningEfforts : [\"default\"];\n    if (!allowed.includes(reasoningEffort)) {\n      throw new Error(`unsupported reasoning effort for ${config.runtime}/${model?.id ?? requestedModel}: ${reasoningEffort}`);\n    }\n  }\n\n  private finishCancelledStart(input: {\n    aiEmployeeId: string;\n    messages?: DeliveredMessage[];\n    launchId?: string;\n    runtimeSessionScope: RuntimeSessionScope;\n    expectedStartCancellationEpoch: number;\n  }): boolean {\n    if (\n      this.startCancellationEpoch(input.aiEmployeeId) === input.expectedStartCancellationEpoch\n      && !this.disposeController.signal.aborted\n    ) return false;\n    const detail = this.disposeController.signal.aborted\n      ? \"daemon disposed before runtime registration\"\n      : \"stopped before runtime registration\";\n    this.log(`ai_employee start cancelled before runtime registration ai_employee=${input.aiEmployeeId}`);\n    this.terminalizeQueuedMessagesForScopedKey(\n      input.aiEmployeeId,\n      this.startingInboxes,\n      this.scopedAIEmployeeKey(input.aiEmployeeId, input.runtimeSessionScope),\n      detail\n    );\n    this.sendDeliverProcessedForMessages(\n      input.aiEmployeeId,\n      input.messages,\n      input.launchId,\n      \"failed\",\n      input.runtimeSessionScope,\n      detail\n    );\n    this.options.sendToServer({\n      type: \"ai_employee:status\",\n      aiEmployeeId: input.aiEmployeeId,\n      status: \"inactive\",\n      launchId: input.launchId,\n      failureReason: detail,\n    });\n    return true;\n  }\n\n  private sendActivity(msg: Omit<Extract<DaemonToServerMessage, { type: \"ai_employee:activity\" }>, \"type\">): void {\n    if (msg.launchId && this.stoppedLaunches.has(msg.launchId) && msg.activity !== \"offline\") return;\n    this.lastActivities.set(msg.aiEmployeeId, { activity: normalizeCachedActivity(msg.activity), detail: msg.detail, launchId: msg.launchId, clientSeq: msg.clientSeq });\n    // \u7EDF\u4E00\u6CE8\u5165\u8BE5\u5458\u5DE5\u5F53\u524D\u6D3B\u8DC3 scope \u5B9E\u4F8B\u6570\uFF0C\u8C03\u7528\u70B9\u65E0\u9700\u5404\u81EA\u8BA1\u7B97\u3002\n    const activeScopeCount = msg.activeScopeCount ?? this.runningEntriesFor(msg.aiEmployeeId).length;\n    this.options.sendToServer({ type: \"ai_employee:activity\", ...msg, activeScopeCount });\n  }\n\n  private runtimeEventsReadLessons(events: RuntimeEvent[]): boolean | null {\n    if (!events.length) return null;\n    return events.some((event) => {\n      const text = `${event.type}\\n${event.content ?? \"\"}\\n${JSON.stringify(event.data ?? \"\")}`;\n      return text.includes(\"notes/lessons.md\") || text.includes(\"lessons.md\");\n    });\n  }\n\n  private async captureMemoryStatsAndSnapshot(input: {\n    aiEmployeeId: string;\n    workspace: AIEmployeeWorkspace;\n    before: Map<string, string>;\n    events: RuntimeEvent[];\n    trigger?: Extract<Extract<DaemonToServerMessage, { type: \"ai_employee:memory_snapshot\" }>[\"trigger\"], string>;\n    forceSnapshot?: boolean;\n  }): Promise<AIEmployeeMemoryStats> {\n    const lessonsRead = this.runtimeEventsReadLessons(input.events);\n    try {\n      const after = await captureMemoryFingerprint(input.workspace.aiEmployeeDir, this.memoryFingerprintCacheFor(input.aiEmployeeId));\n      const stats = diffMemoryFingerprints(input.before, after, lessonsRead);\n      if (!stats.memory_updated && !input.forceSnapshot) return stats;\n      const files = await collectMemorySnapshot(input.workspace.aiEmployeeDir);\n      const message: Extract<DaemonToServerMessage, { type: \"ai_employee:memory_snapshot\" }> = {\n        type: \"ai_employee:memory_snapshot\",\n        aiEmployeeId: input.aiEmployeeId,\n        trigger: input.trigger ?? \"run_end\",\n        takenAt: Date.now(),\n        files,\n      };\n      assertMemorySnapshotMessageWithinLimit(message);\n      this.options.sendToServer(message);\n      return stats;\n    } catch (error) {\n      this.log(`memory snapshot skipped ai_employee=${input.aiEmployeeId} error=${error instanceof Error ? error.message : String(error)}`);\n      return {\n        memory_updated: false,\n        notes_written: [],\n        lessons_read: lessonsRead,\n      };\n    }\n  }\n\n  private async settleMemoryAfterTurn(input: {\n    aiEmployeeId: string;\n    workspace: AIEmployeeWorkspace;\n    before: Map<string, string>;\n    events: RuntimeEvent[];\n    isRetroMaintenanceTurn: boolean;\n  }): Promise<{ stats: AIEmployeeMemoryStats; retroPromoted: boolean }> {\n    if (!input.isRetroMaintenanceTurn) {\n      return {\n        stats: await this.captureMemoryStatsAndSnapshot({\n          aiEmployeeId: input.aiEmployeeId,\n          workspace: input.workspace,\n          before: input.before,\n          events: input.events,\n        }),\n        retroPromoted: false,\n      };\n    }\n    try {\n      return await this.employeeFileMutex.withLock(input.aiEmployeeId, async () => {\n        const reconciliation = await reconcileCommittedRetroStaging(input.workspace.aiEmployeeDir);\n        if (reconciliation.pendingStages.length || reconciliation.conflictStages.length) {\n          this.log(`retro staging unresolved ai_employee=${input.aiEmployeeId} pending=${reconciliation.pendingStages.length} conflicts=${reconciliation.conflictStages.length}`);\n          return {\n            stats: { memory_updated: false, notes_written: [], lessons_read: this.runtimeEventsReadLessons(input.events) },\n            retroPromoted: false,\n          };\n        }\n        if (!reconciliation.promoted || !reconciliation.generationId) {\n          if (reconciliation.status === \"conflict\") this.log(`retro staging base conflict ai_employee=${input.aiEmployeeId}`);\n          return {\n            stats: {\n              memory_updated: false,\n              notes_written: [],\n              lessons_read: this.runtimeEventsReadLessons(input.events),\n            },\n            retroPromoted: false,\n          };\n        }\n        const after = await captureMemoryFingerprint(input.workspace.aiEmployeeDir, this.memoryFingerprintCacheFor(input.aiEmployeeId));\n        const stats = diffMemoryFingerprints(input.before, after, this.runtimeEventsReadLessons(input.events));\n        const files = await collectMemorySnapshot(input.workspace.aiEmployeeDir);\n        const message: Extract<DaemonToServerMessage, { type: \"ai_employee:memory_snapshot\" }> = {\n          type: \"ai_employee:memory_snapshot\",\n          generationId: reconciliation.generationId,\n          aiEmployeeId: input.aiEmployeeId,\n          trigger: \"retro\",\n          takenAt: Date.now(),\n          files,\n        };\n        assertMemorySnapshotMessageWithinLimit(message);\n        const acknowledged = await this.sendMemorySnapshotAndWaitForAck(message);\n        if (!acknowledged) return { stats, retroPromoted: false };\n        await finalizePromotedRetroStaging(reconciliation.stageDirectories);\n        return { stats, retroPromoted: true };\n      });\n    } catch (error) {\n      this.log(`retro staging reconciliation skipped ai_employee=${input.aiEmployeeId} error=${error instanceof Error ? error.message : String(error)}`);\n      return {\n        stats: {\n          memory_updated: false,\n          notes_written: [],\n          lessons_read: this.runtimeEventsReadLessons(input.events),\n        },\n        retroPromoted: false,\n      };\n    }\n  }\n\n  private async reconcileRetroBeforeWorkspaceMutation(aiEmployeeId: string, aiEmployeeDir: string): Promise<void> {\n    const reconciliation = await reconcileCommittedRetroStaging(aiEmployeeDir);\n    if (reconciliation.pendingStages.length || reconciliation.conflictStages.length) {\n      const pending = reconciliation.pendingStages.map((stage) => stage.status).join(\",\") || \"none\";\n      const conflicts = reconciliation.conflictStages.map((stage) => stage.reason).join(\",\") || \"none\";\n      throw new Error(`unresolved retro staging blocks workspace mutation: pending=${pending}; conflicts=${conflicts}`);\n    }\n    if (!reconciliation.promoted || !reconciliation.generationId) return;\n    const files = await collectMemorySnapshot(aiEmployeeDir);\n    const message: Extract<DaemonToServerMessage, { type: \"ai_employee:memory_snapshot\" }> = {\n      type: \"ai_employee:memory_snapshot\",\n      generationId: reconciliation.generationId,\n      aiEmployeeId,\n      trigger: \"retro\",\n      takenAt: Date.now(),\n      files,\n    };\n    assertMemorySnapshotMessageWithinLimit(message);\n    const acknowledged = await this.sendMemorySnapshotAndWaitForAck(message);\n    if (!acknowledged) throw new Error(\"memory snapshot persistence ACK was not received\");\n    await finalizePromotedRetroStaging(reconciliation.stageDirectories);\n  }\n\n  private memorySnapshotAckKey(aiEmployeeId: string, generationId: string): string {\n    return `${aiEmployeeId}\\0${generationId}`;\n  }\n\n  private async sendMemorySnapshotAndWaitForAck(\n    message: Extract<DaemonToServerMessage, { type: \"ai_employee:memory_snapshot\" }>,\n  ): Promise<boolean> {\n    const generationId = message.generationId;\n    if (!generationId) throw new Error(\"memory snapshot generation id is required for ACK\");\n    const key = this.memorySnapshotAckKey(message.aiEmployeeId, generationId);\n    if (this.pendingMemorySnapshotAcks.has(key)) throw new Error(\"memory snapshot ACK waiter already exists\");\n    try {\n      await new Promise<void>((resolve, reject) => {\n        const timeout = setTimeout(() => {\n          this.pendingMemorySnapshotAcks.delete(key);\n          reject(new Error(\"memory snapshot persistence ACK timed out\"));\n        }, Math.max(1, this.options.memorySnapshotAckTimeoutMs ?? 8_000));\n        this.pendingMemorySnapshotAcks.set(key, { timeout, resolve, reject });\n        try {\n          this.options.sendToServer(message);\n        } catch (error) {\n          clearTimeout(timeout);\n          this.pendingMemorySnapshotAcks.delete(key);\n          reject(error instanceof Error ? error : new Error(String(error)));\n        }\n      });\n      return true;\n    } catch (error) {\n      this.log(`memory snapshot ACK unavailable ai_employee=${message.aiEmployeeId} generation=${generationId} error=${error instanceof Error ? error.message : String(error)}`);\n      return false;\n    }\n  }\n\n  private async safeCaptureMemoryFingerprint(aiEmployeeId: string, workspace: AIEmployeeWorkspace): Promise<Map<string, string>> {\n    try {\n      return await captureMemoryFingerprint(workspace.aiEmployeeDir, this.memoryFingerprintCacheFor(aiEmployeeId));\n    } catch (error) {\n      this.log(`memory fingerprint skipped ai_employee=${aiEmployeeId} error=${error instanceof Error ? error.message : String(error)}`);\n      return new Map();\n    }\n  }\n\n  private memoryFingerprintCacheFor(aiEmployeeId: string): MemoryFingerprintCache {\n    if (this.suppressedMemoryFingerprintCaches.has(aiEmployeeId)) return new Map();\n    const existing = this.memoryFingerprintCaches.get(aiEmployeeId);\n    if (existing) return existing;\n    const created: MemoryFingerprintCache = new Map();\n    this.memoryFingerprintCaches.set(aiEmployeeId, created);\n    return created;\n  }\n\n  private requestRuntimePermission(aiEmployeeId: string, launchId: string | undefined, request: RuntimePermissionRequest): Promise<RuntimePermissionDecision> {\n    const requestId = `perm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n    this.log(`permission request ai_employee=${aiEmployeeId} request=${requestId} kind=${request.kind}`);\n    this.sendActivity({\n      aiEmployeeId,\n      activity: \"working\",\n      detail: \"Waiting for permission\",\n      launchId,\n      entries: [{ kind: \"status\", text: request.title, timestamp: Date.now() }],\n      pendingInboxCount: this.queuedInboxCount(aiEmployeeId) + 1,\n    });\n    this.options.sendToServer({\n      type: \"ai_employee:permission_request\",\n      aiEmployeeId,\n      requestId,\n      launchId,\n      kind: request.kind,\n      title: request.title,\n      description: request.description,\n      metadata: request.metadata,\n    });\n    return new Promise((resolve) => {\n      const timeout = setTimeout(() => {\n        this.pendingPermissions.delete(requestId);\n        this.log(`permission timeout ai_employee=${aiEmployeeId} request=${requestId}`);\n        resolve({ action: \"reject\", metadata: { reason: \"permission timeout\" } });\n      }, 10 * 60_000);\n      this.pendingPermissions.set(requestId, { aiEmployeeId, timeout, resolve });\n    });\n  }\n\n  private resolvePermissionDecision(aiEmployeeId: string, requestId: string, action: \"approve\" | \"reject\", metadata?: Record<string, unknown>): void {\n    const pending = this.pendingPermissions.get(requestId);\n    if (!pending || pending.aiEmployeeId !== aiEmployeeId) return;\n    clearTimeout(pending.timeout);\n    this.pendingPermissions.delete(requestId);\n    this.log(`permission decision ai_employee=${aiEmployeeId} request=${requestId} action=${action}`);\n    pending.resolve({ action, metadata });\n  }\n\n  private async ensureAIEmployeeWorkspace(aiEmployeeId: string, config?: AIEmployeeConfig, options?: { refresh?: boolean }): Promise<{ workspace?: AIEmployeeWorkspace; missing?: boolean }> {\n    const running = this.firstRunningEntryFor(aiEmployeeId);\n    if (running?.workspace && !options?.refresh) return { workspace: running.workspace };\n    const idle = config ? this.idleConfigFor(aiEmployeeId, this.runtimeSessionScopeForConfig(config)) ?? this.firstIdleConfigForAIEmployee(aiEmployeeId) : this.firstIdleConfigForAIEmployee(aiEmployeeId);\n    if (idle?.workspace && !options?.refresh) return { workspace: idle.workspace };\n    const effectiveConfig = config ?? running?.config ?? idle?.config;\n    if (!effectiveConfig) return { missing: true };\n    const workspace = await this.employeeFileMutex.withLock(aiEmployeeId, () => createAIEmployeeWorkspace({\n      rootDir: this.options.rootDir,\n      serverNamespace: effectiveConfig.serverNamespace,\n      serverId: effectiveConfig.spaceId,\n      machineDirectoryName: this.machineDirectoryName(effectiveConfig),\n      machineId: effectiveConfig.machineId,\n      aiEmployeeDirectoryName: this.aiEmployeeDirectoryName(effectiveConfig, aiEmployeeId),\n      daemonId: os.hostname() || \"local-daemon\",\n      aiEmployeeId,\n      aiEmployeeName: effectiveConfig.aiEmployeeName,\n      runtime: effectiveConfig.runtime,\n      sandboxMode: effectiveConfig.sandboxMode,\n      role: effectiveConfig.role,\n      aiEmployeeWorkContext: effectiveConfig.aiEmployeeWorkContext,\n      profileRevision: effectiveConfig.profileRevision,\n      systemPromptRevision: effectiveConfig.systemPromptRevision,\n      memoryRestore: effectiveConfig.memoryRestore,\n      profileApplyGeneration: effectiveConfig.profileApplyGeneration,\n      learningCandidateSnapshot: effectiveConfig.learningCandidateSnapshot,\n    }));\n    for (const entry of this.runningEntriesFor(aiEmployeeId)) {\n      entry.workspace = workspace;\n      entry.config = effectiveConfig;\n    }\n    this.setIdleConfig(aiEmployeeId, { config: effectiveConfig, sessionId: effectiveConfig.sessionId, workspace });\n    return { workspace };\n  }\n\n  private async replyWorkspaceInit(requestId: string, aiEmployeeId: string, config: AIEmployeeConfig): Promise<void> {\n    const recorder = this.createTemplatePrepareRecorder();\n    try {\n      const { workspace } = await recorder.step(\"\u51C6\u5907\u5458\u5DE5\u5DE5\u4F5C\u533A\", () => this.ensureAIEmployeeWorkspace(aiEmployeeId, config));\n      if (workspace) {\n        appendReferenceIndexPrepareEntry(recorder.entries, workspace);\n        await recorder.step(\"\u51C6\u5907\u8FD0\u884C\u5BB9\u5668\", () => this.prepareSandboxContainerForWorkspaceInit(aiEmployeeId, config, workspace));\n      }\n      this.options.sendToServer({\n        type: \"ai_employee:workspace:init/result\",\n        requestId,\n        aiEmployeeId,\n        ok: true,\n        workspacePath: workspace ? this.workspaceDisplayPath(config, aiEmployeeId) : undefined,\n        prepareEntries: recorder.entries,\n      });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:workspace:init/result\",\n        requestId,\n        aiEmployeeId,\n        ok: false,\n        prepareEntries: recorder.entries,\n        error: error instanceof Error ? error.message : \"workspace init failed\",\n      });\n    }\n  }\n\n  private async prepareSandboxContainerForWorkspaceInit(aiEmployeeId: string, config: AIEmployeeConfig, workspace: AIEmployeeWorkspace): Promise<void> {\n    const executionBackend = this.executionBackendForConfig(config);\n    if (executionBackend.kind !== \"container\") return;\n    await this.writeRuntimeEnv(workspace, config, aiEmployeeId);\n    const runtimeEnv = this.buildRuntimeEnv(workspace, config, aiEmployeeId);\n    await executionBackend.prepareEmployee({\n      employeeId: aiEmployeeId,\n      workspaceDir: workspace.aiEmployeeDir,\n      runtime: config.runtime,\n      env: runtimeEnv,\n    });\n    this.log(`sandbox container ready ai_employee=${aiEmployeeId} runtime=${config.runtime} dir=${workspace.aiEmployeeDir}`);\n  }\n\n  private async ensureWorkspaceTemplateTools(\n    aiEmployeeId: string,\n    config: AIEmployeeConfig,\n    workspace: AIEmployeeWorkspace,\n    executionBackend: ExecutionBackend,\n    runtimeEnv: NodeJS.ProcessEnv\n  ): Promise<void> {\n    if (!isFeishuIntegratedAIEmployeeTemplateKey(config.aiEmployeeWorkContext?.templateKey)) return;\n    // Fast-path: skip mutex entirely when tool is already installed.\n    // This lets the function be called from within an employeeFileMutex.withLock\n    // scope safely, provided a prior call outside that scope installed the tool first.\n    const alreadyInstalled = executionBackend.kind === \"container\"\n      ? existsSync(path.join(workspace.wmDir, \"tools\", \"lark-cli\", \"node_modules\", \".bin\", \"lark-cli\"))\n      : existsSync(path.join(workspace.wmDir, \"tools\", \"lark-cli\", \"bin\", process.platform === \"win32\" ? \"lark-cli.cmd\" : \"lark-cli\"));\n    if (alreadyInstalled) return;\n    await this.employeeFileMutex.withLock(aiEmployeeId, async () => {\n      if (executionBackend.kind === \"container\") {\n        await this.ensureContainerLarkCliTool(aiEmployeeId, config, workspace, executionBackend, runtimeEnv);\n      } else {\n        await this.ensureHostLarkCliTool(workspace);\n      }\n    });\n  }\n\n  private async ensureHostLarkCliTool(workspace: AIEmployeeWorkspace): Promise<void> {\n    const target = path.join(workspace.wmDir, \"tools\", \"lark-cli\", \"bin\", process.platform === \"win32\" ? \"lark-cli.cmd\" : \"lark-cli\");\n    if (existsSync(target)) return;\n    const source = await resolveLarkCliBinary();\n    if (!source || source === \"lark-cli\" || !existsSync(source)) return;\n    await mkdir(path.dirname(target), { recursive: true });\n    await copyFile(source, target);\n    if (process.platform !== \"win32\") await chmod(target, 0o755);\n  }\n\n  private async ensureContainerLarkCliTool(\n    aiEmployeeId: string,\n    config: AIEmployeeConfig,\n    workspace: AIEmployeeWorkspace,\n    executionBackend: ExecutionBackend,\n    runtimeEnv: NodeJS.ProcessEnv\n  ): Promise<void> {\n    const shim = path.join(workspace.wmDir, \"tools\", \"lark-cli\", \"node_modules\", \".bin\", \"lark-cli\");\n    if (existsSync(shim)) return;\n    await mkdir(path.join(workspace.wmDir, \"tools\", \"lark-cli\"), { recursive: true });\n    this.log(`template tool install ai_employee=${aiEmployeeId} tool=lark-cli target=${path.join(workspace.wmDir, \"tools\", \"lark-cli\")}`);\n    const child = executionBackend.spawnRuntime({\n      command: \"npm\",\n      args: [\n        \"install\",\n        \"--prefix\",\n        \"/workspace/.wm/tools/lark-cli\",\n        \"--omit=dev\",\n        \"--no-audit\",\n        \"--no-fund\",\n        `@larksuite/cli@${resolveLarkCliPackageVersion()}`,\n      ],\n      cwd: workspace.aiEmployeeDir,\n      runtime: config.runtime,\n      env: runtimeEnv,\n      employeeId: aiEmployeeId,\n      stdio: \"pipe\",\n    });\n    await waitForChild(child, \"install lark-cli template tool\");\n  }\n\n  private async runAIEmployeeRuntime(input: {\n    aiEmployeeId: string;\n    config: AIEmployeeConfig;\n    workspace: AIEmployeeWorkspace;\n    wakeMessage?: DeliveredMessage;\n    deliveredMessages?: DeliveredMessage[];\n    launchId?: string;\n    taskId?: string;\n    runtimeEnv: NodeJS.ProcessEnv;\n    controller: AbortController;\n  }): Promise<void> {\n    const { aiEmployeeId, config, workspace, wakeMessage, deliveredMessages, launchId, taskId, runtimeEnv, controller } = input;\n    const turnScope = this.runtimeSessionScopeForConfig(config);\n    const scopedKey = this.scopedAIEmployeeKey(aiEmployeeId, turnScope);\n    let messagesForTurn = deliveredMessages?.length ? deliveredMessages.slice(0, 1) : (wakeMessage ? [wakeMessage] : []);\n    messagesForTurn = await this.materializeDeliveredMessageAttachments(aiEmployeeId, config, workspace, messagesForTurn);\n    const deliveryProcessingStartedAt = Date.now();\n    for (const delivered of messagesForTurn) {\n      await this.recordDeliveredMessageNote(aiEmployeeId, workspace, delivered, delivered.seq);\n    }\n    await this.writeCurrentTurnContext(workspace, config, messagesForTurn[0], launchId);\n    await this.writeTurnToolPolicy(workspace, config, messagesForTurn[0]);\n    const executionBackend = this.executionBackendForConfig(config);\n    const memoryBefore = await this.safeCaptureMemoryFingerprint(aiEmployeeId, workspace);\n    const isRetroMaintenanceTurn = messagesForTurn[0]?.metadata?.maintenance === true || messagesForTurn[0]?.metadata?.routine_template_key === \"retro\";\n\n    if (process.env.WM_DAEMON_FAKE_RUNTIME === \"1\") {\n      await executionBackend.prepareEmployee({\n        employeeId: aiEmployeeId,\n        workspaceDir: workspace.aiEmployeeDir,\n        runtime: config.runtime,\n        env: runtimeEnv,\n      });\n      await this.ensureWorkspaceTemplateTools(aiEmployeeId, config, workspace, executionBackend, runtimeEnv);\n      this.log(`fake runtime start ai_employee=${aiEmployeeId}`);\n      const result = await this.runFakeRuntime({\n        aiEmployeeId,\n        config,\n        wakeMessage: messagesForTurn[0] ?? wakeMessage,\n        abortSignal: controller.signal,\n        workspace,\n        launchId,\n        executionBackend,\n      });\n      this.log(`fake runtime done ai_employee=${aiEmployeeId}`);\n      if (result.runtimeSessionId) {\n        const nextConfig = { ...config, sessionId: result.runtimeSessionId };\n        this.setIdleConfig(aiEmployeeId, { config: nextConfig, sessionId: result.runtimeSessionId, workspace });\n        this.options.sendToServer({ type: \"ai_employee:session\", aiEmployeeId, sessionId: result.runtimeSessionId, runtimeSessionScope: this.runtimeSessionScopeForConfig(config), launchId });\n      }\n      await this.recordRuntimeSessionDiagnostic(aiEmployeeId, workspace, config.runtime, result.runtimeSessionId, result.runtimeSessionId ? \"cold_start\" : \"unavailable\", undefined, this.runtimeSessionScopeForConfig(config), executionBackend);\n      await this.writeRunLog(workspace, {\n        aiEmployeeId,\n        launchId,\n        taskId,\n        runtime: config.runtime,\n        runtimeSessionId: result.runtimeSessionId,\n        status: \"ok\",\n        finalMessage: result.finalMessage,\n        events: result.events,\n      });\n      if (controller.signal.aborted || (launchId && this.stoppedLaunches.has(launchId))) {\n        this.log(`fake ai_employee done ignored after stop ai_employee=${aiEmployeeId} launch=${launchId ?? \"-\"}`);\n        this.sendDeliverProcessedForMessages(aiEmployeeId, messagesForTurn, launchId, \"failed\", this.runtimeSessionScopeForConfig(config), \"stopped\", deliveryProcessingStartedAt);\n        return;\n      }\n      const memorySettlement = await this.settleMemoryAfterTurn({\n        aiEmployeeId,\n        workspace,\n        before: memoryBefore,\n        events: result.events,\n        isRetroMaintenanceTurn,\n      });\n      const memoryStats = memorySettlement.stats;\n      if (memorySettlement.retroPromoted) await this.archiveDeliveredNotesAfterRetro(aiEmployeeId, workspace);\n      this.sendDeliverProcessedForMessages(aiEmployeeId, messagesForTurn, launchId, \"ok\", this.runtimeSessionScopeForConfig(config), \"Fake runtime completed\", deliveryProcessingStartedAt, result.finalMessage.trim());\n      this.sendActivity({\n        aiEmployeeId,\n        activity: \"idle\",\n        detail: \"Fake runtime completed\",\n        launchId,\n        entries: result.events.map((event) => ({ kind: \"text\" as const, text: event.content ?? event.type, timestamp: Date.now() })),\n        memory_stats: memoryStats,\n      });\n      this.sendAvailability({\n        type: \"ai_employee:availability\",\n        aiEmployeeId,\n        daemonState: \"wakeable\",\n        sessionId: result.runtimeSessionId,\n        runtimeSessionScope: this.runtimeSessionScopeForConfig(config),\n        launchId,\n        turnOutcome: \"ok\",\n        workspaceReady: true,\n      });\n      this.running.delete(scopedKey);\n      this.syncSlotAfterRemoval(aiEmployeeId, scopedKey);\n      if (this.drainQueuedMessagesAfterTurn(aiEmployeeId, config, workspace, launchId, result.runtimeSessionId)) {\n        return;\n      }\n      return;\n    }\n\n    const systemPrompt = await readFile(workspace.systemPromptPath, \"utf8\");\n    const migrationKey = this.pendingMigrations.get(aiEmployeeId);\n    if (migrationKey) this.pendingMigrations.delete(aiEmployeeId);\n    const runtimeWrapperPath = this.runtimePathFor(workspace, config, workspace.wrapperPath);\n    const basePrompt = messagesForTurn.length > 0\n      ? formatActionableMessagePrompt(messagesForTurn, runtimeWrapperPath, aiEmployeeId)\n      : formatStartupPrompt(runtimeWrapperPath);\n    const prompt = migrationKey\n      ? `${basePrompt}\\n\\n[Runtime Profile Migration] Your runtime configuration has been updated. Before handling the above, re-ground yourself in the new context, then run: \\`${runtimeWrapperPath} profile migration-ack --key ${migrationKey}\\``\n      : basePrompt;\n    const tracker = new ActivityTracker();\n    const runtimeEvents: RuntimeEvent[] = [];\n    const requestPermission = (request: RuntimePermissionRequest) => this.requestRuntimePermission(aiEmployeeId, launchId, request);\n    let deltaLogText = \"\";\n    let deltaLogCount = 0;\n    const businessSummaries: string[] = [];\n    const seenBusinessSummaries = new Set<string>();\n    let sawAssistantResult = false;\n    let fatalRuntimeStderr: string | undefined;\n    const flushDeltaLog = () => {\n      if (!deltaLogCount) return;\n      this.log(`runtime stream ai_employee=${aiEmployeeId} type=assistant_delta chunks=${deltaLogCount} text=${compact(deltaLogText)}`);\n      deltaLogText = \"\";\n      deltaLogCount = 0;\n    };\n    const onEvent = (event: { type: string; content?: string; data?: unknown; silent?: boolean }) => {\n      runtimeEvents.push(event as RuntimeEvent);\n      if (event.type === \"assistant_delta\") {\n        if (event.content) deltaLogText += event.content;\n        deltaLogCount += 1;\n      } else {\n        flushDeltaLog();\n        if (event.type !== \"tool_progress\" && !event.silent) {\n          this.log(`runtime event ai_employee=${aiEmployeeId} type=${event.type}${event.content ? ` text=${compact(event.content)}` : \"\"}`);\n        }\n      }\n      if (event.type === \"assistant_result\" && event.content?.trim()) {\n        sawAssistantResult = true;\n      }\n      if (event.type === \"runtime_stderr\" && event.content && !fatalRuntimeStderr) {\n        fatalRuntimeStderr = classifyFatalRuntimeStderr(event.content);\n      }\n      for (const businessSummary of summarizeBusinessRuntimeEvent(event)) {\n        if (!seenBusinessSummaries.has(businessSummary)) {\n          seenBusinessSummaries.add(businessSummary);\n          businessSummaries.push(businessSummary);\n          this.log(`business ai_employee=${aiEmployeeId} ${businessSummary}`);\n        }\n      }\n      const running = this.running.get(scopedKey);\n      if (running) {\n        running.lastRuntimeEventAt = Date.now();\n        if (event.type === \"compaction_started\") {\n          running.compacting = true;\n          running.compactionStartedAt = Date.now();\n          if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n          const startedAt = running.compactionStartedAt;\n          running.compactionWatchdog = setTimeout(() => {\n            const r = this.running.get(scopedKey);\n            if (!r || r.compactionStartedAt !== startedAt) return;\n            this.log(`compaction stale ai_employee=${aiEmployeeId}`);\n            r.compacting = false;\n            r.compactionStartedAt = undefined;\n            r.compactionWatchdog = undefined;\n            this.sendActivity({\n              aiEmployeeId,\n              activity: \"working\",\n              detail: \"compaction_stale\",\n              launchId,\n              entries: [{ kind: \"status\", text: \"Context compaction still running; no finish event observed\", timestamp: Date.now() }],\n            });\n          }, 120000);\n        } else if (event.type === \"compaction_finished\") {\n          if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n          running.compacting = false;\n          running.compactionStartedAt = undefined;\n          running.compactionWatchdog = undefined;\n        }\n      }\n      const entries = tracker.toEntries([event]);\n      if (event.silent) return;\n      if (event.type === \"assistant_delta\") return;\n      if (event.type === \"tool_progress\" && !tracker.shouldPublishProgress(\"tool_progress\", 1000)) return;\n      if (entries.length === 0) return;\n      this.sendActivity({\n        aiEmployeeId,\n        activity: \"working\",\n        detail: event.type,\n        entries,\n        launchId,\n        clientSeq: tracker.nextSeq(),\n      });\n    };\n    let result;\n    let adapterForDiagnostic: PersistentRuntimeAdapter | undefined;\n    try {\n      const persistentAdapter = createPersistentRuntimeAdapter(config.runtime);\n      if (!persistentAdapter) {\n        throw new Error(`runtime ${config.runtime} does not support persistent execution`);\n      }\n      const running = this.running.get(scopedKey);\n      const adapter = running?.adapter && running.adapter.runtime === config.runtime\n        ? running.adapter\n        : persistentAdapter;\n      if (running) {\n        running.adapter = adapter;\n        running.state = \"busy\";\n      }\n      adapterForDiagnostic = adapter;\n      if (!adapter.alive) {\n        await executionBackend.prepareEmployee({\n          employeeId: aiEmployeeId,\n          workspaceDir: workspace.aiEmployeeDir,\n          runtime: config.runtime,\n          env: runtimeEnv,\n        });\n        await this.ensureWorkspaceTemplateTools(aiEmployeeId, config, workspace, executionBackend, runtimeEnv);\n        this.log(`runtime spawn ai_employee=${aiEmployeeId} runtime=${config.runtime} model=${config.model ?? \"default\"} reasoning=${config.reasoningEffort ?? \"default\"} permission=${config.permissionMode ?? \"default\"} cwd=${workspace.aiEmployeeDir} launch=${launchId ?? \"-\"} persistent=true`);\n        adapter.onExit = (code, signal) => {\n          this.log(`runtime exit ai_employee=${aiEmployeeId} runtime=${config.runtime} code=${code} signal=${signal ?? \"-\"}`);\n          const current = this.running.get(scopedKey);\n          if (current?.adapter === adapter && current.state !== \"stopping\") {\n            const wasIdle = current.state === \"idle\";\n            current.state = \"error\";\n            this.sendActivity({\n              aiEmployeeId,\n              activity: \"error\",\n              detail: \"Runtime exited\",\n              launchId: current.launchId,\n              entries: [{ kind: \"error\", text: `Runtime exited code=${code} signal=${signal ?? \"-\"}`, timestamp: Date.now() }],\n            });\n            if (wasIdle) {\n              // idle \u5B9E\u4F8B\u5D29\u6E83\u540E\u4E0D\u4F1A\u518D\u88AB\u590D\u7528\uFF1A\u7ACB\u5373\u79FB\u9664\u5E76\u91CA\u653E slot\uFF0C\u5426\u5219 slot \u6C38\u4E45\u5360\u7528\u3001\n              // \u9A71\u9010\u5019\u9009\u53CD\u590D\u9009\u4E2D\u6B7B\u5B9E\u4F8B\uFF0C\u8BE5\u5458\u5DE5\u65B0 scope \u6D88\u606F\u53EA\u80FD\u6392\u961F\u3002\n              this.running.delete(scopedKey);\n              this.syncSlotAfterRemoval(aiEmployeeId, scopedKey);\n            }\n          }\n        };\n        await adapter.start({\n          aiEmployeeId,\n          cwd: workspace.aiEmployeeDir,\n          runtimeCwd: this.runtimePathFor(workspace, config, workspace.aiEmployeeDir),\n          systemPrompt,\n          systemPromptPath: workspace.systemPromptPath,\n          model: config.model,\n          reasoningEffort: config.reasoningEffort,\n          permissionMode: config.permissionMode,\n          env: runtimeEnv,\n          executionBackend,\n          runtimeSessionId: config.sessionId,\n          runtimeSessionScope: this.runtimeSessionScopeForConfig(config),\n          timeoutMs: AI_EMPLOYEE_RUNTIME_TURN_TIMEOUT_MS,\n          onEvent,\n          requestPermission,\n        });\n        this.log(`runtime spawned ai_employee=${aiEmployeeId} runtime=${config.runtime} pid=${adapter.pid ?? \"-\"} persistent=true`);\n      } else {\n        this.log(`runtime reuse ai_employee=${aiEmployeeId} runtime=${config.runtime} pid=${adapter.pid ?? \"-\"} adapter_reused=true`);\n      }\n      result = await adapter.prompt({\n        prompt,\n        timeoutMs: AI_EMPLOYEE_RUNTIME_TURN_TIMEOUT_MS,\n        abortSignal: controller.signal,\n      });\n    } catch (error) {\n      if (isRuntimeSessionRecoveryFailure({ runtime: config.runtime, staleSessionId: config.sessionId, error })) {\n        await this.retryAfterSessionRecoveryFailure(input, error instanceof Error ? error.message : String(error));\n        return;\n      }\n      await this.maybeSendFeishuRoutineFailureNotice({\n        aiEmployeeId,\n        config,\n        workspace,\n        messages: messagesForTurn,\n        status: \"runtime_error\" as RuntimeRunResult[\"status\"],\n        events: runtimeEvents,\n        executionBackend,\n        runtimeEnv,\n        detail: error instanceof Error ? error.message : String(error),\n      });\n      this.sendDeliverProcessedForMessages(aiEmployeeId, messagesForTurn, launchId, \"failed\", this.runtimeSessionScopeForConfig(config), error instanceof Error ? error.message : String(error), deliveryProcessingStartedAt);\n      throw error;\n    }\n    flushDeltaLog();\n    if (isRuntimeSessionRecoveryFailure({ runtime: config.runtime, staleSessionId: config.sessionId, result })) {\n      await this.retryAfterSessionRecoveryFailure(input, result.errorMessage ?? \"runtime session recovery failed\");\n      return;\n    }\n    const effectiveStatus = result.status === \"ok\" && fatalRuntimeStderr && !sawAssistantResult\n      ? \"runtime_error\"\n      : result.status;\n    const effectiveErrorMessage = effectiveStatus === result.status\n      ? result.errorMessage\n      : fatalRuntimeStderr;\n    if (result.runtimeSessionId) {\n      this.log(`runtime session ai_employee=${aiEmployeeId} session=${result.runtimeSessionId}`);\n      const running = this.running.get(scopedKey);\n      if (running) {\n        running.sessionId = result.runtimeSessionId;\n        running.runtimeSessionScope = this.runtimeSessionScopeForConfig(config);\n        this.setIdleConfig(aiEmployeeId, { config: { ...config, sessionId: result.runtimeSessionId }, sessionId: result.runtimeSessionId, workspace });\n      }\n      this.options.sendToServer({ type: \"ai_employee:session\", aiEmployeeId, sessionId: result.runtimeSessionId, runtimeSessionScope: this.runtimeSessionScopeForConfig(config), launchId });\n    }\n    await this.recordRuntimeSessionDiagnostic(\n      aiEmployeeId,\n      workspace,\n      config.runtime,\n      result.runtimeSessionId ?? config.sessionId,\n      result.runtimeSessionId ? (config.sessionId ? \"native_resume\" : \"cold_start\") : \"unavailable\",\n      effectiveErrorMessage,\n      this.runtimeSessionScopeForConfig(config),\n      executionBackend,\n      adapterForDiagnostic\n    );\n    await this.writeRunLog(workspace, {\n      aiEmployeeId,\n      launchId,\n      taskId,\n      runtime: config.runtime,\n      runtimeSessionId: result.runtimeSessionId,\n      status: effectiveStatus,\n      finalMessage: result.finalMessage,\n      errorMessage: effectiveErrorMessage,\n      events: result.events,\n    });\n    for (const summary of summarizeBusinessRuntimeResult(result.events)) {\n      if (!seenBusinessSummaries.has(summary)) {\n        seenBusinessSummaries.add(summary);\n        businessSummaries.push(summary);\n        this.log(`business ai_employee=${aiEmployeeId} ${summary}`);\n      }\n    }\n    if (result.finalMessage.trim()) {\n      this.log(`runtime final ai_employee=${aiEmployeeId} status=${effectiveStatus} text=${compact(result.finalMessage, 2000)}`);\n    }\n    if (businessSummaries.length) {\n      this.log(`business summary ai_employee=${aiEmployeeId} ${businessSummaries.map((item) => `[${item}]`).join(\" \")}`);\n    }\n    if (controller.signal.aborted || (launchId && this.stoppedLaunches.has(launchId))) {\n      this.log(`ai_employee done ignored after stop ai_employee=${aiEmployeeId} launch=${launchId ?? \"-\"}`);\n      this.sendDeliverProcessedForMessages(aiEmployeeId, messagesForTurn, launchId, \"failed\", this.runtimeSessionScopeForConfig(config), \"stopped\", deliveryProcessingStartedAt);\n      return;\n    }\n    const platformReplySettlement = await this.settleCodexPlatformReply({\n      aiEmployeeId,\n      config,\n      workspace,\n      messages: messagesForTurn,\n      status: effectiveStatus,\n      finalMessage: result.finalMessage,\n      events: result.events,\n      sourceDeliveryId: launchId,\n      abortSignal: controller.signal,\n    });\n    if (\n      platformReplySettlement.status === \"aborted\"\n      || controller.signal.aborted\n      || this.disposeController.signal.aborted\n      || (launchId && this.stoppedLaunches.has(launchId))\n    ) {\n      this.log(`ai_employee reply settlement stopped ai_employee=${aiEmployeeId} launch=${launchId ?? \"-\"}`);\n      this.sendDeliverProcessedForMessages(\n        aiEmployeeId,\n        messagesForTurn,\n        launchId,\n        \"failed\",\n        this.runtimeSessionScopeForConfig(config),\n        \"stopped during platform reply settlement\",\n        deliveryProcessingStartedAt\n      );\n      return;\n    }\n    await this.maybeSendTimeoutPlatformNotice({\n      aiEmployeeId,\n      config,\n      messages: messagesForTurn,\n      status: effectiveStatus,\n      events: result.events,\n    });\n    await this.maybeSendFeishuRoutineFailureNotice({\n      aiEmployeeId,\n      config,\n      workspace,\n      messages: messagesForTurn,\n      status: effectiveStatus,\n      events: result.events,\n      executionBackend,\n      runtimeEnv,\n      detail: effectiveErrorMessage ?? effectiveStatus,\n    });\n    const memorySettlement = await this.settleMemoryAfterTurn({\n      aiEmployeeId,\n      workspace,\n      before: memoryBefore,\n      events: result.events,\n      isRetroMaintenanceTurn,\n    });\n    const memoryStats = memorySettlement.stats;\n    if (memorySettlement.retroPromoted) await this.archiveDeliveredNotesAfterRetro(aiEmployeeId, workspace);\n    const platformReplyFailureDetail = platformReplySettlement.status === \"permanent\"\n      ? platformReplySettlement.detail\n      : undefined;\n    const platformReplyFailed = Boolean(platformReplyFailureDetail);\n    this.sendActivity({\n      aiEmployeeId,\n      activity: effectiveStatus === \"ok\" && !platformReplyFailed ? \"idle\" : \"error\",\n      detail: platformReplyFailureDetail ?? effectiveStatus,\n      launchId,\n      entries: result.finalMessage.trim()\n        ? tracker.toEntries([{ type: \"assistant_result\", content: result.finalMessage }])\n        : effectiveErrorMessage\n          ? [{ kind: \"error\", text: effectiveErrorMessage, timestamp: Date.now() }]\n        : [],\n      memory_stats: memoryStats,\n    });\n    this.log(`ai_employee done ai_employee=${aiEmployeeId} status=${effectiveStatus} launch=${launchId ?? \"-\"} events=${result.events.length}${effectiveErrorMessage ? ` error=${compact(effectiveErrorMessage)}` : \"\"}`);\n    this.sendDeliverProcessedForMessages(\n      aiEmployeeId,\n      messagesForTurn,\n      launchId,\n      effectiveStatus === \"ok\" && !platformReplyFailed ? \"ok\" : \"failed\",\n      this.runtimeSessionScopeForConfig(config),\n      platformReplyFailureDetail ?? effectiveErrorMessage ?? effectiveStatus,\n      deliveryProcessingStartedAt,\n      effectiveStatus === \"ok\" && !platformReplyFailed ? result.finalMessage.trim() : undefined\n    );\n    const runningAfterTurn = this.running.get(scopedKey);\n    const recoverablePersistentFailure = Boolean(\n      runningAfterTurn?.adapter &&\n      runningAfterTurn.adapter.alive &&\n      effectiveStatus === \"runtime_error\" &&\n      !fatalRuntimeStderr\n    );\n    const currentScope = turnScope;\n    if (runningAfterTurn?.adapter && (effectiveStatus === \"ok\" || recoverablePersistentFailure)) {\n      runningAfterTurn.state = \"idle\";\n      runningAfterTurn.sessionId = result.runtimeSessionId ?? runningAfterTurn.sessionId;\n      runningAfterTurn.config = { ...config, sessionId: result.runtimeSessionId ?? config.sessionId };\n      runningAfterTurn.runtimeSessionScope = currentScope;\n      runningAfterTurn.controller = new AbortController();\n      this.slotManager.markIdle(aiEmployeeId, scopedKey, Date.now());\n      this.scheduleStrandedQueueDrain();\n    } else {\n      await runningAfterTurn?.adapter?.destroy(effectiveStatus === \"timeout\" ? \"runtime timeout\" : \"runtime failed\");\n      this.running.delete(scopedKey);\n      this.syncSlotAfterRemoval(aiEmployeeId, scopedKey);\n      if (effectiveStatus === \"timeout\") {\n        this.deleteIdleConfigForScope(aiEmployeeId, currentScope);\n      } else {\n        this.deleteIdleConfigsForAIEmployee(aiEmployeeId);\n      }\n    }\n    if (effectiveStatus === \"ok\") {\n      this.sendAvailability({\n        type: \"ai_employee:availability\",\n        aiEmployeeId,\n        daemonState: \"wakeable\",\n        sessionId: result.runtimeSessionId ?? this.idleConfigFor(aiEmployeeId, this.runtimeSessionScopeForConfig(config))?.sessionId,\n        runtimeSessionScope: this.runtimeSessionScopeForConfig(config),\n        launchId,\n        turnOutcome: platformReplyFailed ? \"failed\" : \"ok\",\n        failureReason: platformReplyFailureDetail,\n        workspaceReady: true,\n      });\n      if (this.drainQueuedMessagesAfterTurn(aiEmployeeId, config, workspace, launchId, result.runtimeSessionId)) {\n        return;\n      }\n    } else if (effectiveStatus === \"timeout\") {\n      const timeoutConfig = { ...config, sessionId: undefined };\n      this.setIdleConfig(aiEmployeeId, { config: timeoutConfig, workspace });\n      this.sendAvailability({\n        type: \"ai_employee:availability\",\n        aiEmployeeId,\n        daemonState: \"wakeable\",\n        runtimeSessionScope: currentScope,\n        launchId,\n        turnOutcome: \"failed\",\n        failureReason: effectiveErrorMessage ?? \"timeout\",\n      });\n      if (this.drainQueuedMessagesAfterTurn(aiEmployeeId, config, workspace, launchId, undefined, { invalidatedScope: currentScope })) {\n        return;\n      }\n    } else if (recoverablePersistentFailure) {\n      this.sendAvailability({\n        type: \"ai_employee:availability\",\n        aiEmployeeId,\n        daemonState: \"wakeable\",\n        sessionId: result.runtimeSessionId ?? this.idleConfigFor(aiEmployeeId, this.runtimeSessionScopeForConfig(config))?.sessionId,\n        runtimeSessionScope: this.runtimeSessionScopeForConfig(config),\n        launchId,\n        turnOutcome: \"failed\",\n        failureReason: effectiveErrorMessage ?? \"runtime_error\",\n      });\n      if (this.drainQueuedMessagesAfterTurn(aiEmployeeId, config, workspace, launchId, result.runtimeSessionId)) {\n        return;\n      }\n    } else {\n      this.options.sendToServer({\n        type: \"ai_employee:status\",\n        aiEmployeeId,\n        status: \"inactive\",\n        launchId,\n        failureReason: effectiveErrorMessage ?? effectiveStatus,\n      });\n    }\n  }\n\n  async deliverMessage(aiEmployeeId: string, message: DeliveredMessage, deliveryId: string, seq: number, runtimeSessionScope?: RuntimeSessionScope, runtimeSessionId?: string, dispatchGeneration?: number): Promise<boolean> {\n    this.log(`deliver ai_employee=${aiEmployeeId} seq=${seq} delivery=${deliveryId}`);\n    this.rememberDeliveryDispatchGeneration(deliveryId, dispatchGeneration);\n    if (this.hasAcceptedOrProcessedDeliveryId(deliveryId)) {\n      this.log(`deliver duplicate acknowledged ai_employee=${aiEmployeeId} seq=${seq} delivery=${deliveryId}`);\n      this.sendDeliverAck(aiEmployeeId, message.message_id, seq, deliveryId, true, undefined, dispatchGeneration);\n      this.resendProcessedDelivery(deliveryId, dispatchGeneration);\n      return true;\n    }\n    const scope = runtimeSessionScope ?? this.firstRunningEntryFor(aiEmployeeId)?.runtimeSessionScope ?? this.firstIdleConfigForAIEmployee(aiEmployeeId)?.runtimeSessionScope ?? externalScope(\"system\", \"default\");\n    const scopedKey = this.scopedAIEmployeeKey(aiEmployeeId, scope);\n    if (this.starting.has(scopedKey) || this.preparingStarts.has(scopedKey)) {\n      this.log(`deliver queued during start ai_employee=${aiEmployeeId} seq=${seq} scope=${scope.type}/${scope.id}`);\n      this.rememberQueuedMessageLaunch(aiEmployeeId, [message], deliveryId, message.message_id, scope, runtimeSessionId);\n      this.pushInbox(this.startingInboxes, scopedKey, [message]);\n      this.rememberAcceptedDeliveryId(deliveryId);\n      this.sendDeliverAck(aiEmployeeId, message.message_id, seq, deliveryId, true, undefined, dispatchGeneration);\n      this.sendActivity({\n        aiEmployeeId,\n        activity: \"working\",\n        detail: \"Message queued during startup\",\n        entries: [{ kind: \"status\", text: \"Message queued during startup\", timestamp: Date.now() }],\n        pendingInboxCount: this.queuedInboxCount(aiEmployeeId),\n      });\n      return true;\n    }\n    const running = this.running.get(scopedKey);\n    if (!running) {\n      // \u76EE\u6807 scope \u65E0\u5B9E\u4F8B\uFF1A\u6309 scopedKey \u65B0\u5EFA\uFF08\u6216\u51B7\u6062\u590D\uFF09\uFF0C\u4E0D\u518D\u501F\u7528\u5176\u4ED6 scope \u7684 runtime\u3002\n      const scopedIdle = this.idleConfigFor(aiEmployeeId, scope);\n      const fallbackConfig = scopedIdle?.config\n        ?? this.firstIdleConfigForAIEmployee(aiEmployeeId)?.config\n        ?? this.firstRunningEntryFor(aiEmployeeId)?.config;\n      if (fallbackConfig) {\n        this.log(`deliver resume ai_employee=${aiEmployeeId} seq=${seq} scope=${scope.type}/${scope.id}`);\n        this.rememberAcceptedDeliveryId(deliveryId);\n        this.sendDeliverAck(aiEmployeeId, message.message_id, seq, deliveryId, true, undefined, dispatchGeneration);\n        try {\n          await this.enqueueStart({\n            aiEmployeeId,\n            // \u4EC5\u5F53 idle config \u4E0E\u76EE\u6807 scope \u5339\u914D\u65F6\u624D\u7EE7\u627F\u5176 sessionId\uFF1B\u8DE8 scope \u56DE\u9000\u5FC5\u987B\u51B7\u542F\u52A8\uFF0C\u907F\u514D\u4E0D\u540C\u6765\u6E90\u4F1A\u8BDD\u4E32 session\u3002\n            config: { ...fallbackConfig, sessionId: runtimeSessionId ?? (scopedIdle ? scopedIdle.sessionId ?? scopedIdle.config.sessionId : undefined), runtimeSessionScope: scope },\n            wakeMessage: message,\n            deliveredMessages: [message],\n            launchId: deliveryId,\n            taskId: message.message_id,\n          });\n        } catch (error) {\n          const detail = error instanceof Error ? error.message : String(error);\n          this.log(`deliver resume failed ai_employee=${aiEmployeeId} delivery=${deliveryId} error=${detail}`);\n          this.sendDeliverProcessedForMessages(aiEmployeeId, [message], deliveryId, \"failed\", scope, detail);\n        }\n        return true;\n      }\n      this.log(`deliver skipped ai_employee=${aiEmployeeId} reason=not-running`);\n      this.sendDeliverAck(aiEmployeeId, message.message_id, seq, deliveryId, false, \"not_running\", dispatchGeneration);\n      return false;\n    }\n    this.rememberAcceptedDeliveryId(deliveryId);\n    this.rememberQueuedMessageLaunch(aiEmployeeId, [message], deliveryId, message.message_id, scope, runtimeSessionId);\n    if (running.state === \"idle\" && running.adapter) {\n      // \u540C scope idle \u5B9E\u4F8B\uFF1A\u76F4\u63A5\u6295\u9012\uFF0C\u65E0\u9700 destroy \u91CD\u5EFA\u3002\n      this.sendDeliverAck(aiEmployeeId, message.message_id, seq, deliveryId, true, undefined, dispatchGeneration);\n      const controller = new AbortController();\n      this.slotManager.markBusy(aiEmployeeId, scopedKey);\n      const scopedIdle = this.idleConfigFor(aiEmployeeId, scope);\n      const nextConfig = {\n        ...running.config,\n        ...(scopedIdle?.config ?? {}),\n        sessionId: runtimeSessionId ?? scopedIdle?.sessionId ?? running.sessionId ?? running.config.sessionId,\n        runtimeSessionScope: scope,\n      };\n      running.controller = controller;\n      running.state = \"busy\";\n      running.launchId = deliveryId;\n      running.config = nextConfig;\n      running.sessionId = nextConfig.sessionId;\n      running.runtimeSessionScope = scope;\n      running.done = this.runAIEmployeeRuntime({\n        aiEmployeeId,\n        config: nextConfig,\n        workspace: running.workspace,\n        wakeMessage: message,\n        deliveredMessages: [message],\n        launchId: deliveryId,\n        taskId: message.message_id,\n        runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(running.workspace, nextConfig, aiEmployeeId),\n        controller,\n      }).catch((error) => {\n        const detail = error instanceof Error ? error.message : String(error);\n        this.sendDeliverProcessedForMessages(aiEmployeeId, [message], deliveryId, \"failed\", scope, detail);\n        this.log(`idle delivery failed ai_employee=${aiEmployeeId} error=${detail}`);\n      });\n      this.sendActivity({\n        aiEmployeeId,\n        activity: \"working\",\n        detail: \"Message delivered to idle persistent runtime\",\n        launchId: deliveryId,\n        entries: [{ kind: \"status\", text: \"Message delivered to idle persistent runtime\", timestamp: Date.now() }],\n        pendingInboxCount: this.queuedInboxCount(aiEmployeeId),\n      });\n      return true;\n    }\n    // \u540C scope busy\uFF1A\u5165\u8BE5 scope \u961F\u5217\u4E32\u884C\u5904\u7406\u3002\n    this.pushInbox(this.runningInboxes, scopedKey, [message]);\n    this.sendDeliverAck(aiEmployeeId, message.message_id, seq, deliveryId, true, undefined, dispatchGeneration);\n    this.sendActivity({\n      aiEmployeeId,\n      activity: \"working\",\n      detail: \"Message queued while runtime is busy\",\n      launchId: running.launchId,\n      entries: [{ kind: \"status\", text: \"Message queued while runtime is busy\", timestamp: Date.now() }],\n      pendingInboxCount: this.queuedInboxCount(aiEmployeeId),\n    });\n    return true;\n  }\n\n  async wakeRoutine(input: {\n    aiEmployeeId: string;\n    routineId: string;\n    routine: AIEmployeeRoutine;\n    sessionKey: string;\n    payload: unknown;\n    metadata?: Record<string, unknown>;\n  }): Promise<{ wake_id: string; queued: boolean; skipped?: true; reason?: string }> {\n    const wakeId = `routine-${input.routineId}-${Date.now()}`;\n    const config = this.firstRunningEntryFor(input.aiEmployeeId)?.config ?? this.firstIdleConfigForAIEmployee(input.aiEmployeeId)?.config;\n    if (input.routine.template_key === \"retro\") {\n      if (!config) return { wake_id: wakeId, queued: false, skipped: true, reason: \"preflight_unavailable\" };\n      try {\n        const response = await withPlatformProxyBypass(config.serverUrl, () => fetch(\n          new URL(`/internal/ai-employee/${encodeURIComponent(input.aiEmployeeId)}/retro/preflight`, config.serverUrl),\n          {\n            method: \"POST\",\n            headers: { authorization: `Bearer ${config.authToken}`, \"content-type\": \"application/json\" },\n            body: JSON.stringify({ routine_id: input.routineId }),\n            signal: AbortSignal.timeout(5_000),\n          },\n        ));\n        if (!response.ok) {\n          this.log(`retro preflight failed closed ai_employee=${input.aiEmployeeId} status=${response.status}`);\n          return { wake_id: wakeId, queued: false, skipped: true, reason: \"preflight_unavailable\" };\n        }\n        const payload = await response.json() as unknown;\n        const payloadRecord = payload && typeof payload === \"object\" && !Array.isArray(payload)\n          ? payload as { ok?: unknown; preflight?: unknown }\n          : undefined;\n        const preflight = payloadRecord?.ok === true ? payloadRecord.preflight : undefined;\n        const decision = preflight && typeof preflight === \"object\" && !Array.isArray(preflight)\n          ? preflight as { dispatch?: unknown; reason?: unknown }\n          : undefined;\n        const dispatchReasons = new Set([\"activity\", \"feedback\", \"candidate\", \"continuation\"]);\n        const skipReasons = new Set([\"empty\", \"retired\", \"archived\"]);\n        if (\n          typeof decision?.dispatch !== \"boolean\"\n          || typeof decision.reason !== \"string\"\n          || (decision.dispatch ? !dispatchReasons.has(decision.reason) : !skipReasons.has(decision.reason))\n        ) {\n          this.log(`retro preflight invalid response ai_employee=${input.aiEmployeeId}`);\n          return { wake_id: wakeId, queued: false, skipped: true, reason: \"preflight_invalid\" };\n        }\n        if (!decision.dispatch) {\n          return { wake_id: wakeId, queued: false, skipped: true, reason: decision.reason };\n        }\n      } catch (error) {\n        this.log(`retro preflight failed closed ai_employee=${input.aiEmployeeId} error=${error instanceof Error ? error.message : String(error)}`);\n        return { wake_id: wakeId, queued: false, skipped: true, reason: \"preflight_unavailable\" };\n      }\n    }\n    const message = buildRoutineWakeMessage({ ...input, aiEmployeeWorkContext: config?.aiEmployeeWorkContext });\n    const queued = await this.deliverMessage(input.aiEmployeeId, message, wakeId, message.seq, routineWakeRuntimeSessionScope(input));\n    return { wake_id: wakeId, queued };\n  }\n\n  private sendDeliverAck(aiEmployeeId: string, messageId: string, seq: number, deliveryId: string, accepted: boolean, reason?: string, dispatchGeneration?: number): void {\n    this.options.sendToServer({ type: \"ai_employee:deliver:ack\", aiEmployeeId, messageId, seq, deliveryId, dispatchGeneration, accepted, reason });\n  }\n\n  private rememberDeliveryDispatchGeneration(deliveryId: string, dispatchGeneration: number | undefined): void {\n    if (dispatchGeneration === undefined) this.deliveryDispatchGenerations.delete(deliveryId);\n    else this.deliveryDispatchGenerations.set(deliveryId, dispatchGeneration);\n  }\n\n  private rememberAcceptedDeliveryId(deliveryId: string): void {\n    const previousAccepted = new Map(this.acceptedDeliveryIds);\n    const previousRecovered = new Map(this.recoveredAcceptedDeliveryIds);\n    this.recoveredAcceptedDeliveryIds.delete(deliveryId);\n    this.acceptedDeliveryIds.delete(deliveryId);\n    this.acceptedDeliveryIds.set(deliveryId, Date.now());\n    try {\n      this.persistDeliveryReceipt(deliveryId);\n    } catch (error) {\n      this.acceptedDeliveryIds.clear();\n      this.recoveredAcceptedDeliveryIds.clear();\n      for (const entry of previousAccepted) this.acceptedDeliveryIds.set(...entry);\n      for (const entry of previousRecovered) this.recoveredAcceptedDeliveryIds.set(...entry);\n      throw error;\n    }\n  }\n\n  private hasAcceptedOrProcessedDeliveryId(deliveryId: string): boolean {\n    return this.acceptedDeliveryIds.has(deliveryId) || this.processedDeliveryMessages.has(deliveryId);\n  }\n\n  private rememberProcessedDelivery(\n    deliveryId: string,\n    messages: ProcessedDeliveryMessage[]\n  ): void {\n    const previousAccepted = new Map(this.acceptedDeliveryIds);\n    const previousRecovered = new Map(this.recoveredAcceptedDeliveryIds);\n    const previousProcessed = new Map(this.processedDeliveryMessages);\n    this.recoveredAcceptedDeliveryIds.delete(deliveryId);\n    this.acceptedDeliveryIds.delete(deliveryId);\n    this.processedDeliveryMessages.delete(deliveryId);\n    this.processedDeliveryMessages.set(deliveryId, messages);\n    try {\n      this.persistDeliveryReceipt(deliveryId);\n    } catch (error) {\n      this.acceptedDeliveryIds.clear();\n      this.recoveredAcceptedDeliveryIds.clear();\n      this.processedDeliveryMessages.clear();\n      for (const entry of previousAccepted) this.acceptedDeliveryIds.set(...entry);\n      for (const entry of previousRecovered) this.recoveredAcceptedDeliveryIds.set(...entry);\n      for (const entry of previousProcessed) this.processedDeliveryMessages.set(...entry);\n      throw error;\n    }\n  }\n\n  private deliveryReceiptLedgerPath(): string {\n    return path.join(this.options.rootDir, \"ai-employee-delivery-receipts.json\");\n  }\n\n  private deliveryReceiptDirectory(): string {\n    return path.join(this.options.rootDir, \"ai-employee-delivery-receipts\");\n  }\n\n  private deliveryReceiptPath(deliveryId: string): string {\n    return path.join(this.deliveryReceiptDirectory(), `${createHash(\"sha256\").update(deliveryId).digest(\"hex\")}.json`);\n  }\n\n  private loadDeliveryReceiptLedger(): void {\n    try {\n      const seenDeliveryIds = new Set<string>();\n      const install = (receipt: DeliveryReceipt) => {\n        this.assertValidDeliveryReceipt(receipt);\n        if (seenDeliveryIds.has(receipt.deliveryId)) throw new Error(\"duplicate delivery receipt identity\");\n        seenDeliveryIds.add(receipt.deliveryId);\n        const updatedAt = Number(receipt.updatedAt);\n        if (receipt.status === \"accepted\") {\n          this.recoveredAcceptedDeliveryIds.set(receipt.deliveryId, updatedAt);\n          return;\n        }\n        this.processedDeliveryMessages.set(receipt.deliveryId, receipt.messages);\n      };\n      const legacyPath = this.deliveryReceiptLedgerPath();\n      if (existsSync(legacyPath)) {\n        const parsed = JSON.parse(readFileSync(legacyPath, \"utf8\")) as Partial<DeliveryReceiptLedger>;\n        if (parsed.version !== 1 || !Array.isArray(parsed.receipts)) throw new Error(\"unsupported delivery receipt ledger\");\n        for (const receipt of parsed.receipts) install(receipt as DeliveryReceipt);\n      }\n      const directory = this.deliveryReceiptDirectory();\n      if (existsSync(directory)) {\n        for (const filename of readdirSync(directory).filter((item) => item.endsWith(\".json\")).sort()) {\n          const parsed = JSON.parse(readFileSync(path.join(directory, filename), \"utf8\")) as { version?: unknown; receipt?: DeliveryReceipt };\n          if (parsed.version !== 1 || !parsed.receipt) throw new Error(\"unsupported delivery receipt file\");\n          if (seenDeliveryIds.has(parsed.receipt.deliveryId)) {\n            this.recoveredAcceptedDeliveryIds.delete(parsed.receipt.deliveryId);\n            this.processedDeliveryMessages.delete(parsed.receipt.deliveryId);\n            seenDeliveryIds.delete(parsed.receipt.deliveryId);\n          }\n          install(parsed.receipt);\n        }\n      }\n      if (existsSync(legacyPath)) {\n        for (const deliveryId of seenDeliveryIds) this.persistDeliveryReceipt(deliveryId);\n        rmSync(legacyPath, { force: true });\n      }\n    } catch (error) {\n      this.recoveredAcceptedDeliveryIds.clear();\n      this.processedDeliveryMessages.clear();\n      throw new Error(`delivery receipt ledger is unreadable: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private assertValidDeliveryReceipt(receipt: DeliveryReceipt): void {\n    if (!receipt || typeof receipt !== \"object\" || typeof receipt.deliveryId !== \"string\" || !receipt.deliveryId) {\n      throw new Error(\"invalid delivery receipt identity\");\n    }\n    if (!Number.isFinite(receipt.updatedAt)) throw new Error(\"invalid delivery receipt timestamp\");\n    if (receipt.status === \"accepted\") return;\n    if (receipt.status !== \"processed\" || !Array.isArray(receipt.messages) || receipt.messages.length === 0) {\n      throw new Error(\"invalid processed delivery receipt\");\n    }\n    if (!receipt.messages.every((message) => Boolean(\n      message\n      && message.type === \"ai_employee:deliver:processed\"\n      && typeof message.aiEmployeeId === \"string\"\n      && message.deliveryId === receipt.deliveryId\n      && (message.messageId === undefined || typeof message.messageId === \"string\")\n      && (message.status === \"ok\" || message.status === \"failed\")\n      && (message.dispatchGeneration === undefined || Number.isInteger(message.dispatchGeneration))\n    ))) throw new Error(\"invalid processed delivery message\");\n  }\n\n  private persistDeliveryReceipt(deliveryId: string): void {\n    const directory = this.deliveryReceiptDirectory();\n    mkdirSync(directory, { recursive: true });\n    const filePath = this.deliveryReceiptPath(deliveryId);\n    const acceptedAt = this.recoveredAcceptedDeliveryIds.get(deliveryId) ?? this.acceptedDeliveryIds.get(deliveryId);\n    const processed = this.processedDeliveryMessages.get(deliveryId);\n    const receipt: DeliveryReceipt | undefined = processed\n      ? { deliveryId, status: \"processed\", updatedAt: Date.now(), messages: processed }\n      : acceptedAt !== undefined\n        ? { deliveryId, status: \"accepted\", updatedAt: acceptedAt }\n        : undefined;\n    if (!receipt) {\n      rmSync(filePath, { force: true });\n      this.fsyncDirectory(directory);\n      return;\n    }\n    const temporaryPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n    try {\n      const fileDescriptor = openSync(temporaryPath, \"wx\", 0o600);\n      try {\n        writeFileSync(fileDescriptor, `${JSON.stringify({ version: 1, receipt })}\\n`, \"utf8\");\n        fsyncSync(fileDescriptor);\n      } finally {\n        closeSync(fileDescriptor);\n      }\n      renameSync(temporaryPath, filePath);\n      this.fsyncDirectory(directory);\n    } catch (error) {\n      rmSync(temporaryPath, { force: true });\n      throw error;\n    }\n  }\n\n  private fsyncDirectory(directory: string): void {\n    const directoryDescriptor = openSync(directory, \"r\");\n    try {\n      fsyncSync(directoryDescriptor);\n    } finally {\n      closeSync(directoryDescriptor);\n    }\n  }\n\n  private confirmProcessedDelivery(deliveryId: string): void {\n    if (!this.processedDeliveryMessages.has(deliveryId)) return;\n    const previous = this.processedDeliveryMessages.get(deliveryId)!;\n    this.processedDeliveryMessages.delete(deliveryId);\n    this.deliveryDispatchGenerations.delete(deliveryId);\n    try {\n      this.persistDeliveryReceipt(deliveryId);\n    } catch (error) {\n      this.processedDeliveryMessages.set(deliveryId, previous);\n      throw error;\n    }\n  }\n\n  private resendProcessedDelivery(deliveryId: string, dispatchGeneration = this.deliveryDispatchGenerations.get(deliveryId)): boolean {\n    const messages = this.processedDeliveryMessages.get(deliveryId);\n    if (!messages?.length) return false;\n    for (const message of messages) this.options.sendToServer({ ...message, dispatchGeneration });\n    return true;\n  }\n\n  private sendDeliverProcessedForMessages(\n    aiEmployeeId: string,\n    messages: DeliveredMessage[] | undefined,\n    launchId: string | undefined,\n    status: \"ok\" | \"failed\",\n    runtimeSessionScope: RuntimeSessionScope,\n    detail?: string,\n    startedAtMs?: number,\n    outputSummary?: string\n  ): void {\n    if (!launchId || !messages?.length) return;\n    if (this.processedDeliveryMessages.has(launchId)) return;\n    const durationMs = typeof startedAtMs === \"number\" && Number.isFinite(startedAtMs)\n      ? Math.max(0, Date.now() - startedAtMs)\n      : undefined;\n    const processedMessages = messages.map((message): Extract<DaemonToServerMessage, { type: \"ai_employee:deliver:processed\" }> => ({\n        type: \"ai_employee:deliver:processed\",\n        aiEmployeeId,\n        messageId: message.message_id,\n        deliveryId: launchId,\n        dispatchGeneration: this.deliveryDispatchGenerations.get(launchId),\n        runtimeSessionScope,\n        launchId,\n        status,\n        detail,\n        outputSummary,\n        durationMs,\n    }));\n    this.rememberProcessedDelivery(launchId, processedMessages);\n    for (const message of processedMessages) this.options.sendToServer(message);\n  }\n\n  private clearQueuedMessageMetadata(aiEmployeeId: string, message: DeliveredMessage): void {\n    const key = queuedDeliveryMetadataKey(aiEmployeeId, message);\n    this.queuedLaunchIds.delete(key);\n    this.queuedTaskIds.delete(key);\n    this.queuedRuntimeScopes.delete(key);\n    this.queuedRuntimeSessionIds.delete(key);\n  }\n\n  private terminalizeQueuedMessages(\n    aiEmployeeId: string,\n    map: Map<string, DeliveredMessage[]>,\n    detail: string\n  ): void {\n    for (const scopedKey of this.inboxKeysFor(map, aiEmployeeId)) {\n      this.terminalizeQueuedMessagesForScopedKey(aiEmployeeId, map, scopedKey, detail);\n    }\n  }\n\n  private terminalizeQueuedMessagesForScopedKey(\n    aiEmployeeId: string,\n    map: Map<string, DeliveredMessage[]>,\n    scopedKey: string,\n    detail: string\n  ): void {\n    const fallbackScope = this.scopeFromScopedKey(scopedKey) ?? externalScope(\"system\", \"default\");\n    for (const message of map.get(scopedKey) ?? []) {\n      const key = queuedDeliveryMetadataKey(aiEmployeeId, message);\n      const deliveryId = this.queuedLaunchIds.get(key);\n      const scope = this.queuedRuntimeScopes.get(key) ?? fallbackScope;\n      this.sendDeliverProcessedForMessages(aiEmployeeId, [message], deliveryId, \"failed\", scope, detail);\n      this.clearQueuedMessageMetadata(aiEmployeeId, message);\n    }\n    map.delete(scopedKey);\n  }\n\n  private pushInbox(map: Map<string, DeliveredMessage[]>, scopedKey: string, messages: DeliveredMessage[]): void {\n    const current = map.get(scopedKey) ?? [];\n    map.set(scopedKey, dedupeDeliveredMessages([...current, ...messages]));\n  }\n\n  private rememberQueuedMessageLaunch(aiEmployeeId: string, messages: DeliveredMessage[], launchId?: string, taskId?: string, runtimeSessionScope?: RuntimeSessionScope, runtimeSessionId?: string): void {\n    for (const message of messages) {\n      const key = queuedDeliveryMetadataKey(aiEmployeeId, message);\n      if (launchId) this.queuedLaunchIds.set(key, launchId);\n      if (taskId) this.queuedTaskIds.set(key, taskId);\n      if (runtimeSessionScope) this.queuedRuntimeScopes.set(key, runtimeSessionScope);\n      if (runtimeSessionId) this.queuedRuntimeSessionIds.set(key, runtimeSessionId);\n    }\n  }\n\n  private queuedInboxCount(aiEmployeeId: string): number {\n    let total = 0;\n    for (const key of this.inboxKeysFor(this.startingInboxes, aiEmployeeId)) total += this.startingInboxes.get(key)?.length ?? 0;\n    for (const key of this.inboxKeysFor(this.runningInboxes, aiEmployeeId)) total += this.runningInboxes.get(key)?.length ?? 0;\n    return total;\n  }\n\n  private scopeFromScopedKey(scopedKey: string): RuntimeSessionScope | undefined {\n    const parts = scopedKey.split(\"\\u0000\");\n    if (parts.length < 3) return undefined;\n    const type = parts[1];\n    if (type !== \"channel\" && type !== \"dm\" && type !== \"external\") return undefined;\n    return { type, id: parts.slice(2).join(\"\\u0000\") };\n  }\n\n  private drainQueuedMessagesAfterTurn(\n    aiEmployeeId: string,\n    config: AIEmployeeConfig,\n    workspace: AIEmployeeWorkspace,\n    launchId?: string,\n    runtimeSessionId?: string,\n    options: { invalidatedScope?: RuntimeSessionScope } = {}\n  ): boolean {\n    const currentScope = this.runtimeSessionScopeForConfig(config);\n    const currentKey = this.scopedAIEmployeeKey(aiEmployeeId, currentScope);\n    // \u4F18\u5148\u5F53\u524D scope \u81EA\u5DF1\u7684\u961F\u5217\uFF1B\u5426\u5219\u4EE3\u4E3A\u5524\u8D77\u8BE5\u5458\u5DE5\u5176\u4ED6\u6CA1\u6709\u5B9E\u4F8B\u7684 scope \u961F\u5217\u3002\n    let queueKey = (this.runningInboxes.get(currentKey)?.length ?? 0) > 0 ? currentKey : undefined;\n    if (!queueKey) {\n      for (const key of this.inboxKeysFor(this.runningInboxes, aiEmployeeId)) {\n        if ((this.runningInboxes.get(key)?.length ?? 0) === 0) continue;\n        if (this.running.has(key) || this.starting.has(key) || this.preparingStarts.has(key)) continue;\n        queueKey = key;\n        break;\n      }\n    }\n    if (!queueKey) return false;\n    const pending = this.runningInboxes.get(queueKey) ?? [];\n    if (pending.length === 0) return false;\n    const queued = pending.slice(0, 1);\n    const remaining = pending.slice(1);\n    if (remaining.length > 0) this.runningInboxes.set(queueKey, remaining);\n    else this.runningInboxes.delete(queueKey);\n    const firstQueuedKey = queued[0] ? queuedDeliveryMetadataKey(aiEmployeeId, queued[0]) : \"\";\n    const nextScope = (firstQueuedKey ? this.queuedRuntimeScopes.get(firstQueuedKey) : undefined)\n      ?? this.scopeFromScopedKey(queueKey)\n      ?? currentScope;\n    const scopedIdle = this.idleConfigFor(aiEmployeeId, nextScope);\n    const sameScope = this.scopedAIEmployeeKey(aiEmployeeId, nextScope) === currentKey;\n    const invalidatedScope = options.invalidatedScope;\n    const scopeInvalidated = Boolean(invalidatedScope && this.scopedAIEmployeeKey(aiEmployeeId, nextScope) === this.scopedAIEmployeeKey(aiEmployeeId, invalidatedScope));\n    const queuedSessionId = firstQueuedKey ? this.queuedRuntimeSessionIds.get(firstQueuedKey) : undefined;\n    const sessionId = scopeInvalidated ? undefined : queuedSessionId ?? scopedIdle?.sessionId ?? (sameScope ? runtimeSessionId ?? config.sessionId : undefined);\n    const nextConfig = { ...(scopedIdle?.config ?? config), sessionId, runtimeSessionScope: nextScope };\n    this.setIdleConfig(aiEmployeeId, { config: nextConfig, sessionId, workspace });\n    const nextLaunchId = (firstQueuedKey ? this.queuedLaunchIds.get(firstQueuedKey) : undefined) ?? launchId;\n    const nextTaskId = (firstQueuedKey ? this.queuedTaskIds.get(firstQueuedKey) : undefined) ?? queued[0]?.message_id;\n    for (const message of queued) {\n      this.clearQueuedMessageMetadata(aiEmployeeId, message);\n    }\n    this.log(`deliver drain queued ai_employee=${aiEmployeeId} count=${queued.length} launch=${nextLaunchId ?? \"-\"}`);\n    this.sendActivity({\n      aiEmployeeId,\n      activity: \"working\",\n      detail: `Processing ${queued.length} queued message${queued.length === 1 ? \"\" : \"s\"}`,\n      launchId: nextLaunchId,\n      entries: [{ kind: \"status\", text: `Processing ${queued.length} queued message${queued.length === 1 ? \"\" : \"s\"}`, timestamp: Date.now() }],\n      pendingInboxCount: remaining.length,\n    });\n    queueMicrotask(() => {\n      const running = sameScope ? this.running.get(currentKey) : undefined;\n      if (running?.adapter) {\n        // \u540C scope \u590D\u7528\u672C\u5B9E\u4F8B\u7EE7\u7EED\u4E32\u884C\u5904\u7406\u961F\u5217\u3002\n        const controller = new AbortController();\n        this.slotManager.markBusy(aiEmployeeId, currentKey);\n        running.controller = controller;\n        running.config = nextConfig;\n        running.state = \"busy\";\n        running.launchId = nextLaunchId;\n        running.sessionId = sessionId;\n        running.runtimeSessionScope = nextScope;\n        running.done = this.runAIEmployeeRuntime({\n          aiEmployeeId,\n          config: nextConfig,\n          workspace,\n          wakeMessage: queued[0],\n          deliveredMessages: queued,\n          launchId: nextLaunchId,\n          taskId: nextTaskId,\n          runtimeEnv: running.runtimeEnv ?? this.buildRuntimeEnv(workspace, nextConfig, aiEmployeeId),\n          controller,\n        }).catch((error) => {\n          const detail = controller.signal.aborted ? \"stopped\" : error instanceof Error ? error.message : String(error);\n          this.sendDeliverProcessedForMessages(aiEmployeeId, queued, nextLaunchId, \"failed\", nextScope, detail);\n          this.log(`queued delivery follow-up failed ai_employee=${aiEmployeeId} error=${detail}`);\n        });\n        return;\n      }\n      if (sameScope) {\n        this.running.delete(currentKey);\n        this.syncSlotAfterRemoval(aiEmployeeId, currentKey);\n      }\n      void this.enqueueStart({\n          aiEmployeeId,\n          config: nextConfig,\n          wakeMessage: queued[0],\n          deliveredMessages: queued,\n        launchId: nextLaunchId,\n        taskId: nextTaskId,\n      }).catch((error) => {\n        const detail = error instanceof Error ? error.message : String(error);\n        this.sendDeliverProcessedForMessages(aiEmployeeId, queued, nextLaunchId, \"failed\", nextScope, detail);\n        this.log(`queued delivery follow-up failed ai_employee=${aiEmployeeId} error=${detail}`);\n      });\n    });\n    return true;\n  }\n\n  private async prepareStartRequestForRuntimeProfile(request: StartRequest): Promise<StartRequest> {\n    const requestScope = this.runtimeSessionScopeForConfig(request.config);\n    const requestKey = this.scopedAIEmployeeKey(request.aiEmployeeId, requestScope);\n    const running = this.running.get(requestKey);\n    const idle = this.idleConfigFor(request.aiEmployeeId, requestScope) ?? this.firstIdleConfigForAIEmployee(request.aiEmployeeId);\n    const previousConfig = running?.config ?? idle?.config;\n    if (!previousConfig || !runtimeProfileChanged(previousConfig, request.config)) return request;\n    const staleSessionId = running?.sessionId ?? idle?.sessionId ?? request.config.sessionId;\n    if (!staleSessionId) return { ...request, config: { ...request.config, sessionId: undefined } };\n    this.log(`runtime profile changed ai_employee=${request.aiEmployeeId} stale_session=${staleSessionId}`);\n    this.options.sendToServer({\n      type: \"ai_employee:session_reset\",\n      aiEmployeeId: request.aiEmployeeId,\n      staleSessionId,\n      runtimeSessionScope: requestScope,\n      reason: \"runtime_profile_changed\",\n      detail: \"runtime profile changed before launch\",\n      launchId: request.launchId,\n    });\n    if (running?.adapter) {\n      await running.adapter.destroy(\"runtime profile changed\");\n      running.adapter = undefined;\n    }\n    if (running?.state === \"idle\") {\n      this.running.delete(requestKey);\n      this.syncSlotAfterRemoval(request.aiEmployeeId, requestKey);\n    } else if (running) {\n      running.sessionId = undefined;\n      running.config = { ...request.config, sessionId: undefined };\n    }\n    if (idle) {\n      this.setIdleConfig(request.aiEmployeeId, { config: { ...request.config, sessionId: undefined }, workspace: idle.workspace });\n    }\n    return { ...request, config: { ...request.config, sessionId: undefined } };\n  }\n\n  private async retryAfterSessionRecoveryFailure(input: {\n    aiEmployeeId: string;\n    config: AIEmployeeConfig;\n    workspace: AIEmployeeWorkspace;\n    wakeMessage?: DeliveredMessage;\n    deliveredMessages?: DeliveredMessage[];\n    launchId?: string;\n    taskId?: string;\n    runtimeEnv: NodeJS.ProcessEnv;\n    controller: AbortController;\n  }, detail: string): Promise<void> {\n    const { aiEmployeeId, config, workspace, launchId } = input;\n    const staleSessionId = config.sessionId;\n    const runtimeSessionScope = this.runtimeSessionScopeForConfig(config);\n    if (!staleSessionId) return;\n    this.log(`runtime session recovery failed ai_employee=${aiEmployeeId} runtime=${config.runtime} stale_session=${staleSessionId} detail=${compact(detail)}`);\n    await this.recordRuntimeSessionDiagnostic(aiEmployeeId, workspace, config.runtime, staleSessionId, \"session_reset_fallback\", detail, runtimeSessionScope, this.executionBackendForConfig(config));\n    this.options.sendToServer({\n      type: \"ai_employee:session_reset\",\n      aiEmployeeId,\n      staleSessionId,\n      runtimeSessionScope,\n      reason: \"resume_failed\",\n      detail,\n      launchId,\n    });\n    const running = this.running.get(this.scopedAIEmployeeKey(aiEmployeeId, runtimeSessionScope));\n    if (running?.adapter) {\n      await running.adapter.destroy(\"session recovery failed\");\n      running.adapter = undefined;\n    }\n    const retryConfig = { ...config, sessionId: undefined };\n    if (running) {\n      running.sessionId = undefined;\n      running.config = retryConfig;\n    }\n    // Clear the stale feishu session file so it isn't loaded again on next daemon restart.\n    const feishuChatId = this.feishuChatIdFromScope(runtimeSessionScope);\n    if (feishuChatId) {\n      const chatId = feishuChatId;\n      void removeFeishuSession(workspace.aiEmployeeDir, chatId).catch(() => undefined);\n    }\n    this.setIdleConfig(aiEmployeeId, { config: retryConfig, workspace });\n    await this.runAIEmployeeRuntime({ ...input, config: retryConfig });\n  }\n\n  private async recordRuntimeSessionDiagnostic(\n    aiEmployeeId: string,\n    workspace: AIEmployeeWorkspace,\n    runtime: RuntimeId,\n    sessionId: string | undefined,\n    resumeMode: \"native_resume\" | \"cold_start\" | \"session_reset_fallback\" | \"unavailable\",\n    reason?: string,\n    scope?: RuntimeSessionScope,\n    executionBackend: ExecutionBackend = this.executionBackend,\n    adapter?: PersistentRuntimeAdapter\n  ): Promise<void> {\n    const capability = getRuntimeCapability(runtime);\n    const adapterPid = adapter?.pid;\n    const strategy = capability?.sessionConcurrencyStrategy;\n    // runtime-sessions/current.json \u662F\u5458\u5DE5\u7EA7\u5171\u4EAB\u6587\u4EF6\u4E14\u4E3A\u8BFB-\u6539-\u5199\uFF0C\u5E76\u53D1 scope \u540C\u65F6\u5199\u4F1A\u4EA4\u9519\u3002\n    await this.employeeFileMutex.withLock(aiEmployeeId, () => writeRuntimeSessionDiagnostic({\n      runtimeSessionsDir: workspace.runtimeSessionsDir,\n      runtime,\n      sessionId,\n      scope,\n      sessionConcurrencyStrategy: strategy,\n      pid: adapterPid,\n      hostPid: capability?.sharesHostAcrossScopes ? adapterPid : undefined,\n      queuedCount: this.queuedInboxCount(aiEmployeeId),\n      maxConcurrentScopes: capability?.maxConcurrentScopesDefault,\n      resumeMode,\n      reason,\n      homeDir: executionBackend.kind === \"container\" ? path.join(workspace.aiEmployeeDir, \".home\") : undefined,\n    }));\n  }\n\n  private async recordDeliveredMessageNote(aiEmployeeId: string, workspace: AIEmployeeWorkspace, message: DeliveredMessage, seq: number): Promise<void> {\n    // notes/ \u76EE\u5F55\u662F\u5458\u5DE5\u7EA7\u5171\u4EAB\u7684\uFF0Cdaemon \u5199\u5165\u9700\u4E0E\u5176\u4ED6\u5E73\u53F0\u6587\u4EF6\u5199\u4E32\u884C\u3002\n    await this.employeeFileMutex.withLock(aiEmployeeId, async () => {\n      await mkdir(workspace.notesDir, { recursive: true });\n      await writeFile(\n        path.join(workspace.notesDir, `deliver-${seq}.md`),\n        formatDeliveredMessage(message),\n        \"utf8\"\n      );\n    });\n  }\n\n  private async archiveDeliveredNotesAfterRetro(aiEmployeeId: string, workspace: AIEmployeeWorkspace): Promise<void> {\n    try {\n      await this.employeeFileMutex.withLock(aiEmployeeId, async () => {\n        await mkdir(workspace.notesDir, { recursive: true });\n        const names = await readdir(workspace.notesDir);\n        const deliverNotes = names.filter((name) => /^deliver-\\d+\\.md$/.test(name));\n        if (!deliverNotes.length) return;\n        const archiveDir = path.join(workspace.wmDir, \"archive\");\n        await mkdir(archiveDir, { recursive: true });\n        for (const name of deliverNotes) {\n          const source = path.join(workspace.notesDir, name);\n          const target = path.join(archiveDir, name);\n          await rm(target, { force: true });\n          await rename(source, target);\n        }\n      });\n    } catch (error) {\n      this.log(`deliver note archive skipped ai_employee=${aiEmployeeId} error=${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async materializeDeliveredMessageAttachments(\n    aiEmployeeId: string,\n    config: AIEmployeeConfig,\n    workspace: AIEmployeeWorkspace,\n    messages: DeliveredMessage[]\n  ): Promise<DeliveredMessage[]> {\n    if (messages.every((message) => !message.attachments?.length)) return messages;\n    const nextMessages: DeliveredMessage[] = [];\n    for (const message of messages) {\n      if (!message.attachments?.length) {\n        nextMessages.push(message);\n        continue;\n      }\n      const attachments = [];\n      for (let index = 0; index < message.attachments.length; index += 1) {\n        const attachment = message.attachments[index];\n        try {\n          const payload = await this.downloadAttachmentPayload(aiEmployeeId, config, attachment.id);\n          const meta = payload.attachment ?? attachment;\n          if (!payload.content_base64) throw new Error(\"empty attachment content\");\n          const messageDir = path.join(workspace.wmDir, \"attachments\", safePathSegment(message.message_id));\n          await mkdir(messageDir, { recursive: true });\n          const filename = safeAttachmentFilename(meta.filename ?? attachment.filename ?? attachment.id, attachment.id, index);\n          const hostPath = path.join(messageDir, filename);\n          await writeFile(hostPath, Buffer.from(payload.content_base64, \"base64\"));\n          attachments.push({\n            ...attachment,\n            id: meta.id ?? attachment.id,\n            filename: meta.filename ?? attachment.filename,\n            mime_type: meta.mime_type ?? attachment.mime_type,\n            size: meta.size ?? attachment.size,\n            local_path: this.runtimePathFor(workspace, config, hostPath),\n          });\n        } catch (error) {\n          const detail = error instanceof Error ? error.message : String(error);\n          this.log(`attachment materialize failed ai_employee=${aiEmployeeId} attachment=${attachment.id} error=${detail}`);\n          attachments.push({ ...attachment, download_error: detail });\n        }\n      }\n      nextMessages.push({ ...message, attachments });\n    }\n    return nextMessages;\n  }\n\n  private async downloadAttachmentPayload(\n    aiEmployeeId: string,\n    config: AIEmployeeConfig,\n    attachmentId: string\n  ): Promise<{\n    attachment?: { id: string; filename: string; mime_type?: string; size?: number };\n    content_base64?: string;\n  }> {\n    const response = await withPlatformProxyBypass(config.serverUrl, () =>\n      fetch(new URL(`/internal/ai-employee/${aiEmployeeId}/download-attachment`, config.serverUrl), {\n        method: \"POST\",\n        headers: { authorization: `Bearer ${config.authToken}`, \"content-type\": \"application/json\" },\n        body: JSON.stringify({ attachment_id: attachmentId }),\n      })\n    );\n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status} ${await response.text()}`);\n    }\n    return await response.json() as {\n      attachment?: { id: string; filename: string; mime_type?: string; size?: number };\n      content_base64?: string;\n    };\n  }\n\n  private async writeCurrentTurnContext(\n    workspace: AIEmployeeWorkspace,\n    config: AIEmployeeConfig,\n    message?: DeliveredMessage,\n    sourceDeliveryId?: string\n  ): Promise<void> {\n    const context = {\n      ...(message ? currentTurnContextFromDeliveredMessage(message) : {}),\n      ...(sourceDeliveryId ? { delivery_id: sourceDeliveryId } : {}),\n    };\n    const scopedFile = this.currentTurnContextFile(workspace, config);\n    await mkdir(path.dirname(scopedFile), { recursive: true });\n    await writeFile(scopedFile, JSON.stringify(context, null, 2), \"utf8\");\n    // Compatibility for older wrappers/manual scripts. Runtime wrappers prefer WM_CURRENT_TURN_FILE.\n    await writeFile(path.join(workspace.wmDir, \"current-turn.json\"), JSON.stringify(context, null, 2), \"utf8\");\n  }\n\n  private async writeTurnToolPolicy(workspace: AIEmployeeWorkspace, config: AIEmployeeConfig, message?: DeliveredMessage): Promise<void> {\n    const basePolicy = resolveAIEmployeeToolPolicy(config.aiEmployeeWorkContext);\n    const maintenance = message?.metadata?.maintenance === true || message?.metadata?.routine_template_key === \"retro\";\n    const policy = maintenance\n      ? {\n          ...basePolicy,\n          maintenance: true,\n          lark: {\n            ...basePolicy.lark,\n            imSend: { mode: \"blocked\" },\n          },\n          platform: {\n            messageSend: { mode: \"blocked\" },\n          },\n        }\n      : { ...basePolicy, maintenance: false };\n    const serialized = JSON.stringify(policy, null, 2);\n    const scopedFile = this.scopedToolPolicyFile(workspace, config);\n    await mkdir(path.dirname(scopedFile), { recursive: true });\n    await writeFile(scopedFile, serialized, \"utf8\");\n  }\n\n  private async stopAIEmployee(aiEmployeeId: string, reason: string): Promise<void> {\n    this.log(`ai_employee stop ai_employee=${aiEmployeeId} reason=${reason}`);\n    this.cancelPendingStarts(aiEmployeeId);\n    this.suppressedMemoryFingerprintCaches.add(aiEmployeeId);\n    this.deleteIdleConfigsForAIEmployee(aiEmployeeId);\n    this.terminalizeQueuedMessages(aiEmployeeId, this.startingInboxes, \"stopped while queued\");\n    this.terminalizeQueuedMessages(aiEmployeeId, this.runningInboxes, \"stopped while queued\");\n    this.rejectPendingPermissionsForAgent(aiEmployeeId, \"ai_employee stopped\");\n    this.unregisterAIEmployeeProxy(aiEmployeeId);\n    const entries = this.runningEntriesFor(aiEmployeeId);\n    if (entries.length === 0) {\n      this.options.sendToServer({ type: \"ai_employee:status\", aiEmployeeId, status: \"inactive\", failureReason: reason });\n      this.sendActivity({ aiEmployeeId, activity: \"offline\", detail: \"Stopped\", entries: [{ kind: \"status\", text: \"Stopped\", timestamp: Date.now() }] });\n      return;\n    }\n    // \u505C\u6B62\u5458\u5DE5 = \u505C\u6B62\u5176\u5168\u90E8 per-scope \u5B9E\u4F8B\u3002\n    const dones: Array<Promise<void>> = [];\n    let lastLaunchId: string | undefined;\n    for (const running of entries) {\n      running.stopped = true;\n      running.state = \"stopping\";\n      if (running.launchId) this.stoppedLaunches.add(running.launchId);\n      if (running.compactionWatchdog) clearTimeout(running.compactionWatchdog);\n      this.running.delete(running.scopedKey);\n      if (this.slotManager.release(aiEmployeeId, running.scopedKey)) this.scheduleStrandedQueueDrain();\n      running.controller.abort();\n      await running.adapter?.destroy(\"stop\");\n      if (running.done) dones.push(running.done.catch(() => undefined));\n      lastLaunchId = running.launchId ?? lastLaunchId;\n    }\n    this.killFakeRuntimeChildrenFor(aiEmployeeId, \"stop\");\n    this.sendActivity({\n      aiEmployeeId,\n      activity: \"offline\",\n      detail: \"Stopped\",\n      launchId: lastLaunchId,\n      entries: [{ kind: \"status\", text: \"Stopped\", timestamp: Date.now() }],\n    });\n    this.options.sendToServer({ type: \"ai_employee:status\", aiEmployeeId, status: \"inactive\", launchId: lastLaunchId, failureReason: reason });\n    let stopWaitTimer: ReturnType<typeof setTimeout> | undefined;\n    try {\n      await Promise.race([\n        Promise.all(dones),\n        new Promise<void>((resolve) => {\n          stopWaitTimer = setTimeout(resolve, 5000);\n          stopWaitTimer.unref?.();\n        }),\n      ]);\n    } finally {\n      if (stopWaitTimer) clearTimeout(stopWaitTimer);\n    }\n  }\n\n  private rejectPendingPermissionsForAgent(aiEmployeeId: string, reason: string): void {\n    for (const [requestId, pending] of this.pendingPermissions) {\n      if (pending.aiEmployeeId !== aiEmployeeId) continue;\n      clearTimeout(pending.timeout);\n      this.pendingPermissions.delete(requestId);\n      pending.resolve({ action: \"reject\", metadata: { reason } });\n    }\n  }\n\n  private async runFakeRuntime(input: {\n    aiEmployeeId: string;\n    config: { serverUrl: string; authToken: string; runtime: AIEmployeeRuntime; model?: string; reasoningEffort?: string; permissionMode?: \"default\" | \"full_access\"; runtimeSessionScope?: RuntimeSessionScope };\n    workspace: AIEmployeeWorkspace;\n    wakeMessage?: DeliveredMessage;\n    abortSignal?: AbortSignal;\n    launchId?: string;\n    executionBackend: ExecutionBackend;\n  }): Promise<{ runtimeSessionId: string; finalMessage: string; events: Array<{ type: string; content?: string }> }> {\n    const { aiEmployeeId, config, workspace, wakeMessage, abortSignal, launchId, executionBackend } = input;\n    const childKey = this.scopedAIEmployeeKey(aiEmployeeId, config.runtimeSessionScope ?? externalScope(\"system\", \"default\"));\n    let child: ChildProcess | undefined;\n    if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n      child = this.spawnFakeRuntimeChild({ aiEmployeeId, childKey, config, workspace, launchId, executionBackend });\n    }\n    try {\n      await sleep(fakeRuntimeDelayMs(), abortSignal);\n      if (abortSignal?.aborted) throw new Error(\"Fake runtime aborted\");\n    } finally {\n      if (child) await this.stopFakeRuntimeChild(childKey, child, \"turn-complete\");\n    }\n    const text = `\u6536\u5230\uFF1A${wakeMessage?.content ?? \"hello\"}`;\n    if (wakeMessage && isPlatformReplyTarget(wakeMessage.target)) {\n      await fetch(new URL(`/internal/ai-employee/${aiEmployeeId}/send`, config.serverUrl), {\n        method: \"POST\",\n        headers: { authorization: `Bearer ${config.authToken}`, \"content-type\": \"application/json\" },\n        body: JSON.stringify({ target: wakeMessage.target, text }),\n      });\n    }\n    const sessionId = `fake-${Date.now()}`;\n    return {\n      runtimeSessionId: sessionId,\n      finalMessage: wakeMessage ? text : \"Startup complete\",\n      events: [{ type: \"assistant_result\", content: wakeMessage ? text : \"Startup complete\" }],\n    };\n  }\n\n  private async maybeSendCodexPlatformFallbackReply(input: {\n    aiEmployeeId: string;\n    config: AIEmployeeConfig;\n    workspace: AIEmployeeWorkspace;\n    messages: DeliveredMessage[];\n    status: RuntimeRunResult[\"status\"];\n    finalMessage: string;\n    events: RuntimeEvent[];\n    sourceDeliveryId?: string;\n    abortSignal?: AbortSignal;\n  }): Promise<CodexPlatformReplyAttempt> {\n    if (input.config.runtime !== \"codex\") return { status: \"sent\" };\n    if (input.messages.length === 0) return { status: \"sent\" };\n    if (input.status !== \"ok\") return { status: \"sent\" };\n    const target = exactReplyTarget(input.messages[0]);\n    if (!isPlatformReplyTarget(target)) return { status: \"sent\" };\n    const replay = await this.replayCodexPlatformReplyOutbox(input);\n    if (replay.status !== \"none\") return replay;\n    const platformReplySent = input.events.some(platformMessageSendSucceeded);\n    const text = codexPlatformReplyFallbackText(input.finalMessage, input.events);\n    if (!text) {\n      return platformReplySent\n        ? { status: \"sent\" }\n        : { status: \"permanent\", detail: \"Codex completed without a platform reply\" };\n    }\n    const attachmentIds = codexPlatformReplyFallbackAttachmentIds(input.events);\n    const idempotencyKey = codexPlatformReplyIdempotencyKey(input.messages[0], target, text, attachmentIds, \"answer\");\n    const evidence = input.config.aiEmployeeWorkContext?.templateKey === \"personal_agent\"\n      ? codexPlatformReplyFallbackEvidence(input.messages[0])\n      : undefined;\n    const body = {\n      target,\n      text,\n      attachment_ids: attachmentIds,\n      kind: \"answer\",\n      ...(idempotencyKey ? { idempotency_key: idempotencyKey } : {}),\n      ...(input.sourceDeliveryId ? { source_delivery_id: input.sourceDeliveryId } : {}),\n      ...(evidence ? { evidence } : {}),\n    };\n    try {\n      await this.persistCodexPlatformReplyOutboxEntry(input.workspace, input.messages[0], body);\n    } catch (error) {\n      const detail = error instanceof Error ? error.message : String(error);\n      this.log(`codex platform reply fallback outbox failed ai_employee=${input.aiEmployeeId} target=${target} error=${detail}`);\n      return { status: \"retryable\", detail: `platform reply outbox persist failed: ${detail}` };\n    }\n    const persistedReplay = await this.replayCodexPlatformReplyOutbox(input);\n    return persistedReplay.status === \"none\"\n      ? { status: \"retryable\", detail: \"persisted platform reply was not readable\" }\n      : persistedReplay;\n  }\n\n  private async persistCodexPlatformReplyOutboxEntry(\n    workspace: AIEmployeeWorkspace,\n    message: DeliveredMessage,\n    body: Record<string, unknown>\n  ): Promise<void> {\n    const sourceMessageId = message.message_id.trim();\n    if (!sourceMessageId) throw new Error(\"source message id required\");\n    const outboxDir = path.join(workspace.wmDir, \"platform-reply-outbox\");\n    await mkdir(outboxDir, { recursive: true, mode: 0o700 });\n    if (process.platform !== \"win32\") await chmod(outboxDir, 0o700);\n    const idempotencyKey = stringValue(body.idempotency_key)?.trim() ?? \"\";\n    const filenames = await readdir(outboxDir).catch(() => [] as string[]);\n    for (const filename of filenames) {\n      if (!filename.endsWith(\".json\")) continue;\n      try {\n        const payload = objectValue(JSON.parse(await readFile(path.join(outboxDir, filename), \"utf8\")));\n        const existingBody = payload?.version === 1 ? codexPlatformReplyOutboxBody(payload.body) : undefined;\n        if (\n          stringValue(payload?.source_message_id)?.trim() === sourceMessageId\n          && (stringValue(existingBody?.idempotency_key)?.trim() ?? \"\") === idempotencyKey\n        ) {\n          return;\n        }\n      } catch {\n        // Invalid entries remain visible for diagnosis and must not erase a valid first body.\n      }\n    }\n    const digest = createHash(\"sha256\")\n      .update(`${sourceMessageId}\\0${idempotencyKey}\\0platform-reply`)\n      .digest(\"hex\")\n      .slice(0, 32);\n    const filePath = path.join(outboxDir, `${digest}.json`);\n    if (existsSync(filePath)) return;\n    const tempPath = path.join(outboxDir, `.${digest}.${process.pid}.${Date.now()}.tmp`);\n    const payload = {\n      version: 1,\n      source_message_id: sourceMessageId,\n      body,\n      created_at: new Date().toISOString(),\n    };\n    try {\n      await writeFile(tempPath, JSON.stringify(payload), { encoding: \"utf8\", mode: 0o600, flag: \"wx\" });\n      await rename(tempPath, filePath);\n      if (process.platform !== \"win32\") await chmod(filePath, 0o600);\n    } catch (error) {\n      await rm(tempPath, { force: true }).catch(() => undefined);\n      throw error;\n    }\n  }\n\n  private async replayCodexPlatformReplyOutbox(input: {\n    aiEmployeeId: string;\n    config: AIEmployeeConfig;\n    workspace: AIEmployeeWorkspace;\n    messages: DeliveredMessage[];\n    abortSignal?: AbortSignal;\n  }): Promise<CodexPlatformReplyAttempt> {\n    const sourceMessageId = input.messages[0]?.message_id.trim();\n    if (!sourceMessageId) return { status: \"none\" };\n    const outboxDir = path.join(input.workspace.wmDir, \"platform-reply-outbox\");\n    let filenames: string[];\n    try {\n      filenames = (await readdir(outboxDir)).filter((filename) => filename.endsWith(\".json\"));\n    } catch (error) {\n      if (objectValue(error)?.code === \"ENOENT\") return { status: \"none\" };\n      const detail = error instanceof Error ? error.message : String(error);\n      this.log(`codex platform reply outbox read failed ai_employee=${input.aiEmployeeId} error=${detail}`);\n      return { status: \"retryable\", detail: `platform reply outbox read failed: ${detail}` };\n    }\n\n    const entries: Array<{ filePath: string; body: Record<string, unknown>; createdAt: string }> = [];\n    let matchingEntryFound = false;\n    for (const filename of filenames) {\n      const filePath = path.join(outboxDir, filename);\n      try {\n        const payload = objectValue(JSON.parse(await readFile(filePath, \"utf8\")));\n        if (stringValue(payload?.source_message_id)?.trim() !== sourceMessageId) continue;\n        matchingEntryFound = true;\n        const body = payload?.version === 1 ? codexPlatformReplyOutboxBody(payload.body) : undefined;\n        if (!body) {\n          this.log(`codex platform reply outbox invalid ai_employee=${input.aiEmployeeId} source_message=${sourceMessageId} file=${filename}`);\n          continue;\n        }\n        entries.push({\n          filePath,\n          body,\n          createdAt: stringValue(payload?.created_at) ?? filename,\n        });\n      } catch (error) {\n        this.log(`codex platform reply outbox entry read failed ai_employee=${input.aiEmployeeId} file=${filename} error=${error instanceof Error ? error.message : String(error)}`);\n      }\n    }\n    if (!matchingEntryFound) return { status: \"none\" };\n    if (entries.length === 0) {\n      return { status: \"permanent\", detail: \"platform reply outbox entry is invalid\" };\n    }\n\n    entries.sort((left, right) => left.createdAt.localeCompare(right.createdAt));\n    for (const entry of entries) {\n      const target = stringValue(entry.body.target) ?? exactReplyTarget(input.messages[0]);\n      try {\n        const response = await withPlatformProxyBypass(input.config.serverUrl, () =>\n          fetch(new URL(`/internal/ai-employee/${input.aiEmployeeId}/send`, input.config.serverUrl), {\n            method: \"POST\",\n            headers: { authorization: `Bearer ${input.config.authToken}`, \"content-type\": \"application/json\" },\n            body: JSON.stringify(entry.body),\n            signal: combinedAbortSignal(input.abortSignal, this.disposeController.signal),\n          })\n        );\n        if (!response.ok) {\n          const responseBody = await response.text();\n          const detail = `HTTP ${response.status} ${responseBody}`.trim();\n          const retryable = response.status === 408\n            || response.status === 429\n            || response.status >= 500\n            || (response.status === 409 && /processing|in[_ -]?progress|pending/i.test(responseBody));\n          this.log(`codex platform reply outbox replay failed ai_employee=${input.aiEmployeeId} target=${target} error=${detail}`);\n          return { status: retryable ? \"retryable\" : \"permanent\", detail };\n        }\n        await rm(entry.filePath, { force: true });\n        this.log(`business ai_employee=${input.aiEmployeeId} codex_platform_reply_outbox_replayed target=${target}`);\n      } catch (error) {\n        const detail = error instanceof Error ? error.message : String(error);\n        this.log(`codex platform reply outbox replay failed ai_employee=${input.aiEmployeeId} target=${target} error=${detail}`);\n        return { status: \"retryable\", detail };\n      }\n    }\n    return { status: \"sent\" };\n  }\n\n  private async settleCodexPlatformReply(input: {\n    aiEmployeeId: string;\n    config: AIEmployeeConfig;\n    workspace: AIEmployeeWorkspace;\n    messages: DeliveredMessage[];\n    status: RuntimeRunResult[\"status\"];\n    finalMessage: string;\n    events: RuntimeEvent[];\n    sourceDeliveryId?: string;\n    abortSignal: AbortSignal;\n  }): Promise<CodexPlatformReplySettlement> {\n    let retryAttempt = 0;\n    while (true) {\n      if (input.abortSignal.aborted || this.disposeController.signal.aborted) {\n        return { status: \"aborted\", detail: \"platform reply settlement aborted\" };\n      }\n      const result = await this.maybeSendCodexPlatformFallbackReply(input);\n      if (result.status === \"sent\") return { status: \"settled\" };\n      if (result.status === \"permanent\") return result;\n      const completed = await waitForAbortableDelay(\n        this.codexPlatformReplyRetryDelayMs(retryAttempt),\n        input.abortSignal,\n        this.disposeController.signal\n      );\n      if (!completed) return { status: \"aborted\", detail: \"platform reply settlement aborted\" };\n      retryAttempt += 1;\n    }\n  }\n\n  private codexPlatformReplyRetryDelayMs(attempt: number): number {\n    const configuredDelay = Number(process.env.WM_CODEX_PLATFORM_REPLY_RETRY_DELAY_MS);\n    const baseDelayMs = Number.isFinite(configuredDelay) && configuredDelay > 0\n      ? Math.max(25, Math.floor(configuredDelay))\n      : 1000;\n    return Math.min(30_000, baseDelayMs * (2 ** Math.min(Math.max(0, attempt), 10)));\n  }\n\n  private async maybeSendTimeoutPlatformNotice(input: {\n    aiEmployeeId: string;\n    config: AIEmployeeConfig;\n    messages: DeliveredMessage[];\n    status: RuntimeRunResult[\"status\"];\n    events: RuntimeEvent[];\n  }): Promise<void> {\n    if (input.status !== \"timeout\") return;\n    if (input.messages.length === 0) return;\n    if (input.events.some(platformMessageSendSucceeded)) return;\n    const target = exactReplyTarget(input.messages[0]);\n    if (!isPlatformReplyTarget(target)) return;\n    const text = \"\u62B1\u6B49\uFF0C\u8FD9\u6B21\u5904\u7406\u8D85\u65F6\u4E86\uFF0C\u6682\u65F6\u6CA1\u6709\u5B8C\u6210\u56DE\u590D\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u6216\u628A\u95EE\u9898\u91CD\u65B0\u53D1\u4E00\u904D\u3002\";\n\n    try {\n      const response = await withPlatformProxyBypass(input.config.serverUrl, () =>\n        fetch(new URL(`/internal/ai-employee/${input.aiEmployeeId}/send`, input.config.serverUrl), {\n          method: \"POST\",\n          headers: { authorization: `Bearer ${input.config.authToken}`, \"content-type\": \"application/json\" },\n          body: JSON.stringify({ target, text }),\n        })\n      );\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status} ${await response.text()}`);\n      }\n      this.log(`business ai_employee=${input.aiEmployeeId} timeout_notice_sent target=${target}`);\n    } catch (error) {\n      this.log(`timeout notice failed ai_employee=${input.aiEmployeeId} target=${target} error=${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async maybeSendFeishuRoutineFailureNotice(input: {\n    aiEmployeeId: string;\n    config: AIEmployeeConfig;\n    workspace: AIEmployeeWorkspace;\n    messages: DeliveredMessage[];\n    status: RuntimeRunResult[\"status\"];\n    events: RuntimeEvent[];\n    executionBackend: ExecutionBackend;\n    runtimeEnv: NodeJS.ProcessEnv;\n    detail?: string;\n  }): Promise<void> {\n    if (input.status === \"ok\") return;\n    if (input.messages.length === 0) return;\n    if (input.events.some(feishuMessageSendSucceeded)) return;\n    const target = feishuFallbackReplyTarget(input.messages[0]);\n    if (!target) return;\n\n    const runtimeWorkspaceDir = this.runtimePathFor(input.workspace, input.config, input.workspace.aiEmployeeDir);\n    const runner = createFeishuRuntimeExecRunner({\n      workspaceDir: input.workspace.aiEmployeeDir,\n      runtimeWorkspaceDir,\n      employeeId: input.aiEmployeeId,\n      runtime: input.config.runtime,\n      env: input.runtimeEnv,\n    }, input.executionBackend);\n    const text = \"\u62B1\u6B49\uFF0C\u8FD9\u6B21\u5904\u7406\u8FC7\u7A0B\u4E2D\u9047\u5230\u95EE\u9898\uFF0C\u6682\u65F6\u6CA1\u6709\u5B8C\u6210\u56DE\u590D\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u6216\u91CD\u65B0\u53D1\u4E00\u904D\u3002\";\n    const args = [\n      \"im\",\n      \"+messages-reply\",\n      \"--as\",\n      target.as,\n      \"--message-id\",\n      target.messageId,\n      \"--format\",\n      \"markdown\",\n      \"--text\",\n      text,\n    ];\n\n    try {\n      const result = await runner(\"lark-cli\", args, {\n        env: { WM_FEISHU_ALLOW_SEND: \"1\" },\n        timeoutMs: 30000,\n      });\n      if (result.code !== 0) {\n        throw new Error([result.stderr.trim(), result.stdout.trim()].filter(Boolean).join(\"\\n\") || `exit ${result.code}`);\n      }\n      this.log(`business ai_employee=${input.aiEmployeeId} feishu_failure_notice_sent message=${target.messageId} as=${target.as}`);\n    } catch (error) {\n      this.log(`feishu failure notice failed ai_employee=${input.aiEmployeeId} message=${target.messageId} status=${input.status} error=${error instanceof Error ? error.message : String(error)} detail=${compact(input.detail ?? \"\")}`);\n    }\n  }\n\n  private spawnFakeRuntimeChild(input: {\n    aiEmployeeId: string;\n    childKey: string;\n    config: { runtime: AIEmployeeRuntime; model?: string; reasoningEffort?: string; permissionMode?: \"default\" | \"full_access\" };\n    workspace: AIEmployeeWorkspace;\n    launchId?: string;\n    executionBackend: ExecutionBackend;\n  }): ChildProcess {\n    this.killFakeRuntimeChild(input.childKey, \"replace\");\n    this.log(`runtime spawn ai_employee=${input.aiEmployeeId} runtime=${input.config.runtime} model=${input.config.model ?? \"default\"} reasoning=${input.config.reasoningEffort ?? \"default\"} permission=${input.config.permissionMode ?? \"default\"} cwd=${input.workspace.aiEmployeeDir} launch=${input.launchId ?? \"-\"}`);\n    const child = input.executionBackend.spawnRuntime({\n      command: input.executionBackend.kind === \"container\" ? \"node\" : process.execPath,\n      args: [\n        \"-e\",\n        [\n          \"process.title='wm-fake-runtime-child';\",\n          \"process.on('SIGTERM',()=>process.exit(0));\",\n          \"process.on('SIGINT',()=>process.exit(0));\",\n          \"setInterval(()=>{},1000);\",\n        ].join(\"\"),\n      ],\n      cwd: input.workspace.aiEmployeeDir,\n      // fake \u8DEF\u5F84\u540C\u6837\u4E0D\u5168\u91CF\u7EE7\u627F daemon \u73AF\u5883\uFF0C\u53EA\u7ED9\u6700\u5C0F\u8FD0\u884C\u96C6 + \u63A7\u5236\u53D8\u91CF\u3002\n      env: {\n        PATH: process.env.PATH,\n        HOME: process.env.HOME,\n        WM_FAKE_RUNTIME_AGENT_ID: input.aiEmployeeId,\n        WM_FAKE_RUNTIME_LAUNCH_ID: input.launchId ?? \"\",\n      },\n      employeeId: input.aiEmployeeId,\n      stdio: \"ignore-stdin\",\n    });\n    this.fakeRuntimeChildren.set(input.childKey, child);\n    this.log(`runtime pid ai_employee=${input.aiEmployeeId} pid=${child.pid ?? \"-\"} cwd=${input.workspace.aiEmployeeDir}`);\n    child.once(\"exit\", () => {\n      if (this.fakeRuntimeChildren.get(input.childKey) === child) this.fakeRuntimeChildren.delete(input.childKey);\n    });\n    return child;\n  }\n\n  private killFakeRuntimeChild(childKey: string, reason: string): void {\n    const child = this.fakeRuntimeChildren.get(childKey);\n    if (!child) return;\n    this.log(`runtime kill key=${childKey.split(\"\\u0000\")[0]} pid=${child.pid ?? \"-\"} reason=${reason}`);\n    this.fakeRuntimeChildren.delete(childKey);\n    if (!child.killed) child.kill(\"SIGTERM\");\n  }\n\n  /** \u5458\u5DE5\u7EA7\u6E05\u7406\uFF1Akill \u8BE5\u5458\u5DE5\u5168\u90E8 scope \u7684 fake runtime \u5B50\u8FDB\u7A0B\u3002 */\n  private killFakeRuntimeChildrenFor(aiEmployeeId: string, reason: string): void {\n    const prefix = this.scopedKeyPrefix(aiEmployeeId);\n    for (const key of [...this.fakeRuntimeChildren.keys()]) {\n      if (key.startsWith(prefix)) this.killFakeRuntimeChild(key, reason);\n    }\n  }\n\n  private firstFakeRuntimeChildFor(aiEmployeeId: string): ChildProcess | undefined {\n    const prefix = this.scopedKeyPrefix(aiEmployeeId);\n    for (const [key, child] of this.fakeRuntimeChildren) {\n      if (key.startsWith(prefix)) return child;\n    }\n    return undefined;\n  }\n\n  private async stopFakeRuntimeChild(childKey: string, child: ChildProcess, reason: string): Promise<void> {\n    if (this.fakeRuntimeChildren.get(childKey) !== child) return;\n    this.killFakeRuntimeChild(childKey, reason);\n    await Promise.race([\n      new Promise((resolve) => child.once(\"exit\", resolve)),\n      new Promise((resolve) => setTimeout(resolve, 1000)),\n    ]);\n    if (!child.killed && child.exitCode === null) child.kill(\"SIGKILL\");\n  }\n\n  private async writeRuntimeEnv(\n    workspace: AIEmployeeWorkspace,\n    config: { serverUrl: string; authToken: string; runtime: AIEmployeeRuntime; serverNamespace: string; machineId: string; sandboxMode?: AIEmployeeConfig[\"sandboxMode\"]; envVars?: Record<string, string> },\n    aiEmployeeId: string\n  ): Promise<void> {\n    // runtime-env / agent-proxy-token \u662F\u5458\u5DE5\u7EA7\u5171\u4EAB\u6587\u4EF6\uFF1B\u5E76\u53D1 scope \u540C\u65F6\u542F\u52A8\u90FD\u4F1A\u5199\uFF0C\u5FC5\u987B\u4E32\u884C\u3002\n    await this.employeeFileMutex.withLock(aiEmployeeId, async () => {\n      const proxyEnv = await this.ensureAgentProxyEnv(workspace, config, aiEmployeeId);\n      await this.ensureRuntimeHomeDirs(workspace, config);\n      await this.ensureRuntimeCredentialFiles(workspace, config);\n      // runtime-env \u4E0D\u5199\u5165\u5BBF\u4E3B\u673A\u53D8\u91CF\uFF08hostEnv: {}\uFF09\uFF0C\u907F\u514D\u628A daemon \u73AF\u5883\u6574\u5305\u843D\u76D8\uFF1B\n      // runtime \u51ED\u8BC1\u6587\u4EF6\u7531 ensureRuntimeCredentialFiles \u6309 runtime \u663E\u5F0F\u540C\u6B65\u3002\n      const fileEnv = buildAllowlistedEnv({\n        hostEnv: {},\n        employeeEnvVars: config.envVars ?? {},\n        wmEnv: {\n          ...this.buildWmEnv(workspace, config, aiEmployeeId, proxyEnv),\n          ...this.containerRuntimeEnv(workspace, config),\n        },\n      });\n      await mkdir(workspace.wmDir, { recursive: true });\n      await writeFile(\n        path.join(workspace.wmDir, \"runtime-env\"),\n        [\n          ...Object.entries(fileEnv).map(([key, value]) => `${key}=${escapeEnvValue(value ?? \"\")}`),\n          \"\",\n        ].join(\"\\n\"),\n        \"utf8\"\n      );\n    });\n  }\n\n  /** \u5E73\u53F0\u5408\u6210\u53D8\u91CF\uFF08WM_* / LARKSUITE / NO_PROXY\uFF09\uFF0CbuildRuntimeEnv \u4E0E writeRuntimeEnv \u5171\u7528\u3002 */\n  private buildWmEnv(\n    workspace: AIEmployeeWorkspace,\n    config: { serverUrl: string; authToken: string; runtime: AIEmployeeRuntime; serverNamespace: string; machineId: string; sandboxMode?: AIEmployeeConfig[\"sandboxMode\"] },\n    aiEmployeeId: string,\n    proxyEnv: { proxyUrl: string; proxyTokenFile: string } | undefined\n  ): Record<string, string | undefined> {\n    const wrapperPath = this.runtimePathFor(workspace, config, workspace.wrapperPath);\n    const larkConfigPath = this.runtimePathFor(workspace, config, larkConfigDir(workspace.aiEmployeeDir));\n    const larkHomeEnv = this.executionBackendForConfig(config).kind === \"container\"\n      ? larkRuntimeHomeEnv(\"/workspace\")\n      : larkWorkspaceHomeEnv(workspace.aiEmployeeDir);\n    const proxyTokenFile = proxyEnv ? this.runtimePathFor(workspace, config, proxyEnv.proxyTokenFile) : undefined;\n    const currentTurnFile = this.runtimePathFor(workspace, config, this.currentTurnContextFile(workspace, config as AIEmployeeConfig));\n    const toolPolicyFile = this.runtimePathFor(workspace, config, this.scopedToolPolicyFile(workspace, config as AIEmployeeConfig));\n    return {\n      WM_AGENT_ID: aiEmployeeId,\n      WM_CLI_PATH: wrapperPath,\n      WM_CURRENT_TURN_FILE: currentTurnFile,\n      WM_TOOL_POLICY_FILE: toolPolicyFile,\n      WM_SERVER_URL: config.serverUrl,\n      ...(proxyEnv\n        ? {\n          WM_AGENT_PROXY_URL: proxyEnv.proxyUrl,\n          WM_AGENT_PROXY_TOKEN_FILE: proxyTokenFile,\n        }\n        : {\n          WM_AGENT_TOKEN: config.authToken,\n        }),\n      WM_DAEMON_RUNTIME: config.runtime,\n      WM_DAEMON_SERVER_NAMESPACE: config.serverNamespace,\n      WM_DAEMON_MACHINE_ID: config.machineId,\n      ...larkHomeEnv,\n      ...this.hostRuntimeEnv(workspace, config),\n      LARKSUITE_CLI_CONFIG_DIR: larkConfigPath,\n      NO_PROXY: buildPlatformNoProxy(config.serverUrl, process.env.NO_PROXY),\n      no_proxy: buildPlatformNoProxy(config.serverUrl, process.env.no_proxy),\n    };\n  }\n\n  private runtimePathFor(\n    workspace: AIEmployeeWorkspace,\n    config: Pick<AIEmployeeConfig, \"sandboxMode\">,\n    hostPath: string\n  ): string {\n    if (this.executionBackendForConfig(config).kind !== \"container\") return hostPath;\n    const relative = path.relative(workspace.aiEmployeeDir, hostPath);\n    if (!relative || relative === \"\") return \"/workspace\";\n    if (relative.startsWith(\"..\") || path.isAbsolute(relative)) return hostPath;\n    return path.posix.join(\"/workspace\", ...relative.split(path.sep));\n  }\n\n  private runtimePathDelimiter(config: Pick<AIEmployeeConfig, \"sandboxMode\">): string {\n    return this.executionBackendForConfig(config).kind === \"container\" ? \":\" : path.delimiter;\n  }\n\n  private containerRuntimeEnv(workspace: AIEmployeeWorkspace, config: Pick<AIEmployeeConfig, \"sandboxMode\">): Record<string, string> {\n    if (this.executionBackendForConfig(config).kind !== \"container\") return {};\n    return {\n      HOME: \"/workspace/.home\",\n      CODEX_HOME: \"/workspace/.home/.codex\",\n      XDG_CONFIG_HOME: \"/workspace/.home/.config\",\n      XDG_DATA_HOME: \"/workspace/.home/.local/share\",\n      XDG_STATE_HOME: \"/workspace/.home/.local/state\",\n      XDG_CACHE_HOME: \"/workspace/.home/.cache\",\n      TMPDIR: \"/tmp\",\n    };\n  }\n\n  private hostRuntimeEnv(workspace: AIEmployeeWorkspace, config: Pick<AIEmployeeConfig, \"runtime\" | \"sandboxMode\">): Record<string, string> {\n    if (this.executionBackendForConfig(config).kind === \"container\") return {};\n    if (config.runtime !== \"codex\") return {};\n    return { CODEX_HOME: path.join(workspace.aiEmployeeDir, \".home\", \".codex\") };\n  }\n\n  private async ensureRuntimeHomeDirs(workspace: AIEmployeeWorkspace, config: Pick<AIEmployeeConfig, \"sandboxMode\">): Promise<void> {\n    for (const relative of [\n      \".home\",\n      \".home/.codex\",\n      \".home/.config\",\n      \".home/.local/share\",\n      \".home/.local/state\",\n      \".home/.cache\",\n    ]) {\n      await mkdir(path.join(workspace.aiEmployeeDir, relative), { recursive: true });\n    }\n  }\n\n  private async ensureRuntimeCredentialFiles(workspace: AIEmployeeWorkspace, config: Pick<AIEmployeeConfig, \"runtime\">): Promise<void> {\n    if (config.runtime !== \"codex\") return;\n    const sourceAuthPath = path.join(process.env.CODEX_HOME?.trim() || path.join(os.homedir(), \".codex\"), \"auth.json\");\n    if (!existsSync(sourceAuthPath)) return;\n    const targetAuthPath = path.join(workspace.aiEmployeeDir, \".home\", \".codex\", \"auth.json\");\n    await mkdir(path.dirname(targetAuthPath), { recursive: true });\n    await copyFile(sourceAuthPath, targetAuthPath);\n    await chmod(targetAuthPath, 0o600);\n  }\n\n  private buildRuntimeEnv(\n    workspace: AIEmployeeWorkspace,\n    config: { serverUrl: string; authToken: string; runtime: AIEmployeeRuntime; serverNamespace: string; machineId: string; sandboxMode?: AIEmployeeConfig[\"sandboxMode\"]; envVars?: Record<string, string> },\n    aiEmployeeId: string\n  ): NodeJS.ProcessEnv {\n    const proxyEnv = this.aiEmployeeProxyHandles.get(aiEmployeeId);\n    const runtimeWmDir = this.runtimePathFor(workspace, config, workspace.wmDir);\n    return buildAllowlistedEnv({\n      hostEnv: process.env,\n      employeeEnvVars: config.envVars ?? {},\n      wmEnv: {\n        ...this.buildWmEnv(workspace, config, aiEmployeeId, proxyEnv),\n        ...this.containerRuntimeEnv(workspace, config),\n        PATH: `${runtimeWmDir}${this.runtimePathDelimiter(config)}${process.env.PATH ?? \"\"}`,\n      },\n    });\n  }\n\n  private async ensureAgentProxyEnv(\n    workspace: AIEmployeeWorkspace,\n    config: { serverUrl: string; authToken: string; sandboxMode?: AIEmployeeConfig[\"sandboxMode\"] },\n    aiEmployeeId: string\n  ): Promise<{ proxyUrl: string; proxyTokenFile: string }> {\n    this.unregisterAIEmployeeProxy(aiEmployeeId);\n    const handle = await this.aiEmployeeLocalProxy.registerAIEmployee({\n      aiEmployeeId,\n      serverUrl: config.serverUrl,\n      authToken: config.authToken,\n      aiEmployeeWorkspaceDir: workspace.aiEmployeeDir,\n    }, {\n      advertiseHost: this.executionBackendForConfig(config).kind === \"container\"\n        ? process.env.WM_DAEMON_CONTAINER_PROXY_ADVERTISE_HOST ?? \"host.docker.internal\"\n        : \"127.0.0.1\",\n    });\n    const proxyTokenFile = path.join(workspace.wmDir, \"agent-proxy-token\");\n    await mkdir(workspace.wmDir, { recursive: true });\n    await writeFile(proxyTokenFile, handle.proxyToken, { encoding: \"utf8\", mode: 0o600 });\n    await chmod(proxyTokenFile, 0o600);\n    this.aiEmployeeProxyHandles.set(aiEmployeeId, {\n      proxyUrl: handle.proxyUrl,\n      proxyToken: handle.proxyToken,\n      proxyTokenFile,\n    });\n    return { proxyUrl: handle.proxyUrl, proxyTokenFile };\n  }\n\n  private unregisterAIEmployeeProxy(aiEmployeeId: string): void {\n    const handle = this.aiEmployeeProxyHandles.get(aiEmployeeId);\n    if (!handle) return;\n    this.aiEmployeeLocalProxy.unregisterToken(handle.proxyToken);\n    this.aiEmployeeProxyHandles.delete(aiEmployeeId);\n  }\n\n  private async replyWorkspaceList(aiEmployeeId: string, requestId: string, dirPath?: string, serverNamespace?: string, machineId?: string, config?: AIEmployeeConfig): Promise<void> {\n    try {\n      this.log(`workspace list ai_employee=${aiEmployeeId} request=${requestId} path=${dirPath ?? \".\"}`);\n      const ensured = await this.ensureAIEmployeeWorkspace(aiEmployeeId, config);\n      if (ensured.missing) {\n        this.options.sendToServer({ type: \"ai_employee:workspace:file_tree\", aiEmployeeId, requestId, entries: [], missing: true });\n        return;\n      }\n      const effectiveConfig = config ?? this.firstRunningEntryFor(aiEmployeeId)?.config ?? this.firstIdleConfigForAIEmployee(aiEmployeeId)?.config;\n      const entries = await this.browser.listFiles(aiEmployeeId, dirPath, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n      this.options.sendToServer({ type: \"ai_employee:workspace:file_tree\", aiEmployeeId, requestId, entries });\n    } catch (error) {\n      this.log(`workspace list failed ai_employee=${aiEmployeeId} request=${requestId} error=${error instanceof Error ? error.message : String(error)}`);\n      this.options.sendToServer({\n        type: \"ai_employee:workspace:file_tree\",\n        aiEmployeeId,\n        requestId,\n        entries: [],\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async replyWorkspaceRead(aiEmployeeId: string, requestId: string, filePath: string, serverNamespace?: string, machineId?: string, config?: AIEmployeeConfig): Promise<void> {\n    try {\n      this.log(`workspace read ai_employee=${aiEmployeeId} request=${requestId} path=${filePath}`);\n      const effectiveConfig = config ?? this.firstRunningEntryFor(aiEmployeeId)?.config ?? this.firstIdleConfigForAIEmployee(aiEmployeeId)?.config;\n      const file = await this.browser.readFile(aiEmployeeId, filePath, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n      this.options.sendToServer({ type: \"ai_employee:workspace:file_content\", aiEmployeeId, requestId, file });\n    } catch (error) {\n      this.log(`workspace read failed ai_employee=${aiEmployeeId} request=${requestId} error=${error instanceof Error ? error.message : String(error)}`);\n      this.options.sendToServer({\n        type: \"ai_employee:workspace:file_content\",\n        aiEmployeeId,\n        requestId,\n        file: null,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async replyWorkspaceWrite(aiEmployeeId: string, requestId: string, filePath: string, content: string, serverNamespace?: string, machineId?: string, config?: AIEmployeeConfig): Promise<void> {\n    try {\n      this.log(`workspace write ai_employee=${aiEmployeeId} request=${requestId} path=${filePath}`);\n      const effectiveConfig = config ?? this.firstRunningEntryFor(aiEmployeeId)?.config ?? this.firstIdleConfigForAIEmployee(aiEmployeeId)?.config;\n      const result = await this.browser.writeFile(aiEmployeeId, filePath, content, serverNamespace ?? effectiveConfig?.serverNamespace, machineId ?? effectiveConfig?.machineId);\n      this.options.sendToServer({ type: \"ai_employee:workspace:write_result\", aiEmployeeId, requestId, ...result });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:workspace:write_result\",\n        aiEmployeeId,\n        requestId,\n        path: filePath,\n        ok: false,\n        error: error instanceof Error ? error.message : \"workspace write failed\",\n      });\n    }\n  }\n\n  private async replyAgentSkillsList(aiEmployeeId: string, requestId: string, runtime: RuntimeId, serverNamespace?: string, machineId?: string, config?: AIEmployeeConfig): Promise<void> {\n    try {\n      const ensured = await this.ensureAIEmployeeWorkspace(aiEmployeeId, config);\n      const effectiveConfig = config ?? this.firstRunningEntryFor(aiEmployeeId)?.config ?? this.firstIdleConfigForAIEmployee(aiEmployeeId)?.config;\n      const namespace = serverNamespace ?? effectiveConfig?.serverNamespace;\n      const machine = machineId ?? effectiveConfig?.machineId;\n      if (!namespace || !machine) throw new Error(`Unknown AI employee workspace: ${aiEmployeeId}`);\n      const result = await scanAgentSkills({\n        rootDir: this.options.rootDir,\n        serverNamespace: namespace,\n        machineDirectoryName: this.machineDirectoryName(effectiveConfig),\n        machineId: machine,\n        aiEmployeeDirectoryName: effectiveConfig ? this.aiEmployeeDirectoryName(effectiveConfig, aiEmployeeId) : namedWorkspaceDirectoryName(aiEmployeeId, aiEmployeeId, \"ai-employee\"),\n        aiEmployeeId,\n        runtime,\n      });\n      this.options.sendToServer({ type: \"ai_employee:skills:list/result\", aiEmployeeId, requestId, global: result.global, workspace: result.workspace });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:skills:list/result\",\n        aiEmployeeId,\n        requestId,\n        global: [],\n        workspace: [],\n        error: error instanceof Error ? error.message : \"skills scan failed\",\n      });\n    }\n  }\n\n  private async replyMachineWorkspaceScan(requestId: string, serverNamespace: string, machineId: string, machineName: string | undefined, knownAIEmployeeIds: string[]): Promise<void> {\n    try {\n      const entries = await this.scanWorkspaces(serverNamespace, machineId, machineName, new Set(knownAIEmployeeIds));\n      this.options.sendToServer({ type: \"machine:workspace:scan/result\", requestId, entries });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"machine:workspace:scan/result\",\n        requestId,\n        entries: [],\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async replyMachineWorkspaceDelete(requestId: string, serverNamespace: string, machineId: string, machineName: string | undefined, directoryName: string): Promise<void> {\n    try {\n      if (!isSafeWorkspaceDirectoryName(directoryName)) throw new Error(\"unsafe workspace directory name\");\n      if (this.hasRunningFor(directoryName) || this.isStartingFor(directoryName)) throw new Error(\"cannot delete a running workspace\");\n      const target = this.resolveWorkspaceDirectoryName(machineName ?? machineId, machineId, directoryName);\n      await rm(target, { recursive: true, force: true });\n      this.options.sendToServer({ type: \"machine:workspace:delete/result\", requestId, directoryName, ok: true });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"machine:workspace:delete/result\",\n        requestId,\n        directoryName,\n        ok: false,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async replyResetWorkspace(requestId: string, aiEmployeeId: string, config: AIEmployeeConfig): Promise<void> {\n    try {\n      await this.stopAIEmployee(aiEmployeeId, \"reset-workspace\");\n      this.memoryFingerprintCaches.delete(aiEmployeeId);\n      await this.destroySandboxContainerIfPresent(aiEmployeeId).catch((error) => {\n        this.log(`container cleanup before reset failed aiEmployee=${aiEmployeeId}: ${error instanceof Error ? error.message : String(error)}`);\n      });\n      const target = this.resolveWorkspaceDirectory(config, aiEmployeeId);\n      const takenAt = Date.now();\n      const { workspace, snapshotMessage, generationId } = await this.employeeFileMutex.withLock(aiEmployeeId, async () => {\n        const targetExists = existsSync(target);\n        if (targetExists) await this.reconcileRetroBeforeWorkspaceMutation(aiEmployeeId, target);\n        let snapshot = targetExists\n          ? await collectMemorySnapshot(target, undefined, { failOnUnsafeExistingPath: true })\n          : config.memoryRestore ?? [];\n        const initialLiveSnapshotIdentity = targetExists ? memorySnapshotIdentity(snapshot) : undefined;\n        let expectedFiles = validateMemorySnapshotFiles(snapshot);\n        const parent = path.dirname(target);\n        const basename = path.basename(target);\n        const temporary = path.join(parent, `.${basename}.reset-${randomUUID()}`);\n        const backup = path.join(parent, `.${basename}.backup-${randomUUID()}`);\n        const renameWorkspace = this.options.resetWorkspaceOperations?.rename ?? rename;\n        const removeWorkspace = this.options.resetWorkspaceOperations?.remove ?? rm;\n        let targetMoved = false;\n        let temporaryMoved = false;\n        let completed: {\n          workspace: AIEmployeeWorkspace;\n          snapshotMessage: Extract<DaemonToServerMessage, { type: \"ai_employee:memory_snapshot\" }>;\n          generationId: string;\n        } | undefined;\n        try {\n          const stagedWorkspace = await createAIEmployeeWorkspace({\n            rootDir: this.options.rootDir,\n            serverNamespace: config.serverNamespace,\n            serverId: config.spaceId,\n            machineDirectoryName: this.machineDirectoryName(config),\n            machineId: config.machineId,\n            aiEmployeeDirectoryName: this.aiEmployeeDirectoryName(config, aiEmployeeId),\n            daemonId: os.hostname() || \"local-daemon\",\n            aiEmployeeId,\n            aiEmployeeName: config.aiEmployeeName,\n            runtime: config.runtime,\n            sandboxMode: config.sandboxMode,\n            role: config.role,\n            aiEmployeeWorkContext: config.aiEmployeeWorkContext,\n            profileRevision: config.profileRevision,\n            systemPromptRevision: config.systemPromptRevision,\n            memoryRestore: snapshot,\n            profileApplyGeneration: config.profileApplyGeneration,\n            learningCandidateSnapshot: config.learningCandidateSnapshot,\n            stagingDirectory: temporary,\n            memoryRestoreHooks: this.options.resetWorkspaceOperations?.memoryRestoreHooks,\n          });\n          snapshot = await collectMemorySnapshot(\n            stagedWorkspace.aiEmployeeDir,\n            undefined,\n            { failOnUnsafeExistingPath: true },\n          );\n          expectedFiles = validateMemorySnapshotFiles(snapshot);\n          const generationId = `memory_generation_${createHash(\"sha256\").update(JSON.stringify({\n            requestId,\n            aiEmployeeId,\n            takenAt,\n            files: snapshot.map((file) => ({ path: file.path, hash: file.hash })),\n          })).digest(\"hex\")}`;\n          const snapshotMessage: Extract<DaemonToServerMessage, { type: \"ai_employee:memory_snapshot\" }> = {\n            type: \"ai_employee:memory_snapshot\",\n            generationId,\n            resetRequestId: requestId,\n            aiEmployeeId,\n            trigger: \"manual\",\n            takenAt,\n            files: snapshot,\n          };\n          assertMemorySnapshotMessageWithinLimit(snapshotMessage);\n          await this.verifyResetWorkspace(stagedWorkspace, expectedFiles, temporary);\n          if (targetExists) {\n            await renameWorkspace(target, backup);\n            targetMoved = true;\n            const frozenLiveSnapshot = await collectMemorySnapshot(backup, undefined, { failOnUnsafeExistingPath: true });\n            if (memorySnapshotIdentity(frozenLiveSnapshot) !== initialLiveSnapshotIdentity) {\n              throw new Error(\"live workspace memory changed during reset staging\");\n            }\n          }\n          await renameWorkspace(temporary, target);\n          temporaryMoved = true;\n          const workspace = rebaseAIEmployeeWorkspace(stagedWorkspace, target);\n          await this.verifyResetWorkspace(workspace, expectedFiles, temporary);\n          completed = { workspace, snapshotMessage, generationId };\n        } catch (error) {\n          if (temporaryMoved) await rm(target, { recursive: true, force: true }).catch(() => undefined);\n          if (targetMoved && existsSync(backup)) {\n            await renameWorkspace(backup, target).catch((rollbackError) => {\n              throw new Error(`reset workspace rollback failed: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`, { cause: error });\n            });\n          }\n          throw error;\n        } finally {\n          await rm(temporary, { recursive: true, force: true }).catch(() => undefined);\n          if (!existsSync(target) && existsSync(backup)) {\n            await renameWorkspace(backup, target).catch(() => undefined);\n          }\n        }\n        if (!completed) throw new Error(\"reset workspace did not complete\");\n        if (targetMoved) {\n          await removeWorkspace(backup, { recursive: true, force: true }).catch((error) => {\n            this.log(`reset workspace backup cleanup failed ai_employee=${aiEmployeeId} backup=${backup} error=${error instanceof Error ? error.message : String(error)}`);\n          });\n        }\n        return completed;\n      });\n      this.setIdleConfig(aiEmployeeId, { config, sessionId: config.sessionId, workspace });\n      this.options.sendToServer(snapshotMessage);\n      this.options.sendToServer({ type: \"ai_employee:reset-workspace/result\", requestId, aiEmployeeId, ok: true, memorySnapshotGenerationId: generationId });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:reset-workspace/result\",\n        requestId,\n        aiEmployeeId,\n        ok: false,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    } finally {\n      this.memoryFingerprintCaches.delete(aiEmployeeId);\n    }\n  }\n\n  private async verifyResetWorkspace(\n    workspace: AIEmployeeWorkspace,\n    expectedFiles: Array<{ path: string; content: string }>,\n    forbiddenPhysicalPath: string,\n  ): Promise<void> {\n    const actual = validateMemorySnapshotFiles(await collectMemorySnapshot(workspace.aiEmployeeDir));\n    const actualByPath = new Map(actual.map((file) => [file.path, file.content]));\n    for (const expected of expectedFiles) {\n      if (actualByPath.get(expected.path) !== expected.content) {\n        throw new Error(`reset workspace verification failed for ${expected.path}`);\n      }\n    }\n    for (const promptPath of [workspace.platformSystemPromptPath, workspace.systemPromptPath]) {\n      const content = await readFile(promptPath, \"utf8\");\n      if (content.includes(forbiddenPhysicalPath)) {\n        throw new Error(`reset workspace contains staging path: ${path.basename(promptPath)}`);\n      }\n    }\n  }\n\n  private async replyAgentDiagnostic(requestId: string, aiEmployeeId: string, config?: AIEmployeeConfig): Promise<void> {\n    try {\n      const snapshot = await this.buildAgentDiagnostic(aiEmployeeId, config);\n      this.options.sendToServer({ type: \"ai_employee:diagnostic/result\", requestId, aiEmployeeId, ok: true, snapshot });\n    } catch (error) {\n      this.options.sendToServer({\n        type: \"ai_employee:diagnostic/result\",\n        requestId,\n        aiEmployeeId,\n        ok: false,\n        snapshot: {\n          aiEmployeeId,\n          daemonState: \"offline\",\n          workspaceExists: false,\n          pendingInboxCount: this.queuedInboxCount(aiEmployeeId),\n        },\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  private async buildAgentDiagnostic(aiEmployeeId: string, config?: AIEmployeeConfig): Promise<AIEmployeeDiagnosticSnapshot> {\n    const entries = this.runningEntriesFor(aiEmployeeId);\n    const running = entries.find((entry) => entry.state !== \"idle\") ?? entries[0];\n    const idle = config ? this.idleConfigFor(aiEmployeeId, this.runtimeSessionScopeForConfig(config)) ?? this.firstIdleConfigForAIEmployee(aiEmployeeId) : this.firstIdleConfigForAIEmployee(aiEmployeeId);\n    const effectiveConfig = running?.config ?? idle?.config ?? config;\n    const executionBackend = this.executionBackendForConfig(effectiveConfig);\n    const workspace = running?.workspace ?? idle?.workspace;\n    const workspacePath = workspace?.aiEmployeeDir ?? (effectiveConfig ? this.resolveWorkspaceDirectory(effectiveConfig, aiEmployeeId) : undefined);\n    const workspaceExists = workspacePath ? await pathExists(workspacePath) : false;\n    return {\n      aiEmployeeId,\n      daemonState: this.isStartingFor(aiEmployeeId) ? \"starting\" : running ? running.state === \"idle\" ? \"idle\" : \"running\" : idle ? \"idle\" : \"offline\",\n      runtime: effectiveConfig?.runtime,\n      model: effectiveConfig?.model,\n      sessionId: running?.sessionId ?? idle?.sessionId ?? effectiveConfig?.sessionId,\n      runtime_session: workspace ? await readRuntimeSessionDiagnostic(workspace.runtimeSessionsDir) : undefined,\n      launchId: running?.launchId,\n      runtimePid: running?.adapter?.pid ?? this.firstFakeRuntimeChildFor(aiEmployeeId)?.pid,\n      executionBackend: executionBackend.kind,\n      containerName: executionBackend.kind === \"container\" ? containerNameForEmployee(aiEmployeeId) : undefined,\n      workspacePath,\n      workspaceExists,\n      pendingInboxCount: this.queuedInboxCount(aiEmployeeId),\n      lastActivity: this.lastActivities.get(aiEmployeeId),\n    };\n  }\n\n  private async scanWorkspaces(serverNamespace: string, machineId: string, machineName: string | undefined, knownAIEmployeeIds: Set<string>): Promise<MachineWorkspaceEntry[]> {\n    const machineRoot = this.resolveMachineRoot(machineName ?? machineId, machineId);\n    const names = await readdir(machineRoot, { withFileTypes: true }).catch((error) => {\n      if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n      throw error;\n    });\n    const entries: MachineWorkspaceEntry[] = [];\n    for (const entry of names) {\n      if (!entry.isDirectory() || !isSafeWorkspaceDirectoryName(entry.name)) continue;\n      const fullPath = this.resolveWorkspaceDirectoryName(machineName ?? machineId, machineId, entry.name);\n      const summary = await summarizeDirectory(fullPath);\n      const aiEmployeeId = aiEmployeeIdFromDirectoryName(entry.name, knownAIEmployeeIds);\n      entries.push({\n        directoryName: entry.name,\n        aiEmployeeId,\n        workspacePath: `~/.wm/${this.machineDirectoryNameForParts(machineName ?? machineId, machineId)}/${entry.name}/`,\n        knownToServer: knownAIEmployeeIds.has(aiEmployeeId),\n        running: this.hasRunningFor(aiEmployeeId) || this.isStartingFor(aiEmployeeId),\n        fileCount: summary.fileCount,\n        totalSizeBytes: summary.totalSizeBytes,\n        lastModified: summary.lastModified,\n      });\n    }\n    return entries.sort((a, b) => b.lastModified - a.lastModified || a.directoryName.localeCompare(b.directoryName));\n  }\n\n  private resolveMachineRoot(machineName: string, machineId: string): string {\n    const machineDirectoryName = this.machineDirectoryNameForParts(machineName, machineId);\n    if (!isSafeWorkspaceDirectoryName(machineDirectoryName)) throw new Error(\"unsafe machine directory\");\n    const resolved = path.resolve(this.options.rootDir, machineDirectoryName);\n    const base = path.resolve(this.options.rootDir);\n    if (resolved !== base && !resolved.startsWith(`${base}${path.sep}`)) throw new Error(\"workspace root escapes daemon root\");\n    return resolved;\n  }\n\n  private machineDirectoryName(config?: AIEmployeeConfig): string {\n    return this.machineDirectoryNameForParts(config?.machineName ?? this.options.machineDisplayName, config?.machineId ?? \"machine\");\n  }\n\n  private machineDirectoryNameForParts(machineName: string, machineId: string): string {\n    return namedWorkspaceDirectoryName(machineName, machineId, \"machine\");\n  }\n\n  private aiEmployeeDirectoryName(config: AIEmployeeConfig, aiEmployeeId: string): string {\n    return namedWorkspaceDirectoryName(config.aiEmployeeName, aiEmployeeId, \"ai-employee\");\n  }\n\n  private workspaceDisplayPath(config: AIEmployeeConfig, aiEmployeeId: string): string {\n    return `~/.wm/${this.machineDirectoryName(config)}/${this.aiEmployeeDirectoryName(config, aiEmployeeId)}/`;\n  }\n\n  private resolveWorkspaceDirectory(config: AIEmployeeConfig, aiEmployeeId: string): string {\n    return this.resolveWorkspaceDirectoryForParts(config.machineName ?? this.options.machineDisplayName, config.machineId, config.aiEmployeeName, aiEmployeeId);\n  }\n\n  private resolveWorkspaceDirectoryForParts(machineName: string, machineId: string, aiEmployeeName: string, aiEmployeeId: string): string {\n    const nextDirectoryName = namedWorkspaceDirectoryName(aiEmployeeName, aiEmployeeId, \"ai-employee\");\n    const next = this.resolveWorkspaceDirectoryName(machineName, machineId, nextDirectoryName);\n    if (existsSync(next)) return next;\n    const legacyDirectoryName = namedWorkspaceDirectoryName(aiEmployeeName, aiEmployeeId, \"agent\");\n    const legacy = this.resolveWorkspaceDirectoryName(machineName, machineId, legacyDirectoryName);\n    return existsSync(legacy) ? legacy : next;\n  }\n\n  private resolveWorkspaceDirectoryName(machineName: string, machineId: string, directoryName: string): string {\n    if (!isSafeWorkspaceDirectoryName(directoryName)) throw new Error(\"unsafe workspace directory name\");\n    const machineRoot = this.resolveMachineRoot(machineName, machineId);\n    const resolved = path.resolve(machineRoot, directoryName);\n    if (resolved !== machineRoot && !resolved.startsWith(`${machineRoot}${path.sep}`)) {\n      throw new Error(\"workspace directory escapes machine root\");\n    }\n    return resolved;\n  }\n\n  private log(line: string): void {\n    this.options.log?.(`[agent] ${line}`);\n  }\n\n  private async writeRunLog(\n    workspace: AIEmployeeWorkspace,\n    input: {\n      aiEmployeeId: string;\n      launchId?: string;\n      taskId?: string;\n      runtime: AIEmployeeRuntime;\n      runtimeSessionId?: string;\n      status: string;\n      finalMessage: string;\n      errorMessage?: string;\n      events: unknown[];\n    }\n  ): Promise<void> {\n    await mkdir(workspace.runsDir, { recursive: true });\n    const timestamp = new Date().toISOString();\n    const runPath = path.join(workspace.runsDir, `${timestamp.replace(/[:.]/g, \"-\")}.jsonl`);\n    const records = [\n      {\n        type: \"run\",\n        timestamp,\n        aiEmployeeId: input.aiEmployeeId,\n        launchId: input.launchId,\n        taskId: input.taskId,\n        runtime: input.runtime,\n        runtimeSessionId: input.runtimeSessionId,\n        status: input.status,\n        errorMessage: input.errorMessage,\n      },\n      ...input.events.map((event) => ({ type: \"runtime_event\", timestamp: Date.now(), event })),\n      {\n        type: \"final\",\n        timestamp: new Date().toISOString(),\n        status: input.status,\n        text: input.finalMessage,\n        errorMessage: input.errorMessage,\n      },\n    ];\n    await writeFile(runPath, records.map((record) => JSON.stringify(record)).join(\"\\n\") + \"\\n\", \"utf8\");\n  }\n}\n\nfunction normalizeCachedActivity(activity: AIEmployeeActivitySignal): AIEmployeeActivity {\n  if (activity === \"thinking\" || activity === \"working\") return activity;\n  return \"idle\";\n}\n\nfunction compact(text: string, maxLength = 120): string {\n  const value = text.replace(/\\s+/g, \" \").trim();\n  return value.length > maxLength ? `${value.slice(0, Math.max(0, maxLength - 3))}...` : value;\n}\n\nfunction classifyFatalRuntimeStderr(text: string): string | undefined {\n  const normalized = text.replace(/\\u001b\\[[0-9;]*m/g, \"\").trim();\n  if (!normalized) return undefined;\n  if (/Failed to refresh token/i.test(normalized)) return compact(normalized, 500);\n  if (/not logged in|login required|unauthenticated/i.test(normalized)) return compact(normalized, 500);\n  if (/responses_websocket: failed|codex_api::endpoint::responses_websocket/i.test(normalized)) return compact(normalized, 500);\n  if (/\\b(401|403)\\b/.test(normalized) && /auth|token|unauthor/i.test(normalized)) return compact(normalized, 500);\n  return undefined;\n}\n\nfunction summarizeBusinessRuntimeResult(events: unknown[]): string[] {\n  return events.flatMap((event) => summarizeBusinessRuntimeEvent(event));\n}\n\nfunction summarizeBusinessRuntimeEvent(event: unknown): string[] {\n  const type = objectValue(event)?.type;\n  if (type !== \"tool_result\") return [];\n  const output = runtimeToolOutput(event);\n  if (!output) return [];\n  const summaries: string[] = [];\n  const parsed = parseJsonFromOutput(output);\n  const messages = Array.isArray(parsed?.data?.messages) ? parsed.data.messages : undefined;\n  if (messages) {\n    summaries.push(`feishu_messages count=${messages.length}`);\n    for (const message of messages.slice(0, 8)) {\n      const item = objectValue(message);\n      if (!item) continue;\n      const sender = objectValue(item.sender);\n      const senderName = stringValue(sender?.name) ?? stringValue(sender?.sender_type) ?? stringValue(sender?.id) ?? \"unknown\";\n      const chat = stringValue(item.chat_name) ?? stringValue(item.chat_type) ?? stringValue(item.chat_id) ?? \"unknown\";\n      const messageId = stringValue(item.message_id) ?? \"unknown\";\n      const content = compact(stringValue(item.content) ?? \"\", 180);\n      summaries.push(`feishu_message id=${messageId} chat=${compact(chat, 60)} sender=${compact(senderName, 60)} text=${content || \"-\"}`);\n    }\n  }\n  const item = objectValue(parsed?.item);\n  if (item && stringValue(item.type) === \"feishu_draft\") {\n    const metadata = objectValue(item.metadata);\n    summaries.push([\n      `feishu_draft id=${stringValue(item.id) ?? \"unknown\"}`,\n      `status=${stringValue(item.status) ?? \"unknown\"}`,\n      `sender=${compact(stringValue(metadata?.sender_name) ?? stringValue(metadata?.sender_open_id) ?? \"unknown\", 60)}`,\n      `original=${compact(stringValue(metadata?.original_text) ?? \"\", 160) || \"-\"}`,\n      `draft=${compact(stringValue(metadata?.draft_text) ?? \"\", 220) || \"-\"}`,\n    ].join(\" \"));\n  } else if (/Feishu draft (created|sent|failed)/i.test(output)) {\n    summaries.push(compact(output, 220));\n  }\n  if (/Feishu send\\/reply is disabled/i.test(output)) {\n    summaries.push(\"feishu_send_blocked approval_required=true\");\n  }\n  return summaries;\n}\n\nfunction runtimeToolOutput(event: unknown): string | undefined {\n  const data = objectValue(objectValue(event)?.data);\n  const payload = objectValue(objectValue(data?.params)?.payload);\n  const returnValue = objectValue(payload?.return_value);\n  return stringValue(returnValue?.output) ?? stringValue(returnValue?.message);\n}\n\nfunction parseJsonFromOutput(output: string): any | undefined {\n  const start = output.indexOf(\"{\");\n  if (start < 0) return undefined;\n  try {\n    return JSON.parse(output.slice(start));\n  } catch {\n    return undefined;\n  }\n}\n\nfunction objectValue(value: unknown): Record<string, any> | undefined {\n  return value && typeof value === \"object\" ? value as Record<string, any> : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n  return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction codexPlatformReplyOutboxBody(value: unknown): Record<string, unknown> | undefined {\n  const body = objectValue(value);\n  if (!body || !stringValue(body.text)?.trim()) return undefined;\n  const target = stringValue(body.target);\n  if (body.target !== undefined && (!target || !isPlatformReplyTarget(target))) return undefined;\n  const kind = stringValue(body.kind);\n  if (body.kind !== undefined && !kind) return undefined;\n  if (body.attachment_ids !== undefined && (\n    !Array.isArray(body.attachment_ids)\n    || body.attachment_ids.some((item: unknown) => !stringValue(item)?.trim())\n  )) return undefined;\n  const idempotencyKey = stringValue(body.idempotency_key);\n  if (!idempotencyKey || !/^wm-reply-v1:[a-f0-9]{64}$/.test(idempotencyKey)) return undefined;\n  if (body.source_delivery_id !== undefined && !stringValue(body.source_delivery_id)?.trim()) return undefined;\n  if (body.evidence !== undefined && !objectValue(body.evidence)) return undefined;\n  return body;\n}\n\nfunction shellSingleQuote(value: string): string {\n  return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction exactReplyTarget(message: DeliveredMessage | undefined): string {\n  if (!message?.target) return \"#all\";\n  return message.target;\n}\n\nfunction threadTargetForMessage(message: DeliveredMessage | undefined): string | undefined {\n  if (!message?.target) return undefined;\n  if (message.target.includes(\":\")) return message.target;\n  if ((message.target.startsWith(\"#\") || message.target.startsWith(\"dm:@\")) && message.message_id) {\n    return `${message.target}:${message.message_id.slice(0, 8)}`;\n  }\n  return undefined;\n}\n\nfunction isPlatformReplyTarget(target: string | undefined): boolean {\n  return Boolean(target && (target.startsWith(\"#\") || target.startsWith(\"dm:@\")));\n}\n\nexport function codexPlatformReplyFallbackText(finalMessage: string, events: RuntimeEvent[]): string | undefined {\n  const attempts = events\n    .map(platformMessageSendAttempt)\n    .filter((attempt): attempt is PlatformMessageSendAttempt => Boolean(attempt));\n  const text = (\n    extractAttemptedPlatformReply(finalMessage)\n      ?? extractFailedPlatformSendText(attempts)\n      ?? finalMessage\n  ).trim();\n  if (!text) return undefined;\n  if (text === \"Startup complete\") return undefined;\n  if (attempts.some((attempt) => attempt.succeeded)) return undefined;\n  return text;\n}\n\nexport function codexPlatformReplyFallbackAttachmentIds(events: RuntimeEvent[]): string[] {\n  const ids = new Set<string>();\n  for (const event of events) {\n    const id = platformAttachmentUploadId(event);\n    if (id) ids.add(id);\n  }\n  return [...ids];\n}\n\nexport function codexPlatformReplyFallbackEvidence(message: DeliveredMessage): AnswerEvidenceLogPayload {\n  const messageId = message.message_id.trim();\n  const attachmentIds = (message.attachments ?? []).map((attachment) => attachment.id).filter(Boolean);\n  const sources: AnswerEvidenceLogPayload[\"authority\"][\"sources\"] = [];\n  if (messageId) {\n    sources.push({\n      type: \"local_message\",\n      pointer: `message:${messageId}`,\n      sensitivity: \"private_local\",\n      audience_summary: \"\u5F53\u524D\u4F1A\u8BDD\u4E2D\u7528\u6237\u63D0\u4F9B\u7684\u6D88\u606F\",\n    });\n  }\n  for (const attachmentId of attachmentIds) {\n    sources.push({\n      type: \"attachment\",\n      pointer: `attachment:${attachmentId}`,\n      sensitivity: \"private_local\",\n      audience_summary: \"\u5F53\u524D\u4F1A\u8BDD\u4E2D\u7528\u6237\u63D0\u4F9B\u7684\u9644\u4EF6\",\n    });\n  }\n  if (sources.length === 0) {\n    return {\n      authority: {\n        mode: \"missing_context\",\n        sources: [],\n        confidence: \"low\",\n        audience_safe_summary: \"\u5F53\u524D\u56DE\u5408\u6CA1\u6709\u53EF\u5173\u8054\u7684\u6765\u6E90\uFF0C\u9700\u8981\u8865\u5145\u4E0A\u4E0B\u6587\u3002\",\n      },\n      missing_context: [\"current_turn_source\"],\n      used_local_context: false,\n      used_user_token: false,\n    };\n  }\n  return {\n    authority: {\n      mode: \"agent_grounded\",\n      sources,\n      confidence: \"medium\",\n      audience_safe_summary: \"\u56DE\u7B54\u57FA\u4E8E\u5F53\u524D\u4F1A\u8BDD\u4E2D\u7528\u6237\u63D0\u4F9B\u7684\u4FE1\u606F\u3002\",\n    },\n    internal_evidence: {\n      current_message_id: messageId || undefined,\n      attachment_ids: attachmentIds,\n    },\n    used_local_context: false,\n    used_user_token: false,\n  };\n}\n\nexport function codexPlatformReplyIdempotencyKey(\n  message: DeliveredMessage,\n  target: string,\n  _text: string,\n  _attachmentIds: string[],\n  kind: string\n): string | undefined {\n  const messageId = message.message_id.trim();\n  if (!messageId) return undefined;\n  const digest = createHash(\"sha256\")\n    .update(JSON.stringify([messageId, target, kind || \"answer\"]))\n    .digest(\"hex\");\n  return `wm-reply-v1:${digest}`;\n}\n\ninterface PlatformMessageSendAttempt {\n  failed: boolean;\n  succeeded: boolean;\n  command?: string;\n}\n\nfunction platformMessageSendAttempt(event: RuntimeEvent): PlatformMessageSendAttempt | undefined {\n  const data = objectValue(event.data);\n  const item = objectValue(data?.item) ?? data;\n  const command = stringValue(item?.command) ?? stringValue(data?.command);\n  if (!command || !isPlatformMessageSendCommand(command)) return undefined;\n  const status = stringValue(item?.status) ?? stringValue(data?.status);\n  const exitCode = numberValue(item?.exitCode) ?? numberValue(item?.exit_code) ?? numberValue(data?.exitCode) ?? numberValue(data?.exit_code);\n  const output = stringValue(item?.aggregatedOutput) ?? stringValue(data?.aggregatedOutput) ?? stringValue(event.content);\n  const failed = status === \"failed\"\n    || status === \"error\"\n    || (typeof exitCode === \"number\" && exitCode !== 0)\n    || /fetch failed/i.test(output ?? \"\");\n  return {\n    failed,\n    succeeded: !failed && (status === \"completed\" || status === \"succeeded\" || status === \"success\" || exitCode === 0),\n    command,\n  };\n}\n\nfunction platformMessageSendSucceeded(event: RuntimeEvent): boolean {\n  return platformMessageSendAttempt(event)?.succeeded === true;\n}\n\nfunction feishuMessageSendSucceeded(event: RuntimeEvent): boolean {\n  const data = objectValue(event.data);\n  const item = objectValue(data?.item) ?? data;\n  const command = stringValue(item?.command) ?? stringValue(data?.command);\n  const output = stringValue(item?.aggregatedOutput)\n    ?? stringValue(data?.aggregatedOutput)\n    ?? stringValue(item?.output)\n    ?? stringValue(data?.output)\n    ?? stringValue(event.content);\n  const status = stringValue(item?.status) ?? stringValue(data?.status);\n  const exitCode = numberValue(item?.exitCode) ?? numberValue(item?.exit_code) ?? numberValue(data?.exitCode) ?? numberValue(data?.exit_code);\n  if (command && /(?:^|\\s|\\/)(?:\\.wm\\/lark-cli|lark-cli)\\s+im\\s+\\+(?:messages-reply|messages-send)\\b/.test(command)) {\n    return status === \"completed\" || status === \"succeeded\" || status === \"success\" || exitCode === 0;\n  }\n  return /Feishu draft sent|sent_message_id|message_id/i.test(output ?? \"\") && !/failed|error/i.test(output ?? \"\");\n}\n\nfunction platformAttachmentUploadId(event: RuntimeEvent): string | undefined {\n  const data = objectValue(event.data);\n  const item = objectValue(data?.item) ?? data;\n  const command = stringValue(item?.command) ?? stringValue(data?.command);\n  if (!command || !isPlatformAttachmentUploadCommand(command)) return undefined;\n  const output = stringValue(item?.aggregatedOutput)\n    ?? stringValue(data?.aggregatedOutput)\n    ?? stringValue(item?.output)\n    ?? stringValue(data?.output)\n    ?? stringValue(event.content);\n  const payload = output ? parseJsonFromOutput(output) : undefined;\n  const payloadId = stringValue(objectValue(payload?.attachment)?.id);\n  if (payloadId) return payloadId;\n  return output?.match(/\\b(att_[A-Za-z0-9_-]+)\\b/)?.[1];\n}\n\nfunction isPlatformMessageSendCommand(command: string): boolean {\n  return /(?:^|\\s|\\/)(?:\\.wm\\/wm|wm)\\s+message\\s+send\\b/.test(command);\n}\n\nfunction isPlatformAttachmentUploadCommand(command: string): boolean {\n  return /(?:^|\\s|\\/)(?:\\.wm\\/wm|wm)\\s+attachment\\s+upload\\b/.test(command);\n}\n\nfunction extractFailedPlatformSendText(attempts: PlatformMessageSendAttempt[]): string | undefined {\n  for (let index = attempts.length - 1; index >= 0; index--) {\n    const attempt = attempts[index];\n    if (!attempt.failed || !attempt.command) continue;\n    const text = extractMessageTextFromCommand(attempt.command);\n    if (text) return text;\n  }\n  return undefined;\n}\n\nfunction extractMessageTextFromCommand(command: string): string | undefined {\n  const textOption = extractCommandOptionValue(command, \"text\") ?? extractCommandOptionValue(command, \"content\");\n  if (textOption?.trim()) return textOption.trim();\n  const heredoc = command.match(/<<[^\\n]*EOF[^\\n]*\\n([\\s\\S]*?)\\nEOF['\"]?/);\n  return heredoc?.[1]?.trim() || undefined;\n}\n\nfunction extractCommandOptionValue(command: string, option: string): string | undefined {\n  const pattern = new RegExp(`(?:^|\\\\s)--${option}(?:=|\\\\s+)(?:\"([^\"]+)\"|'([^']+)'|([^\\\\s\"']+))`);\n  const match = command.match(pattern);\n  return match?.[1] ?? match?.[2] ?? match?.[3];\n}\n\nfunction extractAttemptedPlatformReply(finalMessage: string): string | undefined {\n  const backtick = finalMessage.match(/Attempted reply:\\s*`([^`]+)`/i)?.[1];\n  if (backtick?.trim()) return backtick.trim();\n  const english = finalMessage.match(/Attempted reply:\\s*([\\s\\S]+)$/i)?.[1];\n  if (english?.trim()) return stripCodeFence(english.trim());\n  const chinese = finalMessage.match(/(?:\u5C1D\u8BD5|\u8BA1\u5212)(?:\u53D1\u9001|\u56DE\u590D)(?:\u5185\u5BB9)?[\uFF1A:]\\s*([\\s\\S]+)$/)?.[1];\n  if (chinese?.trim()) return stripCodeFence(chinese.trim());\n  return undefined;\n}\n\nfunction stripCodeFence(text: string): string {\n  const fenced = text.match(/^```(?:\\w+)?\\n([\\s\\S]*?)\\n```$/);\n  return (fenced?.[1] ?? text).trim();\n}\n\nexport function feishuFallbackReplyTarget(message: DeliveredMessage): { messageId: string; as: \"bot\" | \"user\" } | undefined {\n  const metadata = objectValue(message.metadata);\n  const payload = firstPayloadObject(metadata?.routine_payload);\n  const source = stringValue(payload?.source) ?? stringValue(metadata?.routine_source);\n  if (source === \"feishu_ambient\") return undefined;\n  const messageId = stringValue(payload?.message_id) ?? stringValue(payload?.messageId);\n  if (!messageId) return undefined;\n  if (source === \"feishu_personal_agent\") return { messageId, as: \"user\" };\n  const isFeishuSource = source === \"feishu\"\n    || source === \"feishu_customer_service\"\n    || source === \"feishu_ai_employee\";\n  if (!isFeishuSource) return undefined;\n  if (!/Reply sink is direct_reply/.test(message.content ?? \"\")) return undefined;\n  return { messageId, as: \"bot\" };\n}\n\nfunction firstPayloadObject(payload: unknown): Record<string, unknown> | undefined {\n  if (Array.isArray(payload)) return objectValue(payload[0]);\n  return objectValue(payload);\n}\n\nexport function formatStartupPromptForTest(wrapperPath: string): string {\n  return formatStartupPrompt(wrapperPath);\n}\n\nfunction formatStartupPrompt(_wrapperPath: string): string {\n  return [\n    \"Start this platform-created agent session.\",\n    \"\",\n    \"This is an initialization turn only. There is no user channel message, no direct message, and no task to answer.\",\n    \"Do not inspect files, call tools, send platform messages, invent a channel target, or reply to #all.\",\n    \"Stop with exactly this short runtime final output: \\\"Startup complete\\\".\",\n  ].join(\"\\n\");\n}\n\nfunction formatActionableMessagePrompt(messages: DeliveredMessage[], wrapperPath: string, aiEmployeeId: string): string {\n  const first = messages[0];\n  const receivedTarget = first?.target ?? \"#all\";\n  const replyTarget = exactReplyTarget(first);\n  const threadTarget = threadTargetForMessage(first);\n  const wrapperCommand = \".wm/wm\";\n  const canSendPlatformReply = isPlatformReplyTarget(replyTarget);\n  const replyCommand = canSendPlatformReply\n    ? [\n      `${wrapperCommand} message send --target ${shellSingleQuote(replyTarget)} --kind answer <<'EOF'`,\n      \"your reply\",\n      \"EOF\",\n    ].join(\"\\n\")\n    : \"\";\n  return [\n    formatMessageBatchPrompt(messages, wrapperPath),\n    \"\",\n    `Received target: ${receivedTarget}`,\n    first?.message_id ? `Message ID: ${first.message_id}` : \"Message ID: unknown\",\n    `Reply target: ${replyTarget}`,\n    threadTarget && threadTarget !== replyTarget ? `Thread target for focused follow-up/collaboration: ${threadTarget}` : undefined,\n    \"\",\n    \"Before acting, identify the requested work surface: NiuMa platform, local workspace, or an external system. Use the tool for that surface.\",\n    \"Only handle the delivered message shown in this turn. Do not inspect or process pending delivery notes, queued messages, or other newly delivered messages unless this message explicitly asks you to review history.\",\n    \"Platform-agent collaboration rule: if this message asks you to ask, check, confirm, contact, or get status from another platform agent, do not inspect local process/workspace/server activity/task list to answer for them. Ask that agent with an @mention in the focused thread target when provided, wait for their platform reply, then summarize in the original reply target.\",\n    \"Use the focused thread target only for platform-agent collaboration. Do not use it for your own final reply to the human.\",\n    \"External-system rule: if the user names an external system such as Feishu/Lark, do the action through that external skill, CLI, token, or API, then report the result in the original reply target. Do not replace an external contact request with a platform mention.\",\n    canSendPlatformReply\n      ? [\n        \"Complete the requested work. When you have a channel-visible final reply, send it with this agent-local wrapper command:\",\n        replyCommand,\n        `If the short wrapper is unexpectedly unavailable, use this absolute fallback: ${wrapperPath}`,\n        \"For `dm:@...` targets, use the exact reply command above even if the target names your own agent id. Do not replace it with the sender name.\",\n        \"Do not rely on a global wm binary outside this workspace for platform replies. If the wrapper fails, report the exact failure in your runtime final output.\",\n        \"Do not rely on runtime final output as the platform reply.\",\n        \"If the user asks you to create, output, or send a file, first write the file inside your workspace, then upload it and send it as a platform attachment. Uploading alone is not visible to the user.\",\n        \"Use this exact file delivery sequence:\",\n        `${wrapperCommand} attachment upload --file <path> --json`,\n        `${wrapperCommand} message send --target ${shellSingleQuote(replyTarget)} --kind answer --attachment-ids <attachment_id> --text \"\u6587\u4EF6\u5DF2\u751F\u6210\"`,\n      ].join(\"\\n\")\n      : [\n        \"Complete the requested work for this internal system target. Do not call `wm message send` for this target because it is not a platform channel, DM, or thread.\",\n        \"Use the relevant external-system command or wm inbox command requested above, then stop with a concise runtime final output.\",\n      ].join(\"\\n\"),\n  ].join(\"\\n\");\n}\n\nfunction formatMessageBatchPrompt(messages: DeliveredMessage[], wrapperPath: string): string {\n  if (messages.length === 0) return \"\";\n  if (messages.length === 1) return formatDeliveredMessage(messages[0]);\n  const replyTarget = exactReplyTarget(messages[0]);\n  const threadTarget = threadTargetForMessage(messages[0]);\n  const replyCommand = [\n    `.wm/wm message send --target ${shellSingleQuote(replyTarget)} --kind answer <<'EOF'`,\n    \"your reply\",\n    \"EOF\",\n  ].join(\"\\n\");\n  return [\n    \"New platform messages were delivered while you were busy. Process each message below in order.\",\n    \"\",\n    messages.map((message) => formatDeliveredMessage(message)).join(\"\\n\\n---\\n\\n\"),\n    \"\",\n    \"Use the agent-local wm CLI wrapper for any channel-visible replies:\",\n    replyCommand,\n    \"\",\n    \"If a delivered message asks for a generated file, uploading the file alone is not enough. Send it with `wm message send --attachment-ids <attachment_id>` to make a download card appear in chat.\",\n    \"\",\n    threadTarget ? `Use thread target ${threadTarget} when the delivered message is part of, or should create, a thread.` : undefined,\n    \"\",\n    \"Complete all work that is now actionable before stopping.\",\n  ].filter((line): line is string => typeof line === \"string\").join(\"\\n\");\n}\n\nexport function buildAIEmployeeWorkContextMessage(config: Pick<AIEmployeeConfig, \"aiEmployeeWorkContext\">): string {\n  const context = config.aiEmployeeWorkContext;\n  if (!context) return \"\";\n  const lines: string[] = [\"AIEmployee work context (authoritative for this employee/agent).\"];\n  if (context.templateKey) lines.push(`Template key: ${context.templateKey}`);\n  if (context.role) lines.push(`Role: ${context.role}`);\n  if (context.instructions) lines.push(\"Instructions:\", compact(context.instructions, 1000));\n  if (context.workRules) lines.push(\"Work rules:\", compact(context.workRules, 1600));\n  if (context.tone) lines.push(`Tone: ${context.tone}`);\n  const safeTemplateConfig = redactTemplatePromptConfig(context.templateConfig);\n  if (Object.keys(safeTemplateConfig).length > 0) {\n    lines.push(\"Template config:\", compact(JSON.stringify(safeTemplateConfig), 1000));\n  }\n  lines.push(\"\", \"Rule-linked reference materials:\");\n  lines.push(\"The work rules are the source of truth for this AI employee. The daemon publishes rule-linked reference outputs as one generation selected only by `.wm/knowledge/current.json`.\");\n  lines.push(\"For reference-backed questions, run `wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md` once and use that validated single-generation bundle, then inspect the exact Feishu/Lark doc, wiki, drive folder, web URL, or local path only if still needed.\");\n  lines.push(\"For difference, comparison, identity, policy, model, or person questions, verify the exact requested names against the quick reference, the Known Exact Names section, or the original referenced material before answering. If one requested name is absent, say the configured material has no explicit entry for that name; do not compare it with the closest similar name. If a structured row maps aliases across regions, versions, departments, or document titles, include those explicit mapped names before explaining differences.\");\n  lines.push(\"If the rules include Feishu/Lark doc, wiki, or drive folder URLs, use available tools to read those materials when they are relevant to the task.\");\n  lines.push(\"For Feishu customer-service app resources, read rule-linked reference documents with user identity after authorization; keep bot identity for customer-message send/reply operations, for example:\");\n  lines.push(\"  .wm/lark-cli drive +inspect --as user --url <url_from_work_rules> --format json\");\n  lines.push(\"  .wm/lark-cli docs +fetch --api-version v2 --as user --doc <docx_url_or_token>\");\n  lines.push(\"If a rule-referenced material cannot be read, say that the referenced material read failed instead of presenting general knowledge as document-backed.\");\n  lines.push(\"During retro maintenance, `wm retro inputs --json` returns turn-scoped `memory_files`; edit only those staging paths. Formal memory is promoted only after `wm retro complete` succeeds.\");\n  lines.push(\"Do not look for a separate configured knowledge-source list; reference URLs belong in the work rules/prompt.\");\n  if (context.feishu) {\n    lines.push(\"\", \"Feishu context:\");\n    if (context.feishu.appDisplayName) lines.push(`App display name: ${context.feishu.appDisplayName}`);\n    if (context.feishu.replySink) lines.push(`Reply sink: ${context.feishu.replySink}`);\n    if (context.feishu.readiness) lines.push(`Readiness: ${JSON.stringify(context.feishu.readiness)}`);\n  }\n  return lines.join(\"\\n\");\n}\n\nfunction redactTemplatePromptConfig(value: unknown): Record<string, unknown> {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n  const output: Record<string, unknown> = {};\n  for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n    if (/secret|token|password|credential|key/i.test(key)) continue;\n    if (typeof item === \"string\" || typeof item === \"number\" || typeof item === \"boolean\") {\n      output[key] = item;\n    }\n  }\n  return output;\n}\n\nfunction dedupeDeliveredMessages(messages: DeliveredMessage[]): DeliveredMessage[] {\n  const seen = new Set<string>();\n  const deduped: DeliveredMessage[] = [];\n  for (const message of messages) {\n    const key = deliveredMessageKey(message);\n    if (seen.has(key)) continue;\n    seen.add(key);\n    deduped.push(message);\n  }\n  return deduped;\n}\n\nfunction deliveredMessageKey(message: DeliveredMessage): string {\n  if (message.message_id) return `id:${message.message_id}`;\n  return [\n    \"fingerprint\",\n    message.target,\n    message.timestamp,\n    message.sender_type,\n    message.sender_name,\n    String(message.seq),\n    message.content,\n  ].join(\"\\u001f\");\n}\n\nfunction queuedDeliveryMetadataKey(aiEmployeeId: string, message: DeliveredMessage): string {\n  return `${aiEmployeeId}\\u0000${deliveredMessageKey(message)}`;\n}\n\nfunction safePathSegment(value: string): string {\n  return (value || \"message\").replace(/[^a-zA-Z0-9._-]+/g, \"_\").slice(0, 80) || \"message\";\n}\n\nfunction safeAttachmentFilename(filename: string, attachmentId: string, index: number): string {\n  const base = path.basename(filename || attachmentId || `attachment-${index + 1}`);\n  const safe = base.replace(/[^\\p{L}\\p{N}._ -]+/gu, \"_\").replace(/^\\.+/, \"\").trim();\n  return safe || `attachment-${index + 1}`;\n}\n\ninterface RoutineWakeMetadata {\n  source?: unknown;\n  proxy?: unknown;\n}\n\n// \u6765\u6E90\u63A8\u5BFC\u7EDF\u4E00\u53E3\u5F84\uFF1A\u4F18\u5148 payload.source\uFF0C\u5176\u6B21 metadata.source\uFF0C\u6700\u540E\u56DE\u9000 routine \u6A21\u677F key\u3002\nfunction routineWakeSource(input: { routine: AIEmployeeRoutine; payload?: unknown; metadata?: Record<string, unknown> }): string {\n  const payload = input.payload && typeof input.payload === \"object\" && !Array.isArray(input.payload)\n    ? input.payload as Record<string, unknown>\n    : undefined;\n  const metadata = input.metadata as RoutineWakeMetadata | undefined;\n  if (typeof payload?.source === \"string\") return payload.source;\n  return typeof metadata?.source === \"string\" ? metadata.source : String(input.routine.template_key);\n}\n\n// \u5916\u90E8\u89E6\u53D1\u6309\u6765\u6E90\u4F1A\u8BDD\u62C6\u5206 runtime session scope\uFF1A\n// - \u98DE\u4E66\u5BA2\u670D\u6D88\u606F\u6309 chat_id \u62C6\u5206\uFF0C\u4E0D\u540C\u5BA2\u6237\u4F1A\u8BDD\u4E92\u4E0D\u4E32\u53F0\uFF1B\n// - \u5176\u4ED6 routine \u5524\u9192\u6309 routine id \u62C6\u5206\uFF0C\u4E0E server \u4E0B\u53D1\u7684 routine config scope \u5BF9\u9F50\u3002\nexport function routineWakeRuntimeSessionScope(input: {\n  routineId: string;\n  routine: AIEmployeeRoutine;\n  sessionKey: string;\n  payload: unknown;\n  metadata?: Record<string, unknown>;\n}): RuntimeSessionScope {\n  const source = routineWakeSource(input);\n  if (source === \"feishu_customer_service\" || source === \"feishu\" || source === \"feishu_personal_agent\" || source === \"feishu_ambient\") {\n    const payload = input.payload && typeof input.payload === \"object\" && !Array.isArray(input.payload)\n      ? input.payload as Record<string, unknown>\n      : undefined;\n    const chatId = typeof payload?.chat_id === \"string\" ? payload.chat_id.trim() : \"\";\n    return externalScope(\"feishu\", chatId || input.sessionKey);\n  }\n  return externalScope(\"routine\", input.routineId);\n}\n\nexport function buildRoutineWakeMessage(input: {\n  aiEmployeeId: string;\n  routineId: string;\n  routine: AIEmployeeRoutine;\n  sessionKey: string;\n  payload: unknown;\n  metadata?: Record<string, unknown>;\n  aiEmployeeWorkContext?: AIEmployeeWorkContext;\n}): DeliveredMessage {\n  if (input.routine.template_key === \"retro\") return buildRetroWakeMessage(input);\n  const metadata = input.metadata as RoutineWakeMetadata | undefined;\n  const source = routineWakeSource(input);\n  const replySink = input.routine.policy.reply_sink ?? \"inbox\";\n  const isFeishuPersonalAgent = source === \"feishu_personal_agent\";\n  const isFeishuAmbient = source === \"feishu_ambient\";\n  const isFeishuWebhookBot = !isFeishuPersonalAgent && !isFeishuAmbient && (\n    String(input.routine.template_key) === \"feishu_customer_service\" ||\n    String(input.routine.template_key) === \"feishu_ai_employee\" ||\n    source === \"feishu_customer_service\" ||\n    source === \"feishu_ai_employee\" ||\n    source === \"feishu\"\n  );\n  const payloadItems = Array.isArray(input.payload) ? input.payload : [];\n  const lines: string[] = [\n    \"Routine tick (daemon-curated).\",\n    `Routine ID: ${input.routineId}`,\n    `Routine name: ${input.routine.name}`,\n    `Routine template: ${input.routine.template_key}`,\n    `Owner human ID: ${input.routine.owner_human_id}`,\n    `Session key: ${input.sessionKey}`,\n    `Source: ${source}`,\n    \"\",\n    \"Routine goal:\",\n    compact(input.routine.instruction.goal, 500),\n    \"\",\n    \"Routine scope:\",\n    compact(input.routine.instruction.scope, 500),\n  ];\n  if (input.routine.instruction.handling_rules.length) {\n    lines.push(\"\", \"Handling rules:\");\n    for (const rule of input.routine.instruction.handling_rules) lines.push(`- ${rule}`);\n  }\n  if (input.routine.instruction.escalation_rules?.length) {\n    lines.push(\"\", \"Escalation rules:\");\n    for (const rule of input.routine.instruction.escalation_rules) lines.push(`- ${rule}`);\n  }\n  if (metadata?.proxy !== undefined) {\n    lines.push(\"\", \"Proxy configuration:\");\n    lines.push(JSON.stringify(metadata.proxy, null, 2));\n  }\n  lines.push(\"\", \"Candidate payload already filtered by daemon:\");\n  if (payloadItems.length) {\n    for (const item of payloadItems) lines.push(`- ${compact(JSON.stringify(item), 700)}`);\n  } else {\n    lines.push(compact(JSON.stringify(input.payload), 1000));\n  }\n  lines.push(\"\", \"Rules:\");\n  lines.push(\"1. Treat the candidate payload above as authoritative. Do not rerun broad Feishu message search for this tick.\");\n  lines.push(\"2. Use `.wm/lark-cli` for Feishu commands when Feishu access is needed; do not use a global or bare sending command.\");\n  if (isFeishuAmbient) {\n    lines.push(\"3. This is an ambient Feishu assistant trigger. You are observing recent messages after a silence window, not responding to a direct command.\");\n    lines.push(\"4. Default to silence. Normal chat, short acknowledgements, casual discussion, or context that does not clearly need the assistant MUST produce exactly `NO_REPLY` and MUST NOT call any send command.\");\n    lines.push(\"5. Only send a proactive response when the recent messages contain an explicit assistant request, a clear unresolved question/action item, or a risk/blocker where this employee has useful context. Do not summarize every quiet conversation.\");\n    lines.push(\"6. Use the payload's `recent_messages` as the primary chat ledger. If it is not enough, read nearby context with:\");\n    lines.push(\"   .wm/lark-cli im +chat-messages-list --as user --chat-id <chat_id> --order desc --page-size 50 --format json\");\n    lines.push(\"7. When a proactive response is clearly useful, send as the operator to the same chat exactly once using markdown. Include the payload's `feishu_activity_key`; the wrapper uses it to prevent cross-chat sends and strips it before calling Feishu:\");\n    lines.push(\"   WM_FEISHU_ALLOW_SEND=1 .wm/lark-cli im +messages-send --as user --chat-id <chat_id> --feishu-activity-key <feishu_activity_key> --format markdown --text <reply>\");\n    lines.push(\"8. Keep or update a short durable memory for this Feishu chat at `.wm/feishu-memory/<chat_id>.md` when you learn stable project context, decisions, owners, or recurring risks. Do not dump the whole chat history.\");\n    lines.push(\"9. Do not speak just to say you are monitoring. Do not expose internal message IDs, CLI commands, or logs to Feishu users.\");\n  } else if (isFeishuPersonalAgent) {\n    lines.push(\"3. This is a personal agent trigger \u2014 you are acting on behalf of the operator's own Feishu identity (user token). ALL Feishu reads and sends MUST use `--as user`. Never use `--as bot`.\");\n    lines.push(\"4. The trigger text in the payload starts with a command prefix (e.g. `/agent`). Strip that prefix to extract the actual instruction. Only the text after the prefix is the operator's intent.\");\n    lines.push(\"5. Use payload.recent_messages first. If more context is needed, read recent chat context with:\");\n    lines.push(\"   .wm/lark-cli im +chat-messages-list --as user --chat-id <chat_id> --order desc --page-size 50 --format json\");\n    lines.push(\"6. If the payload includes `local_image_path`, read that local image file before answering when the user's question depends on the image content. If only `image_key` is present or `image_download_error` is set, you may use `.wm/lark-cli im +messages-resources-download --as user` as a fallback, but do not ignore the image.\");\n    lines.push(\"7. If the payload includes `pre_fetched_docs`, use that daemon-prefetched content first. Only fetch the Feishu doc again when the prefetched content is missing, errored, or clearly insufficient.\");\n    lines.push(\"8. If work rules reference a Feishu doc or folder and no prefetched content is available, read it with user identity:\");\n    lines.push(\"   .wm/lark-cli docs +fetch --api-version v2 --as user --doc <docx_url_or_token>\");\n    lines.push(\"   .wm/lark-cli drive +inspect --as user --url <folder_url_or_token> --format json\");\n    lines.push(\"9. Reply as the operator (send_as_user) exactly once to the triggering message so Feishu shows it as a message reply. Include the payload's `feishu_activity_key`; the wrapper uses it to prevent stale-turn sends and strips it before calling Feishu:\");\n    lines.push(\"   WM_FEISHU_ALLOW_SEND=1 .wm/lark-cli im +messages-reply --as user --message-id <message_id> --feishu-activity-key <feishu_activity_key> --format markdown --text <reply>\");\n    lines.push(\"10. Do not add `--json` or output-format options to the send command.\");\n    lines.push(\"11. External chats are already filtered out before this trigger is delivered. Do not add your own external-chat check.\");\n    lines.push(\"12. If the instruction is unclear or cannot be completed, send a brief apology as user. Do not silently do nothing.\");\n  } else {\n    lines.push(\"3. If your work rules reference a Feishu doc, wiki, or folder, inspect and read it before drafting when the user question needs business knowledge. For Feishu customer-service app resources, read rule-linked reference documents with user identity after authorization:\");\n    lines.push(\"   .wm/lark-cli drive +inspect --as user --url <folder_url_or_token> --format json\");\n    lines.push(\"   printf '%s' '{\\\"folder_token\\\":\\\"<token>\\\",\\\"page_size\\\":20}' | .wm/lark-cli drive files list --as user --params - --format json\");\n    lines.push(\"   .wm/lark-cli docs +fetch --api-version v2 --as user --doc <docx_url_or_token>\");\n    lines.push(\"4. Track knowledge_access_status as used, unavailable, or skipped. If user access cannot read the referenced source, say so and do not invent knowledge-base facts.\");\n    if (replySink === \"direct_reply\") {\n      lines.push(\"5. Reply sink is direct_reply: send exactly one Feishu reply during this tick when a reply is needed.\");\n      lines.push(\"6. Send only through the controlled wrapper with the explicit gate; inbound business activity is server-owned, and the wrapper best-effort reports the send result after Feishu returns:\");\n      lines.push(isFeishuWebhookBot\n        ? \"   WM_FEISHU_ALLOW_SEND=1 .wm/lark-cli im +messages-reply --as bot --message-id <message_id> --feishu-activity-key <feishu_activity_key> --format markdown --text <reply>\"\n        : \"   WM_FEISHU_ALLOW_SEND=1 .wm/lark-cli im +messages-reply --message-id <message_id> --feishu-activity-key <feishu_activity_key> --format markdown --text <reply>\");\n      lines.push(\"7. Do not add `--json` or output-format options to the send command.\");\n      lines.push(\"8. Do not manually create or update Feishu inbox history after direct_reply; the `.wm/lark-cli` wrapper owns best-effort sent/failed bookkeeping.\");\n      lines.push(\"9. If sending fails, report the send error in the runtime final output. Do not create an open draft for a failed direct send, and never invent a sent_message_id.\");\n      lines.push(\"10. Do not use messages-send when a Feishu message_id is present.\");\n      lines.push(\"11. If no candidate truly needs a reply, do nothing.\");\n    } else {\n      lines.push(\"5. Reply sink is inbox: never send, reply, react, or mutate Feishu during this tick.\");\n      lines.push(\"6. Do not call `.wm/lark-cli im +messages-reply`, `.wm/lark-cli im +messages-send`, or `wm inbox feishu-draft sent/failed` during this tick.\");\n      lines.push(\"7. For each candidate that needs a human-visible reply, create exactly one platform inbox draft:\");\n      lines.push(\"   wm inbox feishu-draft create --routine-id <routine_id> --human-id <owner_human_id> --feishu-message-id <message_id> --chat-id <chat_id> --sender-name <name> --sender-open-id <open_id> --original-text <original_user_text> --draft-text <draft> --risk <knowledge_access_status and reason>\");\n      lines.push(\"8. Leave every reply draft open for human approval. A later approved inbox task will explicitly ask you to send exactly one draft.\");\n      lines.push(\"9. If no candidate truly needs a reply, do nothing.\");\n    }\n  }\n  return {\n    target: `routine:${input.routineId}`,\n    message_id: `routine-${input.routineId}-${Date.now()}`,\n    seq: Date.now(),\n    timestamp: new Date().toISOString(),\n    sender_type: \"human\",\n    sender_name: \"Routine\",\n    content: lines.join(\"\\n\"),\n    metadata: {\n      routine_id: input.routineId,\n      routine_source: source,\n      routine_payload: input.payload,\n    },\n  };\n}\n\nfunction buildRetroWakeMessage(input: {\n  aiEmployeeId: string;\n  routineId: string;\n  routine: AIEmployeeRoutine;\n  sessionKey: string;\n  payload: unknown;\n  metadata?: Record<string, unknown>;\n}): DeliveredMessage {\n  const lines = [\n    \"Retro maintenance turn (daemon-curated).\",\n    `Routine ID: ${input.routineId}`,\n    `Routine name: ${input.routine.name}`,\n    `Routine template: ${input.routine.template_key}`,\n    `Owner human ID: ${input.routine.owner_human_id}`,\n    `Session key: ${input.sessionKey}`,\n    \"Source: retro\",\n    \"\",\n    \"Maintenance goal:\",\n    compact(input.routine.instruction.goal, 700),\n    \"\",\n    \"Allowed work:\",\n    \"1. Read recent inputs with `wm retro inputs --json`. If `has_activity` is false, stop this maintenance turn without running `wm retro complete`. When active, use only the returned `memory_files` staging paths for all memory edits.\",\n    \"2. Review `facts/quick-reference.md`, `index.md`, `routing.md`, and `facts/reference-facts.md` through one `wm reference bundle --files facts/quick-reference.md,index.md,routing.md,facts/reference-facts.md` call before changing retrieval behavior.\",\n    \"3. For slow or repeatedly broad retrieval, update the returned `memory_files.slow_queries` staging file with the query, slow route, better route, and verification note.\",\n    \"4. For wrong or corrected answers, update the returned `memory_files.mistakes` staging file. Put structured learning candidates in a JSON array containing only `kind`, `statement`, and current-batch `source_refs`; do not write evidence prose because Server derives evidence from those refs.\",\n    \"4a. The legacy `memory_files.candidates` / `.wm/knowledge/facts/candidate-facts.md` path is staging-only working history, never an authoritative instruction source; Server-verified state is materialized separately in `.wm/learning/candidates.md`.\",\n    \"5. Update the returned `memory_files.lessons` staging file with stable, reusable lessons only after the pattern is clear.\",\n    \"6. Optionally write a detailed retro note under `notes/retro/`.\",\n    \"7. If a stable lesson suggests changing your\u5C97\u4F4D\u89C4\u5219, write a small JSON diff and run `wm profile propose --diff-file <path>` before completing the retro.\",\n    \"8. When `has_activity` is true, finish by running `wm retro complete --summary <summary> --lessons-added <n> --retro-note <path> [--candidates-file <json-path>]`. The wrapper automatically binds this maintenance message to the cached input batch; do not copy feedback IDs or period fields manually.\",\n    \"\",\n    \"Hard boundaries:\",\n    \"- Do not send platform, Feishu, email, or external messages.\",\n    \"- Do not process pending customer/user messages in this turn.\",\n    \"- Do not mutate business systems; this is memory maintenance only.\",\n  ];\n  return {\n    target: `routine:${input.routineId}`,\n    message_id: `routine-retro-${input.routineId}-${Date.now()}`,\n    seq: Date.now(),\n    timestamp: new Date().toISOString(),\n    sender_type: \"human\",\n    sender_name: \"Retro\",\n    content: lines.join(\"\\n\"),\n    metadata: {\n      routine_id: input.routineId,\n      routine_source: \"retro\",\n      routine_template_key: \"retro\",\n      maintenance: true,\n      routine_payload: input.payload,\n    },\n  };\n}\n\nfunction appendReferenceIndexPrepareEntry(entries: ActivityEntry[], workspace: AIEmployeeWorkspace): void {\n  const sourceCount = workspace.referenceIndex.sourceCount;\n  entries.push({\n    kind: \"status\",\n    text: \"\u53C2\u8003\u8D44\u6599\u7D22\u5F15\",\n    summary: sourceCount > 0 ? `\u5B8C\u6210\uFF08\u53D1\u73B0 ${sourceCount} \u4E2A\u8D44\u6599\u6E90\uFF0C\u5F85\u51ED\u8BC1\u5199\u5165\u540E\u751F\u6210\u5185\u5BB9\u7D22\u5F15\uFF09` : \"\u5B8C\u6210\uFF08\u672A\u53D1\u73B0\u8D44\u6599\u6E90\uFF09\",\n    timestamp: Date.now(),\n  });\n}\n\nfunction appendReferenceIndexMaterializeEntry(entries: ActivityEntry[], result: MaterializeReferenceIndexResult): void {\n  const hasFatalIndexFailure = result.status === \"stale\";\n  entries.push({\n    kind: hasFatalIndexFailure ? \"error\" : \"status\",\n    text: \"\u53C2\u8003\u8D44\u6599\u5185\u5BB9\u7D22\u5F15\",\n    summary: `\u5B8C\u6210\uFF08\u5DF2\u7D22\u5F15 ${result.indexedDocumentCount} \u7BC7\uFF0C\u8D44\u6599\u6E90\u5931\u8D25 ${result.failedSourceCount} \u4E2A\uFF0C\u6587\u6863\u5931\u8D25 ${result.failedDocumentCount} \u7BC7\uFF0C\u8DF3\u8FC7 ${result.skippedSourceCount} \u4E2A\u8D44\u6599\u6E90\uFF09`,\n    timestamp: Date.now(),\n    is_error: hasFatalIndexFailure,\n  });\n}\n\nfunction referenceIndexReadinessFromResult(result: MaterializeReferenceIndexResult): AIEmployeeReferenceIndexReadiness {\n  return {\n    materialized: result.status === \"fresh\" || result.status === \"degraded\",\n    status: result.status,\n    source_digest: result.sourceDigest,\n    generator_version: result.generatorVersion,\n    source_count: result.sourceCount,\n    indexed_document_count: result.indexedDocumentCount,\n    failed_source_count: result.failedSourceCount,\n    failed_document_count: result.failedDocumentCount,\n    skipped_source_count: result.skippedSourceCount,\n    stale_document_count: result.staleDocumentCount,\n    truncated_source_count: result.truncatedSourceCount,\n    updated_at: result.updatedAt,\n  };\n}\n\nfunction selectRuntimeModel(detection: RuntimeModelDetectionResult, requestedModel: string): RuntimeModelDescriptor | undefined {\n  if (detection.models.length === 0) {\n    if (requestedModel === \"default\") return undefined;\n    throw new Error(`unsupported model for ${detection.runtime}: ${requestedModel}`);\n  }\n  if (requestedModel === \"default\") {\n    return detection.models.find((model) => model.id === detection.defaultModel)\n      ?? detection.models.find((model) => model.default)\n      ?? detection.models[0];\n  }\n  const model = detection.models.find((candidate) => candidate.id === requestedModel);\n  if (!model) throw new Error(`unsupported model for ${detection.runtime}: ${requestedModel}`);\n  return model;\n}\n\nfunction runtimeProfileChanged(previous: AIEmployeeConfig, next: AIEmployeeConfig): boolean {\n  return previous.runtime !== next.runtime\n    || (previous.model ?? \"\") !== (next.model ?? \"\")\n    || (previous.reasoningEffort ?? \"default\") !== (next.reasoningEffort ?? \"default\")\n    || (previous.permissionMode ?? \"default\") !== (next.permissionMode ?? \"default\");\n}\n\nfunction escapeEnvValue(value: string): string {\n  return String(value).replace(/\\n/g, \"\\\\n\");\n}\n\nfunction fakeRuntimeDelayMs(): number {\n  const raw = Number(process.env.WM_DAEMON_FAKE_RUNTIME_DELAY_MS);\n  return Number.isFinite(raw) && raw >= 0 ? raw : 200;\n}\n\nasync function summarizeDirectory(root: string): Promise<{ fileCount: number; totalSizeBytes: number; lastModified: number }> {\n  let fileCount = 0;\n  let totalSizeBytes = 0;\n  let lastModified = 0;\n  const visit = async (dir: string): Promise<void> => {\n    const entries = await readdir(dir, { withFileTypes: true });\n    for (const entry of entries) {\n      const fullPath = path.join(dir, entry.name);\n      const info = await stat(fullPath);\n      lastModified = Math.max(lastModified, info.mtimeMs);\n      if (entry.isDirectory()) {\n        await visit(fullPath);\n      } else {\n        fileCount += 1;\n        totalSizeBytes += info.size;\n      }\n    }\n  };\n  const rootInfo = await stat(root);\n  lastModified = rootInfo.mtimeMs;\n  await visit(root);\n  return { fileCount, totalSizeBytes, lastModified };\n}\n\nfunction aiEmployeeIdFromDirectoryName(directoryName: string, knownAIEmployeeIds: Set<string>): string {\n  for (const aiEmployeeId of knownAIEmployeeIds) {\n    if (directoryName.endsWith(`-${aiEmployeeId}`)) return aiEmployeeId;\n  }\n  return directoryName;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n  try {\n    await stat(targetPath);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction waitForChild(child: ChildProcess, label: string): Promise<void> {\n  return new Promise((resolve, reject) => {\n    let stdout = \"\";\n    let stderr = \"\";\n    child.stdout?.setEncoding(\"utf8\");\n    child.stderr?.setEncoding(\"utf8\");\n    child.stdout?.on(\"data\", (chunk) => {\n      stdout += String(chunk);\n    });\n    child.stderr?.on(\"data\", (chunk) => {\n      stderr += String(chunk);\n    });\n    child.once(\"error\", reject);\n    child.once(\"exit\", (code, signal) => {\n      if (code === 0) {\n        resolve();\n        return;\n      }\n      const detail = [stderr.trim(), stdout.trim()].filter(Boolean).join(\"\\n\").slice(0, 2000);\n      reject(new Error(`${label} failed code=${code ?? \"-\"} signal=${signal ?? \"-\"}${detail ? `: ${detail}` : \"\"}`));\n    });\n  });\n}\n\nfunction waitForChildResult(child: ChildProcess, label: string, timeoutMs: number): Promise<{ code: number; stdout: string; stderr: string }> {\n  return new Promise((resolve) => {\n    let stdout = \"\";\n    let stderr = \"\";\n    let settled = false;\n    const finish = (code: number, signal?: NodeJS.Signals | null): void => {\n      if (settled) return;\n      settled = true;\n      clearTimeout(timer);\n      resolve({\n        code,\n        stdout,\n        stderr: signal ? `${stderr}\\n${label} stopped signal=${signal}`.trim() : stderr,\n      });\n    };\n    const timer = setTimeout(() => {\n      child.kill(\"SIGTERM\");\n      finish(124, null);\n    }, timeoutMs);\n    child.stdout?.setEncoding(\"utf8\");\n    child.stderr?.setEncoding(\"utf8\");\n    child.stdout?.on(\"data\", (chunk) => {\n      stdout += String(chunk);\n    });\n    child.stderr?.on(\"data\", (chunk) => {\n      stderr += String(chunk);\n    });\n    child.once(\"error\", (error) => {\n      stderr += error.message;\n      finish(127, null);\n    });\n    child.once(\"exit\", (code, signal) => finish(code ?? 1, signal));\n  });\n}\n\nfunction currentTurnContextFromDeliveredMessage(message: DeliveredMessage): Record<string, unknown> {\n  const content = message.content ?? \"\";\n  const routinePayload = firstPayloadObject(message.metadata?.routine_payload);\n  const attachments = (message.attachments ?? [])\n    .filter((attachment) => attachment.id && attachment.filename)\n    .map((attachment) => ({\n      id: attachment.id,\n      filename: attachment.filename,\n      mime_type: attachment.mime_type,\n      size: attachment.size,\n      local_path: attachment.local_path,\n      download_error: attachment.download_error,\n    }));\n  return {\n    message_id: message.message_id,\n    target: message.target,\n    seq: message.seq,\n    sender_name: message.sender_name,\n    sender_type: message.sender_type,\n    timestamp: message.timestamp,\n    routine_id: lineValue(content, \"Routine ID\"),\n    owner_human_id: lineValue(content, \"Owner human ID\"),\n    session_key: lineValue(content, \"Session key\"),\n    source: lineValue(content, \"Source\") || stringValue(routinePayload?.source),\n    feishu_activity_key: stringValue(routinePayload?.feishu_activity_key),\n    feishu_message_id: jsonStringValue(content, \"message_id\") || jsonStringValue(content, \"messageId\") || stringValue(routinePayload?.message_id) || stringValue(routinePayload?.messageId),\n    chat_id: jsonStringValue(content, \"chat_id\") || jsonStringValue(content, \"chatId\") || stringValue(routinePayload?.chat_id) || stringValue(routinePayload?.chatId),\n    chat_type: jsonStringValue(content, \"chat_type\") || jsonStringValue(content, \"chatType\") || stringValue(routinePayload?.chat_type) || stringValue(routinePayload?.chatType),\n    chat_name: stringValue(routinePayload?.chat_name) || stringValue(routinePayload?.chatName),\n    sender_open_id: jsonStringValue(content, \"open_id\") || jsonStringValue(content, \"openId\") || stringValue(routinePayload?.sender_open_id) || stringValue(routinePayload?.senderOpenId) || stringValue(routinePayload?.open_id) || stringValue(routinePayload?.openId),\n    original_text: jsonStringValue(content, \"text\") || stringValue(routinePayload?.text),\n    message_ids: Array.isArray(routinePayload?.message_ids) ? routinePayload.message_ids.map(String).filter(Boolean) : undefined,\n    recent_messages: Array.isArray(routinePayload?.recent_messages) ? routinePayload.recent_messages : undefined,\n    attachment_ids: attachments.map((attachment) => attachment.id),\n    attachments,\n  };\n}\n\nfunction lineValue(content: string, label: string): string | undefined {\n  const escaped = label.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n  const match = content.match(new RegExp(`^${escaped}:\\\\s*(.+)$`, \"m\"));\n  return match?.[1]?.trim() || undefined;\n}\n\nfunction jsonStringValue(content: string, key: string): string | undefined {\n  const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n  const match = content.match(new RegExp(`\"${escaped}\"\\\\s*:\\\\s*\"((?:\\\\\\\\.|[^\"\\\\\\\\])*)\"`, \"m\"));\n  if (!match?.[1]) return undefined;\n  try {\n    return JSON.parse(`\"${match[1]}\"`);\n  } catch {\n    return match[1];\n  }\n}\n\nfunction formatDurationForActivityEntry(value: number): string {\n  if (!Number.isFinite(value)) return \"-\";\n  if (value < 1000) return `${Math.max(0, Math.round(value))}ms`;\n  return `${(value / 1000).toFixed(1)}s`;\n}\n\nfunction combinedAbortSignal(...signals: Array<AbortSignal | undefined>): AbortSignal | undefined {\n  const active = signals.filter((signal): signal is AbortSignal => Boolean(signal));\n  if (active.length === 0) return undefined;\n  if (active.length === 1) return active[0];\n  return AbortSignal.any(active);\n}\n\nfunction waitForAbortableDelay(ms: number, ...signals: AbortSignal[]): Promise<boolean> {\n  if (signals.some((signal) => signal.aborted)) return Promise.resolve(false);\n  return new Promise((resolve) => {\n    let settled = false;\n    const finish = (completed: boolean) => {\n      if (settled) return;\n      settled = true;\n      clearTimeout(timer);\n      for (const signal of signals) signal.removeEventListener(\"abort\", onAbort);\n      resolve(completed);\n    };\n    const timer = setTimeout(() => finish(true), ms);\n    const onAbort = () => finish(false);\n    for (const signal of signals) signal.addEventListener(\"abort\", onAbort, { once: true });\n  });\n}\n\nfunction sleep(ms: number, abortSignal?: AbortSignal): Promise<void> {\n  if (abortSignal?.aborted) return Promise.reject(new Error(\"Runtime aborted\"));\n  return new Promise((resolve, reject) => {\n    const timer = setTimeout(resolve, ms);\n    const onAbort = () => {\n      clearTimeout(timer);\n      reject(new Error(\"Runtime aborted\"));\n    };\n    abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n  });\n}\n", "export type RuntimeId = \"codex\" | \"claude\" | \"kimi\" | \"antigravity\" | \"cursor\" | \"hermes\" | \"opencode\";\nexport type RuntimeKind = RuntimeId;\nexport type SpaceRole = \"owner\" | \"admin\" | \"member\";\nexport type MemberType = \"human\" | \"ai_employee\";\nexport type MessageAuthorType = MemberType | \"runtime_session\";\nexport type TaskStatus = \"todo\" | \"in_progress\" | \"in_review\" | \"done\" | \"cancelled\";\nexport type TaskSource = \"channel\" | \"feishu\";\nexport type TaskVisibility = \"visible\" | \"internal\";\nexport type AIEmployeeDaemonState =\n  | \"unavailable\"\n  | \"inactive\"\n  | \"initializing\"\n  | \"wakeable\"\n  | \"active\"\n  | \"applying_profile\"\n  | \"restarting_fresh\"\n  | \"profile_update_failed\";\nexport type AIEmployeeActivity = \"idle\" | \"working\" | \"thinking\";\nexport type AIEmployeeActivitySignal = AIEmployeeActivity | \"error\" | \"offline\" | \"unknown\";\n/** Server-owned authoritative runtime/provisioning lifecycle. See ai-employee-lifecycle.ts. */\nexport type AIEmployeeLifecycle =\n  | \"offline\"\n  | \"not_provisioned\"\n  | \"ready\"\n  | \"starting\"\n  | \"applying_profile\"\n  | \"restarting\"\n  | \"stopping\"\n  | \"active\"\n  | \"error\";\nexport type AIEmployeePermissionMode = \"default\" | \"full_access\";\nexport type MachineExecutionBackend = \"host\" | \"container\";\nexport type AIEmployeeSandboxMode = MachineExecutionBackend;\nexport type ChannelVisibility = \"public\" | \"private\";\nexport type MessageKind = \"human\" | \"ai_employee\" | \"runtime_session\" | \"system\";\nexport type RunStatus = \"running\" | \"completed\" | \"failed\";\n\nexport interface Envelope<TPayload = unknown> {\n  type: string;\n  payload: TPayload;\n  id?: string;\n  target_bridge_id?: string;\n}\n\nexport function makeEnvelope<TPayload>(type: string, payload: TPayload, id?: string): Envelope<TPayload> {\n  return id ? { type, payload, id } : { type, payload };\n}\n\nexport type ActivityEntryKind =\n  | \"text\"\n  | \"thinking\"\n  | \"prompt\"\n  | \"assistant\"\n  | \"tool_call\"\n  | \"tool_result\"\n  | \"bash_call\"\n  | \"bash_result\"\n  | \"tool_start\"\n  | \"tool_end\"\n  | \"compaction_started\"\n  | \"compaction_finished\"\n  | \"status\"\n  | \"error\";\n\nexport interface Space {\n  id: string;\n  name: string;\n  owner_user_id: string;\n  created_at: number;\n}\n\nexport interface HumanUser {\n  id: string;\n  name: string;\n  display_name?: string;\n  email: string;\n  created_at: number;\n}\n\nexport interface HumanFeishuBinding {\n  space_id: string;\n  human_id: string;\n  app_id: string;\n  app_display_name: string;\n  status: \"pending_oauth\" | \"active\" | \"error\";\n  has_user_token: boolean;\n  open_id?: string;\n  union_id?: string;\n  updated_at: number;\n}\n\nexport interface FeishuInvite {\n  id: string;\n  space_id: string;\n  inviter_human_id: string;\n  invitee_open_id: string;\n  invitee_name: string;\n  status: \"pending\" | \"accepted\" | \"expired\" | \"cancelled\";\n  expires_at: number;\n  accepted_by_user_id?: string;\n  created_at: number;\n  used_at?: number;\n}\n\nexport type HumanDelegationMedium = \"feishu\" | \"personal_agent\";\n\nexport interface HumanDelegation {\n  id: string;\n  space_id: string;\n  human_id: string;\n  medium: HumanDelegationMedium;\n  delegate_ai_employee_id: string;\n  enabled: boolean;\n  interval_seconds: number;\n  consecutive_failures: number;\n  last_wake_at?: number;\n  last_success_at?: number;\n  feishu_channel_id?: string;\n  created_at: number;\n  updated_at: number;\n}\n\nexport type EmployeeFeedbackSource =\n  | \"inbox_edit\"\n  | \"inbox_ignore\"\n  | \"task_return\"\n  | \"human_reaction\"\n  | \"human_correction\";\n\nexport type EmployeeFeedbackRefType = \"inbox\" | \"task\" | \"message\" | \"run\";\n\nexport interface EmployeeFeedback {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  source: EmployeeFeedbackSource;\n  ref_type: EmployeeFeedbackRefType;\n  ref_id: string;\n  original_text?: string;\n  final_text?: string;\n  created_by_user_id?: string;\n  metadata: Record<string, unknown>;\n  created_at: number;\n  consumed_by_retro_id?: string;\n}\n\nexport type RoutineStatus = \"draft\" | \"enabled\" | \"paused\" | \"error\" | \"needs_attention\" | \"archived\";\nexport type RoutineDaemonStatus = \"stopped\" | \"starting\" | \"running\" | \"error\";\nexport type RoutineTemplateKey = \"proxy_module\" | \"retro\";\n\nexport interface AIEmployeeRetro {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  maintenance_message_id?: string;\n  period_start: number;\n  period_end: number;\n  run_id?: string;\n  inputs_summary: Record<string, unknown>;\n  retro_note_path?: string;\n  lessons_added: number;\n  proposal_id?: string;\n  summary?: string;\n  created_at: number;\n}\n\nexport interface AIEmployeeRetroInputs {\n  batch_id: string;\n  period: { start: number; end: number };\n  has_activity: boolean;\n  runs: Array<Record<string, unknown>>;\n  feedback: EmployeeFeedback[];\n  lessons: string;\n}\n\nexport type AIEmployeeLearningCandidateKind = \"work_rule_add\";\nexport type AIEmployeeLearningCandidateStatus = \"pending\" | \"verified\" | \"rejected\" | \"proposal_pending\" | \"promoted\";\nexport type AIEmployeeLearningCandidateSourceRef = { type: \"activity\" | \"feedback\"; id: string };\n\nexport interface AIEmployeeLearningCandidateInput {\n  kind: AIEmployeeLearningCandidateKind;\n  statement: string;\n  source_refs: AIEmployeeLearningCandidateSourceRef[];\n}\n\nexport interface AIEmployeeLearningCandidateEvidence extends AIEmployeeLearningCandidateSourceRef {\n  text: string;\n}\n\nexport interface AIEmployeeLearningCandidate {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  retro_id: string;\n  batch_id: string;\n  kind: AIEmployeeLearningCandidateKind;\n  statement: string;\n  statement_hash: string;\n  source_refs: AIEmployeeLearningCandidateSourceRef[];\n  evidence: AIEmployeeLearningCandidateEvidence[];\n  status: AIEmployeeLearningCandidateStatus;\n  verified_by_user_id?: string;\n  verified_at?: number;\n  rejection_reason?: string;\n  proposal_id?: string;\n  promoted_generation?: number;\n  baseline_start?: number;\n  baseline_end?: number;\n  evaluation_start?: number;\n  evaluation_end?: number;\n  created_at: number;\n  updated_at: number;\n}\n\nexport interface AIEmployeeLearningCandidateSnapshot {\n  profile_apply_generation: number;\n  candidates: AIEmployeeLearningCandidate[];\n}\n\nexport interface AIEmployeeLearningCandidateEvaluationMetrics {\n  sample_count: number;\n  correction_rate?: number;\n  evidence_hit_rate?: number;\n  intervention_rate?: number;\n}\n\nexport interface AIEmployeeLearningCandidateEvaluation {\n  candidate_id: string;\n  as_of: number;\n  status: \"insufficient_data\" | \"ready\";\n  interpretation: \"correlation_not_causation\";\n  baseline: AIEmployeeLearningCandidateEvaluationMetrics;\n  followup: AIEmployeeLearningCandidateEvaluationMetrics;\n  delta?: {\n    correction_rate: number;\n    evidence_hit_rate: number;\n    intervention_rate: number;\n  };\n}\nexport type AIEmployeeTemplateKey = \"feishu_customer_service\" | \"feishu_ai_employee\" | \"personal_agent\";\nexport type AIEmployeeTemplateFieldControl = \"text\" | \"textarea\" | \"password\" | \"select\";\nexport type AIEmployeeTemplateFieldScope = \"standard\" | \"special\";\nexport type AIEmployeeTemplateSetupStep =\n  | \"runtime_prepare\"\n  | \"credential_check\"\n  | \"permission_inspector\"\n  | \"bot_capability\"\n  | \"platform_permissions\"\n  | \"business_permissions\"\n  | \"connection_check\"\n  | \"webhook\"\n  | \"user_auth\"\n  | \"human_binding_check\"\n  | \"runtime_ready\";\nexport type AIEmployeeTemplatePermissionGroupKey = \"inspector\" | \"bot_messaging\" | \"business_user_auth\";\nexport type AIEmployeeTemplateFieldConfigVisibility = \"visible\" | \"masked\" | \"hidden\";\n\nexport type AIEmployeeTone =\n  | \"professional_concise\"\n  | \"warm_patient\"\n  | \"rigorous_conservative\"\n  | \"lively_enthusiastic\";\n\nexport const AI_EMPLOYEE_TONE_LABELS: Record<AIEmployeeTone, string> = {\n  professional_concise: \"\u4E13\u4E1A\u7B80\u6D01\uFF1A\u5148\u7ED9\u76F4\u63A5\u7B54\u6848\uFF0C\u518D\u8865\u6761\u4EF6\u4E0E\u9002\u7528\u7248\u672C\uFF0C\u4E0D\u5806\u672F\u8BED\uFF0C\u7F3A\u4FE1\u606F\u5766\u8BDA\u8BF4\u660E\u3002\",\n  warm_patient: \"\u4EB2\u548C\u8010\u5FC3\uFF1A\u8BED\u6C14\u6E29\u548C\u3001\u5FAA\u5FAA\u5584\u8BF1\uFF0C\u7167\u987E\u4E0D\u719F\u6089\u4EA7\u54C1\u7684\u7528\u6237\u3002\",\n  rigorous_conservative: \"\u4E25\u8C28\u4FDD\u5B88\uFF1A\u53EA\u7528\u786E\u8BA4\u53E3\u5F84\uFF0C\u9047\u4E89\u8BAE\u5408\u89C4\u95EE\u9898\u8C28\u614E\u3001\u53EF\u8F6C\u4EBA\u5DE5\uFF0C\u4E0D\u505A\u63A8\u65AD\u3002\",\n  lively_enthusiastic: \"\u6D3B\u6CFC\u70ED\u60C5\uFF1A\u8BED\u6C14\u8F7B\u677E\u6709\u4EB2\u548C\u529B\uFF0C\u9002\u5408\u793E\u533A\u4E0E\u8425\u9500\u573A\u666F\u3002\",\n};\n\nexport function aiEmployeeToneLabel(tone: AIEmployeeTone): string {\n  return AI_EMPLOYEE_TONE_LABELS[tone];\n}\n\nexport interface AIEmployeeProfile {\n  role: string;\n  /** Canonical format: newline-separated work rules, one rule per non-empty line. */\n  work_rules: string;\n  tone: AIEmployeeTone;\n}\n\nexport type AIEmployeeProfileProposalStatus = \"pending\" | \"approved\" | \"rejected\";\nexport type AIEmployeeProfileProposalKind = \"work_rules_diff\";\n\nexport interface AIEmployeeProfileProposalDiffEntry {\n  op: \"add\" | \"remove\" | \"replace\";\n  before?: string;\n  after?: string;\n  reason: string;\n  evidence: string[];\n}\n\nexport interface AIEmployeeProfileProposal {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  retro_id?: string;\n  kind: AIEmployeeProfileProposalKind;\n  diff: AIEmployeeProfileProposalDiffEntry[];\n  status: AIEmployeeProfileProposalStatus;\n  summary?: string;\n  created_by_run_id?: string;\n  reviewed_by_user_id?: string;\n  rejection_reason?: string;\n  created_at: number;\n  updated_at: number;\n}\n\nexport interface AIEmployeeMemoryOverview {\n  snapshot?: {\n    id: string;\n    trigger: \"run_end\" | \"retro\" | \"manual\" | string;\n    machine_id?: string;\n    taken_at: number;\n    files: AIEmployeeMemorySnapshotFile[];\n  };\n  retros: AIEmployeeRetro[];\n  proposals: AIEmployeeProfileProposal[];\n  feedback: EmployeeFeedback[];\n}\n\nexport interface AIEmployeeToolPolicy {\n  lark: {\n    driveSearch: {\n      mode: \"work_rule_sources_only\" | \"unrestricted\";\n      allowedFolderTokens: string[];\n    };\n    imSend: {\n      mode: \"controlled_by_reply_sink\";\n    };\n  };\n  webSearch: {\n    mode: \"allowed_after_source_miss\" | \"disabled\";\n  };\n}\n\nexport interface AIEmployeeRuntimeReadiness {\n  skills_injected: boolean;\n  feishu_bound: boolean;\n  user_authorized?: boolean;\n  webhook_verified_at?: number;\n  runtime_prepare_version?: number;\n  reference_index?: AIEmployeeReferenceIndexReadiness;\n  runtime_prepare_entries?: ActivityEntry[];\n  last_checked?: number;\n  error?: string;\n  status?: AIEmployeeTemplateSetupStatus;\n  steps?: AIEmployeeTemplateSetupStepState[];\n}\n\nexport interface AIEmployeeReferenceIndexReadiness {\n  materialized: boolean;\n  status?: \"fresh\" | \"stale\" | \"degraded\";\n  source_digest?: string;\n  generator_version?: number;\n  source_count: number;\n  indexed_document_count: number;\n  failed_source_count: number;\n  failed_document_count: number;\n  skipped_source_count: number;\n  stale_document_count?: number;\n  truncated_source_count?: number;\n  updated_at?: string;\n}\n\nexport type ReferenceIndexPrepareMode = \"skip\" | \"if-stale\" | \"refresh\" | \"force\";\n\nexport type AIEmployeeTemplateSetupStatus = \"draft\" | \"checking\" | \"blocked\" | \"ready\" | \"error\";\nexport type AIEmployeeTemplateSetupStepStatus = \"pending\" | \"checking\" | \"passed\" | \"blocked\" | \"error\";\nexport type AIEmployeeTemplateSetupAction = \"open_permissions\" | \"recheck\" | \"start_user_auth\" | \"open_webhook_config\";\nexport type AIEmployeeTemplateSetupReasonCode =\n  | \"machine_offline\"\n  | \"runtime_prepare_failed\"\n  | \"tool_missing\"\n  | \"credential_invalid\"\n  | \"bot_capability_missing\"\n  | \"permissions_missing\"\n  | \"event_subscription_missing\"\n  | \"callback_unverified\"\n  | \"user_auth_required\"\n  | \"unknown\";\n\nexport interface AIEmployeeTemplateMissingPermission {\n  scope: string;\n  name?: string;\n  group: AIEmployeeTemplatePermissionGroupKey;\n  audit_required?: boolean;\n  publish_required?: boolean;\n}\n\nexport interface AIEmployeeTemplateSetupStepState {\n  id: AIEmployeeTemplateSetupStep;\n  status: AIEmployeeTemplateSetupStepStatus;\n  action?: AIEmployeeTemplateSetupAction;\n  reason_code?: AIEmployeeTemplateSetupReasonCode;\n  missing_permissions?: AIEmployeeTemplateMissingPermission[];\n  required_events?: string[];\n  callback_type?: string;\n  error?: string;\n  checked_at?: number;\n}\n\nexport interface AIEmployeeTemplateSetupState {\n  status: AIEmployeeTemplateSetupStatus;\n  steps: AIEmployeeTemplateSetupStepState[];\n}\n\nexport interface AIEmployeeTemplateFieldOption {\n  value: string;\n  label: string;\n  description?: string;\n}\n\nexport interface AIEmployeeTemplateField {\n  key: string;\n  scope: AIEmployeeTemplateFieldScope;\n  label: string;\n  description?: string;\n  control: AIEmployeeTemplateFieldControl;\n  required?: boolean;\n  defaultValue?: string;\n  options?: AIEmployeeTemplateFieldOption[];\n  secret?: boolean;\n  prompt?: boolean;\n  editable?: boolean;\n  configVisibility?: AIEmployeeTemplateFieldConfigVisibility;\n  presenceKey?: string;\n}\n\nexport interface AIEmployeeTemplatePermissionGroup {\n  label: string;\n  description?: string;\n  scopes: string[];\n}\n\nexport interface AIEmployeeTemplateDefinition {\n  key: AIEmployeeTemplateKey;\n  name: string;\n  description: string;\n  activitySourceLabel: string;\n  detailSectionLabel: string;\n  defaultSkills: string[];\n  setupSteps?: AIEmployeeTemplateSetupStep[];\n  permissionGroups?: Partial<Record<AIEmployeeTemplatePermissionGroupKey, AIEmployeeTemplatePermissionGroup>>;\n  defaultProfile: AIEmployeeProfile;\n  standardFields: AIEmployeeTemplateField[];\n  specialFields: AIEmployeeTemplateField[];\n  defaultToolPolicy?: AIEmployeeToolPolicy;\n  /**\n   * \u6C99\u7BB1\u7B56\u7565\uFF1A\n   * - optional: \u521B\u5EFA\u65F6\u7531\u7528\u6237\u9009\u62E9\u5BBF\u4E3B\u673A\u6216\u6C99\u7BB1\u3002\n   * - required: \u521B\u5EFA/\u8FD0\u884C\u90FD\u5FC5\u987B\u4F7F\u7528\u6C99\u7BB1\u3002\n   * - required_for_external: \u5E73\u53F0\u5185\u8BD5\u8FD0\u884C\u53EF\u9009\uFF0C\u8FDB\u5165\u5916\u90E8\u6E20\u9053\u524D\u5FC5\u987B\u5207\u5230\u6C99\u7BB1\u3002\n   */\n  sandboxPolicy?: \"optional\" | \"required\" | \"required_for_external\";\n  /** @deprecated Use sandboxPolicy. Kept for older Web/Server clients. */\n  requiresSandbox?: boolean;\n}\n\nexport type AIEmployeeEvidenceSource = \"message\" | \"attachment\" | \"tool\" | \"human_correction\" | \"manual\";\nexport type AIEmployeeEvidenceVisibility = \"internal\" | \"public_summary\";\nexport type AIEmployeeMessageKind = \"answer\" | \"question\" | \"status\" | \"system\";\nexport type AnswerAuthorityMode = \"agent_grounded\" | \"human_confirmed\" | \"missing_context\";\nexport type AnswerAuthoritySensitivity = \"public\" | \"internal\" | \"private_local\";\nexport type AnswerAuthorityConfidence = \"high\" | \"medium\" | \"low\";\n\nexport interface AnswerAuthoritySource {\n  type: string;\n  pointer: string;\n  hash?: string;\n  sensitivity: AnswerAuthoritySensitivity;\n  audience_summary: string;\n}\n\nexport interface AnswerAuthorityPublic {\n  mode: AnswerAuthorityMode;\n  sources: AnswerAuthoritySource[];\n  confidence: AnswerAuthorityConfidence;\n  audience_safe_summary: string;\n}\n\nexport interface AnswerEvidenceLogPayload {\n  authority: AnswerAuthorityPublic;\n  internal_evidence?: Record<string, unknown>;\n  missing_context?: unknown;\n  used_local_context?: boolean;\n  used_user_token?: boolean;\n}\n\nexport interface AIEmployeeEvidenceLog {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  source: AIEmployeeEvidenceSource;\n  ref_type?: EmployeeFeedbackRefType;\n  ref_id?: string;\n  summary: string;\n  visibility: AIEmployeeEvidenceVisibility;\n  run_id?: string;\n  message_id?: string;\n  authority_public?: AnswerAuthorityPublic;\n  internal_evidence?: Record<string, unknown>;\n  missing_context?: unknown;\n  used_local_context?: boolean;\n  used_user_token?: boolean;\n  created_by_user_id?: string;\n  created_at: number;\n}\n\nexport interface AIEmployeeGraduationReport {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  status: \"draft\" | \"passed\" | \"failed\";\n  questions_total: number;\n  questions_passed: number;\n  pass_rate: number;\n  passed?: boolean;\n  questions?: unknown[];\n  missing_context: string[];\n  summary?: string;\n  created_by_user_id?: string;\n  created_at: number;\n  updated_at: number;\n}\n\nexport interface AIEmployeeTemplateCatalogItem {\n  key: AIEmployeeTemplateKey;\n  name: string;\n  description: string;\n  activitySourceLabel: string;\n  detailSectionLabel: string;\n  defaultSkills: string[];\n  setupSteps?: AIEmployeeTemplateSetupStep[];\n  permissionGroups?: Partial<Record<AIEmployeeTemplatePermissionGroupKey, AIEmployeeTemplatePermissionGroup>>;\n  defaultProfile: AIEmployeeProfile;\n  standardFields: AIEmployeeTemplateField[];\n  specialFields: AIEmployeeTemplateField[];\n  sandboxPolicy?: AIEmployeeTemplateDefinition[\"sandboxPolicy\"];\n  /** @deprecated Use sandboxPolicy. */\n  requiresSandbox?: boolean;\n}\n\nexport interface AIEmployeeWorkContext {\n  templateKey?: AIEmployeeTemplateKey;\n  role?: string;\n  instructions?: string;\n  workRules?: string;\n  tone?: AIEmployeeTone;\n  templateConfig?: Record<string, unknown>;\n  feishu?: {\n    appDisplayName?: string;\n    replySink?: AIEmployeeFeishuCustomerServiceConfig[\"reply_sink\"];\n    readiness?: AIEmployeeRuntimeReadiness;\n  };\n  toolPolicy?: AIEmployeeToolPolicy;\n}\n\nconst toneOptions: AIEmployeeTemplateFieldOption[] = (Object.keys(AI_EMPLOYEE_TONE_LABELS) as AIEmployeeTone[]).map((tone) => {\n  const [label, description] = AI_EMPLOYEE_TONE_LABELS[tone].split(\"\uFF1A\");\n  return { value: tone, label, description };\n});\n\nconst feishuTemplateSpecialFields: AIEmployeeTemplateField[] = [\n  { key: \"feishu_app_id\", scope: \"special\", label: \"\u98DE\u4E66 App ID\", control: \"text\", required: true, editable: true },\n  { key: \"feishu_app_secret\", scope: \"special\", label: \"\u98DE\u4E66 App Secret\", control: \"password\", required: true, secret: true, editable: true, configVisibility: \"masked\", presenceKey: \"has_app_secret\" },\n  { key: \"reply_sink\", scope: \"special\", label: \"\u56DE\u590D\u65B9\u5F0F\", control: \"select\", required: true, defaultValue: \"direct_reply\", editable: true, options: [\n    { value: \"inbox\", label: \"\u8FDB\u5165\u6536\u4EF6\u7BB1\", description: \"\u751F\u6210\u8349\u7A3F\uFF0C\u7B49\u5F85\u4EBA\u5DE5\u786E\u8BA4\u540E\u53D1\u9001\u3002\" },\n    { value: \"direct_reply\", label: \"\u76F4\u63A5\u56DE\u590D\", description: \"AI\u5458\u5DE5\u81EA\u884C\u5411\u98DE\u4E66\u53D1\u9001\u56DE\u590D\u3002\" },\n  ] },\n  { key: \"app_display_name\", scope: \"special\", label: \"\u98DE\u4E66\u5E94\u7528\u540D\", control: \"text\", required: false, editable: true },\n  { key: \"webhook_url\", scope: \"special\", label: \"Webhook\", control: \"text\", required: false, editable: false, prompt: false, configVisibility: \"visible\" },\n];\n\n// feishu_ai_employee \u4E13\u5C5E\uFF1A\u56FA\u5B9A\u540C\u65F6\u652F\u6301 Webhook \u4E0E\u4E2A\u4EBA\u6307\u4EE4\u8F6E\u8BE2\u3002\nconst feishuAiEmployeePersonalAgentFields: AIEmployeeTemplateField[] = [\n  { key: \"feishu_ingestion_mode\", scope: \"special\", label: \"\u63A5\u5165\u65B9\u5F0F\", control: \"select\", required: false, defaultValue: \"webhook_and_polling\", editable: false, options: [\n    { value: \"webhook_and_polling\", label: \"Webhook + \u8F6E\u8BE2\u63A5\u5165\", description: \"\u98DE\u4E66\u4E8B\u4EF6\u901A\u8FC7 Webhook \u63A8\u9001\uFF1B\u89E6\u53D1\u8BCD\u6D88\u606F\u7531\u8F6E\u8BE2\u68C0\u6D4B\u3002\" },\n    { value: \"webhook_bot\", label: \"Webhook \u63A5\u5165\", description: \"\u98DE\u4E66\u628A\u4E8B\u4EF6\u63A8\u9001\u5230\u5E73\u53F0\uFF0C\u7531\u673A\u5668\u4EBA\u8EAB\u4EFD\u54CD\u5E94\u3002\" },\n    { value: \"personal_agent_polling\", label: \"\u8F6E\u8BE2\u63A5\u5165\", description: \"\u5E73\u53F0\u8F6E\u8BE2\u64CD\u4F5C\u4EBA\u7684\u4F1A\u8BDD\uFF0C\u5339\u914D\u89E6\u53D1\u524D\u7F00\u540E\u4EE5\u64CD\u4F5C\u4EBA\u8EAB\u4EFD\u8BFB\u53D6\u4E0A\u4E0B\u6587\u5E76\u56DE\u590D\u3002\" },\n  ] },\n];\n\nconst feishuPermissionGroups: Partial<Record<AIEmployeeTemplatePermissionGroupKey, AIEmployeeTemplatePermissionGroup>> = {\n  inspector: {\n    label: \"\u6743\u9650\u68C0\u67E5\u80FD\u529B\",\n    description: \"\u7528\u4E8E\u68C0\u67E5\u98DE\u4E66\u5E94\u7528\u7F3A\u54EA\u4E9B\u6743\u9650\uFF0C\u4E0D\u53C2\u4E0E\u4E1A\u52A1\u56DE\u590D\u3002\",\n    scopes: [\"admin:app.info:readonly\", \"application:application:self_manage\"],\n  },\n  business_user_auth: {\n    label: \"\u8D44\u6599\u8BFB\u53D6\u6743\u9650\",\n    description: \"\u7528\u4E8E\u5458\u5DE5\u8BFB\u53D6\u6388\u6743\u8303\u56F4\u5185\u7684\u98DE\u4E66\u6587\u6863\u3001\u77E5\u8BC6\u5E93\u4E0E\u641C\u7D22\u7ED3\u679C\u3002\",\n    scopes: [\n      \"offline_access\",\n      \"docx:document:readonly\",\n      \"space:document:retrieve\",\n      \"drive:drive:readonly\",\n      \"drive:drive.metadata:readonly\",\n      \"wiki:node:read\",\n      \"wiki:space:read\",\n      \"search:docs:read\",\n    ],\n  },\n  bot_messaging: {\n    label: \"\u6D88\u606F\u6536\u53D1\u6743\u9650\",\n    description: \"\u7528\u4E8E\u98DE\u4E66 AI\u5458\u5DE5\u4EE5\u673A\u5668\u4EBA\u8EAB\u4EFD\u63A5\u6536\u6D88\u606F\u548C\u56DE\u590D\u7528\u6237\u3002\",\n    scopes: [\n      \"im:message.p2p_msg:readonly\",\n      \"im:message.group_at_msg:readonly\",\n      \"im:message.group_at_msg.include_bot:readonly\",\n      \"im:message:send_as_bot\",\n    ],\n  },\n};\n\nexport const AI_EMPLOYEE_BASE_TEMPLATE = {\n  standardFields: [\n    { key: \"name\", scope: \"standard\", label: \"\u540D\u79F0\", control: \"text\", required: true, prompt: true, editable: true },\n    { key: \"role\", scope: \"standard\", label: \"\u5C97\u4F4D\u63CF\u8FF0\", control: \"textarea\", required: true, prompt: true, editable: true },\n    { key: \"work_rules\", scope: \"standard\", label: \"\u5C97\u4F4D\u89C4\u5219\", control: \"textarea\", required: true, prompt: true, editable: true },\n    { key: \"tone\", scope: \"standard\", label: \"\u8BED\u6C14\", control: \"select\", required: true, defaultValue: \"professional_concise\", options: toneOptions, prompt: true, editable: true },\n    { key: \"runtime\", scope: \"standard\", label: \"\u8FD0\u884C\u65F6\", control: \"select\", required: true, defaultValue: \"codex\", editable: true },\n    { key: \"model\", scope: \"standard\", label: \"\u6A21\u578B\", control: \"text\", required: false, editable: true },\n    { key: \"permission_mode\", scope: \"standard\", label: \"\u6743\u9650\", control: \"select\", required: true, defaultValue: \"default\", editable: true },\n  ] satisfies AIEmployeeTemplateField[],\n};\n\nexport const AI_EMPLOYEE_TEMPLATES: Record<AIEmployeeTemplateKey, AIEmployeeTemplateDefinition> = {\n  feishu_customer_service: {\n    key: \"feishu_customer_service\",\n    name: \"\u98DE\u4E66\u5BA2\u670D\",\n    description: \"\u5904\u7406\u98DE\u4E66\u673A\u5668\u4EBA\u79C1\u804A\u6D88\u606F\uFF0C\u6309\u5C97\u4F4D\u89C4\u5219\u81EA\u4E3B\u8BFB\u53D6\u89C4\u5219\u5185\u8D44\u6599\u5E76\u56DE\u590D\u6216\u751F\u6210\u8349\u7A3F\u3002\",\n    activitySourceLabel: \"\u98DE\u4E66\",\n    detailSectionLabel: \"\u98DE\u4E66\u914D\u7F6E\",\n    defaultSkills: [\"reference-index-builder\", \"lark-shared\", \"lark-im\", \"lark-wiki\", \"lark-doc\", \"lark-drive\", \"lark-sheets\"],\n    defaultToolPolicy: {\n      lark: {\n        driveSearch: {\n          mode: \"work_rule_sources_only\",\n          allowedFolderTokens: [],\n        },\n        imSend: {\n          mode: \"controlled_by_reply_sink\",\n        },\n      },\n      webSearch: {\n        mode: \"allowed_after_source_miss\",\n      },\n    },\n    setupSteps: [\"credential_check\", \"permission_inspector\", \"bot_capability\", \"platform_permissions\", \"connection_check\", \"user_auth\"],\n    sandboxPolicy: \"required\",\n    requiresSandbox: true,\n    permissionGroups: feishuPermissionGroups,\n    defaultProfile: {\n      role: \"\",\n      work_rules: \"\",\n      tone: \"professional_concise\",\n    },\n    standardFields: AI_EMPLOYEE_BASE_TEMPLATE.standardFields,\n    specialFields: feishuTemplateSpecialFields.map((field) => field.key === \"reply_sink\" ? { ...field, defaultValue: \"inbox\" } : field),\n  },\n  feishu_ai_employee: {\n    key: \"feishu_ai_employee\",\n    name: \"\u98DE\u4E66\u52A9\u7406\",\n    description: \"\u63A5\u5165\u98DE\u4E66\u673A\u5668\u4EBA\uFF0C\u5728\u98DE\u4E66\u7FA4\u804A\u3001\u8BDD\u9898\u548C\u79C1\u804A\u4E2D\u54CD\u5E94 @\u3001\u8BFB\u53D6\u5F53\u524D\u4E0A\u4E0B\u6587\u5E76\u534F\u52A9\u56E2\u961F\u5904\u7406\u5DE5\u4F5C\u3002\",\n    activitySourceLabel: \"\u98DE\u4E66\",\n    detailSectionLabel: \"\u98DE\u4E66\u914D\u7F6E\",\n    defaultSkills: [\"reference-index-builder\", \"lark-shared\", \"lark-im\", \"lark-wiki\", \"lark-doc\", \"lark-drive\", \"lark-sheets\"],\n    setupSteps: [\"credential_check\", \"permission_inspector\", \"bot_capability\", \"platform_permissions\", \"connection_check\", \"user_auth\"],\n    permissionGroups: feishuPermissionGroups,\n    sandboxPolicy: \"required\",\n    defaultProfile: {\n      role: \"\u98DE\u4E66\u52A9\u7406 / \u56E2\u961F\u534F\u4F5C\u52A9\u624B\u3002\u9762\u5411\u5185\u90E8\u56E2\u961F\u5728\u98DE\u4E66\u7FA4\u804A\u3001\u8BDD\u9898\u548C\u79C1\u804A\u4E2D\u534F\u52A9\u5904\u7406\u5DE5\u4F5C\uFF0C\u5305\u62EC\u9605\u8BFB\u5F53\u524D\u6D88\u606F\u4E0A\u4E0B\u6587\u3001\u603B\u7ED3\u8BA8\u8BBA\u7ED3\u8BBA\u3001\u6574\u7406\u5F85\u529E\u3001\u5206\u6790\u95EE\u9898\u3001\u67E5\u627E\u8D44\u6599\u3001\u8DDF\u8FDB\u4E8B\u9879\u3001\u751F\u6210\u56DE\u590D\u548C\u6267\u884C\u5E73\u53F0\u5141\u8BB8\u7684\u4EFB\u52A1\u3002\",\n      work_rules: [\n        \"\u5DE5\u4F5C\u4E0A\u4E0B\u6587\uFF1A\u4F60\u4F1A\u6536\u5230\u98DE\u4E66\u7FA4\u804A\u3001\u8BDD\u9898\u3001\u79C1\u804A\u6216\u5E73\u53F0\u8F6C\u4EA4\u7684\u6D88\u606F\uFF0C\u6D88\u606F\u53EF\u80FD\u5305\u542B\u5F53\u524D\u4F1A\u8BDD\u3001thread\u3001\u9644\u4EF6\u548C\u76F8\u5173\u4E0A\u4E0B\u6587\u3002\",\n        \"\u534F\u4F5C\u65B9\u5F0F\uFF1A\u56F4\u7ED5\u5F53\u524D\u4F1A\u8BDD\u5E2E\u52A9\u56E2\u961F\u603B\u7ED3\u3001\u5206\u6790\u3001\u6574\u7406\u5F85\u529E\u3001\u67E5\u627E\u8D44\u6599\u3001\u751F\u6210\u56DE\u590D\u548C\u8DDF\u8FDB\u4E8B\u9879\uFF1B\u7F3A\u5C11\u4E0A\u4E0B\u6587\u3001\u6743\u9650\u6216\u8D44\u6599\u65F6\uFF0C\u8BF4\u660E\u9700\u8981\u4EC0\u4E48\u3002\",\n        \"\u8F93\u51FA\u8FB9\u754C\uFF1A\u56DE\u590D\u7ED9\u5F53\u524D\u98DE\u4E66\u4F1A\u8BDD\uFF0C\u4FDD\u6301\u7B80\u6D01\u3001\u660E\u786E\u3001\u53EF\u6267\u884C\uFF1B\u4E0D\u66B4\u9732\u5185\u90E8\u5DE5\u5177\u3001\u8FD0\u884C\u65E5\u5FD7\u3001\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3001token\u3001\u5BC6\u94A5\u6216\u5E73\u53F0\u5B9E\u73B0\u7EC6\u8282\u3002\",\n      ].join(\"\\n\"),\n      tone: \"professional_concise\",\n    },\n    requiresSandbox: true,\n    standardFields: AI_EMPLOYEE_BASE_TEMPLATE.standardFields,\n    specialFields: [...feishuTemplateSpecialFields, ...feishuAiEmployeePersonalAgentFields],\n  },\n  personal_agent: {\n    key: \"personal_agent\",\n    name: \"\u4E2A\u4EBA\u5206\u8EAB\",\n    description: \"\u4EE3\u8868\u4E00\u4E2A\u4EBA\u5148\u5728\u5E73\u53F0\u5185\u8BD5\u8FD0\u884C\uFF0C\u5B66\u4E60\u5176\u8868\u8FBE\u3001\u5224\u65AD\u548C\u56DE\u590D\u8FB9\u754C\uFF0C\u901A\u8FC7\u9A8C\u6536\u540E\u518D\u8FDB\u5165\u5916\u90E8\u6E20\u9053\u3002\",\n    activitySourceLabel: \"\u5E73\u53F0\",\n    detailSectionLabel: \"\u5206\u8EAB\u914D\u7F6E\",\n    defaultSkills: [\"wm-platform\", \"wm-routine\"],\n    setupSteps: [],\n    sandboxPolicy: \"required_for_external\",\n    defaultProfile: {\n      role: \"\u4E2A\u4EBA\u5206\u8EAB\u5458\u5DE5\u3002\u4EE3\u8868\u7ED1\u5B9A\u7684\u4EBA\u7C7B\u6210\u5458\u5728\u5E73\u53F0\u5185\u6574\u7406\u4FE1\u606F\u3001\u8D77\u8349\u56DE\u590D\u3001\u8BB0\u5F55\u8BC1\u636E\u548C\u603B\u7ED3\u4E0A\u4E0B\u6587\uFF1B\u4E0A\u7EBF\u524D\u53EA\u80FD\u8BD5\u8FD0\u884C\uFF0C\u4E0D\u4E3B\u52A8\u5BF9\u5916\u53D1\u9001\u3002\",\n      work_rules: [\n        \"\u8BD5\u8FD0\u884C\u9636\u6BB5\u53EA\u80FD\u5728\u5E73\u53F0\u5185\u56DE\u590D\u6216\u751F\u6210\u8349\u7A3F\uFF0C\u4E0D\u80FD\u5192\u5145\u7ED1\u5B9A\u4EBA\u76F4\u63A5\u5BF9\u5916\u53D1\u9001\u3002\",\n        \"\u56DE\u7B54\u5FC5\u987B\u4FDD\u7559\u4F9D\u636E\uFF1A\u7528\u5DF2\u77E5\u6D88\u606F\u3001\u9644\u4EF6\u3001\u4EBA\u5DE5\u7EA0\u6B63\u548C\u5C97\u4F4D\u914D\u7F6E\u4F5C\u4E3A\u8BC1\u636E\uFF1B\u7F3A\u5C11\u4F9D\u636E\u65F6\u8BF4\u660E\u9700\u8981\u8865\u5145\u4EC0\u4E48\u3002\",\n        \"\u9047\u5230\u4EBA\u5DE5\u7EA0\u6B63\u65F6\uFF0C\u5C06\u7EA0\u6B63\u5199\u5165\u8BC1\u636E\u548C\u540E\u7EED\u884C\u4E3A\u8FB9\u754C\uFF1B\u4E0D\u8981\u91CD\u590D\u5DF2\u7ECF\u88AB\u7EA0\u6B63\u7684\u8BF4\u6CD5\u3002\",\n        \"\u8FDB\u5165\u6B63\u5F0F\u5BF9\u5916\u524D\u5FC5\u987B\u901A\u8FC7\u6BD5\u4E1A\u81EA\u6D4B\uFF0C\u786E\u8BA4\u5E38\u89C1\u95EE\u9898\u3001\u62D2\u7B54\u8FB9\u754C\u548C\u4E0A\u4E0B\u6587\u4E0D\u8DB3\u5904\u7406\u90FD\u7A33\u5B9A\u3002\",\n      ].join(\"\\n\"),\n      tone: \"professional_concise\",\n    },\n    standardFields: AI_EMPLOYEE_BASE_TEMPLATE.standardFields,\n    specialFields: [],\n  },\n};\n\nexport const AI_EMPLOYEE_TEMPLATE_SKILLS: Record<AIEmployeeTemplateKey, string[]> = {\n  feishu_customer_service: AI_EMPLOYEE_TEMPLATES.feishu_customer_service.defaultSkills,\n  feishu_ai_employee: AI_EMPLOYEE_TEMPLATES.feishu_ai_employee.defaultSkills,\n  personal_agent: AI_EMPLOYEE_TEMPLATES.personal_agent.defaultSkills,\n};\n\nexport type FeishuIntegratedAIEmployeeTemplateKey = Extract<AIEmployeeTemplateKey, \"feishu_customer_service\" | \"feishu_ai_employee\">;\n\nexport function isFeishuIntegratedAIEmployeeTemplateKey(value: unknown): value is FeishuIntegratedAIEmployeeTemplateKey {\n  return value === \"feishu_customer_service\" || value === \"feishu_ai_employee\";\n}\n\nexport function isAIEmployeeTemplateKey(value: unknown): value is AIEmployeeTemplateKey {\n  return typeof value === \"string\" && value in AI_EMPLOYEE_TEMPLATES;\n}\n\nexport function getPublicAIEmployeeTemplateCatalog(): AIEmployeeTemplateCatalogItem[] {\n  return (Object.keys(AI_EMPLOYEE_TEMPLATES) as AIEmployeeTemplateKey[]).map((key) => {\n    const template = AI_EMPLOYEE_TEMPLATES[key];\n    return {\n      key: template.key,\n      name: template.name,\n      description: template.description,\n      activitySourceLabel: template.activitySourceLabel,\n      detailSectionLabel: template.detailSectionLabel,\n      defaultSkills: [...template.defaultSkills],\n      setupSteps: template.setupSteps ? [...template.setupSteps] : undefined,\n      permissionGroups: cloneTemplatePermissionGroups(template.permissionGroups),\n      sandboxPolicy: template.sandboxPolicy ?? (template.requiresSandbox ? \"required\" : \"optional\"),\n      requiresSandbox: template.requiresSandbox,\n      defaultProfile: template.defaultProfile,\n      standardFields: template.standardFields.map(publicTemplateField).filter(Boolean) as AIEmployeeTemplateField[],\n      specialFields: template.specialFields.map(publicTemplateField).filter(Boolean) as AIEmployeeTemplateField[],\n    };\n  });\n}\n\nfunction cloneTemplatePermissionGroups(\n  groups: AIEmployeeTemplateDefinition[\"permissionGroups\"]\n): AIEmployeeTemplateCatalogItem[\"permissionGroups\"] {\n  if (!groups) return undefined;\n  const next: AIEmployeeTemplateCatalogItem[\"permissionGroups\"] = {};\n  for (const key of Object.keys(groups) as AIEmployeeTemplatePermissionGroupKey[]) {\n    const group = groups[key];\n    if (!group) continue;\n    next[key] = { ...group, scopes: [...group.scopes] };\n  }\n  return next;\n}\n\nfunction publicTemplateField(field: AIEmployeeTemplateField): AIEmployeeTemplateField | undefined {\n  if (field.configVisibility === \"hidden\") return undefined;\n  const { secret: _secret, ...safe } = field;\n  return {\n    ...safe,\n    configVisibility: field.configVisibility ?? (field.secret ? \"masked\" : \"visible\"),\n    options: field.options ? field.options.map((option) => ({ ...option })) : undefined,\n  };\n}\n\nexport function defaultAIEmployeeProfile(template: AIEmployeeTemplateKey): AIEmployeeProfile {\n  if (template in AI_EMPLOYEE_TEMPLATES) return AI_EMPLOYEE_TEMPLATES[template].defaultProfile;\n  return { role: \"\", work_rules: \"\", tone: \"professional_concise\" };\n}\n\nexport type AIEmployeeBusinessStatus =\n  | \"draft\"\n  | \"trial\"\n  | \"shadow\"\n  | \"online\"\n  | \"paused\"\n  | \"needs_attention\"\n  | \"retired\";\nexport type RoutineTriggerKind = \"schedule\" | \"event\";\nexport type RoutinePrimitiveName = \"http_request\" | \"filter\" | \"dedupe\" | \"foreach\" | \"wake_agent\";\nexport type RoutineOutcome = \"success\" | \"failure\" | \"partial\";\n\nexport type AIEmployeeMessageMode =\n  | { type: \"normal\" };\n\nexport interface RoutineTrigger {\n  kind: RoutineTriggerKind;\n  interval_seconds?: number;\n  lookback_seconds?: number;\n}\n\nexport interface RoutineAuthRef {\n  ref: string;\n}\n\nexport interface RoutineStep {\n  id: string;\n  primitive: RoutinePrimitiveName;\n  input: unknown;\n  do?: RoutineStep[];\n  on_error?: { match: string; action: \"skip\" | \"fail\" };\n}\n\nexport interface RoutineSpec {\n  trigger: RoutineTrigger;\n  auth?: RoutineAuthRef;\n  steps: RoutineStep[];\n  on_error?: Array<{ match: string; action: \"skip\" | \"fail\" }>;\n}\n\nexport type ProxyModuleTrigger =\n  | { type: \"interval\"; interval_seconds: number }\n  | { type: \"event\" };\n\nexport interface ProxyModuleSpec {\n  kind: \"proxy_module\";\n  version: 1;\n  name: string;\n  description: string;\n  trigger: ProxyModuleTrigger;\n}\n\nexport interface ProxyModuleTriggerEvent {\n  kind: \"interval\" | \"event\";\n  received_at: number;\n  headers?: Record<string, string>;\n  body?: unknown;\n}\n\nexport interface RoutineInstruction {\n  goal: string;\n  scope: string;\n  handling_rules: string[];\n  escalation_rules?: string[];\n}\n\nexport interface RoutinePolicy {\n  action_mode: \"draft_only\" | \"auto_low_risk\" | \"manual_only\";\n  approval_required_for: string[];\n  forbidden_actions: string[];\n  max_runs_per_hour?: number;\n  max_items_per_run?: number;\n  max_thread_turns?: number;\n  dedupe_key?: string;\n  reply_sink?: \"inbox\" | \"direct_reply\";\n}\n\nexport interface RoutineState {\n  last_run_at?: number;\n  last_success_at?: number;\n  last_error?: string | null;\n  consecutive_failures?: number;\n  module_path?: string;\n  contract?: Record<string, unknown>;\n  verify?: Record<string, unknown>;\n  probe?: Record<string, unknown>;\n  first_run_status?: string;\n  last_run_status?: string;\n  source_candidates?: number;\n  filtered_count?: number;\n  draft_count?: number;\n  failure_reason?: string;\n  attention_required?: boolean;\n  cursor?: Record<string, unknown>;\n  dedupe?: Record<string, unknown>;\n}\n\nexport interface RoutineStatePatch extends Partial<RoutineState> {}\n\nexport interface AIEmployeeRoutine {\n  id: string;\n  space_id: string;\n  owner_human_id: string;\n  ai_employee_id: string;\n  created_by_human_id: string;\n  name: string;\n  template_key: RoutineTemplateKey;\n  status: RoutineStatus;\n  daemon_status: RoutineDaemonStatus;\n  daemon_status_detail?: string;\n  daemon_status_updated_at?: number;\n  spec: RoutineSpec | ProxyModuleSpec;\n  instruction: RoutineInstruction;\n  policy: RoutinePolicy;\n  state: RoutineState;\n  created_at: number;\n  updated_at: number;\n}\n\nexport type AIEmployeeRoutineListItem = Omit<AIEmployeeRoutine, \"spec\" | \"instruction\" | \"policy\" | \"state\"> & {\n  can_view_config: boolean;\n  last_run_at?: number;\n  spec?: AIEmployeeRoutine[\"spec\"];\n  instruction?: AIEmployeeRoutine[\"instruction\"];\n  policy?: AIEmployeeRoutine[\"policy\"];\n  state?: AIEmployeeRoutine[\"state\"];\n};\n\nexport interface RoutineStepTrace {\n  step_id: string;\n  primitive?: string;\n  input?: unknown;\n  output?: unknown;\n  error?: unknown;\n  started_at?: number;\n  finished_at?: number;\n}\n\nexport interface AIEmployeeRoutineRun {\n  id: string;\n  routine_id: string;\n  started_at: number;\n  finished_at?: number;\n  outcome?: RoutineOutcome;\n  step_traces: RoutineStepTrace[];\n  error_message?: string;\n  wake_count: number;\n  dedupe_added: number;\n  outcome_detail?: string;\n  source_candidates?: number;\n  filtered_count?: number;\n  draft_count?: number;\n  failure_reason?: string;\n}\n\nexport type AIEmployeeFeishuIngestionMode = \"webhook_bot\" | \"personal_agent_polling\" | \"webhook_and_polling\";\n\nexport interface AIEmployeeFeishuAutoReplyChat {\n  chat_id: string;\n  chat_type: \"p2p\" | \"group\";\n  name?: string;\n  external?: boolean;\n}\n\nexport interface AIEmployeeFeishuCustomerServiceConfig {\n  feishu_app_id: string;\n  /** \u98DE\u4E66\u673A\u5668\u4EBA open_id\uFF1B\u7FA4\u804A @ \u4E8B\u4EF6\u4E2D\u7684 mentions.id \u901A\u5E38\u662F\u8BE5\u503C\u3002 */\n  feishu_bot_open_id?: string;\n  app_display_name?: string;\n  has_app_secret?: boolean;\n  scope: \"dm\";\n  reply_sink: \"inbox\" | \"direct_reply\";\n  webhook_url?: string;\n  has_webhook_secret?: boolean;\n  profile_revision?: string;\n  system_prompt_revision?: string;\n  sandbox_mode?: AIEmployeeSandboxMode;\n  /** \u63A5\u5165\u65B9\u5F0F\uFF1A\u98DE\u4E66\u5BA2\u670D\u56FA\u5B9A webhook\uFF1B\u98DE\u4E66\u52A9\u7406\u56FA\u5B9A webhook_and_polling\u3002 */\n  feishu_ingestion_mode?: AIEmployeeFeishuIngestionMode;\n  /** \u8F6E\u8BE2\u63A5\u5165\u4E0B\uFF0C\u89E6\u53D1\u4EE3\u7406\u7684\u6D88\u606F\u524D\u7F00\uFF0C\u9ED8\u8BA4 \"/agent\"\u3002 */\n  personal_agent_trigger?: string;\n  /** \u8F6E\u8BE2\u63A5\u5165\u4E0B\uFF0Cdaemon \u8F6E\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09\uFF0C\u9ED8\u8BA4 30000\u3002 */\n  personal_agent_poll_interval_ms?: number;\n  /** \u8F6E\u8BE2\u63A5\u5165\u4E0B\uFF0C\u6388\u6743\u64CD\u4F5C\u4EBA\u7684\u98DE\u4E66 open_id\uFF0C\u7531 setup \u5728\u7528\u6237\u6388\u6743\u901A\u8FC7\u540E\u5199\u5165\u3002 */\n  personal_agent_operator_open_id?: string;\n  /** \u98DE\u4E66\u52A9\u7406\u540E\u53F0\u611F\u77E5\u6A21\u5F0F\u3002\u9ED8\u8BA4\u4EC5\u98DE\u4E66\u52A9\u7406\u5F00\u542F\uFF0C\u98DE\u4E66\u5BA2\u670D\u5173\u95ED\u3002 */\n  ambient_enabled?: boolean;\n  /** \u540E\u53F0\u611F\u77E5\u89E6\u53D1\u7684\u6C89\u9ED8\u9608\u503C\uFF08\u6BEB\u79D2\uFF09\uFF0C\u9ED8\u8BA4 60000\u3002 */\n  ambient_silence_threshold_ms?: number;\n  /**\n   * \u81EA\u52A8\u56DE\u7B54\u76D1\u542C\u8303\u56F4\u3002undefined \u8868\u793A\u6CBF\u7528\u65E7\u884C\u4E3A\uFF08\u76D1\u542C\u6240\u6709\u53EF\u89C1\u4F1A\u8BDD\uFF09\uFF1B\n   * \u7A7A\u6570\u7EC4\u8868\u793A\u4E0D\u81EA\u52A8\u56DE\u7B54\u4EFB\u4F55\u4F1A\u8BDD\u3002/agent \u624B\u52A8\u89E6\u53D1\u4E0D\u53D7\u8BE5\u914D\u7F6E\u5F71\u54CD\u3002\n   */\n  auto_reply_chats?: AIEmployeeFeishuAutoReplyChat[];\n}\n\nexport interface AIEmployeeSpec {\n  template_key: AIEmployeeTemplateKey;\n  config: AIEmployeeFeishuCustomerServiceConfig;\n}\n\nexport interface RoutineCredentialMaterial {\n  kind: \"static_bearer\" | \"client_credentials_token\";\n  payload: Record<string, unknown>;\n}\n\nexport interface MemberFindResult {\n  human?: {\n    id: string;\n    name: string;\n    email?: string;\n    feishu_open_id?: string;\n  };\n  ai_employees: Array<{\n    ai_employee_id: string;\n    name: string;\n    runtime: RuntimeId;\n    online: boolean;\n    machine_id: string;\n  }>;\n}\n\nexport interface Machine {\n  id: string;\n  space_id: string;\n  owner_user_id?: string;\n  name: string;\n  hostname: string;\n  os: string;\n  daemon_version: string;\n  daemon_service_mode?: \"temporary\" | \"persistent\" | \"unknown\";\n  executionBackend?: MachineExecutionBackend;\n  containerImage?: string;\n  containerRuntimeStatus?: ContainerRuntimeStatus;\n  latest_daemon_version?: string;\n  daemon_update_available?: boolean;\n  daemon_version_status?: \"up_to_date\" | \"outdated\" | \"current\" | \"unknown\";\n  runtimes: RuntimeId[];\n  runtime_models?: RuntimeModelDetectionResult[];\n  /** machine \u662F\u5426\u5177\u5907\u5BB9\u5668\u6C99\u7BB1\u6267\u884C\u80FD\u529B\uFF08daemon \u63A2\u6D4B\u5BB9\u5668\u5F15\u64CE\u5F97\u51FA\uFF09\u3002 */\n  sandboxCapable?: boolean;\n  /** \u63A2\u6D4B\u5230\u7684\u5BB9\u5668\u5F15\u64CE\uFF1Bnull \u8868\u793A\u660E\u786E\u672A\u68C0\u6D4B\u5230\uFF0Cundefined \u8868\u793A\u65E7 daemon \u672A\u4E0A\u62A5\u3002 */\n  containerEngine?: ContainerEngineInfo | null;\n  status: \"online\" | \"offline\";\n  connected_at?: number;\n  last_seen_at?: number;\n  created_at?: number;\n  removed_at?: number;\n  connect_command?: string;\n  connect_commands?: DaemonInstallCommands;\n}\n\nexport interface DaemonInstallCommands {\n  system_service: string;\n  temporary: string;\n  windows_system_service?: string;\n  windows_temporary?: string;\n}\n\n/** daemon \u63A2\u6D4B\u5230\u7684\u5BB9\u5668\u5F15\u64CE\u4FE1\u606F\uFF08\u6C99\u7BB1\u80FD\u529B\u4F4D\u4F9D\u636E\uFF09\u3002 */\nexport interface ContainerEngineInfo {\n  kind: \"docker\" | \"podman\";\n  version: string;\n}\n\nexport interface ContainerRuntimeStatus {\n  image: string;\n  imagePresent?: boolean;\n  lastError?: string;\n}\n\nexport interface AIEmployee {\n  id: string;\n  space_id: string;\n  machine_id: string;\n  machine_name?: string;\n  owner_user_id?: string;\n  channel_id?: string;\n  kind: \"responsive\";\n  runtime: RuntimeId;\n  model: string;\n  reasoning_effort?: string;\n  permission_mode: AIEmployeePermissionMode;\n  sandbox_mode?: AIEmployeeSandboxMode;\n  name: string;\n  display_name: string;\n  role: string;\n  instructions: string;\n  env_vars?: Record<string, string>;\n  workspace_path?: string;\n  /** Server-computed authoritative lifecycle; clients render from this + activity. */\n  lifecycle?: AIEmployeeLifecycle;\n  daemon_state?: AIEmployeeDaemonState;\n  activity?: AIEmployeeActivity;\n  active_launch_id?: string;\n  last_activity_at?: number;\n  template_key?: AIEmployeeTemplateKey;\n  template_profile?: AIEmployeeProfile;\n  template_config?: Record<string, unknown>;\n  template_readiness?: AIEmployeeRuntimeReadiness;\n  routine_id?: string;\n  business_status?: AIEmployeeBusinessStatus;\n  business_status_reason?: string;\n  previous_business_status?: AIEmployeeBusinessStatus;\n  /** Persistent marker: profile update is pending re-apply on next daemon reconnect. */\n  profile_apply_pending?: boolean;\n  /** Monotonic token paired with profile_apply_pending for stale completion fencing. */\n  profile_apply_generation?: number;\n  deleted_at?: number;\n  created_at: number;\n  updated_at: number;\n  last_runtime_session_id?: string;\n}\n\nexport interface Channel {\n  id: string;\n  space_id: string;\n  name: string;\n  description?: string;\n  visibility: ChannelVisibility;\n  is_default: boolean;\n  created_by_user_id: string;\n  human_member_ids?: string[];\n  member_count?: number;\n  ai_employee_count?: number;\n  unread_count?: number;\n  created_at: number;\n  archived_at?: number;\n  updated_at?: number;\n}\n\nexport type InboxItemType =\n  | \"permission\"\n  | \"permission_request\"\n  | \"question\"\n  | \"confirmation_request\"\n  | \"error\"\n  | \"completed\"\n  | \"alert\"\n  | \"feishu_draft\"\n  | \"platform_draft\"\n  | \"proxy_draft\"\n  | \"profile_proposal\";\nexport type InboxItemStatus =\n  | \"open\"\n  | \"approved\"\n  | \"rejected\"\n  | \"confirmed\"\n  | \"ignored\"\n  | \"acknowledged\"\n  | \"sent\"\n  | \"failed\"\n  | \"resolved\";\nexport type InboxAction = \"approve\" | \"reject\" | \"confirm\" | \"ignore\" | \"ack\";\n\nexport interface InboxItem {\n  id: string;\n  organization_id: string;\n  channel_id?: string;\n  task_id?: string;\n  run_id?: string;\n  type: InboxItemType;\n  title: string;\n  description: string;\n  status: InboxItemStatus;\n  metadata: Record<string, unknown>;\n  created_at: number;\n  resolved_at?: number;\n}\n\nexport interface InboxItemAction {\n  id: string;\n  inbox_item_id: string;\n  action: InboxAction;\n  actor_user_id: string;\n  note?: string;\n  metadata: Record<string, unknown>;\n  created_at: number;\n}\n\nexport interface MessageSearchResult {\n  message_id: string;\n  channel_id?: string;\n  dm_pair_key?: string;\n  target_type: \"channel\" | \"dm\";\n  seq: number;\n  snippet: string;\n  author: {\n    type: MessageAuthorType;\n    id: string;\n    name: string;\n  };\n  created_at: number;\n  channel_name?: string;\n  dm_name?: string;\n}\n\nexport interface Message {\n  id: string;\n  space_id: string;\n  channel_id?: string;\n  dm_pair_key?: string;\n  thread_id?: string;\n  seq: number;\n  kind: MessageKind;\n  author_type: MessageAuthorType;\n  author_id: string;\n  author_name: string;\n  text: string;\n  attachment_ids?: string[];\n  attachments?: AttachmentMeta[];\n  mentions?: string[];\n  task_id?: string;\n  run_id?: string;\n  reply_count?: number;\n  mode?: AIEmployeeMessageMode;\n  metadata?: Record<string, unknown>;\n  created_at: number;\n}\n\nexport interface Task {\n  id: string;\n  space_id: string;\n  channel_id?: string;\n  source?: TaskSource;\n  visibility?: TaskVisibility;\n  source_message_id?: string;\n  metadata?: Record<string, unknown>;\n  title: string;\n  description: string;\n  status: TaskStatus;\n  assignee_id?: string;\n  created_by_user_id: string;\n  created_at: number;\n  updated_at: number;\n}\n\nexport interface ActivityEntry {\n  kind: ActivityEntryKind;\n  text?: string;\n  summary?: string;\n  call_id?: string;\n  tool_name?: string;\n  tool_input?: Record<string, unknown>;\n  tool_output?: string;\n  command?: string;\n  stdout?: string;\n  stderr?: string;\n  exit_code?: number;\n  is_error?: boolean;\n  timestamp: number;\n}\n\nexport interface AIEmployeeRun {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  task_id: string;\n  launch_id: string;\n  status: RunStatus;\n  created_at: number;\n  updated_at: number;\n  completed_at?: number;\n  error?: string;\n}\n\nexport interface RunEvent {\n  id: string;\n  run_id: string;\n  seq: number;\n  entries: ActivityEntry[];\n  created_at: number;\n}\n\nexport type AIEmployeeActivityKind = \"execution\" | \"business\" | \"system\" | \"lifecycle\";\nexport type AIEmployeeActivityEventStatus = \"started\" | \"completed\" | \"pending\" | \"failed\" | \"ignored\";\n\nexport interface AIEmployeeActivityEvent {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  template_key?: AIEmployeeTemplateKey;\n  kind: AIEmployeeActivityKind;\n  source: string;\n  channel?: \"dm\" | \"channel\" | \"feishu\" | \"routine\" | \"system\";\n  status: AIEmployeeActivityEventStatus;\n  input_summary?: string;\n  input_attachments?: AttachmentMeta[];\n  output_summary?: string;\n  output_attachments?: AttachmentMeta[];\n  failure_reason?: string;\n  duration_ms?: number;\n  linked_run_id?: string;\n  linked_message_id?: string;\n  linked_inbox_id?: string;\n  linked_routine_id?: string;\n  launch_id?: string;\n  /** Correlation key for same-row started -> completed/failed updates (lifecycle events). */\n  operation_id?: string;\n  metadata?: Record<string, unknown>;\n  created_at: number;\n  /** Lifecycle event timing (kind=\"lifecycle\"): started/finished + derived duration. */\n  started_at?: number;\n  completed_at?: number;\n  entries?: ActivityEntry[];\n}\n\nexport interface AttachmentMeta {\n  id: string;\n  space_id: string;\n  filename: string;\n  mime_type: string;\n  size: number;\n  path: string;\n  created_at: number;\n}\n\nexport interface Reminder {\n  id: string;\n  space_id: string;\n  ai_employee_id: string;\n  title: string;\n  fire_at: string;\n  recurrence?: string;\n  anchor_message_id?: string;\n  status: \"scheduled\" | \"fired\" | \"cancelled\";\n  version: number;\n  created_at: number;\n  updated_at: number;\n}\n\nexport interface FileEntry {\n  name: string;\n  path: string;\n  type: \"file\" | \"directory\";\n  size: number;\n  modified_at: number;\n}\n\nexport interface FileContent {\n  path: string;\n  content: string | null;\n  binary: boolean;\n  size: number;\n  mime_type?: string;\n  encoding?: \"utf8\" | \"base64\";\n}\n\nexport interface AIEmployeeSkillDescriptor {\n  name: string;\n  path: string;\n  description?: string;\n  userInvocable?: boolean;\n  content?: string;\n  version?: string;\n  loadedVersion?: string;\n  updatedAt?: number;\n}\n\nexport interface AIEmployeeSkillGroup {\n  source: \"global\" | \"workspace\";\n  root: string;\n  skills: AIEmployeeSkillDescriptor[];\n}\n\nexport interface RuntimeModelDescriptor {\n  id: string;\n  label: string;\n  providerId?: string;\n  providerLabel?: string;\n  default?: boolean;\n  fixed?: boolean;\n  reasoningEfforts?: string[];\n  defaultReasoningEffort?: string;\n}\n\nexport interface RuntimeModelDetectionResult {\n  runtime: RuntimeId;\n  source: \"static\" | \"codex-cache\" | \"cursor-cli\" | \"kimi-config\" | \"kimi-cli\" | \"hermes-config\" | \"hermes-provider-models\" | \"antigravity-cli\" | \"opencode-cli\" | \"opencode-default\" | \"error\";\n  selectable: boolean;\n  fixed?: boolean;\n  defaultModel?: string;\n  models: RuntimeModelDescriptor[];\n  error?: string;\n  /** runtime CLI \u5B89\u88C5\u72B6\u6001\uFF1B\u65E7 daemon \u4E0D\u4E0A\u62A5\uFF0CServer \u89C6\u4E3A unknown\uFF08\u53EF\u9009\u5B57\u6BB5\u5411\u540E\u517C\u5BB9\uFF09\u3002 */\n  installStatus?: \"installed\" | \"not_installed\";\n  /** runtime \u8BA4\u8BC1\u72B6\u6001\uFF1B\u65E7 daemon \u4E0D\u4E0A\u62A5\u89C6\u4E3A unknown\u3002 */\n  authStatus?: \"authenticated\" | \"unauthenticated\" | \"expired\" | \"unknown\";\n  /** \u8BA4\u8BC1\u65B9\u5F0F\uFF08\u4EC5 authStatus \u53EF\u5224\u5B9A\u65F6\u5B58\u5728\uFF09\u3002 */\n  authMethod?: \"api_key\" | \"oauth\";\n}\n\nexport interface MachineWorkspaceEntry {\n  directoryName: string;\n  aiEmployeeId?: string;\n  workspacePath?: string;\n  knownToServer: boolean;\n  running: boolean;\n  fileCount: number;\n  totalSizeBytes: number;\n  lastModified: number;\n}\n\nexport interface AIEmployeeDiagnosticSnapshot {\n  aiEmployeeId: string;\n  daemonState: \"starting\" | \"running\" | \"idle\" | \"offline\";\n  runtime?: RuntimeId;\n  model?: string;\n  sessionId?: string;\n  runtime_session?: AIEmployeeRuntimeSessionDiagnostic;\n  launchId?: string;\n  runtimePid?: number;\n  executionBackend?: MachineExecutionBackend;\n  containerName?: string;\n  containerImage?: string;\n  workspacePath?: string;\n  workspaceExists: boolean;\n  pendingInboxCount: number;\n  lastActivity?: {\n    activity: AIEmployeeActivity;\n    detail: string;\n    launchId?: string;\n  };\n}\n\nexport interface AIEmployeeRuntimeSessionDiagnostic {\n  runtime: RuntimeId;\n  sessionId?: string;\n  scope?: RuntimeSessionScope;\n  sessionConcurrencyStrategy?: \"shared_host_multiplex\" | \"process_per_session\" | \"process_per_turn_resume\";\n  pid?: number;\n  hostPid?: number;\n  queuedCount?: number;\n  maxConcurrentScopes?: number;\n  reachable: boolean;\n  nativePath?: string;\n  handoffPath?: string;\n  resumeMode: \"native_resume\" | \"cold_start\" | \"session_reset_fallback\" | \"unavailable\";\n  reason?: string;\n  updatedAt: string;\n}\n\nexport type RuntimeSessionScope =\n  | { type: \"channel\"; id: string }\n  | { type: \"dm\"; id: string }\n  | { type: \"external\"; id: string };\n\nexport interface DeliveredMessage {\n  target: string;\n  message_id: string;\n  thread_id?: string;\n  parent_message_id?: string;\n  seq: number;\n  timestamp: string;\n  sender_type: MessageAuthorType;\n  sender_id?: string;\n  sender_name: string;\n  content: string;\n  metadata?: Record<string, unknown>;\n  attachments?: Array<{\n    id: string;\n    filename: string;\n    mime_type?: string;\n    size?: number;\n    local_path?: string;\n    download_error?: string;\n  }>;\n  task_status?: TaskStatus;\n  task_number?: number;\n  mode?: AIEmployeeMessageMode;\n  thread_join_context?: {\n    parent_target: string;\n    thread_target: string;\n    suggested_read_history_target: string;\n    parent_message: DeliveredMessage;\n    recent_messages: DeliveredMessage[];\n    history_truncated?: boolean;\n  };\n}\n\nexport interface AIEmployeeMemoryStats {\n  memory_updated: boolean;\n  notes_written: string[];\n  lessons_read: boolean | null;\n}\n\ninterface AIEmployeeMemorySnapshotFileBase {\n  path: string;\n  /** Lowercase hex SHA-256 of the complete post-redaction UTF-8 byte sequence. */\n  hash: string;\n  truncated?: boolean;\n  redacted?: boolean;\n}\n\nexport interface AIEmployeeMemorySnapshotLegacyFile extends AIEmployeeMemorySnapshotFileBase {\n  content: string;\n  byteLength?: never;\n  chunks?: never;\n}\n\nexport interface AIEmployeeMemorySnapshotV2File extends AIEmployeeMemorySnapshotFileBase {\n  /** Optional duplicate of the joined chunks; validators require exact equality when present. */\n  content?: string;\n  /** UTF-8 byte length of the complete post-redaction file. */\n  byteLength: number;\n  chunks: AIEmployeeMemorySnapshotChunk[];\n}\n\nexport type AIEmployeeMemorySnapshotFile =\n  | AIEmployeeMemorySnapshotLegacyFile\n  | AIEmployeeMemorySnapshotV2File;\n\nexport interface AIEmployeeMemorySnapshotChunk {\n  /** Zero-based contiguous index within the file. */\n  index: number;\n  content: string;\n  /** UTF-8 byte length of content; must be at most 64 KiB. */\n  byteLength: number;\n  /** Lowercase hex SHA-256 of this chunk's UTF-8 byte sequence. */\n  hash: string;\n}\n\nexport interface DaemonMsg_AIEmployeeStart {\n  type: \"ai_employee:start\";\n  aiEmployeeId: string;\n  config: {\n    runtime: RuntimeId;\n    model: string;\n    sandboxMode?: AIEmployeeSandboxMode;\n    reasoningEffort?: string;\n    permissionMode?: AIEmployeePermissionMode;\n    sessionId?: string;\n    runtimeSessionScope?: RuntimeSessionScope;\n    serverUrl: string;\n    authToken: string;\n    spaceId: string;\n    machineId: string;\n    machineName?: string;\n    serverNamespace: string;\n    aiEmployeeName: string;\n    role?: string;\n    aiEmployeeWorkContext?: AIEmployeeWorkContext;\n    profileRevision?: string;\n    systemPromptRevision?: string;\n    restartMode?: \"resume\" | \"fresh\";\n    envVars?: Record<string, string>;\n    /** \u5458\u5DE5\u7EA7\u5E76\u53D1 scope \u4E0A\u9650\uFF0C\u7F3A\u7701 5\uFF08daemon RuntimeSlotManager perEmployeeLimit\uFF09 */\n    concurrencyLimit?: number;\n    /** machine \u5168\u5C40 runtime slot \u4E0A\u9650\u8986\u76D6\u503C\uFF1B\u672C\u9636\u6BB5 Server \u4E0D\u4E0B\u53D1\uFF0Cdaemon \u7528\u672C\u5730\u9ED8\u8BA4 */\n    machineRuntimeSlotLimit?: number;\n    /** Latest server-side memory snapshot files to restore before runtime spawn. */\n    memoryRestore?: AIEmployeeMemorySnapshotFile[];\n    /** Generation used to compile this exact employee profile. */\n    profileApplyGeneration?: number;\n    /** Server-owned learning candidates bound to profileApplyGeneration. */\n    learningCandidateSnapshot?: AIEmployeeLearningCandidateSnapshot;\n  };\n  wakeMessage?: DeliveredMessage;\n  launchId?: string;\n  taskId?: string;\n  /** Server outbox lease generation; omitted by legacy servers. */\n  dispatchGeneration?: number;\n}\n\nexport interface DaemonMsg_AIEmployeeStop {\n  type: \"ai_employee:stop\";\n  aiEmployeeId: string;\n}\n\nexport interface DaemonMsg_AIEmployeeDeliver {\n  type: \"ai_employee:deliver\";\n  aiEmployeeId: string;\n  message: DeliveredMessage;\n  seq: number;\n  deliveryId: string;\n  /** Server outbox lease generation; omitted by legacy servers. */\n  dispatchGeneration?: number;\n  runtimeSessionScope?: RuntimeSessionScope;\n  sessionId?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeDeliveryConfirmed {\n  type: \"ai_employee:deliver:confirmed\";\n  deliveryId: string;\n}\n\nexport interface DaemonMsg_AIEmployeeDeliverReply {\n  type: \"ai_employee:dm:reply\";\n  aiEmployeeId: string;\n  waitToken: string;\n  replyMessageId: string;\n  text: string;\n  senderAIEmployeeId: string;\n  senderName: string;\n  timestamp: string;\n}\n\nexport interface DaemonMsg_ActivityProbe {\n  type: \"ai_employee:activity_probe\";\n  aiEmployeeId: string;\n  probeId: string;\n}\n\nexport interface DaemonMsg_WorkspaceList {\n  type: \"ai_employee:workspace:list\";\n  aiEmployeeId: string;\n  requestId: string;\n  path?: string;\n  serverNamespace?: string;\n  machineId?: string;\n  config?: DaemonMsg_AIEmployeeStart[\"config\"];\n}\n\nexport interface DaemonMsg_WorkspaceRead {\n  type: \"ai_employee:workspace:read\";\n  aiEmployeeId: string;\n  requestId: string;\n  path: string;\n  serverNamespace?: string;\n  machineId?: string;\n  config?: DaemonMsg_AIEmployeeStart[\"config\"];\n}\n\nexport interface DaemonMsg_WorkspaceWrite {\n  type: \"ai_employee:workspace:write\";\n  aiEmployeeId: string;\n  requestId: string;\n  path: string;\n  content: string;\n  serverNamespace?: string;\n  machineId?: string;\n  config?: DaemonMsg_AIEmployeeStart[\"config\"];\n}\n\nexport interface DaemonMsg_AIEmployeeSkillsList {\n  type: \"ai_employee:skills:list\";\n  aiEmployeeId: string;\n  requestId: string;\n  runtime: RuntimeId;\n  serverNamespace?: string;\n  machineId?: string;\n  config?: DaemonMsg_AIEmployeeStart[\"config\"];\n}\n\nexport interface DaemonMsg_AIEmployeeWorkspaceInit {\n  type: \"ai_employee:workspace:init\";\n  requestId: string;\n  aiEmployeeId: string;\n  config: DaemonMsg_AIEmployeeStart[\"config\"];\n}\n\nexport interface DaemonMsg_AIEmployeeProfileUpdateAndRestart {\n  type: \"ai_employee:profile:update_and_restart\";\n  requestId: string;\n  aiEmployeeId: string;\n  config: DaemonMsg_AIEmployeeStart[\"config\"] & { restartMode: \"fresh\" };\n  routine?: AIEmployeeRoutine;\n  credentials?: Record<string, RoutineCredentialMaterial>;\n}\n\nexport interface DaemonMsg_AIEmployeeDestroy {\n  type: \"ai_employee:destroy\";\n  requestId: string;\n  aiEmployeeId: string;\n}\n\nexport interface DaemonMsg_RoutineStart {\n  type: \"routine:start\";\n  routine: AIEmployeeRoutine;\n  config: DaemonMsg_AIEmployeeStart[\"config\"];\n  credentials?: Record<string, RoutineCredentialMaterial>;\n}\n\nexport interface DaemonMsg_RoutineStop {\n  type: \"routine:stop\";\n  routineId: string;\n}\n\nexport interface DaemonMsg_RoutineUpdate {\n  type: \"routine:update\";\n  routine: AIEmployeeRoutine;\n  config: DaemonMsg_AIEmployeeStart[\"config\"];\n  credentials?: Record<string, RoutineCredentialMaterial>;\n}\n\nexport interface DaemonMsg_RoutineTrigger {\n  type: \"routine:trigger\";\n  routineId: string;\n  event: ProxyModuleTriggerEvent;\n}\n\nexport interface DaemonMsg_AIEmployeeSkillInject {\n  type: \"ai_employee:skill:inject\";\n  requestId: string;\n  aiEmployeeId: string;\n  skills: string[];\n  feishu: { app_id: string; app_secret: string };\n}\n\nexport interface DaemonMsg_AIEmployeeSkillInjectResult {\n  type: \"ai_employee:skill:inject/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeTemplateSetupPrepare {\n  type: \"ai_employee:template_setup:prepare\";\n  requestId: string;\n  aiEmployeeId: string;\n  config: DaemonMsg_AIEmployeeStart[\"config\"];\n  skills: string[];\n  feishu: { app_id: string; app_secret: string };\n  materializeReferenceIndex?: boolean;\n  referenceIndexPrepareMode?: ReferenceIndexPrepareMode;\n}\n\nexport interface DaemonMsg_AIEmployeeUserAuthStart {\n  type: \"ai_employee:user_auth:start\";\n  requestId: string;\n  aiEmployeeId: string;\n  domains: string[];\n  scopes?: string[];\n}\n\nexport interface DaemonMsg_AIEmployeeUserAuthComplete {\n  type: \"ai_employee:user_auth:complete\";\n  requestId: string;\n  aiEmployeeId: string;\n  deviceCode: string;\n}\n\nexport interface DaemonMsg_AIEmployeeUserAuthStatus {\n  type: \"ai_employee:user_auth:status\";\n  requestId: string;\n  aiEmployeeId: string;\n}\n\nexport interface DaemonMsg_AIEmployeeTemplateSetupCheck {\n  type: \"ai_employee:template_setup:check\";\n  requestId: string;\n  aiEmployeeId: string;\n  appId?: string;\n  inspectorScopes: string[];\n  botScopes?: string[];\n  businessScopes: string[];\n  requiredEvents?: string[];\n  webhookVerified?: boolean;\n  skillsInjected?: boolean;\n}\n\nexport interface DaemonMsg_AIEmployeeFeishuChatsList {\n  type: \"ai_employee:feishu_chats:list\";\n  requestId: string;\n  aiEmployeeId: string;\n}\n\nexport interface DaemonMsg_AIEmployeeUserAuthSessionStart {\n  type: \"ai_employee:user_auth:session_start\";\n  requestId: string;\n  aiEmployeeId: string;\n  domains: string[];\n  scopes?: string[];\n  config?: DaemonMsg_AIEmployeeStart[\"config\"];\n  feishu?: { app_id: string; app_secret: string };\n}\n\nexport interface DaemonMsg_AIEmployeeUserAuthSessionStatus {\n  type: \"ai_employee:user_auth:session_status\";\n  requestId: string;\n  aiEmployeeId: string;\n}\n\nexport interface DaemonMsg_RuntimeModelsDetect {\n  type: \"machine:runtime_models:detect\";\n  requestId: string;\n  runtimes?: RuntimeId[];\n}\n\nexport interface DaemonMsg_MachineWorkspaceScan {\n  type: \"machine:workspace:scan\";\n  requestId: string;\n  serverNamespace: string;\n  machineId: string;\n  machineName?: string;\n  knownAIEmployeeIds?: string[];\n}\n\nexport interface DaemonMsg_MachineWorkspaceDelete {\n  type: \"machine:workspace:delete\";\n  requestId: string;\n  serverNamespace: string;\n  machineId: string;\n  machineName?: string;\n  directoryName: string;\n}\n\nexport interface DaemonMsg_AIEmployeeResetWorkspace {\n  type: \"ai_employee:reset-workspace\";\n  requestId: string;\n  aiEmployeeId: string;\n  config: DaemonMsg_AIEmployeeStart[\"config\"];\n}\n\nexport interface DaemonMsg_AIEmployeeDiagnostic {\n  type: \"ai_employee:diagnostic\";\n  requestId: string;\n  aiEmployeeId: string;\n  config?: DaemonMsg_AIEmployeeStart[\"config\"];\n}\n\nexport interface DaemonMsg_ReminderUpsert {\n  type: \"reminder.upsert\";\n  reminder: Reminder;\n}\n\nexport interface DaemonMsg_ReminderCancel {\n  type: \"reminder.cancel\";\n  reminderId: string;\n  version: number;\n}\n\nexport interface DaemonMsg_ReminderSnapshot {\n  type: \"reminder.snapshot\";\n  aiEmployeeId: string;\n  reminders: Reminder[];\n}\n\nexport interface DaemonMsg_Ping {\n  type: \"ping\";\n}\n\nexport interface DaemonMsg_AIEmployeeRuntimeProfileMigration {\n  type: \"ai_employee:runtime_profile:migration\";\n  aiEmployeeId: string;\n  migrationKey: string;\n}\n\nexport interface DaemonMsg_AIEmployeePermissionDecision {\n  type: \"ai_employee:permission_decision\";\n  aiEmployeeId: string;\n  requestId: string;\n  action: \"approve\" | \"reject\";\n  metadata?: Record<string, unknown>;\n}\n\nexport interface DaemonMsg_AIEmployeeMemorySnapshotAck {\n  type: \"ai_employee:memory_snapshot:ack\";\n  aiEmployeeId: string;\n  generationId: string;\n}\n\nexport type NativeSessionRuntime = \"codex\" | \"claude\";\nexport type NativeSessionCompletionMode = \"fixed_rounds\" | \"consensus\";\nexport type NativeSessionCompletionSignal = \"continue\" | \"propose_consensus\" | \"confirm_consensus\";\nexport type NativeSessionCollaborationStatus =\n  | \"waiting_initiator\"\n  | \"waiting_peer\"\n  | \"round_completed\"\n  | \"consensus_pending\"\n  | \"consensus_ready\"\n  | \"completed\"\n  | \"limit_reached\"\n  | \"stopped\"\n  | \"failed\";\n\nexport interface NativeSessionCollaborationStartCommand {\n  kind: \"start\";\n  clientRequestId: string;\n  selfRuntime: NativeSessionRuntime;\n  selfSessionId: string;\n  peerRuntime: NativeSessionRuntime;\n  peerSessionId: string;\n  projectScopeFingerprint: string;\n  projectLabel: string;\n  goal: string;\n  maxRounds: number;\n  completionMode: NativeSessionCompletionMode;\n  continueThreadRootMessageId?: string;\n}\n\nexport interface NativeSessionCollaborationSendCommand {\n  kind: \"send\";\n  clientRequestId: string;\n  collaborationId: string;\n  text: string;\n  completionSignal: NativeSessionCompletionSignal;\n  proposalTurnId?: string;\n}\n\nexport interface NativeSessionCollaborationWaitCommand {\n  kind: \"wait\";\n  collaborationId: string;\n  afterSeq: number;\n  limit?: number;\n}\n\nexport interface NativeSessionCollaborationFinishCommand {\n  kind: \"finish\";\n  clientRequestId: string;\n  collaborationId: string;\n  outcome: \"completed\" | \"limit_reached\" | \"stopped\";\n  summary: string;\n  disagreements?: string[];\n  decisionItems?: string[];\n}\n\nexport interface NativeSessionCollaborationStatusCommand {\n  kind: \"status\";\n  collaborationId: string;\n}\n\nexport interface NativeSessionCollaborationRetryCommand {\n  kind: \"retry\";\n  clientRequestId: string;\n  collaborationId: string;\n  turnId: string;\n}\n\nexport type NativeSessionCollaborationCommand =\n  | NativeSessionCollaborationStartCommand\n  | NativeSessionCollaborationSendCommand\n  | NativeSessionCollaborationWaitCommand\n  | NativeSessionCollaborationFinishCommand\n  | NativeSessionCollaborationStatusCommand\n  | NativeSessionCollaborationRetryCommand;\n\nexport interface NativeSessionCollaborationEvent {\n  eventSeq: number;\n  collaborationId: string;\n  type: \"started\" | \"turn_submitted\" | \"peer_reply\" | \"warning\" | \"failed\" | \"finished\";\n  turnId?: string;\n  messageId?: string;\n  payload: Record<string, unknown>;\n  createdAt: number;\n}\n\nexport interface DaemonMsg_NativeSessionCollaborationResult {\n  type: \"native_session_collaboration:result\";\n  requestId: string;\n  commandKind: NativeSessionCollaborationCommand[\"kind\"];\n  ok: boolean;\n  result?: Record<string, unknown>;\n  errorCode?: string;\n  error?: string;\n}\n\nexport interface DaemonMsg_NativeSessionCollaborationEvent {\n  type: \"native_session_collaboration:event\";\n  collaborationId: string;\n  event: NativeSessionCollaborationEvent;\n}\n\nexport interface DaemonMsg_NativeSessionCollaborationExecute {\n  type: \"native_session_collaboration:execute\";\n  requestId: string;\n  collaborationId: string;\n  turnId: string;\n  roundNumber: number;\n  peerRuntime: NativeSessionRuntime;\n  peerSessionId: string;\n  prompt: string;\n  discussionOnly: true;\n  leaseGeneration: number;\n}\n\nexport type ServerToDaemonMessage =\n  | DaemonMsg_AIEmployeeStart\n  | DaemonMsg_AIEmployeeStop\n  | DaemonMsg_AIEmployeeDeliver\n  | DaemonMsg_AIEmployeeDeliveryConfirmed\n  | DaemonMsg_AIEmployeeDeliverReply\n  | DaemonMsg_ActivityProbe\n  | DaemonMsg_WorkspaceList\n  | DaemonMsg_WorkspaceRead\n  | DaemonMsg_WorkspaceWrite\n  | DaemonMsg_AIEmployeeSkillsList\n  | DaemonMsg_AIEmployeeWorkspaceInit\n  | DaemonMsg_AIEmployeeProfileUpdateAndRestart\n  | DaemonMsg_AIEmployeeDestroy\n  | DaemonMsg_RoutineStart\n  | DaemonMsg_RoutineStop\n  | DaemonMsg_RoutineUpdate\n  | DaemonMsg_RoutineTrigger\n  | DaemonMsg_AIEmployeeSkillInject\n  | DaemonMsg_AIEmployeeTemplateSetupPrepare\n  | DaemonMsg_AIEmployeeUserAuthStart\n  | DaemonMsg_AIEmployeeUserAuthComplete\n  | DaemonMsg_AIEmployeeUserAuthStatus\n  | DaemonMsg_AIEmployeeTemplateSetupCheck\n  | DaemonMsg_AIEmployeeFeishuChatsList\n  | DaemonMsg_AIEmployeeUserAuthSessionStart\n  | DaemonMsg_AIEmployeeUserAuthSessionStatus\n  | DaemonMsg_RuntimeModelsDetect\n  | DaemonMsg_MachineWorkspaceScan\n  | DaemonMsg_MachineWorkspaceDelete\n  | DaemonMsg_AIEmployeeResetWorkspace\n  | DaemonMsg_AIEmployeeDiagnostic\n  | DaemonMsg_ReminderUpsert\n  | DaemonMsg_ReminderCancel\n  | DaemonMsg_ReminderSnapshot\n  | DaemonMsg_AIEmployeeRuntimeProfileMigration\n  | DaemonMsg_AIEmployeePermissionDecision\n  | DaemonMsg_AIEmployeeMemorySnapshotAck\n  | DaemonMsg_NativeSessionCollaborationResult\n  | DaemonMsg_NativeSessionCollaborationEvent\n  | DaemonMsg_NativeSessionCollaborationExecute\n  | DaemonMsg_Ping;\n\nexport interface DaemonMsg_Ready {\n  type: \"ready\";\n  capabilities: string[];\n  runtimes: RuntimeId[];\n  runningAIEmployees: string[];\n  wakeableAIEmployees?: Array<{\n    aiEmployeeId: string;\n    sessionId?: string;\n    launchId?: string;\n    runtimeSessionScope?: RuntimeSessionScope;\n    /** Replayable terminal state for a turn whose realtime availability frame may have been lost. */\n    turnOutcome?: \"ok\" | \"failed\";\n    failureReason?: string;\n    workspaceReady?: boolean;\n  }>;\n  /** Processed receipts awaiting Server terminal confirmation. */\n  processedDeliveryIds?: string[];\n  machineId?: string;\n  hostname: string;\n  name?: string;\n  os: string;\n  daemonVersion: string;\n  daemonServiceMode?: \"temporary\" | \"persistent\" | \"unknown\";\n  executionBackend?: MachineExecutionBackend;\n  containerImage?: string;\n  containerRuntimeStatus?: ContainerRuntimeStatus;\n  /** machine \u662F\u5426\u5177\u5907\u5BB9\u5668\u6C99\u7BB1\u6267\u884C\u80FD\u529B\uFF1B\u65E7 daemon \u4E0D\u4E0A\u62A5\u3002 */\n  sandboxCapable?: boolean;\n  /** \u63A2\u6D4B\u5230\u7684\u5BB9\u5668\u5F15\u64CE\uFF1Bnull \u8868\u793A\u660E\u786E\u672A\u68C0\u6D4B\u5230\uFF0Cundefined \u8868\u793A\u65E7 daemon \u672A\u4E0A\u62A5\u3002 */\n  containerEngine?: ContainerEngineInfo | null;\n}\n\nexport interface DaemonMsg_AIEmployeeStatus {\n  type: \"ai_employee:status\";\n  aiEmployeeId: string;\n  status: \"active\" | \"inactive\";\n  launchId?: string;\n  failureReason?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeActivity {\n  type: \"ai_employee:activity\";\n  aiEmployeeId: string;\n  activity: AIEmployeeActivitySignal;\n  detail: string;\n  entries?: ActivityEntry[];\n  launchId?: string;\n  clientSeq?: number;\n  probeId?: string;\n  pendingInboxCount?: number;\n  /** \u8BE5\u5458\u5DE5\u5F53\u524D\u6D3B\u8DC3\uFF08running\uFF09scope \u5B9E\u4F8B\u6570\uFF0Cdaemon \u805A\u5408\u4E0A\u62A5 */\n  activeScopeCount?: number;\n  /** Run-level memory read/write stats. Present only on the run terminal idle/error activity. */\n  memory_stats?: AIEmployeeMemoryStats;\n}\n\nexport interface DaemonMsg_AIEmployeeMemorySnapshot {\n  type: \"ai_employee:memory_snapshot\";\n  /** Daemon-provided id for reset snapshots that must be verified before reset succeeds. */\n  generationId?: string;\n  /** Reset request bound to this generation; required by current reset-capable daemons. */\n  resetRequestId?: string;\n  aiEmployeeId: string;\n  machineId?: string;\n  trigger: \"run_end\" | \"retro\" | \"manual\";\n  takenAt: number;\n  files: AIEmployeeMemorySnapshotFile[];\n}\n\nexport interface DaemonMsg_AIEmployeeAvailability {\n  type: \"ai_employee:availability\";\n  aiEmployeeId: string;\n  daemonState: AIEmployeeDaemonState;\n  sessionId?: string;\n  runtimeSessionScope?: RuntimeSessionScope;\n  launchId?: string;\n  /** Outcome of the launch/turn that produced this availability. Missing means legacy success. */\n  turnOutcome?: \"ok\" | \"failed\";\n  failureReason?: string;\n  /** Structured signal that the workspace has been initialized (drives lifecycle ready/not_provisioned). */\n  workspaceReady?: boolean;\n}\n\nexport interface DaemonMsg_AIEmployeeSession {\n  type: \"ai_employee:session\";\n  aiEmployeeId: string;\n  sessionId: string;\n  runtimeSessionScope?: RuntimeSessionScope;\n  launchId?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeSessionReset {\n  type: \"ai_employee:session_reset\";\n  aiEmployeeId: string;\n  staleSessionId?: string;\n  runtimeSessionScope?: RuntimeSessionScope;\n  reason: \"resume_failed\" | \"runtime_profile_changed\" | \"manual_reset\";\n  detail?: string;\n  launchId?: string;\n}\n\nexport interface DaemonMsg_DeliverAck {\n  type: \"ai_employee:deliver:ack\";\n  aiEmployeeId: string;\n  messageId?: string;\n  seq: number;\n  deliveryId: string;\n  /** Echoes the generation from the accepted start/deliver request. */\n  dispatchGeneration?: number;\n  accepted?: boolean;\n  reason?: string;\n}\n\nexport interface DaemonMsg_DeliverProcessed {\n  type: \"ai_employee:deliver:processed\";\n  aiEmployeeId: string;\n  messageId?: string;\n  deliveryId: string;\n  /** Echoes the latest generation received for this delivery. */\n  dispatchGeneration?: number;\n  runtimeSessionScope?: RuntimeSessionScope;\n  launchId?: string;\n  status: \"ok\" | \"failed\";\n  detail?: string;\n  outputSummary?: string;\n  durationMs?: number;\n}\n\nexport interface DaemonMsg_WorkspaceFileTree {\n  type: \"ai_employee:workspace:file_tree\";\n  aiEmployeeId: string;\n  requestId: string;\n  entries: FileEntry[];\n  missing?: boolean;\n  error?: string;\n}\n\nexport interface DaemonMsg_WorkspaceFileContent {\n  type: \"ai_employee:workspace:file_content\";\n  aiEmployeeId: string;\n  requestId: string;\n  file: FileContent | null;\n  error?: string;\n}\n\nexport interface DaemonMsg_WorkspaceWriteResult {\n  type: \"ai_employee:workspace:write_result\";\n  aiEmployeeId: string;\n  requestId: string;\n  path: string;\n  ok: boolean;\n  size?: number;\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeSkillsListResult {\n  type: \"ai_employee:skills:list/result\";\n  aiEmployeeId: string;\n  requestId: string;\n  global: AIEmployeeSkillGroup[];\n  workspace: AIEmployeeSkillGroup[];\n  skills_flat?: Array<AIEmployeeSkillDescriptor & { source: \"ai_employee\" | \"workspace\" }>;\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeWorkspaceInitResult {\n  type: \"ai_employee:workspace:init/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  workspacePath?: string;\n  prepareEntries?: ActivityEntry[];\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeProfileUpdateAndRestartResult {\n  type: \"ai_employee:profile:update_and_restart/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  profileRevision?: string;\n  systemPromptRevision?: string;\n  restarted?: boolean;\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeDestroyResult {\n  type: \"ai_employee:destroy/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  error?: string;\n}\n\nexport interface DaemonMsg_RuntimeModelsResult {\n  type: \"machine:runtime_models:result\";\n  requestId: string;\n  results: RuntimeModelDetectionResult[];\n  executionBackend?: MachineExecutionBackend;\n  containerImage?: string;\n  containerRuntimeStatus?: ContainerRuntimeStatus;\n  /** machine \u662F\u5426\u5177\u5907\u5BB9\u5668\u6C99\u7BB1\u6267\u884C\u80FD\u529B\uFF1B\u65E7 daemon \u4E0D\u4E0A\u62A5\u3002 */\n  sandboxCapable?: boolean;\n  /** \u63A2\u6D4B\u5230\u7684\u5BB9\u5668\u5F15\u64CE\uFF1Bnull \u8868\u793A\u660E\u786E\u672A\u68C0\u6D4B\u5230\uFF0Cundefined \u8868\u793A\u65E7 daemon \u672A\u4E0A\u62A5\u3002 */\n  containerEngine?: ContainerEngineInfo | null;\n}\n\nexport interface DaemonMsg_MachineWorkspaceScanResult {\n  type: \"machine:workspace:scan/result\";\n  requestId: string;\n  entries: MachineWorkspaceEntry[];\n  error?: string;\n}\n\nexport interface DaemonMsg_MachineWorkspaceDeleteResult {\n  type: \"machine:workspace:delete/result\";\n  requestId: string;\n  directoryName: string;\n  ok: boolean;\n  error?: string;\n}\n\ninterface DaemonMsg_AIEmployeeResetWorkspaceResultBase {\n  type: \"ai_employee:reset-workspace/result\";\n  requestId: string;\n  aiEmployeeId: string;\n}\n\nexport interface DaemonMsg_AIEmployeeResetWorkspaceSuccess extends DaemonMsg_AIEmployeeResetWorkspaceResultBase {\n  ok: true;\n  memorySnapshotGenerationId: string;\n  error?: never;\n}\n\nexport interface DaemonMsg_AIEmployeeResetWorkspaceFailure extends DaemonMsg_AIEmployeeResetWorkspaceResultBase {\n  ok: false;\n  memorySnapshotGenerationId?: string;\n  error?: string;\n}\n\nexport type DaemonMsg_AIEmployeeResetWorkspaceResult =\n  | DaemonMsg_AIEmployeeResetWorkspaceSuccess\n  | DaemonMsg_AIEmployeeResetWorkspaceFailure;\n\nexport interface DaemonMsg_AIEmployeeUserAuthStartResult {\n  type: \"ai_employee:user_auth:start/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  verificationUrl?: string;\n  deviceCode?: string;\n  expiresInSec?: number;\n  error?: string;\n}\n\nexport type AIEmployeeUserAuthStatusValue = \"authorized\" | \"pending\" | \"expired\" | \"error\";\n\nexport interface DaemonMsg_AIEmployeeUserAuthCompleteResult {\n  type: \"ai_employee:user_auth:complete/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  status: AIEmployeeUserAuthStatusValue;\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeUserAuthStatusResult {\n  type: \"ai_employee:user_auth:status/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  authorized: boolean;\n  /** \u6388\u6743\u7528\u6237\u7684\u98DE\u4E66 open_id\uFF08\u7528\u4E8E\u4E2A\u4EBA /agent \u4EE3\u7406\u8BC6\u522B\u64CD\u4F5C\u4EBA\u672C\u4EBA\uFF09\uFF0C\u6765\u81EA auth status identities.user.openId\u3002 */\n  operatorOpenId?: string;\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeTemplateSetupCheckResult {\n  type: \"ai_employee:template_setup:check/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  setup: AIEmployeeTemplateSetupState;\n  availableScopes?: string[];\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeTemplateSetupPrepareResult {\n  type: \"ai_employee:template_setup:prepare/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  runtimePrepared?: boolean;\n  skillsInjected?: boolean;\n  feishuBound?: boolean;\n  referenceIndex?: AIEmployeeReferenceIndexReadiness;\n  prepareEntries?: ActivityEntry[];\n  error?: string;\n  reasonCode?: AIEmployeeTemplateSetupReasonCode;\n}\n\nexport interface DaemonMsg_AIEmployeeFeishuChatsListResult {\n  type: \"ai_employee:feishu_chats:list/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  chats?: AIEmployeeFeishuAutoReplyChat[];\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeUserAuthSessionStartResult {\n  type: \"ai_employee:user_auth:session_start/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  verificationUrl?: string;\n  expiresInSec?: number;\n  status?: AIEmployeeUserAuthStatusValue;\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeUserAuthSessionStatusResult {\n  type: \"ai_employee:user_auth:session_status/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  status: AIEmployeeUserAuthStatusValue;\n  authorized: boolean;\n  /** \u6388\u6743\u7528\u6237\u7684\u98DE\u4E66 open_id\uFF08\u7528\u4E8E\u4E2A\u4EBA /agent \u4EE3\u7406\u8BC6\u522B\u64CD\u4F5C\u4EBA\u672C\u4EBA\uFF09\uFF0C\u6765\u81EA auth status identities.user.openId\u3002 */\n  operatorOpenId?: string;\n  error?: string;\n}\n\nexport interface DaemonMsg_AIEmployeeDiagnosticResult {\n  type: \"ai_employee:diagnostic/result\";\n  requestId: string;\n  aiEmployeeId: string;\n  ok: boolean;\n  snapshot: AIEmployeeDiagnosticSnapshot;\n  error?: string;\n}\n\nexport interface DaemonMsg_ReminderFireAttempt {\n  type: \"reminder.fire_attempt\";\n  reminderId: string;\n  aiEmployeeId: string;\n  version: number;\n}\n\nexport interface DaemonMsg_ReminderSnapshotRequest {\n  type: \"reminder.snapshot.request\";\n  aiEmployeeId: string;\n}\n\nexport interface DaemonMsg_Pong {\n  type: \"pong\";\n}\n\nexport interface DaemonMsg_AIEmployeeRuntimeProfileMigrationAck {\n  type: \"ai_employee:runtime_profile:migration:ack\";\n  aiEmployeeId: string;\n  migrationKey: string;\n}\n\nexport interface DaemonMsg_AIEmployeePermissionRequest {\n  type: \"ai_employee:permission_request\";\n  aiEmployeeId: string;\n  requestId: string;\n  launchId?: string;\n  kind: \"command\" | \"file_change\" | \"permission\" | \"session\" | \"unknown\";\n  title: string;\n  description: string;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface DaemonMsg_RoutineStateWriteback {\n  type: \"routine:state_writeback\";\n  routineId: string;\n  statePatch?: RoutineStatePatch;\n  run?: {\n    startedAt: number;\n    finishedAt?: number;\n    outcome?: RoutineOutcome;\n    stepTraces?: RoutineStepTrace[];\n    errorMessage?: string;\n    wakeCount?: number;\n    dedupeAdded?: number;\n    outcomeDetail?: string;\n    sourceCandidates?: number;\n    filteredCount?: number;\n    draftCount?: number;\n    failureReason?: string;\n  };\n}\n\nexport interface DaemonMsg_RoutineStatus {\n  type: \"routine:status\";\n  routineId: string;\n  aiEmployeeId: string;\n  status: RoutineDaemonStatus;\n  detail?: string;\n}\n\nexport interface DaemonMsg_FeishuPersonalAgentTrigger {\n  type: \"feishu:personal_agent_trigger\";\n  aiEmployeeId: string;\n  chatId: string;\n  chatType: string;\n  chatName?: string;\n  messageId: string;\n  text: string;\n  senderOpenId: string;\n  senderName?: string;\n  receivedAt: number;\n  messageType?: string;\n  rawContent?: string;\n  imageKey?: string;\n  localImagePath?: string;\n  localImageRelativePath?: string;\n  imageDownloadError?: string;\n  preFetchedDocs?: FeishuPersonalAgentPreFetchedDoc[];\n  recentMessages?: FeishuPersonalAgentRecentMessage[];\n}\n\nexport interface FeishuPersonalAgentRecentMessage {\n  messageId: string;\n  chatId?: string;\n  chatType?: string;\n  senderOpenId?: string;\n  senderName?: string;\n  text: string;\n  messageType?: string;\n  imageKey?: string;\n  localImagePath?: string;\n  localImageRelativePath?: string;\n  imageDownloadError?: string;\n  sentAt?: number;\n}\n\nexport interface FeishuPersonalAgentPreFetchedDoc {\n  url: string;\n  title?: string;\n  content: string;\n  truncated?: boolean;\n  error?: string;\n}\n\nexport interface DaemonMsg_FeishuPersonalAgentPoll {\n  type: \"feishu:personal_agent_poll\";\n  aiEmployeeId: string;\n  status: \"ok\" | \"skipped\" | \"failed\";\n  checkedAt: number;\n  activeTimeCursor?: number;\n  chatCount?: number;\n  scannedMessageCount?: number;\n  matchedMessageCount?: number;\n  detail?: string;\n}\n\nexport interface DaemonMsg_FeishuPersonalAgentSkipped {\n  type: \"feishu:personal_agent_skipped\";\n  aiEmployeeId: string;\n  chatId: string;\n  chatType: string;\n  chatName?: string;\n  messageId: string;\n  text: string;\n  senderOpenId: string;\n  senderName?: string;\n  receivedAt: number;\n  reason: \"external_chat_unsupported\";\n  detail: string;\n}\n\nexport interface DaemonMsg_FeishuPersonalAgentAmbient {\n  type: \"feishu:personal_agent_ambient\";\n  aiEmployeeId: string;\n  chatId: string;\n  chatType: string;\n  chatName?: string;\n  messageIds: string[];\n  recentMessages: FeishuPersonalAgentRecentMessage[];\n  messageCount: number;\n  lastMessageAt: number;\n  receivedAt: number;\n  reason: \"silence_threshold\";\n  detail?: string;\n}\n\nexport interface DaemonMsg_NativeSessionCollaborationCommand {\n  type: \"native_session_collaboration:command\";\n  requestId: string;\n  command: NativeSessionCollaborationCommand;\n}\n\nexport interface DaemonMsg_NativeSessionCollaborationExecuteResult {\n  type: \"native_session_collaboration:execute_result\";\n  requestId: string;\n  collaborationId: string;\n  turnId: string;\n  leaseGeneration: number;\n  status: \"ok\" | \"failed\" | \"paused\";\n  replyText?: string;\n  completionSignal?: NativeSessionCompletionSignal;\n  proposalTurnId?: string;\n  runtimeSessionId?: string;\n  warning?: string;\n  error?: string;\n}\n\nexport type DaemonToServerMessage =\n  | DaemonMsg_Ready\n  | DaemonMsg_AIEmployeeStatus\n  | DaemonMsg_AIEmployeeActivity\n  | DaemonMsg_AIEmployeeMemorySnapshot\n  | DaemonMsg_AIEmployeeAvailability\n  | DaemonMsg_AIEmployeeSession\n  | DaemonMsg_AIEmployeeSessionReset\n  | DaemonMsg_DeliverAck\n  | DaemonMsg_DeliverProcessed\n  | DaemonMsg_WorkspaceFileTree\n  | DaemonMsg_WorkspaceFileContent\n  | DaemonMsg_WorkspaceWriteResult\n  | DaemonMsg_AIEmployeeSkillsListResult\n  | DaemonMsg_AIEmployeeWorkspaceInitResult\n  | DaemonMsg_AIEmployeeProfileUpdateAndRestartResult\n  | DaemonMsg_AIEmployeeDestroyResult\n  | DaemonMsg_RuntimeModelsResult\n  | DaemonMsg_MachineWorkspaceScanResult\n  | DaemonMsg_MachineWorkspaceDeleteResult\n  | DaemonMsg_AIEmployeeResetWorkspaceResult\n  | DaemonMsg_AIEmployeeSkillInjectResult\n  | DaemonMsg_AIEmployeeTemplateSetupPrepareResult\n  | DaemonMsg_AIEmployeeUserAuthStartResult\n  | DaemonMsg_AIEmployeeUserAuthCompleteResult\n  | DaemonMsg_AIEmployeeUserAuthStatusResult\n  | DaemonMsg_AIEmployeeTemplateSetupCheckResult\n  | DaemonMsg_AIEmployeeFeishuChatsListResult\n  | DaemonMsg_AIEmployeeUserAuthSessionStartResult\n  | DaemonMsg_AIEmployeeUserAuthSessionStatusResult\n  | DaemonMsg_AIEmployeeDiagnosticResult\n  | DaemonMsg_ReminderFireAttempt\n  | DaemonMsg_ReminderSnapshotRequest\n  | DaemonMsg_AIEmployeeRuntimeProfileMigrationAck\n  | DaemonMsg_AIEmployeePermissionRequest\n  | DaemonMsg_RoutineStateWriteback\n  | DaemonMsg_RoutineStatus\n  | DaemonMsg_FeishuPersonalAgentTrigger\n  | DaemonMsg_FeishuPersonalAgentSkipped\n  | DaemonMsg_FeishuPersonalAgentAmbient\n  | DaemonMsg_FeishuPersonalAgentPoll\n  | DaemonMsg_NativeSessionCollaborationCommand\n  | DaemonMsg_NativeSessionCollaborationExecuteResult\n  | DaemonMsg_Pong;\n\nexport interface WebEvent_ChannelMessage {\n  type: \"channel:message\";\n  message: Message;\n}\n\nexport interface WebEvent_ChannelTaskUpdate {\n  type: \"channel:task_update\";\n  task: Task;\n}\n\nexport interface WebEvent_AIEmployeeActivity {\n  type: \"ai_employee:activity\";\n  ai_employee_id: string;\n  activity: AIEmployeeActivity;\n  detail: string;\n  daemon_state?: AIEmployeeDaemonState;\n  entries?: ActivityEntry[];\n}\n\nexport interface WebEvent_AIEmployeeRunStarted {\n  type: \"ai_employee:run_started\";\n  run: AIEmployeeRun;\n}\n\nexport interface WebEvent_AIEmployeeRunCompleted {\n  type: \"ai_employee:run_completed\";\n  run: AIEmployeeRun;\n}\n\nexport interface WebEvent_RunEvent {\n  type: \"run:event\";\n  run_id: string;\n  event: RunEvent;\n}\n\nexport interface WebEvent_MachineStatus {\n  type: \"machine:status\";\n  machine_id: string;\n  status: \"online\" | \"offline\";\n}\n\nexport interface WebEvent_Warning {\n  type: \"warning\";\n  id: string;\n  severity: \"info\" | \"warning\" | \"error\";\n  title: string;\n  description?: string;\n  machine_id?: string;\n  ai_employee_id?: string;\n  dismissible?: boolean;\n}\n\nexport interface WebEvent_InboxItems {\n  type: \"inbox:items\";\n  items: InboxItem[];\n}\n\nexport interface WebEvent_InboxItem {\n  type: \"inbox:item\";\n  item: InboxItem;\n}\n\nexport type ServerToWebEvent =\n  | WebEvent_ChannelMessage\n  | WebEvent_ChannelTaskUpdate\n  | WebEvent_AIEmployeeActivity\n  | WebEvent_AIEmployeeRunStarted\n  | WebEvent_AIEmployeeRunCompleted\n  | WebEvent_RunEvent\n  | WebEvent_MachineStatus\n  | WebEvent_InboxItems\n  | WebEvent_InboxItem\n  | WebEvent_Warning;\n\nexport function formatDeliveredMessage(msg: DeliveredMessage): string {\n  const msgShort = msg.message_id.slice(0, 8);\n  const attachSuffix = msg.attachments?.length\n    ? ` [${msg.attachments.length} attachment: ${msg.attachments.map((a) => {\n      const parts = [`id:${a.id}`];\n      if (a.local_path) parts.push(`local:${a.local_path}`);\n      if (a.mime_type) parts.push(`type:${a.mime_type}`);\n      if (typeof a.size === \"number\") parts.push(`size:${a.size}`);\n      if (a.download_error) parts.push(`download_error:${a.download_error}`);\n      return `${a.filename} (${parts.join(\", \")})`;\n    }).join(\", \")}${msg.attachments.some((a) => a.local_path) ? \"\" : \" -- use wm attachment view to download\"}]`\n    : \"\";\n  const taskSuffix = msg.task_status\n    ? ` [task #${msg.task_number ?? \"?\"} status=${msg.task_status}]`\n    : \"\";\n  const body = `[target=${msg.target} msg=${msgShort} time=${msg.timestamp} type=${msg.sender_type}] @${msg.sender_name}: ${msg.content}${attachSuffix}${taskSuffix}`;\n  if (!msg.thread_join_context) return body;\n  const context = msg.thread_join_context;\n  const parentShort = context.parent_message.message_id.slice(0, 8);\n  const recent = context.recent_messages.length > 0\n    ? context.recent_messages.map((item) => `- [msg=${item.message_id.slice(0, 8)} time=${item.timestamp} type=${item.sender_type}] @${item.sender_name}: ${item.content}`).join(\"\\n\")\n    : \"- (no earlier thread replies)\";\n  return [\n    \"[System: You were added to a new thread via @mention. Read this context before replying.]\",\n    `parent: ${context.parent_target}`,\n    `thread: ${context.thread_target}`,\n    `suggested next step: wm message read --channel \"${context.suggested_read_history_target}\"`,\n    \"\",\n    \"Parent message:\",\n    `- [msg=${parentShort} time=${context.parent_message.timestamp} type=${context.parent_message.sender_type}] @${context.parent_message.sender_name}: ${context.parent_message.content}`,\n    \"\",\n    \"Recent thread context:\",\n    recent,\n    \"\",\n    body,\n  ].join(\"\\n\");\n}\n\n\nexport function makeId(prefix: string): string {\n  return `${prefix}_${crypto.randomUUID().replace(/-/g, \"\")}`;\n}\n", "import type { RuntimeSessionScope } from \"./protocol\";\n\nexport type ExternalScopeSource = \"feishu\" | \"mail\" | \"routine\" | \"webhook\" | \"system\";\n\n// \u751F\u6210\u7684 id \u4EC5\u4F5C\u4E0D\u900F\u660E key \u4F7F\u7528\uFF0C\u6D88\u8D39\u65B9\u7981\u6B62\u6309 \":\" \u89E3\u6790\u5176\u5185\u90E8\u7ED3\u6784\u3002\nexport function externalScope(source: ExternalScopeSource, sessionKey: string): RuntimeSessionScope {\n  const key = sessionKey.trim();\n  return { type: \"external\", id: `${source}:${key || \"default\"}` };\n}\n", "import type { ProxyModuleSpec, ProxyModuleTrigger } from \"../protocol\";\n\nexport type ProxyModuleSpecValidationResult =\n  | { ok: true; spec: ProxyModuleSpec }\n  | { ok: false; errors: string[] };\n\nconst ALLOWED_FIELDS = new Set([\"kind\", \"version\", \"name\", \"description\", \"trigger\"]);\nconst MIN_INTERVAL_SECONDS = 30;\nconst MAX_INTERVAL_SECONDS = 86_400;\nconst MAX_NAME_LENGTH = 60;\nconst MAX_DESCRIPTION_LENGTH = 500;\n\nexport function normalizeProxyModuleSpec(input: unknown): ProxyModuleSpec {\n  const result = validateProxyModuleSpec(input);\n  if (!result.ok) throw new Error(result.errors.join(\"; \"));\n  return result.spec;\n}\n\nexport function validateProxyModuleSpec(input: unknown): ProxyModuleSpecValidationResult {\n  const errors: string[] = [];\n  const raw = objectValue(input);\n  if (!raw) return { ok: false, errors: [\"proxy module spec must be an object\"] };\n\n  for (const key of Object.keys(raw)) {\n    if (!ALLOWED_FIELDS.has(key)) errors.push(`unknown field: ${key}`);\n  }\n  if (raw.kind !== \"proxy_module\") errors.push(\"kind must be proxy_module\");\n  if (raw.version !== 1) errors.push(\"version must be 1\");\n\n  const name = stringValue(raw.name);\n  if (!name) errors.push(\"name is required\");\n  else if (name.length > MAX_NAME_LENGTH) errors.push(`name must be <= ${MAX_NAME_LENGTH} chars`);\n\n  const description = stringValue(raw.description);\n  if (!description) errors.push(\"description is required\");\n  else if (description.length > MAX_DESCRIPTION_LENGTH) errors.push(`description must be <= ${MAX_DESCRIPTION_LENGTH} chars`);\n\n  const trigger = normalizeTrigger(raw.trigger, errors);\n\n  if (errors.length > 0) return { ok: false, errors };\n  return { ok: true, spec: { kind: \"proxy_module\", version: 1, name, description, trigger } };\n}\n\nexport function isProxyModuleSpec(input: unknown): input is ProxyModuleSpec {\n  return objectValue(input)?.kind === \"proxy_module\";\n}\n\n/** @deprecated connectors are no longer part of ProxyModuleSpec; this shim is a no-op */\nexport function redactProxyModuleSpec(spec: ProxyModuleSpec): ProxyModuleSpec {\n  return spec;\n}\n\nfunction normalizeTrigger(value: unknown, errors: string[]): ProxyModuleTrigger {\n  const trigger = objectValue(value);\n  if (!trigger) {\n    errors.push(\"trigger must be an object\");\n    return { type: \"interval\", interval_seconds: 180 };\n  }\n  if (trigger.type === \"event\") {\n    if (\"interval_seconds\" in trigger) errors.push(\"event trigger must not include interval_seconds\");\n    return { type: \"event\" };\n  }\n  if (trigger.type !== \"interval\") {\n    errors.push(\"trigger.type must be interval or event\");\n    return { type: \"interval\", interval_seconds: 180 };\n  }\n  const interval = Number(trigger.interval_seconds);\n  if (!Number.isInteger(interval) || interval < MIN_INTERVAL_SECONDS || interval > MAX_INTERVAL_SECONDS) {\n    errors.push(`interval_seconds must be integer between ${MIN_INTERVAL_SECONDS} and ${MAX_INTERVAL_SECONDS}`);\n    return { type: \"interval\", interval_seconds: 180 };\n  }\n  return { type: \"interval\", interval_seconds: interval };\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | undefined {\n  return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n}\n\nfunction stringValue(value: unknown): string {\n  return typeof value === \"string\" ? value.trim() : \"\";\n}\n", "import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type {\n  RuntimeId,\n  RuntimeModelDescriptor,\n  RuntimeModelDetectionResult,\n} from \"@claude-console/shared\";\nimport { authProbeSpecForRuntime, RuntimeAuthDetector, type RuntimeAuthDetectorOptions } from \"./auth-detector\";\n\nconst DEFAULT_REASONING = [\"default\"];\nconst CODEX_REASONING = [\"low\", \"medium\", \"high\", \"xhigh\"];\n\nexport interface RuntimeModelDetectorOptions {\n  homeDir?: string;\n  codexModelsCachePath?: string;\n  kimiConfigPath?: string;\n  hermesConfigPath?: string;\n  fetchImpl?: typeof fetch;\n  execFileImpl?: typeof execFile;\n  authDetector?: RuntimeAuthDetector;\n  authDetectorOptions?: RuntimeAuthDetectorOptions;\n  activeAuthProbe?: boolean;\n}\n\nexport class RuntimeModelDetector {\n  private readonly authDetector: RuntimeAuthDetector;\n\n  constructor(private readonly options: RuntimeModelDetectorOptions = {}) {\n    this.authDetector = options.authDetector ?? new RuntimeAuthDetector(options.authDetectorOptions);\n  }\n\n  async detectAll(runtimes: RuntimeId[]): Promise<RuntimeModelDetectionResult[]> {\n    return Promise.all(runtimes.map((runtime) => this.detect(runtime, { activeAuthProbe: true })));\n  }\n\n  async detect(runtime: RuntimeId, options: { activeAuthProbe?: boolean } = {}): Promise<RuntimeModelDetectionResult> {\n    if (process.env.WM_DAEMON_FAKE_RUNTIME_CHILD === \"1\") {\n      return withAuth(fakeRuntimeModelResult(runtime), {\n        installStatus: \"installed\",\n        authStatus: \"authenticated\",\n        authMethod: \"api_key\",\n      });\n    }\n\n    const auth = await this.authDetector.detect(authProbeSpecForRuntime(runtime), {\n      active: options.activeAuthProbe ?? this.options.activeAuthProbe ?? false,\n    });\n    if (auth.installStatus === \"not_installed\") {\n      return {\n        runtime,\n        source: runtime === \"opencode\" ? \"opencode-default\" : runtime === \"antigravity\" ? \"antigravity-cli\" : \"error\",\n        selectable: false,\n        fixed: true,\n        models: [],\n        error: `${runtime} CLI not installed`,\n        ...auth,\n      };\n    }\n    try {\n      if (runtime === \"codex\") {\n        try {\n          return withAuth(parseCodexModelsCache(await readFile(this.codexModelsCachePath(), \"utf8\")), auth);\n        } catch {\n          return withAuth(staticRuntimeModelResult(runtime), auth);\n        }\n      }\n      if (runtime === \"claude\") {\n        return withAuth(staticRuntimeModelResult(runtime), auth);\n      }\n      if (runtime === \"kimi\") {\n        const configPath = this.options.kimiConfigPath || process.env.KIMI_CONFIG_PATH || path.join(this.homeDir(), \".kimi\", \"config.toml\");\n        const parsed = parseKimiModelConfig(await readFile(configPath, \"utf8\"));\n        return withAuth({\n          runtime,\n          source: \"kimi-config\",\n          selectable: parsed.models.length > 1,\n          fixed: parsed.models.length <= 1,\n          defaultModel: parsed.defaultModel,\n          models: parsed.models,\n        }, auth);\n      }\n      if (runtime === \"cursor\") {\n        const { stdout, stderr } = await this.exec(\"cursor-agent\", [\"models\"], 15000);\n        const parsed = parseCursorModelsOutput(`${stdout}\\n${stderr}`);\n        return withAuth({\n          runtime,\n          source: \"cursor-cli\",\n          selectable: parsed.models.length > 0,\n          fixed: false,\n          defaultModel: parsed.defaultModel,\n          models: parsed.models,\n        }, auth);\n      }\n      if (runtime === \"hermes\") {\n        const configPath = this.options.hermesConfigPath || process.env.HERMES_CONFIG_PATH || path.join(this.homeDir(), \".hermes\", \"config.yaml\");\n        const configText = await readFile(configPath, \"utf8\");\n        const parsed = parseHermesModelConfig(configText);\n        const providerModels = await detectHermesProviderModels(configText, this.options.fetchImpl ?? fetch);\n        if (providerModels.models.length > 0) {\n          return withAuth({\n            runtime,\n            source: \"hermes-provider-models\",\n            selectable: providerModels.models.length > 1,\n            fixed: providerModels.models.length <= 1,\n            defaultModel: providerModels.defaultModel ?? parsed.defaultModel,\n            models: providerModels.models,\n          }, auth);\n        }\n        return withAuth({\n          runtime,\n          source: \"hermes-config\",\n          selectable: parsed.models.length > 1,\n          fixed: parsed.models.length <= 1,\n          defaultModel: parsed.defaultModel,\n          models: parsed.models,\n        }, auth);\n      }\n      if (runtime === \"antigravity\") {\n        return withAuth(staticAntigravityModelResult(), auth);\n      }\n      if (runtime === \"opencode\") {\n        const { stdout, stderr } = await this.exec(\"opencode\", [\"models\"], 15000);\n        const parsed = parseCursorModelsOutput(`${stdout}\\n${stderr}`);\n        return parsed.models.length > 0\n          ? withAuth({\n              runtime,\n              source: \"opencode-cli\",\n              selectable: true,\n              fixed: false,\n              defaultModel: parsed.defaultModel,\n              models: parsed.models,\n            }, auth)\n          : withAuth({\n              runtime,\n              source: \"opencode-default\",\n              selectable: false,\n              fixed: true,\n            models: [],\n          }, auth);\n      }\n      return withAuth({\n        runtime,\n        source: \"error\",\n        selectable: false,\n        fixed: true,\n        models: [],\n        error: `unsupported runtime ${runtime}`,\n      }, auth);\n    } catch (error) {\n      if (runtime === \"cursor\") {\n        const output = [\n          typeof (error as { stdout?: unknown }).stdout === \"string\" ? (error as { stdout: string }).stdout : \"\",\n          typeof (error as { stderr?: unknown }).stderr === \"string\" ? (error as { stderr: string }).stderr : \"\",\n        ].join(\"\\n\");\n        const parsed = parseCursorModelsOutput(output);\n        if (parsed.models.length > 0) {\n          return withAuth({\n            runtime,\n            source: \"cursor-cli\",\n            selectable: true,\n            fixed: false,\n            defaultModel: parsed.defaultModel,\n            models: parsed.models,\n            error: error instanceof Error ? error.message : String(error),\n          }, auth);\n        }\n      }\n      if (runtime === \"antigravity\") {\n        return withAuth({\n          ...staticAntigravityModelResult(),\n          error: error instanceof Error ? error.message : String(error),\n        }, auth);\n      }\n      if (runtime === \"opencode\") {\n        const output = [\n          typeof (error as { stdout?: unknown }).stdout === \"string\" ? (error as { stdout: string }).stdout : \"\",\n          typeof (error as { stderr?: unknown }).stderr === \"string\" ? (error as { stderr: string }).stderr : \"\",\n        ].join(\"\\n\");\n        const parsed = parseCursorModelsOutput(output);\n        if (parsed.models.length > 0) {\n          return withAuth({\n            runtime,\n            source: \"opencode-cli\",\n            selectable: true,\n            fixed: false,\n            defaultModel: parsed.defaultModel,\n            models: parsed.models,\n            error: error instanceof Error ? error.message : String(error),\n          }, auth);\n        }\n        return withAuth({\n          runtime,\n          source: \"opencode-default\",\n          selectable: false,\n          fixed: true,\n          models: [],\n          error: error instanceof Error ? error.message : String(error),\n        }, auth);\n      }\n      return withAuth({\n        runtime,\n        source: \"error\",\n        selectable: false,\n        fixed: true,\n        models: [],\n        error: error instanceof Error ? error.message : String(error),\n      }, auth);\n    }\n  }\n\n  private codexModelsCachePath(): string {\n    return this.options.codexModelsCachePath ?? process.env.CODEX_MODELS_CACHE_PATH ?? path.join(this.homeDir(), \".codex\", \"models_cache.json\");\n  }\n\n  private async exec(command: string, args: string[], timeout: number): Promise<{ stdout: string; stderr: string }> {\n    const execAsync = promisify(this.options.execFileImpl ?? execFile);\n    const result = await execAsync(command, args, { timeout, cwd: this.homeDir() });\n    if (typeof result === \"string\" || Buffer.isBuffer(result)) return { stdout: String(result), stderr: \"\" };\n    return {\n      stdout: typeof result.stdout === \"string\" ? result.stdout : String(result.stdout ?? \"\"),\n      stderr: typeof result.stderr === \"string\" ? result.stderr : String(result.stderr ?? \"\"),\n    };\n  }\n\n  private homeDir(): string {\n    return this.options.homeDir ?? os.homedir();\n  }\n}\n\nfunction withAuth(\n  result: RuntimeModelDetectionResult,\n  auth: Pick<RuntimeModelDetectionResult, \"installStatus\" | \"authStatus\" | \"authMethod\">\n): RuntimeModelDetectionResult {\n  return {\n    ...result,\n    installStatus: auth.installStatus,\n    authStatus: auth.authStatus,\n    authMethod: auth.authMethod,\n  };\n}\n\nexport function parseKimiModelConfig(configText: string): {\n  models: RuntimeModelDescriptor[];\n  defaultModel?: string;\n} {\n  const ids: string[] = [];\n  const labels = new Map<string, string>();\n  let defaultModel: string | undefined;\n  let section: string | undefined;\n  let currentModelKey: string | undefined;\n  for (const rawLine of configText.split(/\\r?\\n/)) {\n    const line = stripYamlComment(rawLine).trim();\n    if (!line) continue;\n    const table = line.match(/^\\[models\\.([^\\]]+)]$/);\n    if (table) {\n      currentModelKey = unquote(table[1]!.trim());\n      section = `models.${currentModelKey}`;\n      pushUnique(ids, currentModelKey);\n      continue;\n    }\n    const anyTable = line.match(/^\\[([^\\]]+)]$/);\n    if (anyTable) {\n      section = anyTable[1]?.trim();\n      currentModelKey = undefined;\n      continue;\n    }\n    const defaultModelLine = line.match(/^default_model\\s*=\\s*[\"']?([^\"']+)[\"']?\\s*$/);\n    if (defaultModelLine) {\n      defaultModel = defaultModelLine[1]?.trim();\n      pushUnique(ids, defaultModel);\n      continue;\n    }\n    if (section?.startsWith(\"models.\")) {\n      const model = line.match(/^model\\s*=\\s*[\"']?([^\"']+)[\"']?\\s*$/);\n      if (model && currentModelKey) labels.set(currentModelKey, model[1]!.trim());\n      continue;\n    }\n    const model = line.match(/^model\\s*=\\s*[\"']?([^\"']+)[\"']?\\s*$/);\n    if (model) {\n      const value = model[1]?.trim();\n      defaultModel ??= value;\n      pushUnique(ids, value);\n      continue;\n    }\n    const array = line.match(/^(?:models|available_models)\\s*=\\s*\\[(.+)\\]\\s*$/);\n    if (array) {\n      for (const part of array[1]!.split(\",\")) pushUnique(ids, unquote(part.trim()));\n    }\n  }\n  const models = ids.map((id) => ({\n    ...defaultReasoningModel(id, id === defaultModel),\n    label: labels.get(id) ?? id,\n    default: id === defaultModel ? true : undefined,\n  }));\n  return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nexport function staticRuntimeModelResult(runtime: \"codex\" | \"claude\"): RuntimeModelDetectionResult {\n  if (runtime === \"codex\") {\n    const models = [\n      codexModel(\"gpt-5.5\", \"medium\", true),\n      codexModel(\"gpt-5.4\", \"medium\"),\n      codexModel(\"gpt-5.4-mini\", \"medium\"),\n      codexModel(\"gpt-5.3-codex\", \"medium\"),\n      codexModel(\"gpt-5.3-codex-spark\", \"high\"),\n      codexModel(\"gpt-5.2\", \"medium\"),\n    ];\n    return {\n      runtime,\n      source: \"static\",\n      selectable: true,\n      fixed: false,\n      defaultModel: \"gpt-5.5\",\n      models,\n    };\n  }\n  return {\n    runtime,\n    source: \"static\",\n    selectable: true,\n    fixed: false,\n    defaultModel: \"sonnet\",\n    models: [\n      defaultReasoningModel(\"haiku\", false),\n      { id: \"sonnet\", label: \"sonnet\", default: true, reasoningEfforts: [\"adaptive\", \"low\", \"medium\", \"high\", \"max\"], defaultReasoningEffort: \"adaptive\" },\n      { id: \"opus\", label: \"opus\", reasoningEfforts: [\"adaptive\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], defaultReasoningEffort: \"adaptive\" },\n    ],\n  };\n}\n\nfunction staticAntigravityModelResult(): RuntimeModelDetectionResult {\n  return {\n    runtime: \"antigravity\",\n    source: \"antigravity-cli\",\n    selectable: true,\n    fixed: false,\n    defaultModel: \"Gemini 3.5 Flash (Medium)\",\n    models: [\n      defaultReasoningModel(\"Gemini 3.5 Flash (Medium)\", true),\n      defaultReasoningModel(\"Gemini 3.5 Flash (High)\", false),\n      defaultReasoningModel(\"Gemini 3.5 Flash (Low)\", false),\n      defaultReasoningModel(\"Gemini 3.1 Pro (Low)\", false),\n      defaultReasoningModel(\"Gemini 3.1 Pro (High)\", false),\n      defaultReasoningModel(\"Gemini 3 Flash\", false),\n      defaultReasoningModel(\"Claude Sonnet 4.6 (Thinking)\", false),\n    ],\n  };\n}\n\nfunction fakeRuntimeModelResult(runtime: RuntimeId): RuntimeModelDetectionResult {\n  if (runtime === \"codex\" || runtime === \"claude\") return staticRuntimeModelResult(runtime);\n  if (runtime === \"kimi\") {\n    return {\n      runtime,\n      source: \"kimi-config\",\n      selectable: true,\n      fixed: false,\n      defaultModel: \"kimi-k2.6\",\n      models: [\n        defaultReasoningModel(\"kimi-k2.6\", true),\n        defaultReasoningModel(\"kimi-k2.5\", false),\n      ],\n    };\n  }\n  if (runtime === \"cursor\") {\n    return {\n      runtime,\n      source: \"cursor-cli\",\n      selectable: true,\n      fixed: false,\n      defaultModel: \"composer-2-fast\",\n      models: [\n        defaultReasoningModel(\"composer-2-fast\", true),\n        defaultReasoningModel(\"gpt-5.5-medium\", false),\n      ],\n    };\n  }\n  if (runtime === \"antigravity\") {\n    return staticAntigravityModelResult();\n  }\n  if (runtime === \"opencode\") {\n    return {\n      runtime,\n      source: \"opencode-default\",\n      selectable: false,\n      fixed: true,\n      defaultModel: \"default\",\n      models: [{ ...defaultReasoningModel(\"default\", true), fixed: true }],\n    };\n  }\n  return {\n    runtime,\n    source: \"error\",\n    selectable: false,\n    fixed: true,\n    models: [],\n    error: \"legacy runtime is not part of fake runtime model fixture\",\n  };\n}\n\nexport interface HermesProviderConfig {\n  name?: string;\n  baseUrl?: string;\n  apiKey?: string;\n  model?: string;\n}\n\nexport function parseHermesProviderConfigs(configText: string): HermesProviderConfig[] {\n  const providers: HermesProviderConfig[] = [];\n  const lines = configText.split(/\\r?\\n/);\n  let insideCustomProviders = false;\n  let current: HermesProviderConfig | undefined;\n  const flush = (): void => {\n    if (current && (current.baseUrl || current.apiKey || current.model)) providers.push(current);\n    current = undefined;\n  };\n  for (const line of lines) {\n    const raw = stripYamlComment(line);\n    if (!raw.trim()) continue;\n    if (/^\\S/.test(raw) && !/^-/.test(raw)) {\n      if (insideCustomProviders) flush();\n      insideCustomProviders = /^custom_providers:\\s*$/.test(raw);\n      continue;\n    }\n    if (!insideCustomProviders) continue;\n    const item = raw.match(/^\\s*-\\s*(?:(name|base_url|api_key|model):\\s*(.+?)\\s*)?$/);\n    if (item) {\n      flush();\n      current = {};\n      if (item[1]) assignHermesProviderField(current, item[1], item[2]);\n      continue;\n    }\n    const field = raw.match(/^\\s*(name|base_url|api_key|model):\\s*(.+?)\\s*$/);\n    if (field) {\n      current ??= {};\n      assignHermesProviderField(current, field[1], field[2]);\n    }\n  }\n  if (insideCustomProviders) flush();\n  return providers;\n}\n\nexport async function detectHermesProviderModels(\n  configText: string,\n  fetchImpl: typeof fetch = fetch\n): Promise<{ models: RuntimeModelDescriptor[]; defaultModel?: string }> {\n  const ids: string[] = [];\n  let defaultModel: string | undefined;\n  for (const provider of parseHermesProviderConfigs(configText)) {\n    if (!provider.baseUrl || !provider.apiKey) continue;\n    defaultModel ??= provider.model;\n    pushUnique(ids, provider.model);\n    const url = `${provider.baseUrl.replace(/\\/+$/, \"\")}/models`;\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), 8000);\n    try {\n      const response = await fetchImpl(url, {\n        headers: { authorization: `Bearer ${provider.apiKey}` },\n        signal: controller.signal,\n      });\n      if (!response.ok) continue;\n      for (const id of parseOpenAIModelIds(await response.json())) pushUnique(ids, id);\n    } catch {\n      // Keep provider tokens private and fall back to the configured current model.\n    } finally {\n      clearTimeout(timeout);\n    }\n  }\n  const models = ids.map((id) => ({\n    ...defaultReasoningModel(id, defaultModel === id),\n    default: defaultModel === id ? true : undefined,\n  }));\n  return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nexport function parseOpenAIModelIds(value: unknown): string[] {\n  const data = Array.isArray((value as { data?: unknown } | undefined)?.data)\n    ? (value as { data: unknown[] }).data\n    : Array.isArray(value)\n      ? value\n      : [];\n  const ids: string[] = [];\n  for (const item of data) {\n    if (typeof item === \"string\") {\n      pushUnique(ids, item);\n      continue;\n    }\n    if (item && typeof item === \"object\") {\n      pushUnique(ids, stringField(item as Record<string, unknown>, \"id\"));\n    }\n  }\n  return ids;\n}\n\nfunction assignHermesProviderField(provider: HermesProviderConfig, key: string, rawValue: string | undefined): void {\n  const value = rawValue ? unquote(rawValue) : \"\";\n  if (!value) return;\n  if (key === \"name\") provider.name = value;\n  if (key === \"base_url\") provider.baseUrl = value;\n  if (key === \"api_key\") provider.apiKey = value;\n  if (key === \"model\") provider.model = value;\n}\n\nexport function parseCodexModelsCache(cacheText: string): RuntimeModelDetectionResult {\n  const parsed = JSON.parse(cacheText) as unknown;\n  const rawModels = Array.isArray(parsed)\n    ? parsed\n    : Array.isArray((parsed as { models?: unknown }).models)\n      ? (parsed as { models: unknown[] }).models\n      : [];\n  const models = rawModels\n    .map(parseCodexModel)\n    .filter((model): model is RuntimeModelDescriptor => Boolean(model));\n  if (models.length === 0) throw new Error(\"Codex model cache contains no models\");\n  const defaultModel = models.find((model) => model.default)?.id ?? models[0]!.id;\n  return {\n    runtime: \"codex\",\n    source: \"codex-cache\",\n    selectable: true,\n    fixed: false,\n    defaultModel,\n    models: normalizeDefault(models, defaultModel),\n  };\n}\n\nexport function parseCursorModelsOutput(output: string): {\n  models: RuntimeModelDescriptor[];\n  defaultModel?: string;\n} {\n  const models: RuntimeModelDescriptor[] = [];\n  let defaultModel: string | undefined;\n  for (const rawLine of output.split(/\\r?\\n/)) {\n    const line = stripAnsi(rawLine).trim();\n    if (!line || /^(available|models?|model\\s+id|name|loading|tip:)\\b/i.test(line)) continue;\n    const markedDefault = /\\b(default|current)\\b/i.test(line);\n    const cleaned = line\n      .replace(/^[*\\-\\u2022\u2713\\s]+/, \"\")\n      .replace(/\\((?:default|current)\\)/gi, \"\")\n      .replace(/\\[(?:default|current)\\]/gi, \"\")\n      .trim();\n    const id = cleaned.split(/\\s+-\\s+|\\s+/)[0]?.trim();\n    if (!id || id.includes(\":\") || /[\\u001b\\u009b]/.test(id)) continue;\n    if (models.some((model) => model.id === id)) continue;\n    models.push({ ...defaultReasoningModel(id, markedDefault && !defaultModel), default: markedDefault && !defaultModel ? true : undefined });\n    if (markedDefault && !defaultModel) defaultModel = id;\n  }\n  if (!defaultModel && models[0]) {\n    defaultModel = models[0].id;\n    models[0] = { ...models[0], default: true };\n  }\n  return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nexport function parseAntigravityModelsOutput(output: string): {\n  models: RuntimeModelDescriptor[];\n  defaultModel?: string;\n} {\n  const models: RuntimeModelDescriptor[] = [];\n  for (const rawLine of output.split(/\\r?\\n/)) {\n    const line = stripAnsi(rawLine).trim();\n    if (!line || /^(usage|available|models?|error|warning)[:\\s]/i.test(line)) continue;\n    const cleaned = line\n      .replace(/^[*\\-\\u2022\u2713\\s]+/, \"\")\n      .replace(/\\s+\\((?:default|current)\\)\\s*$/i, \"\")\n      .trim();\n    if (!cleaned || cleaned.length > 120) continue;\n    if (!/[A-Za-z0-9]/.test(cleaned)) continue;\n    if (models.some((model) => model.id === cleaned)) continue;\n    models.push(defaultReasoningModel(cleaned, models.length === 0));\n  }\n  const defaultModel = models[0]?.id;\n  return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nfunction stripAnsi(value: string): string {\n  return value.replace(\n    // eslint-disable-next-line no-control-regex\n    /[\\u001b\\u009b][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))/g,\n    \"\"\n  );\n}\n\nexport function parseHermesModelConfig(configText: string): {\n  models: RuntimeModelDescriptor[];\n  defaultModel?: string;\n} {\n  const ids: string[] = [];\n  let defaultModel: string | undefined;\n  const lines = configText.split(/\\r?\\n/);\n  let insideCustomProviders = false;\n  for (let index = 0; index < lines.length; index += 1) {\n    const raw = stripYamlComment(lines[index] ?? \"\");\n    if (/^\\S/.test(raw) && !/^-/.test(raw)) {\n      insideCustomProviders = /^custom_providers:\\s*$/.test(raw);\n    }\n\n    const topModel = raw.match(/^model:\\s*(.+?)\\s*$/);\n    if (topModel && unquote(topModel[1])) {\n      defaultModel = unquote(topModel[1]);\n      pushUnique(ids, defaultModel);\n      continue;\n    }\n\n    const providerModel = raw.match(/^\\s+model:\\s*(.+?)\\s*$/);\n    if (insideCustomProviders && providerModel && unquote(providerModel[1])) {\n      const model = unquote(providerModel[1]);\n      if (!defaultModel) defaultModel = model;\n      pushUnique(ids, model);\n      continue;\n    }\n\n    const inlineModels = raw.match(/^\\s*models:\\s*\\[(.+?)\\]\\s*$/);\n    if (inlineModels) {\n      for (const value of inlineModels[1].split(\",\")) pushUnique(ids, unquote(value));\n      continue;\n    }\n\n    if (!/^\\s*models:\\s*$/.test(raw)) continue;\n    const parentIndent = indentOf(raw);\n    let childIndent: number | undefined;\n    for (let next = index + 1; next < lines.length; next += 1) {\n      const nested = stripYamlComment(lines[next] ?? \"\");\n      if (!nested.trim()) continue;\n      if (indentOf(nested) <= parentIndent) break;\n      childIndent ??= indentOf(nested);\n      if (indentOf(nested) !== childIndent) continue;\n      const item = nested.match(/^\\s*-\\s*(.+?)\\s*$/);\n      const named = nested.match(/^\\s*(?:name|id):\\s*(.+?)\\s*$/);\n      const mapped = nested.match(/^\\s*([A-Za-z0-9._:/+-]+):(?:\\s|$)/);\n      if (item) {\n        const value = item[1].match(/^(?:name|id):\\s*(.+?)\\s*$/)?.[1] ?? item[1];\n        pushUnique(ids, unquote(value));\n      } else if (named) {\n        pushUnique(ids, unquote(named[1]));\n      } else if (mapped) {\n        pushUnique(ids, unquote(mapped[1]));\n      }\n    }\n  }\n\n  const models = ids.map((id) => ({\n    ...defaultReasoningModel(id, defaultModel === id),\n    default: defaultModel === id ? true : undefined,\n  }));\n  return { models: normalizeDefault(models, defaultModel), defaultModel };\n}\n\nfunction normalizeDefault(models: RuntimeModelDescriptor[], defaultModel?: string): RuntimeModelDescriptor[] {\n  return models.map((model) => ({\n    ...model,\n    default: defaultModel ? model.id === defaultModel : model.default,\n  }));\n}\n\nfunction codexModel(id: string, defaultReasoningEffort: string, isDefault = false): RuntimeModelDescriptor {\n  return {\n    id,\n    label: id,\n    default: isDefault ? true : undefined,\n    reasoningEfforts: CODEX_REASONING,\n    defaultReasoningEffort,\n  };\n}\n\nfunction defaultReasoningModel(id: string, isDefault = false): RuntimeModelDescriptor {\n  return {\n    id,\n    label: id,\n    default: isDefault ? true : undefined,\n    reasoningEfforts: DEFAULT_REASONING,\n    defaultReasoningEffort: \"default\",\n  };\n}\n\nfunction parseCodexModel(value: unknown): RuntimeModelDescriptor | undefined {\n  if (!value || typeof value !== \"object\") return undefined;\n  const record = value as Record<string, unknown>;\n  const id = stringField(record, \"id\") ?? stringField(record, \"slug\") ?? stringField(record, \"name\") ?? stringField(record, \"model\");\n  if (!id) return undefined;\n  const reasoningEfforts = parseReasoningEfforts(record.supported_reasoning_levels);\n  const defaultReasoningEffort = stringField(record, \"default_reasoning_level\");\n  const effectiveEfforts = reasoningEfforts.length > 0 ? reasoningEfforts : CODEX_REASONING;\n  return {\n    id,\n    label: stringField(record, \"display_name\") ?? stringField(record, \"displayName\") ?? id,\n    default: record.default === true ? true : undefined,\n    reasoningEfforts: effectiveEfforts,\n    defaultReasoningEffort: defaultReasoningEffort && effectiveEfforts.includes(defaultReasoningEffort)\n      ? defaultReasoningEffort\n      : effectiveEfforts[0],\n  };\n}\n\nfunction parseReasoningEfforts(value: unknown): string[] {\n  if (!Array.isArray(value)) return [];\n  const efforts: string[] = [];\n  for (const item of value) {\n    const effort = typeof item === \"string\"\n      ? item\n      : item && typeof item === \"object\"\n        ? stringField(item as Record<string, unknown>, \"effort\") ?? stringField(item as Record<string, unknown>, \"id\") ?? stringField(item as Record<string, unknown>, \"name\")\n        : undefined;\n    pushUnique(efforts, effort);\n  }\n  return efforts;\n}\n\nfunction stringField(record: Record<string, unknown>, key: string): string | undefined {\n  const value = record[key];\n  return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction pushUnique(values: string[], value: string | undefined): void {\n  const trimmed = value?.trim();\n  if (!trimmed || values.includes(trimmed)) return;\n  values.push(trimmed);\n}\n\nfunction stripYamlComment(value: string): string {\n  return value.replace(/\\s+#.*$/, \"\");\n}\n\nfunction indentOf(value: string): number {\n  return value.length - value.trimStart().length;\n}\n\nfunction unquote(value: string): string {\n  return value.trim().replace(/^['\"]|['\"]$/g, \"\");\n}\n", "import { execFile } from \"node:child_process\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { RuntimeId } from \"@claude-console/shared\";\n\nconst PYTHON_PTY_BRIDGE = `\nimport os, pty, select, signal, sys, time\ntimeout_ms = int(sys.argv[1])\ncmd = sys.argv[2:]\npid, fd = pty.fork()\nif pid == 0:\n    os.execvp(cmd[0], cmd)\ndeadline = time.time() + (timeout_ms / 1000.0)\nchunks = []\nexit_code = None\nwhile True:\n    if time.time() > deadline:\n        try:\n            os.kill(pid, signal.SIGTERM)\n        except OSError:\n            pass\n        exit_code = 124\n        break\n    try:\n        done, status = os.waitpid(pid, os.WNOHANG)\n        if done:\n            exit_code = os.waitstatus_to_exitcode(status)\n            break\n    except ChildProcessError:\n        exit_code = 0\n        break\n    ready, _, _ = select.select([fd], [], [], 0.1)\n    if fd in ready:\n        try:\n            data = os.read(fd, 4096)\n            if not data:\n                break\n            chunks.append(data)\n        except OSError:\n            break\ntry:\n    while True:\n        ready, _, _ = select.select([fd], [], [], 0)\n        if fd not in ready:\n            break\n        data = os.read(fd, 4096)\n        if not data:\n            break\n        chunks.append(data)\nexcept OSError:\n    pass\nsys.stdout.buffer.write(b''.join(chunks))\nsys.exit(exit_code if exit_code is not None else 0)\n`;\n\nexport type RuntimeInstallStatus = \"installed\" | \"not_installed\";\nexport type RuntimeAuthStatus = \"authenticated\" | \"unauthenticated\" | \"expired\" | \"unknown\";\nexport type RuntimeAuthMethod = \"api_key\" | \"oauth\";\n\nexport interface RuntimeAuthDetectionResult {\n  installStatus: RuntimeInstallStatus;\n  authStatus?: RuntimeAuthStatus;\n  authMethod?: RuntimeAuthMethod;\n}\n\nexport interface AuthProbeSpec {\n  runtime: RuntimeId;\n  binaryName: string;\n  credentialPaths: string[];\n  apiKeyEnvVars: string[];\n  activeProbe?: { command: string[]; timeoutMs: number; pseudoTty?: boolean };\n  apiKeyProbe?: { provider: \"anthropic\" | \"openai\" | \"moonshot\" | \"cursor\"; timeoutMs: number };\n}\n\nexport interface RuntimeAuthDetectorOptions {\n  env?: NodeJS.ProcessEnv;\n  homedir?: string;\n  platform?: NodeJS.Platform;\n  execFileImpl?: typeof execFile;\n  fetchImpl?: typeof fetch;\n  accessImpl?: typeof access;\n  readFileImpl?: typeof readFile;\n}\n\nexport class RuntimeAuthDetector {\n  private readonly lastActive = new Map<RuntimeId, Pick<RuntimeAuthDetectionResult, \"authStatus\" | \"authMethod\">>();\n\n  constructor(private readonly options: RuntimeAuthDetectorOptions = {}) {}\n\n  detectStatic(spec: AuthProbeSpec): RuntimeAuthDetectionResult {\n    if (!this.hasExecutable(spec.binaryName)) {\n      return { installStatus: \"not_installed\" };\n    }\n    const env = this.options.env ?? process.env;\n    for (const key of spec.apiKeyEnvVars) {\n      if (typeof env[key] === \"string\" && env[key]!.trim()) {\n        return { installStatus: \"installed\", authStatus: \"unknown\", authMethod: \"api_key\" };\n      }\n    }\n    const credentialPath = this.firstExistingPath(spec.credentialPaths);\n    if (!credentialPath) {\n      return { installStatus: \"installed\", authStatus: spec.credentialPaths.length > 0 || spec.apiKeyEnvVars.length > 0 ? \"unauthenticated\" : \"unknown\" };\n    }\n    const method = this.authMethodFromCredentialPath(spec.runtime, credentialPath);\n    const credentialMethod = this.credentialFileApiKey(spec.runtime, credentialPath) ? \"api_key\" : undefined;\n    return { installStatus: \"installed\", authStatus: \"unknown\", authMethod: credentialMethod ?? method };\n  }\n\n  async detectActive(spec: AuthProbeSpec): Promise<Pick<RuntimeAuthDetectionResult, \"authStatus\" | \"authMethod\">> {\n    if (!spec.activeProbe) return {};\n    const [command, ...args] = spec.activeProbe.command;\n    if (!command) return {};\n    try {\n      const { stdout, stderr } = spec.activeProbe.pseudoTty\n        ? await this.execPseudoTty(command, args, spec.activeProbe.timeoutMs)\n        : await this.exec(command, args, spec.activeProbe.timeoutMs);\n      const parsed = parseActiveAuthProbe(spec.runtime, `${stdout}\\n${stderr}`);\n      if (parsed.authStatus) this.lastActive.set(spec.runtime, parsed);\n      return parsed;\n    } catch (error) {\n      if (isTimeoutError(error)) {\n        return this.lastActive.get(spec.runtime) ?? { authStatus: \"unknown\" };\n      }\n      const output = [\n        typeof (error as { stdout?: unknown }).stdout === \"string\" ? (error as { stdout: string }).stdout : \"\",\n        typeof (error as { stderr?: unknown }).stderr === \"string\" ? (error as { stderr: string }).stderr : \"\",\n        error instanceof Error ? error.message : String(error),\n      ].join(\"\\n\");\n      const parsed = parseActiveAuthProbe(spec.runtime, output, true);\n      if (parsed.authStatus) this.lastActive.set(spec.runtime, parsed);\n      return parsed;\n    }\n  }\n\n  async detect(spec: AuthProbeSpec, options: { active?: boolean } = {}): Promise<RuntimeAuthDetectionResult> {\n    const stat = this.detectStatic(spec);\n    if (stat.installStatus === \"not_installed\" || !options.active) return stat;\n    const active = await this.detectActive(spec);\n    if (active.authStatus === \"authenticated\") {\n      return { ...stat, authStatus: \"authenticated\", authMethod: active.authMethod ?? stat.authMethod };\n    }\n    const apiKey = await this.detectApiKey(spec);\n    if (apiKey.authStatus === \"authenticated\") {\n      return { ...stat, authStatus: \"authenticated\", authMethod: \"api_key\" };\n    }\n    if (apiKey.authStatus === \"unauthenticated\") {\n      return { ...stat, authStatus: \"unauthenticated\", authMethod: \"api_key\" };\n    }\n    const activeStatus = active.authStatus === \"unknown\" ? stat.authStatus : active.authStatus;\n    return {\n      ...stat,\n      authStatus: activeStatus ?? stat.authStatus,\n      authMethod: active.authMethod ?? stat.authMethod,\n    };\n  }\n\n  private hasExecutable(binaryName: string): boolean {\n    if (binaryName.includes(\"/\") || binaryName.includes(\"\\\\\")) return this.existsSyncLike(binaryName);\n    const pathEnv = (this.options.env ?? process.env).PATH ?? \"\";\n    const suffixes = this.platform() === \"win32\" ? [\"\", \".exe\", \".cmd\", \".bat\"] : [\"\"];\n    for (const dir of pathEnv.split(path.delimiter)) {\n      if (!dir) continue;\n      for (const suffix of suffixes) {\n        if (this.existsSyncLike(path.join(dir, `${binaryName}${suffix}`))) return true;\n      }\n    }\n    return false;\n  }\n\n  private firstExistingPath(paths: string[]): string | undefined {\n    for (const raw of paths) {\n      const expanded = this.expandPath(raw);\n      if (this.existsSyncLike(expanded)) return expanded;\n    }\n    return undefined;\n  }\n\n  private existsSyncLike(filePath: string): boolean {\n    const fs = require(\"node:fs\") as typeof import(\"node:fs\");\n    try {\n      fs.accessSync(filePath);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  private authMethodFromCredentialPath(runtime: RuntimeId, credentialPath: string): RuntimeAuthMethod | undefined {\n    const lower = credentialPath.toLowerCase();\n    if (runtime === \"kimi\" || runtime === \"hermes\") return \"api_key\";\n    if (lower.includes(\"oauth\") || lower.includes(\"auth\") || lower.includes(\"credential\")) return \"oauth\";\n    return undefined;\n  }\n\n  private credentialFileApiKey(runtime: RuntimeId, credentialPath: string): string | undefined {\n    try {\n      const text = readFileSync(credentialPath, \"utf8\");\n      if (runtime === \"kimi\" || runtime === \"hermes\" || runtime === \"claude\") {\n        return extractNamedSecret(text, [\"api_key\", \"api-key\", \"access_token\", \"auth_token\", \"token\"]);\n      }\n      if (runtime === \"opencode\") {\n        const parsed = parseJsonObject(text);\n        if (parsed) {\n          for (const value of Object.values(parsed)) {\n            if (value && typeof value === \"object\" && !Array.isArray(value)) {\n              const record = value as Record<string, unknown>;\n              if (typeof record.key === \"string\" && record.key.trim()) return record.key.trim();\n            }\n          }\n        }\n      }\n      if (runtime === \"codex\") {\n        const parsed = parseJsonObject(text);\n        const key = parsed?.OPENAI_API_KEY;\n        if (typeof key === \"string\" && key.trim()) return key.trim();\n      }\n      return undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  private async detectApiKey(spec: AuthProbeSpec): Promise<Pick<RuntimeAuthDetectionResult, \"authStatus\" | \"authMethod\">> {\n    if (!spec.apiKeyProbe) return {};\n    const key = this.firstApiKeyCandidate(spec);\n    if (!key) return {};\n    try {\n      const ok = await this.validateApiKey(spec, key, spec.apiKeyProbe);\n      return ok\n        ? { authStatus: \"authenticated\", authMethod: \"api_key\" }\n        : { authStatus: \"unauthenticated\", authMethod: \"api_key\" };\n    } catch {\n      return { authStatus: \"unknown\", authMethod: \"api_key\" };\n    }\n  }\n\n  private firstApiKeyCandidate(spec: AuthProbeSpec): string | undefined {\n    const env = this.options.env ?? process.env;\n    for (const key of spec.apiKeyEnvVars) {\n      const value = env[key];\n      if (typeof value === \"string\" && value.trim()) return value.trim();\n    }\n    for (const raw of spec.credentialPaths) {\n      const expanded = this.expandPath(raw);\n      if (!this.existsSyncLike(expanded)) continue;\n      const value = this.credentialFileApiKey(spec.runtime, expanded);\n      if (value) return value;\n    }\n    return undefined;\n  }\n\n  private async validateApiKey(spec: AuthProbeSpec, key: string, probe: NonNullable<AuthProbeSpec[\"apiKeyProbe\"]>): Promise<boolean> {\n    const controller = new AbortController();\n    const timer = setTimeout(() => controller.abort(), probe.timeoutMs);\n    try {\n      const fetchImpl = this.options.fetchImpl ?? fetch;\n      const { url, headers } = this.apiKeyProbeRequest(spec, key, probe.provider);\n      const response = await fetchImpl(url, { method: \"GET\", headers, signal: controller.signal });\n      if (response.status === 401 || response.status === 403) return false;\n      return response.ok;\n    } finally {\n      clearTimeout(timer);\n    }\n  }\n\n  private apiKeyProbeRequest(spec: AuthProbeSpec, key: string, provider: NonNullable<AuthProbeSpec[\"apiKeyProbe\"]>[\"provider\"]): { url: string; headers: Record<string, string> } {\n    if (provider === \"anthropic\") {\n      return {\n        url: \"https://api.anthropic.com/v1/models\",\n        headers: { \"x-api-key\": key, \"anthropic-version\": \"2023-06-01\" },\n      };\n    }\n    if (provider === \"cursor\") {\n      return {\n        url: \"https://api.cursor.com/v0/models\",\n        headers: { Authorization: `Bearer ${key}` },\n      };\n    }\n    if (provider === \"moonshot\") {\n      const baseUrl = this.moonshotBaseUrl(spec) ?? \"https://api.moonshot.cn/v1\";\n      return {\n        url: `${baseUrl.replace(/\\/+$/, \"\")}/models`,\n        headers: { Authorization: `Bearer ${key}` },\n      };\n    }\n    return {\n      url: \"https://api.openai.com/v1/models\",\n      headers: { Authorization: `Bearer ${key}` },\n    };\n  }\n\n  private moonshotBaseUrl(spec: AuthProbeSpec): string | undefined {\n    for (const raw of spec.credentialPaths) {\n      const expanded = this.expandPath(raw);\n      if (!this.existsSyncLike(expanded)) continue;\n      try {\n        const text = readFileSync(expanded, \"utf8\");\n        const value = extractNamedSecret(text, [\"base_url\", \"base-url\"]);\n        if (value) return value;\n      } catch {\n        continue;\n      }\n    }\n    return undefined;\n  }\n\n  private async exec(command: string, args: string[], timeoutMs: number): Promise<{ stdout: string; stderr: string }> {\n    const impl = this.options.execFileImpl ?? execFile;\n    const execAsync = promisify(impl);\n    const result = await execAsync(command, args, { timeout: timeoutMs, cwd: this.homedir() });\n    if (typeof result === \"string\" || Buffer.isBuffer(result)) {\n      return { stdout: String(result), stderr: \"\" };\n    }\n    return {\n      stdout: typeof result.stdout === \"string\" ? result.stdout : String(result.stdout ?? \"\"),\n      stderr: typeof result.stderr === \"string\" ? result.stderr : String(result.stderr ?? \"\"),\n    };\n  }\n\n  private async execPseudoTty(command: string, args: string[], timeoutMs: number): Promise<{ stdout: string; stderr: string }> {\n    if (this.platform() === \"win32\") return this.exec(command, args, timeoutMs);\n    let lastError: unknown;\n    for (const python of [\"python3\", \"python\"]) {\n      try {\n        return await this.exec(python, [\"-c\", PYTHON_PTY_BRIDGE, String(timeoutMs), command, ...args], timeoutMs + 2_000);\n      } catch (error) {\n        lastError = error;\n        if (!isCommandNotFoundError(error)) throw error;\n      }\n    }\n    if (lastError) throw lastError;\n    return this.exec(command, args, timeoutMs);\n  }\n\n  private expandPath(input: string): string {\n    if (input.startsWith(\"~/\")) return path.join(this.homedir(), input.slice(2));\n    if (input.includes(\"$HOME\")) return input.replaceAll(\"$HOME\", this.homedir());\n    return input;\n  }\n\n  private homedir(): string {\n    return this.options.homedir ?? os.homedir();\n  }\n\n  private platform(): NodeJS.Platform {\n    return this.options.platform ?? process.platform;\n  }\n}\n\nexport function authProbeSpecForRuntime(runtime: RuntimeId, options: { homedir?: string; env?: NodeJS.ProcessEnv; platform?: NodeJS.Platform } = {}): AuthProbeSpec {\n  const home = options.homedir ?? os.homedir();\n  const credential = (...parts: string[]) => path.join(home, ...parts);\n  switch (runtime) {\n    case \"claude\":\n      return {\n        runtime,\n        binaryName: \"claude\",\n        credentialPaths: [credential(\".claude\", \".credentials.json\"), credential(\".claude.json\"), credential(\".claude\", \"settings.json\")],\n        apiKeyEnvVars: [\"ANTHROPIC_API_KEY\", \"ANTHROPIC_AUTH_TOKEN\"],\n        activeProbe: { command: [\"claude\", \"auth\", \"status\", \"--json\"], timeoutMs: 10_000 },\n        apiKeyProbe: { provider: \"anthropic\", timeoutMs: 5_000 },\n      };\n    case \"codex\":\n      return {\n        runtime,\n        binaryName: \"codex\",\n        credentialPaths: [credential(\".codex\", \"auth.json\")],\n        apiKeyEnvVars: [\"OPENAI_API_KEY\"],\n        activeProbe: { command: [\"codex\", \"login\", \"status\"], timeoutMs: 10_000 },\n        apiKeyProbe: { provider: \"openai\", timeoutMs: 5_000 },\n      };\n    case \"kimi\":\n      return {\n        runtime,\n        binaryName: \"kimi\",\n        credentialPaths: [options.env?.KIMI_CONFIG_PATH ?? credential(\".kimi\", \"config.toml\")],\n        apiKeyEnvVars: [\"MOONSHOT_API_KEY\", \"KIMI_API_KEY\", \"KIMI_API_CODE\"],\n        apiKeyProbe: { provider: \"moonshot\", timeoutMs: 5_000 },\n      };\n    case \"cursor\":\n      return {\n        runtime,\n        binaryName: \"cursor-agent\",\n        credentialPaths: [credential(\".cursor\", \"cli-config.json\"), credential(\".config\", \"cursor\", \"cli-config.json\")],\n        apiKeyEnvVars: [\"CURSOR_API_KEY\"],\n        activeProbe: { command: [\"cursor-agent\", \"status\"], timeoutMs: 15_000 },\n        apiKeyProbe: { provider: \"cursor\", timeoutMs: 5_000 },\n      };\n    case \"antigravity\":\n      return {\n        runtime,\n        binaryName: \"agy\",\n        credentialPaths: [],\n        apiKeyEnvVars: [],\n        activeProbe: { command: [\"agy\", \"models\"], timeoutMs: 15_000, pseudoTty: true },\n      };\n    case \"hermes\":\n      return {\n        runtime,\n        binaryName: \"hermes\",\n        credentialPaths: [options.env?.HERMES_CONFIG_PATH ?? credential(\".hermes\", \"config.yaml\"), credential(\".hermes\", \"auth.json\")],\n        apiKeyEnvVars: [],\n        activeProbe: { command: [\"hermes\", \"auth\", \"list\"], timeoutMs: 15_000 },\n      };\n    case \"opencode\":\n      return {\n        runtime,\n        binaryName: \"opencode\",\n        credentialPaths: [credential(\".local\", \"share\", \"opencode\", \"auth.json\"), credential(\".config\", \"opencode\", \"opencode.json\")],\n        apiKeyEnvVars: [\"ANTHROPIC_API_KEY\", \"OPENAI_API_KEY\", \"GOOGLE_API_KEY\", \"GEMINI_API_KEY\"],\n        activeProbe: { command: [\"opencode\", \"auth\", \"list\"], timeoutMs: 10_000 },\n      };\n  }\n}\n\nexport function parseActiveAuthProbe(runtime: RuntimeId, output: string, failed = false): Pick<RuntimeAuthDetectionResult, \"authStatus\" | \"authMethod\"> {\n  const text = stripAnsi(output).trim();\n  if (!text) return failed ? { authStatus: \"expired\" } : { authStatus: \"unknown\" };\n  if (runtime === \"claude\") {\n    const json = parseJsonObject(text);\n    if (json && typeof json.loggedIn === \"boolean\") {\n      return {\n        authStatus: json.loggedIn ? \"authenticated\" : \"unauthenticated\",\n        authMethod: normalizeAuthMethod(typeof json.authMethod === \"string\" ? json.authMethod : undefined),\n      };\n    }\n  }\n  if (runtime === \"codex\") {\n    if (/not logged in|login required|unauth/i.test(text)) return { authStatus: \"unauthenticated\" };\n    if (/logged in/i.test(text)) return { authStatus: \"authenticated\", authMethod: /api key/i.test(text) ? \"api_key\" : \"oauth\" };\n  }\n  if (runtime === \"cursor\") {\n    if (/not logged in|login required|unauth/i.test(text)) return { authStatus: \"unauthenticated\" };\n    if (/logged in|authenticated|signed in/i.test(text)) return { authStatus: \"authenticated\", authMethod: \"oauth\" };\n  }\n  if (runtime === \"hermes\") {\n    if (/api_key/i.test(text)) return { authStatus: \"authenticated\", authMethod: \"api_key\" };\n    if (/oauth/i.test(text)) return { authStatus: \"authenticated\", authMethod: \"oauth\" };\n    if (/no credentials|not logged in|unauth/i.test(text)) return { authStatus: \"unauthenticated\" };\n  }\n  if (runtime === \"opencode\") {\n    if (/api[_ -]?key|credentials[\\s\\S]*\\bapi\\b/i.test(text)) return { authStatus: \"authenticated\", authMethod: \"api_key\" };\n    if (/oauth|logged in|authenticated/i.test(text)) return { authStatus: \"authenticated\", authMethod: /oauth/i.test(text) ? \"oauth\" : undefined };\n    if (/no auth|not logged in|unauth/i.test(text)) return { authStatus: \"unauthenticated\" };\n  }\n  if (runtime === \"antigravity\") {\n    if (/Gemini\\s+\\d|Claude\\s+Sonnet|GPT-OSS|Fetching available models/i.test(text)) return { authStatus: \"authenticated\", authMethod: \"oauth\" };\n    if (/sign.?in|authorization url|authenticate|login required|not logged in|unauth/i.test(text)) return { authStatus: \"unauthenticated\" };\n    if (/access disabled|permission denied|forbidden/i.test(text)) return { authStatus: \"expired\" };\n  }\n  return failed ? { authStatus: \"expired\" } : { authStatus: \"unknown\" };\n}\n\nfunction parseJsonObject(text: string): Record<string, unknown> | undefined {\n  const match = text.match(/\\{[\\s\\S]*\\}/);\n  if (!match) return undefined;\n  try {\n    const value = JSON.parse(match[0]!);\n    return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction normalizeAuthMethod(value?: string): RuntimeAuthMethod | undefined {\n  if (!value) return undefined;\n  if (/api.?key/i.test(value)) return \"api_key\";\n  if (/oauth|chatgpt|login/i.test(value)) return \"oauth\";\n  return undefined;\n}\n\nfunction extractNamedSecret(text: string, names: string[]): string | undefined {\n  for (const name of names) {\n    const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n    const match = text.match(new RegExp(`\\\\b${escaped}\\\\b\\\\s*[:=]\\\\s*[\"']?([^\"'\\\\s,}]+)`, \"i\"));\n    const value = match?.[1]?.trim();\n    if (value) return value;\n  }\n  return undefined;\n}\n\nfunction stripAnsi(text: string): string {\n  return text.replace(/\\x1b\\[[0-9;?]*[ -/]*[@-~]/g, \"\");\n}\n\nfunction isTimeoutError(error: unknown): boolean {\n  return Boolean(error && typeof error === \"object\" && (\n    (error as { killed?: unknown }).killed === true ||\n    (error as { signal?: unknown }).signal === \"SIGTERM\" ||\n    /timed out|timeout/i.test(error instanceof Error ? error.message : String(error))\n  ));\n}\n\nfunction isCommandNotFoundError(error: unknown): boolean {\n  return Boolean(error && typeof error === \"object\" && (\n    (error as { code?: unknown }).code === \"ENOENT\" ||\n    /ENOENT|not found/i.test(error instanceof Error ? error.message : String(error))\n  ));\n}\n", "import { execFile } from \"node:child_process\";\nimport type { ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { EventEmitter } from \"node:events\";\nimport { PassThrough } from \"node:stream\";\nimport { promisify } from \"node:util\";\nimport type { EmployeePrepareInput, ExecutionBackend, RuntimeSpawnInput } from \"./execution-backend\";\nimport { HostBackend } from \"./execution-backend\";\nimport type { RuntimeId } from \"./capabilities\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface ContainerCredentialMount {\n  hostPath: string;\n  containerPath: string;\n  readonly?: boolean;\n}\n\nexport interface ContainerBackendOptions {\n  image: string;\n  runtimeImages?: Partial<Record<RuntimeId, string>>;\n  dockerCommand?: string;\n  memory?: string;\n  cpus?: string;\n  credentialMounts?: ContainerCredentialMount[];\n  networkEnv?: NodeJS.ProcessEnv;\n  commandRunner?: (command: string, args: string[]) => Promise<{ stdout: string; stderr: string }>;\n  hostBackend?: HostBackend;\n}\n\nexport class ContainerBackend implements ExecutionBackend {\n  readonly kind = \"container\" as const;\n  private readonly dockerCommand: string;\n  private readonly hostBackend: HostBackend;\n  private readonly commandRunner: (command: string, args: string[]) => Promise<{ stdout: string; stderr: string }>;\n  private readonly networkEnv: NodeJS.ProcessEnv;\n  private readonly prepareLocks = new Map<string, Promise<void>>();\n  private lastError: string | undefined;\n\n  constructor(private readonly options: ContainerBackendOptions) {\n    this.dockerCommand = options.dockerCommand ?? \"docker\";\n    this.hostBackend = options.hostBackend ?? new HostBackend();\n    this.commandRunner = options.commandRunner ?? ((command, args) => execFileAsync(command, args, { encoding: \"utf8\" }));\n    this.networkEnv = options.networkEnv ?? (options.commandRunner ? {} : containerNetworkEnv());\n  }\n\n  async prepareEmployee(input: EmployeePrepareInput): Promise<void> {\n    const name = containerNameForEmployee(input.employeeId);\n    const pending = this.prepareLocks.get(name);\n    if (pending) {\n      await pending;\n      return;\n    }\n    const current = this.prepareEmployeeUnshared(input, name);\n    this.prepareLocks.set(name, current);\n    try {\n      await current;\n    } finally {\n      if (this.prepareLocks.get(name) === current) this.prepareLocks.delete(name);\n    }\n  }\n\n  private async prepareEmployeeUnshared(input: EmployeePrepareInput, name: string): Promise<void> {\n    const image = this.imageFor(input.runtime);\n    await this.ensureImagePresent(image);\n    const inspect = await this.inspectRunning(name);\n    if (inspect !== \"missing\" && !(await this.containerConfigMatches(input, name, image))) {\n      await this.commandRunner(this.dockerCommand, [\"rm\", \"-f\", name]);\n      await this.commandRunner(this.dockerCommand, this.runArgs(input, image));\n      return;\n    }\n    if (inspect === \"running\") return;\n    if (inspect === \"stopped\") {\n      await this.commandRunner(this.dockerCommand, [\"start\", name]);\n      return;\n    }\n    await this.commandRunner(this.dockerCommand, this.runArgs(input, image));\n  }\n\n  spawnRuntime(input: RuntimeSpawnInput): ChildProcessWithoutNullStreams {\n    const proxy = new RetryableContainerChild(() => this.spawnRuntimeOnce(input), async () => {\n      await this.prepareEmployee({\n        employeeId: input.employeeId,\n        workspaceDir: input.workspaceDir ?? input.cwd,\n        runtime: input.runtime ?? runtimeFromCommand(input.command),\n        env: input.env,\n      });\n    });\n    proxy.start();\n    return proxy as unknown as ChildProcessWithoutNullStreams;\n  }\n\n  private spawnRuntimeOnce(input: RuntimeSpawnInput): ChildProcessWithoutNullStreams {\n    const name = containerNameForEmployee(input.employeeId);\n    const mergedEnv = { ...this.networkEnv, ...input.env };\n    return this.hostBackend.spawnRuntime({\n      command: this.dockerCommand,\n      args: [\n        \"exec\",\n        \"-i\",\n        \"-w\",\n        \"/workspace\",\n        ...envArgs(mergedEnv),\n        name,\n        input.command,\n        ...input.args,\n      ],\n      cwd: input.cwd,\n      env: process.env,\n      employeeId: input.employeeId,\n      detached: input.detached ?? process.platform !== \"win32\",\n    });\n  }\n\n  async destroyEmployee(employeeId: string): Promise<void> {\n    try {\n      await this.commandRunner(this.dockerCommand, [\"rm\", \"-f\", containerNameForEmployee(employeeId)]);\n      this.lastError = undefined;\n    } catch (error) {\n      this.lastError = error instanceof Error ? error.message : String(error);\n      throw error;\n    }\n  }\n\n  async runtimeStatus(): Promise<{ image: string; imagePresent?: boolean; lastError?: string }> {\n    let imagePresent: boolean | undefined;\n    try {\n      await this.commandRunner(this.dockerCommand, [\"image\", \"inspect\", this.options.image]);\n      imagePresent = true;\n    } catch (error) {\n      imagePresent = false;\n      this.lastError = error instanceof Error ? error.message : String(error);\n    }\n    return { image: this.options.image, imagePresent, lastError: this.lastError };\n  }\n\n  private imageFor(runtime?: RuntimeId): string {\n    return (runtime ? this.options.runtimeImages?.[runtime] : undefined) ?? this.options.image;\n  }\n\n  private async ensureImagePresent(image: string): Promise<void> {\n    try {\n      await this.commandRunner(this.dockerCommand, [\"image\", \"inspect\", image]);\n      this.lastError = undefined;\n      return;\n    } catch {\n      // Pull below; docker pull gives a better error if credentials or network are wrong.\n    }\n    try {\n      await this.commandRunner(this.dockerCommand, [\"pull\", image]);\n      this.lastError = undefined;\n    } catch (error) {\n      this.lastError = error instanceof Error ? error.message : String(error);\n      throw error;\n    }\n  }\n\n  private async inspectRunning(name: string): Promise<\"running\" | \"stopped\" | \"missing\"> {\n    try {\n      const result = await this.commandRunner(this.dockerCommand, [\"inspect\", \"-f\", \"{{.State.Running}}\", name]);\n      return result.stdout.trim() === \"true\" ? \"running\" : \"stopped\";\n    } catch {\n      return \"missing\";\n    }\n  }\n\n  private async containerConfigMatches(input: EmployeePrepareInput, name: string, image: string): Promise<boolean> {\n    try {\n      const result = await this.commandRunner(this.dockerCommand, [\n        \"inspect\",\n        \"-f\",\n        \"{{ index .Config.Labels \\\"wm.daemon.config-hash\\\" }}\",\n        name,\n      ]);\n      if (result.stdout.trim() !== this.containerConfigHash(input, image)) return false;\n      return await this.containerCredentialMountsMatch(name);\n    } catch {\n      return false;\n    }\n  }\n\n  private async containerCredentialMountsMatch(name: string): Promise<boolean> {\n    const expected = normalizeCredentialMounts(this.options.credentialMounts ?? []);\n    if (expected.length === 0) return true;\n    try {\n      const result = await this.commandRunner(this.dockerCommand, [\n        \"inspect\",\n        \"-f\",\n        \"{{ json .Mounts }}\",\n        name,\n      ]);\n      const mounts = JSON.parse(result.stdout.trim() || \"[]\") as Array<{ Source?: unknown; Destination?: unknown; RW?: unknown }>;\n      return expected.every((mount) => mounts.some((actual) =>\n        actual.Source === mount.hostPath &&\n        actual.Destination === mount.containerPath &&\n        actual.RW === (mount.readonly === false)\n      ));\n    } catch {\n      return false;\n    }\n  }\n\n  private containerConfigHash(input: EmployeePrepareInput, image: string): string {\n    return createHash(\"sha256\")\n      .update(JSON.stringify({\n        image,\n        workspaceDir: input.workspaceDir,\n        credentialMounts: normalizeCredentialMounts(this.options.credentialMounts ?? []),\n        networkEnv: this.networkEnv,\n      }))\n      .digest(\"hex\");\n  }\n\n  private runArgs(input: EmployeePrepareInput, image: string): string[] {\n    return [\n      \"run\",\n      \"-d\",\n      \"--name\",\n      containerNameForEmployee(input.employeeId),\n      \"--label\",\n      `wm.daemon.config-hash=${this.containerConfigHash(input, image)}`,\n      \"--add-host\",\n      \"host.docker.internal:host-gateway\",\n      ...(this.options.memory ? [\"--memory\", this.options.memory] : []),\n      ...(this.options.cpus ? [\"--cpus\", this.options.cpus] : []),\n      \"-v\",\n      `${input.workspaceDir}:/workspace`,\n      \"-e\",\n      \"HOME=/workspace/.home\",\n      ...envArgs(this.networkEnv),\n      \"-w\",\n      \"/workspace\",\n      ...credentialMountArgs(this.options.credentialMounts ?? []),\n      image,\n    ];\n  }\n}\n\nfunction runtimeFromCommand(command: string): RuntimeId | undefined {\n  const base = command.split(/[\\\\/]/).pop() ?? command;\n  if (base === \"claude\") return \"claude\";\n  if (base === \"codex\") return \"codex\";\n  if (base === \"kimi\") return \"kimi\";\n  if (base === \"hermes\") return \"hermes\";\n  if (base === \"opencode\") return \"opencode\";\n  if (base === \"agy\") return \"antigravity\";\n  if (base === \"cursor-agent\") return \"cursor\";\n  return undefined;\n}\n\nclass RetryableContainerChild extends EventEmitter {\n  stdin = new PassThrough();\n  stdout = new PassThrough();\n  stderr = new PassThrough();\n  private current: ChildProcessWithoutNullStreams | undefined;\n  private retrying = false;\n  private killed = false;\n\n  constructor(\n    private readonly spawnChild: () => ChildProcessWithoutNullStreams,\n    private readonly prepare: () => Promise<void>\n  ) {\n    super();\n  }\n\n  get pid(): number | undefined {\n    return this.current?.pid;\n  }\n\n  start(): void {\n    this.attach(this.spawnChild(), true);\n  }\n\n  kill(signal?: NodeJS.Signals | number): boolean {\n    this.killed = true;\n    this.stdin.end();\n    return this.current?.kill(signal as NodeJS.Signals) ?? true;\n  }\n\n  private attach(child: ChildProcessWithoutNullStreams, retryOnMissing: boolean): void {\n    this.current = child;\n    this.stdin.pipe(child.stdin);\n    child.stdout.pipe(this.stdout, { end: false });\n    child.stderr.pipe(this.stderr, { end: false });\n    child.on(\"error\", (error) => {\n      if (retryOnMissing && !this.retrying && !this.killed && isMissingContainerError(error)) {\n        this.retrying = true;\n        void this.prepare()\n          .then(() => {\n            if (!this.killed) this.attach(this.spawnChild(), false);\n          })\n          .catch((retryError) => this.emit(\"error\", retryError));\n        return;\n      }\n      this.emit(\"error\", error);\n    });\n    child.on(\"exit\", (code, signal) => {\n      if (this.retrying && retryOnMissing) return;\n      this.stdout.end();\n      this.stderr.end();\n      this.emit(\"exit\", code, signal);\n    });\n    child.on(\"close\", (code, signal) => {\n      if (this.retrying && retryOnMissing) return;\n      this.emit(\"close\", code, signal);\n    });\n  }\n}\n\nfunction isMissingContainerError(error: unknown): boolean {\n  const message = error instanceof Error ? error.message : String(error);\n  return /no such container|container .* is not running|not found/i.test(message);\n}\n\nexport function containerNameForEmployee(employeeId: string): string {\n  const cleaned = employeeId\n    .trim()\n    .toLowerCase()\n    .replace(/[^a-z0-9_.-]+/g, \"-\")\n    .replace(/-+/g, \"-\")\n    .replace(/^[.-]+|[.-]+$/g, \"\")\n    .slice(0, 80);\n  return `wm-emp-${cleaned || \"employee\"}`;\n}\n\nfunction credentialMountArgs(mounts: ContainerCredentialMount[]): string[] {\n  const args: string[] = [];\n  for (const mount of normalizeCredentialMounts(mounts)) {\n    args.push(\"-v\", `${mount.hostPath}:${mount.containerPath}${mount.readonly === false ? \"\" : \":ro\"}`);\n  }\n  return args;\n}\n\nfunction normalizeCredentialMounts(mounts: ContainerCredentialMount[]): ContainerCredentialMount[] {\n  return [...mounts].sort((left, right) => {\n    const leftKey = `${left.hostPath}\\0${left.containerPath}`;\n    const rightKey = `${right.hostPath}\\0${right.containerPath}`;\n    return leftKey.localeCompare(rightKey);\n  });\n}\n\nfunction envArgs(env?: NodeJS.ProcessEnv): string[] {\n  if (!env) return [];\n  const args: string[] = [];\n  for (const [key, value] of Object.entries(env).sort(([left], [right]) => left.localeCompare(right))) {\n    if (value === undefined) continue;\n    args.push(\"-e\", `${key}=${value}`);\n  }\n  return args;\n}\n\nexport function containerNetworkEnv(source: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\n  const env: NodeJS.ProcessEnv = {};\n  for (const key of [\"HTTP_PROXY\", \"HTTPS_PROXY\", \"ALL_PROXY\", \"http_proxy\", \"https_proxy\", \"all_proxy\"]) {\n    const value = source[key];\n    if (typeof value === \"string\" && value.trim()) {\n      env[key] = rewriteLoopbackProxyForContainer(value.trim());\n    }\n  }\n  const noProxy = mergeNoProxy(source.NO_PROXY ?? source.no_proxy);\n  env.NO_PROXY = noProxy;\n  env.no_proxy = noProxy;\n  return env;\n}\n\nfunction rewriteLoopbackProxyForContainer(value: string): string {\n  try {\n    const parsed = new URL(value);\n    const host = parsed.hostname.toLowerCase();\n    if (host === \"127.0.0.1\" || host === \"localhost\" || host === \"::1\" || host === \"[::1]\") {\n      parsed.hostname = \"host.docker.internal\";\n      return parsed.toString();\n    }\n  } catch {\n    // Keep unusual proxy values untouched; the runtime or Docker will surface the real error.\n  }\n  return value;\n}\n\nfunction mergeNoProxy(value?: string): string {\n  const merged = new Set<string>();\n  for (const part of (value ?? \"\").split(\",\")) {\n    const trimmed = part.trim();\n    if (trimmed) merged.add(trimmed);\n  }\n  for (const required of [\"127.0.0.1\", \"localhost\", \"::1\", \"host.docker.internal\"]) {\n    merged.add(required);\n  }\n  return [...merged].join(\",\");\n}\n", "import { access, mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AIEmployeeRuntimeSessionDiagnostic, RuntimeId } from \"@claude-console/shared\";\nimport type { RuntimeSessionScope } from \"@claude-console/shared\";\n\nexport type RuntimeSessionResumeMode = AIEmployeeRuntimeSessionDiagnostic[\"resumeMode\"];\n\nexport async function writeRuntimeSessionDiagnostic(input: {\n  runtimeSessionsDir: string;\n  runtime: RuntimeId;\n  sessionId?: string;\n  scope?: RuntimeSessionScope;\n  sessionConcurrencyStrategy?: AIEmployeeRuntimeSessionDiagnostic[\"sessionConcurrencyStrategy\"];\n  pid?: number;\n  hostPid?: number;\n  queuedCount?: number;\n  maxConcurrentScopes?: number;\n  resumeMode: RuntimeSessionResumeMode;\n  reason?: string;\n  homeDir?: string;\n}): Promise<AIEmployeeRuntimeSessionDiagnostic> {\n  await mkdir(input.runtimeSessionsDir, { recursive: true });\n  const nativePath = input.sessionId ? await resolveRuntimeSessionNativePath(input.runtime, input.sessionId, input.homeDir) : undefined;\n  const handoffPath = input.sessionId && !nativePath\n    ? path.join(input.runtimeSessionsDir, `${input.runtime}-${safeSessionFilePart(input.sessionId)}.jsonl`)\n    : undefined;\n  const diagnostic: AIEmployeeRuntimeSessionDiagnostic = {\n    runtime: input.runtime,\n    sessionId: input.sessionId,\n    scope: input.scope,\n    sessionConcurrencyStrategy: input.sessionConcurrencyStrategy,\n    pid: input.pid,\n    hostPid: input.hostPid,\n    queuedCount: input.queuedCount,\n    maxConcurrentScopes: input.maxConcurrentScopes,\n    reachable: Boolean(nativePath),\n    nativePath,\n    handoffPath,\n    resumeMode: input.resumeMode,\n    reason: input.reason,\n    updatedAt: new Date().toISOString(),\n  };\n  const currentPath = path.join(input.runtimeSessionsDir, \"current.json\");\n  const existing = await readJsonObject(currentPath);\n  await writeFile(currentPath, `${JSON.stringify({ ...existing, ...diagnostic }, null, 2)}\\n`, \"utf8\");\n  if (handoffPath) {\n    await writeFile(handoffPath, `${JSON.stringify(diagnostic)}\\n`, \"utf8\");\n  }\n  return diagnostic;\n}\n\nasync function readJsonObject(filePath: string): Promise<Record<string, unknown>> {\n  try {\n    const parsed = JSON.parse(await readFile(filePath, \"utf8\"));\n    return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? parsed as Record<string, unknown> : {};\n  } catch {\n    return {};\n  }\n}\n\nexport async function readRuntimeSessionDiagnostic(runtimeSessionsDir: string): Promise<AIEmployeeRuntimeSessionDiagnostic | undefined> {\n  try {\n    return JSON.parse(await readFile(path.join(runtimeSessionsDir, \"current.json\"), \"utf8\")) as AIEmployeeRuntimeSessionDiagnostic;\n  } catch {\n    return undefined;\n  }\n}\n\nasync function resolveRuntimeSessionNativePath(runtime: RuntimeId, sessionId: string, homeDir = os.homedir()): Promise<string | undefined> {\n  if (!looksLikeNativeSessionId(sessionId)) return undefined;\n  if (runtime === \"claude\") {\n    return findFileByName(path.join(homeDir, \".claude\", \"projects\"), `${sessionId}.jsonl`, 4);\n  }\n  if (runtime === \"codex\") {\n    return findFileByName(path.join(homeDir, \".codex\", \"sessions\"), `${sessionId}.jsonl`, 6);\n  }\n  return undefined;\n}\n\nfunction looksLikeNativeSessionId(sessionId: string): boolean {\n  return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(sessionId);\n}\n\nasync function findFileByName(root: string, filename: string, maxDepth: number): Promise<string | undefined> {\n  try {\n    await access(root);\n  } catch {\n    return undefined;\n  }\n  const stack: Array<{ dir: string; depth: number }> = [{ dir: root, depth: 0 }];\n  let visited = 0;\n  while (stack.length) {\n    visited += 1;\n    if (visited > 300) return undefined;\n    const current = stack.pop();\n    if (!current) break;\n    let entries: Array<{ name: string; isDirectory: () => boolean; isFile: () => boolean }>;\n    try {\n      entries = await readdir(current.dir, { withFileTypes: true }) as typeof entries;\n    } catch {\n      continue;\n    }\n    for (const entry of entries) {\n      const fullPath = path.join(current.dir, entry.name);\n      if (entry.isFile() && entry.name === filename) return fullPath;\n      if (entry.isDirectory() && current.depth < maxDepth) stack.push({ dir: fullPath, depth: current.depth + 1 });\n    }\n  }\n  return undefined;\n}\n\nfunction safeSessionFilePart(sessionId: string): string {\n  return sessionId.replace(/[^a-zA-Z0-9._-]+/g, \"_\").slice(0, 120) || \"session\";\n}\n", "import type { RuntimeRunResult } from \"./adapter\";\nimport type { RuntimeId } from \"./capabilities\";\n\nexport function isRuntimeSessionRecoveryFailure(input: {\n  runtime: RuntimeId;\n  staleSessionId?: string;\n  result?: RuntimeRunResult;\n  error?: unknown;\n}): boolean {\n  if (!input.staleSessionId) return false;\n  if (input.result && input.result.status !== \"runtime_error\") return false;\n  const text = [\n    input.staleSessionId,\n    input.result?.errorMessage,\n    input.error instanceof Error ? input.error.message : input.error ? String(input.error) : undefined,\n  ].filter(Boolean).join(\"\\n\").toLowerCase();\n  if (!text) return false;\n  const generic = /(session|thread|conversation).*(not found|missing|does not exist|unavailable|invalid|cannot load|could not load|could not resume|resume failed|replay rejected)/i;\n  const reversed = /(not found|missing|does not exist|unavailable|invalid).*(session|thread|conversation)/i;\n  if (generic.test(text) || reversed.test(text)) return true;\n  if (input.runtime === \"codex\") return (\n    /(thread|resume).*(failed|invalid|not found|missing)/i.test(text) ||\n    /no rollout found for thread id/i.test(text)\n  );\n  if (input.runtime === \"claude\") return /(resume|conversation).*(failed|invalid|not found|missing)/i.test(text);\n  return /session\\/load.*(failed|invalid|not found|missing)|load session.*(failed|invalid|not found|missing)/i.test(text);\n}\n", "import type { Reminder } from \"@claude-console/shared\";\n\ntype ReminderJob = { reminderId: string; ownerAIEmployeeId: string; version: number };\n\nexport class ReminderCache {\n  private readonly timers = new Map<string, NodeJS.Timeout>();\n  private handler: (job: ReminderJob) => void = () => {};\n\n  upsert(reminder: Reminder): void {\n    this.cancelTimer(reminder.id);\n    if (reminder.status !== \"scheduled\") return;\n    const delay = Math.max(0, Date.parse(reminder.fire_at) - Date.now());\n    const timer = setTimeout(() => {\n      this.timers.delete(reminder.id);\n      this.handler({ reminderId: reminder.id, ownerAIEmployeeId: reminder.ai_employee_id, version: reminder.version });\n    }, delay);\n    this.timers.set(reminder.id, timer);\n  }\n\n  cancel(reminderId: string): void {\n    this.cancelTimer(reminderId);\n  }\n\n  snapshot(aiEmployeeId: string, reminders: Reminder[]): void {\n    for (const [id] of this.timers) {\n      if (id.startsWith(`${aiEmployeeId}:`)) this.cancelTimer(id);\n    }\n    for (const reminder of reminders) this.upsert(reminder);\n  }\n\n  onFire(handler: (job: ReminderJob) => void): void {\n    this.handler = handler;\n  }\n\n  clear(): void {\n    for (const id of this.timers.keys()) this.cancelTimer(id);\n  }\n\n  private cancelTimer(id: string): void {\n    const timer = this.timers.get(id);\n    if (timer) clearTimeout(timer);\n    this.timers.delete(id);\n  }\n}\n", "/**\n * \u8FDB\u7A0B\u5185\u5458\u5DE5\u7EA7\u6587\u4EF6\u5199\u9501\u3002\n *\n * \u540C\u4E00\u5458\u5DE5\u7684 workspace \u5E73\u53F0\u7BA1\u7406\u6587\u4EF6\uFF08runtime-env\u3001agent-proxy-token\u3001\n * runtime-sessions/current.json \u7B49\uFF09\u662F\u5458\u5DE5\u7EA7\u5171\u4EAB\u7684\uFF1Bscope \u5E76\u53D1\u540E\u540C\u5458\u5DE5\n * \u591A\u5B9E\u4F8B\u53EF\u80FD\u540C\u65F6\u5199\u8FD9\u4E9B\u6587\u4EF6\u3002\u6240\u6709\u5199\u90FD\u7ECF\u540C\u4E00\u4E2A daemon \u8FDB\u7A0B\uFF0C\u56E0\u6B64\u8FDB\u7A0B\u5185\n * per-employee promise \u94FE\u5373\u53EF\u4FDD\u8BC1\u4E32\u884C\u3002\n *\n * \u6CE8\u610F\uFF1A\u9501\u4E0D\u53EF\u91CD\u5165\u2014\u2014\u540C\u4E00 employeeId \u5728 withLock \u4E34\u754C\u533A\u5185\u518D\u5D4C\u5957\u8C03\u7528\n * withLock \u4F1A\u7B49\u5F85\u81EA\u5DF1\u91CA\u653E\uFF0C\u76F4\u63A5\u6B7B\u9501\u3002\u8C03\u7528\u65B9\u5FC5\u987B\u4FDD\u8BC1\u4E34\u754C\u533A\u5185\u4E0D\u518D\u83B7\u53D6\n * \u540C key \u7684\u9501\u3002\n */\nexport class EmployeeFileMutex {\n  /** \u6BCF\u4E2A\u5458\u5DE5\u5F53\u524D\u201C\u6700\u540E\u4E00\u4E2A\u6392\u961F\u4EFB\u52A1\u5B8C\u6210\u201D\u7684 promise\u3002 */\n  private readonly chains = new Map<string, Promise<void>>();\n\n  async withLock<T>(employeeId: string, fn: () => Promise<T>): Promise<T> {\n    const prev = this.chains.get(employeeId) ?? Promise.resolve();\n    let release!: () => void;\n    const gate = new Promise<void>((resolve) => {\n      release = resolve;\n    });\n    // \u94FE\u4E0A\u6302\u7684\u662F\u672C\u4EFB\u52A1\u7684\u5B8C\u6210\u4FE1\u53F7\uFF08gate\uFF09\uFF0C\u4E0E fn \u7684\u62D2\u7EDD\u72B6\u6001\u9694\u79BB\uFF0C\n    // \u540E\u7EED\u6392\u961F\u8005\u53EA\u7B49\"\u524D\u4E00\u4E2A\u7ED3\u675F\"\uFF0C\u4E0D\u4F1A\u56E0\u524D\u4E00\u4E2A\u629B\u9519\u800C reject\u3002\n    this.chains.set(employeeId, gate);\n    await prev;\n    try {\n      return await fn();\n    } finally {\n      release();\n      // \u4EC5\u5F53\u6CA1\u6709\u65B0\u4EFB\u52A1\u63A5\u5230\u94FE\u5C3E\u65F6\u6E05\u7406\uFF0C\u9632\u6B62 Map \u65E0\u9650\u589E\u957F\u3002\n      if (this.chains.get(employeeId) === gate) {\n        this.chains.delete(employeeId);\n      }\n    }\n  }\n\n  /** \u4ECD\u6709\u672A\u5B8C\u6210\u961F\u5217\u7684\u5458\u5DE5\u6570\uFF0C\u6D4B\u8BD5\u7528\u3002 */\n  pendingCount(): number {\n    return this.chains.size;\n  }\n}\n", "export interface SlotManagerOptions {\n  /** machine \u5168\u5C40\u5B58\u6D3B runtime \u4E0A\u9650 */\n  globalLimit: number;\n  /** \u6BCF\u5458\u5DE5\u5E76\u53D1 scope \u4E0A\u9650\uFF08\u8C03\u7528\u65B9\u53EF\u5728 tryAcquire \u65F6\u4F20\u5458\u5DE5\u7EA7\u8986\u76D6\u503C\uFF09 */\n  perEmployeeLimit: number;\n  /** idle slot \u7684\u5B58\u6D3B\u65F6\u957F\uFF0C\u9ED8\u8BA4 600_000ms */\n  idleTtlMs?: number;\n}\n\nexport type AcquireResult =\n  | { ok: true }\n  | { ok: false; reason: \"employee_limit\" | \"global_limit\" | \"key_conflict\" };\n\nexport interface RuntimeSlot {\n  employeeId: string;\n  scopedKey: string;\n  state: \"busy\" | \"idle\";\n  idleSince?: number;\n}\n\nconst DEFAULT_IDLE_TTL_MS = 600_000;\n\n/**\n * \u7EAF\u5185\u5B58\u7684 runtime \u69FD\u4F4D\u8BB0\u8D26\u5668\u3002\n * \u53EA\u505A\u9650\u6D41\u5224\u5B9A\u548C\u9A71\u9010\u5019\u9009\u5EFA\u8BAE\uFF0C\u4E0D\u81EA\u52A8\u9A71\u9010\u2014\u2014\u5B9E\u9645 destroy \u7531\u8C03\u7528\u65B9\u6267\u884C\u3002\n */\nexport class RuntimeSlotManager {\n  private readonly slots = new Map<string, RuntimeSlot>();\n\n  constructor(private readonly options: SlotManagerOptions) {}\n\n  tryAcquire(employeeId: string, scopedKey: string, perEmployeeOverride?: number): AcquireResult {\n    const existing = this.slots.get(scopedKey);\n    if (existing) {\n      if (existing.employeeId !== employeeId) {\n        // \u8DE8\u5458\u5DE5 key \u78B0\u649E\uFF1A\u663E\u5F0F\u62D2\u7EDD\uFF0C\u4E0D\u8986\u76D6\u539F slot\n        return { ok: false, reason: \"key_conflict\" };\n      }\n      // \u540C key \u5E42\u7B49 acquire\uFF1Aidle slot \u8F6C\u56DE busy\n      existing.state = \"busy\";\n      existing.idleSince = undefined;\n      return { ok: true };\n    }\n\n    const employeeLimit = perEmployeeOverride ?? this.options.perEmployeeLimit;\n    let employeeCount = 0;\n    for (const slot of this.slots.values()) {\n      if (slot.employeeId === employeeId) {\n        employeeCount += 1;\n      }\n    }\n    if (employeeCount >= employeeLimit) {\n      return { ok: false, reason: \"employee_limit\" };\n    }\n    if (this.slots.size >= this.options.globalLimit) {\n      return { ok: false, reason: \"global_limit\" };\n    }\n\n    this.slots.set(scopedKey, { employeeId, scopedKey, state: \"busy\" });\n    return { ok: true };\n  }\n\n  /** \u91CA\u653E\u6210\u529F\u8FD4\u56DE true\uFF1B\u672A\u77E5 key \u6216 employeeId \u4E0D\u5339\u914D\u8FD4\u56DE false\uFF0C\u8C03\u7528\u65B9\u53EF\u636E\u6B64\u544A\u8B66\u3002 */\n  release(employeeId: string, scopedKey: string): boolean {\n    const slot = this.slots.get(scopedKey);\n    if (slot && slot.employeeId === employeeId) {\n      this.slots.delete(scopedKey);\n      return true;\n    }\n    return false;\n  }\n\n  markIdle(employeeId: string, scopedKey: string, at: number): void {\n    const slot = this.slots.get(scopedKey);\n    if (slot && slot.employeeId === employeeId) {\n      slot.state = \"idle\";\n      slot.idleSince = at;\n    }\n  }\n\n  markBusy(employeeId: string, scopedKey: string): void {\n    const slot = this.slots.get(scopedKey);\n    if (slot && slot.employeeId === employeeId) {\n      slot.state = \"busy\";\n      slot.idleSince = undefined;\n    }\n  }\n\n  /** \u8FD4\u56DE\u6700\u4E45 idle \u7684\u9A71\u9010\u5019\u9009\uFF1B\u6307\u5B9A preferEmployeeId \u65F6\u4F18\u5148\u8BE5\u5458\u5DE5\u7684 idle slot\uFF0C\u6CA1\u6709\u5219\u56DE\u9000\u5168\u5C40\u3002 */\n  evictionCandidate(preferEmployeeId?: string): { employeeId: string; scopedKey: string } | undefined {\n    const oldestIdle = (filter?: (slot: RuntimeSlot) => boolean): RuntimeSlot | undefined => {\n      let best: RuntimeSlot | undefined;\n      for (const slot of this.slots.values()) {\n        if (slot.state !== \"idle\") continue;\n        if (filter && !filter(slot)) continue;\n        if (!best || (slot.idleSince ?? 0) < (best.idleSince ?? 0)) {\n          best = slot;\n        }\n      }\n      return best;\n    };\n\n    const candidate =\n      (preferEmployeeId !== undefined\n        ? oldestIdle((slot) => slot.employeeId === preferEmployeeId)\n        : undefined) ?? oldestIdle();\n    if (!candidate) return undefined;\n    return { employeeId: candidate.employeeId, scopedKey: candidate.scopedKey };\n  }\n\n  /** \u8FD4\u56DE idle \u65F6\u95F4\u8D85\u8FC7 TTL \u7684 slot \u5217\u8868\uFF0C\u7531\u8C03\u7528\u65B9\u51B3\u5B9A\u6E05\u7406\uFF1Bnow \u7531\u8C03\u7528\u65B9\u4F20\u5165\uFF0C\u4E0D\u4F9D\u8D56\u5899\u949F\u3002 */\n  expiredIdle(now: number): RuntimeSlot[] {\n    const ttl = this.options.idleTtlMs ?? DEFAULT_IDLE_TTL_MS;\n    const expired: RuntimeSlot[] = [];\n    for (const slot of this.slots.values()) {\n      if (slot.state === \"idle\" && slot.idleSince !== undefined && now - slot.idleSince >= ttl) {\n        expired.push(slot);\n      }\n    }\n    return expired;\n  }\n\n  activeCount(): number {\n    return this.slots.size;\n  }\n}\n", "/**\n * runtime \u5B50\u8FDB\u7A0B\u73AF\u5883\u53D8\u91CF\u767D\u540D\u5355\u3002\n *\n * buildRuntimeEnv \u4E0D\u518D `...process.env` \u5168\u91CF\u7EE7\u627F daemon \u73AF\u5883\uFF08\u4F1A\u628A\u5BBF\u4E3B\u673A\n * AWS/GITHUB \u7B49\u654F\u611F\u51ED\u8BC1\u6CC4\u7ED9 runtime \u5B50\u8FDB\u7A0B\uFF09\uFF0C\u6539\u4E3A\u6309\u663E\u5F0F\u540D\u5355\u5408\u6210\u3002\n * \u767D\u540D\u5355\u9057\u6F0F\u7684\u75C7\u72B6\u662F\u67D0 runtime \u542F\u52A8\u5931\u8D25\u6216\u767B\u5F55\u6001\u4E22\u5931\u2014\u2014\u6309\"\u8865\u540D\u5355\"\u5904\u7406\uFF0C\n * \u4E0D\u8981\u56DE\u9000\u5168\u91CF\u7EE7\u627F\u3002\n */\n\n/** \u8FDB\u7A0B\u8FD0\u884C\u57FA\u7840\u53D8\u91CF\uFF08\u542B Windows spawn \u89E3\u6790\u6240\u9700\u53D8\u91CF\uFF09\u3002 */\nconst BASE_VARS = [\n  \"PATH\", \"HOME\", \"SHELL\", \"LANG\", \"LC_ALL\", \"TERM\", \"TMPDIR\", \"USER\", \"LOGNAME\",\n  // Windows \u517C\u5BB9\n  \"SystemRoot\", \"SystemDrive\", \"ComSpec\", \"PATHEXT\",\n  \"APPDATA\", \"LOCALAPPDATA\", \"USERPROFILE\", \"ProgramFiles\", \"ProgramData\",\n];\n\n/** \u4EE3\u7406\u53D8\u91CF\uFF1A\u5E73\u53F0 NO_PROXY \u673A\u5236\u4E0E\u4F01\u4E1A\u4EE3\u7406\u4F9D\u8D56\u3002 */\nconst PROXY_VARS = [\n  \"HTTP_PROXY\", \"HTTPS_PROXY\", \"NO_PROXY\",\n  \"http_proxy\", \"https_proxy\", \"no_proxy\",\n  \"ALL_PROXY\", \"NODE_EXTRA_CA_CERTS\", \"SSL_CERT_FILE\", \"SSL_CERT_DIR\",\n];\n\n/** runtime CLI \u51ED\u8BC1\u4E0E\u914D\u7F6E\u8DEF\u5F84\u53D8\u91CF\uFF08\u4E0E\u5404 adapter \u5B9E\u9645\u4F9D\u8D56\u6838\u5BF9\uFF09\u3002 */\nconst RUNTIME_CREDENTIAL_VARS = [\n  // claude\uFF08SDK \u4E0E claude CLI\uFF09\n  \"ANTHROPIC_API_KEY\", \"ANTHROPIC_BASE_URL\", \"ANTHROPIC_AUTH_TOKEN\", \"CLAUDE_CONFIG_DIR\",\n  // codex CLI\n  \"OPENAI_API_KEY\", \"OPENAI_BASE_URL\", \"CODEX_HOME\",\n  // gemini CLI\n  \"GEMINI_API_KEY\", \"GOOGLE_API_KEY\", \"GOOGLE_APPLICATION_CREDENTIALS\",\n  // kimi CLI\uFF08model-detector \u4E0E CLI \u5171\u7528\u914D\u7F6E\u8DEF\u5F84\uFF09\n  \"MOONSHOT_API_KEY\", \"KIMI_API_KEY\", \"KIMI_CONFIG_PATH\",\n  // hermes CLI\n  \"HERMES_CONFIG_PATH\",\n  // opencode\uFF08\u9075\u5FAA XDG \u76EE\u5F55\u7EA6\u5B9A\uFF09\n  \"OPENCODE_CONFIG\", \"XDG_CONFIG_HOME\", \"XDG_DATA_HOME\", \"XDG_STATE_HOME\", \"XDG_CACHE_HOME\",\n  // cursor-agent\n  \"CURSOR_API_KEY\",\n];\n\nconst HOST_ALLOWLIST = new Set([...BASE_VARS, ...PROXY_VARS, ...RUNTIME_CREDENTIAL_VARS]);\n\nexport interface BuildAllowlistedEnvInput {\n  /** daemon \u5BBF\u4E3B\u8FDB\u7A0B\u73AF\u5883\uFF08\u4EC5\u767D\u540D\u5355\u547D\u4E2D\u9879\u900F\u4F20\uFF09\u3002 */\n  hostEnv: NodeJS.ProcessEnv;\n  /** \u5458\u5DE5\u914D\u7F6E envVars\uFF0C\u5168\u91CF\u8FDB\u5165\uFF0C\u8986\u76D6\u5BBF\u4E3B\u673A\u540C\u540D\u3002 */\n  employeeEnvVars: Record<string, string>;\n  /** \u5E73\u53F0\u5408\u6210\u53D8\u91CF\uFF08WM_* / PATH \u524D\u7F6E wmDir / NO_PROXY \u7B49\uFF09\uFF0C\u6700\u7EC8\u80DC\u51FA\uFF0C\u4E0D\u53EF\u88AB\u5458\u5DE5\u914D\u7F6E\u8986\u76D6\u3002 */\n  wmEnv: Record<string, string | undefined>;\n}\n\n/**\n * \u6309\u7EC4\u62F7\u8D1D hostEnv \u547D\u4E2D\u9879 \u2192 \u53E0\u52A0 employeeEnvVars \u2192 \u53E0\u52A0 wmEnv\uFF08\u6700\u9AD8\u4F18\u5148\uFF09\u3002\n * wmEnv \u5FC5\u987B\u6700\u540E\uFF1AServer \u4FA7 sanitizeEnvVars \u4E4B\u5916\u7684\u7B2C\u4E8C\u9053\u9632\u7EBF\uFF0C\u9632\u6B62\u8BEF\u914D/\u6076\u610F\n * \u5458\u5DE5 envVars \u8986\u76D6 WM_SERVER_URL / WM_AGENT_PROXY_URL / PATH / NO_PROXY \u7B49\u5E73\u53F0\u8DEF\u7531\u53D8\u91CF\u3002\n */\nexport function buildAllowlistedEnv(input: BuildAllowlistedEnvInput): NodeJS.ProcessEnv {\n  const result: NodeJS.ProcessEnv = {};\n  for (const key of HOST_ALLOWLIST) {\n    const value = input.hostEnv[key];\n    if (value !== undefined) result[key] = value;\n  }\n  for (const [key, value] of Object.entries(input.employeeEnvVars)) {\n    result[key] = value;\n  }\n  for (const [key, value] of Object.entries(input.wmEnv)) {\n    if (value !== undefined) result[key] = value;\n  }\n  return result;\n}\n", "import type { ActivityEntry } from \"@claude-console/shared\";\nimport type { RuntimeEvent } from \"../runtime/adapter\";\n\ninterface PendingCall {\n  callId: string;\n  kind: \"bash\" | \"tool\";\n  toolName: string;\n}\n\nexport class ActivityTracker {\n  private clientSeq = 0;\n  private readonly lastProgressAt = new Map<string, number>();\n  private readonly pendingCalls = new Map<string, PendingCall>();\n  private readonly pendingCallOrder: PendingCall[] = [];\n  private lastAssistantText = \"\";\n\n  toEntries(events: RuntimeEvent[]): ActivityEntry[] {\n    const entries: ActivityEntry[] = [];\n    let assistantText = \"\";\n    let assistantTimestamp = 0;\n    const flushAssistant = () => {\n      const text = assistantText.trim();\n      assistantText = \"\";\n      if (!text || text === this.lastAssistantText) return;\n      this.lastAssistantText = text;\n      entries.push({ kind: \"assistant\", text, timestamp: assistantTimestamp || Date.now() });\n      assistantTimestamp = 0;\n    };\n\n    for (const event of events) {\n      if (event.type === \"assistant_delta\" || event.type === \"thinking_delta\") {\n        if (event.content) {\n          if (!assistantTimestamp) assistantTimestamp = Date.now();\n          assistantText += event.content;\n        }\n        continue;\n      }\n      flushAssistant();\n      for (const entry of this.toEntry(event)) entries.push(entry);\n    }\n    flushAssistant();\n    return entries;\n  }\n\n  nextSeq(): number {\n    this.clientSeq += 1;\n    return this.clientSeq;\n  }\n\n  shouldPublishProgress(key: string, intervalMs: number): boolean {\n    const now = Date.now();\n    const last = this.lastProgressAt.get(key) ?? 0;\n    if (now - last < intervalMs) return false;\n    this.lastProgressAt.set(key, now);\n    return true;\n  }\n\n  private toEntry(event: RuntimeEvent): ActivityEntry[] {\n    const timestamp = Date.now();\n    if (event.type === \"task_delivered\") {\n      const prompt = summarizeDeliveredPrompt(event.content ?? \"\");\n      if (!prompt) return [];\n      return [{ kind: \"prompt\", ...prompt, timestamp }];\n    }\n    if (event.type === \"assistant_result\") {\n      const text = event.content?.trim();\n      if (!text || text === this.lastAssistantText) return [];\n      this.lastAssistantText = text;\n      return [{ kind: \"assistant\", text, timestamp }];\n    }\n    if (event.type === \"tool_start\") {\n      return [this.toolCallEntry(event, timestamp)];\n    }\n    if (event.type === \"tool_result\" || event.type === \"tool_end\") {\n      return [this.toolResultEntry(event, timestamp)];\n    }\n    if (event.type.includes(\"error\")) {\n      return [{ kind: \"error\", text: event.content ?? stringifyData(event.data), is_error: true, timestamp }];\n    }\n    if (isNoisyRuntimeStatus(event.type)) return [];\n    if (event.content) return [{ kind: \"text\", text: event.content, timestamp }];\n    return [];\n  }\n\n  private toolCallEntry(event: RuntimeEvent, timestamp: number): ActivityEntry {\n    const data = asRecord(event.data);\n    const toolName = extractToolName(data, event.content);\n    const callId = extractCallId(data) ?? `call-${this.pendingCallOrder.length + 1}`;\n    const input = extractToolInput(data);\n    const command = typeof input.command === \"string\" ? input.command : undefined;\n    const semantic = command ? summarizePlatformCommand(command) : undefined;\n    const isBash = isBashTool(toolName);\n    const pending: PendingCall = { callId, kind: isBash ? \"bash\" : \"tool\", toolName };\n    this.pendingCalls.set(callId, pending);\n    this.pendingCallOrder.push(pending);\n\n    if (isBash) {\n      return {\n        kind: \"bash_call\",\n        call_id: callId,\n        tool_name: toolName,\n        command,\n        summary: semantic ?? \"\u6267\u884C Bash\",\n        tool_input: input,\n        timestamp,\n      };\n    }\n    return {\n      kind: \"tool_call\",\n      call_id: callId,\n      tool_name: toolName,\n      summary: semanticToolSummary(toolName),\n      tool_input: input,\n      timestamp,\n    };\n  }\n\n  private toolResultEntry(event: RuntimeEvent, timestamp: number): ActivityEntry {\n    const data = asRecord(event.data);\n    const callId = extractResultCallId(data) ?? this.pendingCallOrder.find((call) => this.pendingCalls.has(call.callId))?.callId ?? `result-${timestamp}`;\n    const pending = this.pendingCalls.get(callId);\n    if (pending) this.pendingCalls.delete(callId);\n    const output = extractToolOutput(data, event.content);\n    const isBash = pending?.kind === \"bash\";\n    if (isBash) {\n      return {\n        kind: \"bash_result\",\n        call_id: callId,\n        tool_name: pending.toolName,\n        stdout: output.stdout,\n        stderr: output.stderr,\n        exit_code: output.exitCode,\n        text: output.text,\n        is_error: output.isError,\n        timestamp,\n      };\n    }\n    return {\n      kind: \"tool_result\",\n      call_id: callId,\n      tool_name: pending?.toolName,\n      tool_output: output.text,\n      text: output.text,\n      is_error: output.isError,\n      timestamp,\n    };\n  }\n}\n\nfunction summarizeDeliveredPrompt(content: string): Pick<ActivityEntry, \"text\" | \"summary\" | \"tool_output\"> | undefined {\n  const firstLine = content.split(\"\\n\").find((line) => line.startsWith(\"[target=\"));\n  if (!firstLine) return content.trim() ? { text: truncate(content.trim(), 500), summary: \"\u7CFB\u7EDF\u5524\u9192\" } : undefined;\n  const target = firstLine.match(/^\\[target=([^\\s]+)/)?.[1] ?? \"\";\n  const sender = firstLine.match(/\\]\\s+@([^:]+):/)?.[1] ?? \"unknown\";\n  const text = firstLine.replace(/^\\[[^\\]]+\\]\\s+@[^:]+:\\s*/, \"\").trim();\n  return {\n    text: truncate(text, 500),\n    summary: [target, `@${sender}`].filter(Boolean).join(\" \u00B7 \"),\n  };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n  return value && typeof value === \"object\" ? value as Record<string, unknown> : {};\n}\n\nfunction optionalRecord(value: unknown): Record<string, unknown> | undefined {\n  return value && typeof value === \"object\" ? value as Record<string, unknown> : undefined;\n}\n\nfunction extractToolName(data: Record<string, unknown>, fallback?: string): string {\n  const item = asRecord(data.item);\n  const payload = asRecord(data.payload);\n  return stringValue(data.name) ??\n    stringValue(item.name) ??\n    stringValue(payload.name) ??\n    stringValue(data.type) ??\n    fallback ??\n    \"tool\";\n}\n\nfunction extractToolInput(data: Record<string, unknown>): Record<string, unknown> {\n  const item = asRecord(data.item);\n  const payload = asRecord(data.payload);\n  return optionalRecord(data.input) ?? optionalRecord(item.input) ?? optionalRecord(payload.input) ?? {};\n}\n\nfunction extractCallId(data: Record<string, unknown>): string | undefined {\n  const item = asRecord(data.item);\n  const payload = asRecord(data.payload);\n  return stringValue(data.id) ?? stringValue(item.id) ?? stringValue(payload.id);\n}\n\nfunction extractResultCallId(data: Record<string, unknown>): string | undefined {\n  const item = asRecord(data.item);\n  const payload = asRecord(data.payload);\n  return stringValue(data.tool_use_id) ??\n    stringValue(data.call_id) ??\n    stringValue(data.id) ??\n    stringValue(item.id) ??\n    stringValue(item.tool_use_id) ??\n    stringValue(payload.id) ??\n    stringValue(payload.tool_use_id);\n}\n\nfunction extractToolOutput(data: Record<string, unknown>, content?: string): { text: string; stdout?: string; stderr?: string; exitCode?: number; isError?: boolean } {\n  const text = content ?? blockContent(data.content) ?? stringValue(data.output) ?? stringifyData(data);\n  const stdout = stringValue(data.stdout) ?? text;\n  const stderr = stringValue(data.stderr);\n  const exitCode = numberValue(data.exit_code) ?? numberValue(data.exitCode);\n  return {\n    text,\n    stdout,\n    stderr,\n    exitCode,\n    isError: Boolean(data.is_error) || Boolean(stderr) || (typeof exitCode === \"number\" && exitCode !== 0),\n  };\n}\n\nfunction blockContent(value: unknown): string | undefined {\n  if (typeof value === \"string\") return value;\n  if (!Array.isArray(value)) return undefined;\n  return value.map((item) => {\n    if (typeof item === \"string\") return item;\n    const block = asRecord(item);\n    return stringValue(block.text) ?? \"\";\n  }).join(\"\");\n}\n\nfunction isBashTool(name: string): boolean {\n  return [\"bash\", \"shell\", \"exec\", \"command\"].includes(name.toLowerCase());\n}\n\nfunction semanticToolSummary(name: string): string {\n  const normalized = name.toLowerCase();\n  if (normalized === \"read\") return \"\u8BFB\u53D6\u6587\u4EF6\";\n  if (normalized === \"write\") return \"\u5199\u5165\u6587\u4EF6\";\n  if (normalized === \"edit\") return \"\u4FEE\u6539\u6587\u4EF6\";\n  return `\u8C03\u7528\u5DE5\u5177 ${name}`;\n}\n\nfunction summarizePlatformCommand(command: string): string | undefined {\n  if (!/(^|\\s|\\/)(\\.wm\\/wm|wm)(\\s|$)/.test(command)) return undefined;\n  const target = command.match(/--target\\s+['\"]?([^'\"\\s]+)/)?.[1];\n  if (/\\bmessage\\s+send\\b/.test(command)) return [\"\u53D1\u9001\u5E73\u53F0\u6D88\u606F\", target].filter(Boolean).join(\" \u00B7 \");\n  if (/\\bmessage\\s+(read|check)\\b/.test(command)) return [\"\u8BFB\u53D6\u5E73\u53F0\u6D88\u606F\", target].filter(Boolean).join(\" \u00B7 \");\n  if (/\\bmessage\\s+search\\b/.test(command)) return \"\u641C\u7D22\u5E73\u53F0\u6D88\u606F\";\n  if (/\\bserver\\s+info\\b/.test(command)) return \"\u67E5\u8BE2\u5E73\u53F0\u4FE1\u606F\";\n  if (/\\bchannel\\s+members\\b/.test(command)) return \"\u67E5\u8BE2\u9891\u9053\u6210\u5458\";\n  if (/\\btask\\s+/.test(command)) return \"\u5904\u7406\u5E73\u53F0\u4EFB\u52A1\";\n  return \"\u8C03\u7528\u5E73\u53F0 CLI\";\n}\n\nfunction stringValue(value: unknown): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n  return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction stringifyData(data: unknown): string {\n  if (data === undefined || data === null) return \"\";\n  if (typeof data === \"string\") return data;\n  try {\n    return JSON.stringify(data);\n  } catch {\n    return String(data);\n  }\n}\n\nfunction truncate(text: string, max: number): string {\n  return text.length > max ? `${text.slice(0, max - 1)}\u2026` : text;\n}\n\nfunction isNoisyRuntimeStatus(type: string): boolean {\n  return type === \"usage_update\" ||\n    type === \"runtime_started\" ||\n    type === \"session_init\" ||\n    type === \"tool_progress\" ||\n    type === \"account/rateLimits/updated\" ||\n    type === \"thread/status/changed\" ||\n    type === \"item/commandExecution/terminalInteraction\" ||\n    type === \"serverRequest/resolved\" ||\n    type === \"turn/started\" ||\n    type === \"turn/completed\" ||\n    type === \"turn_finished\";\n}\n", "import { readdir, readFile, stat } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AIEmployeeSkillDescriptor, AIEmployeeSkillGroup, RuntimeId } from \"@claude-console/shared\";\n\nexport interface ScanAgentSkillsInput {\n  homeDir?: string;\n  rootDir: string;\n  serverNamespace: string;\n  machineDirectoryName?: string;\n  machineId: string;\n  aiEmployeeDirectoryName?: string;\n  aiEmployeeId: string;\n  runtime: RuntimeId;\n}\n\nexport interface AgentSkillScanResult {\n  global: AIEmployeeSkillGroup[];\n  workspace: AIEmployeeSkillGroup[];\n}\n\nexport async function scanAgentSkills(input: ScanAgentSkillsInput): Promise<AgentSkillScanResult> {\n  const homeDir = input.homeDir ?? os.homedir();\n  const workspaceDir = input.machineDirectoryName\n    ? path.join(input.rootDir, input.machineDirectoryName, input.aiEmployeeDirectoryName ?? input.aiEmployeeId)\n    : path.join(input.rootDir, input.serverNamespace, input.machineId, input.aiEmployeeId);\n  return {\n    global: await scanGroupedSkillRoots(runtimeSkillRoots(homeDir, input.runtime), \"global\"),\n    workspace: await scanGroupedSkillRoots(workspaceSkillRoots(workspaceDir, input.runtime), \"workspace\"),\n  };\n}\n\nfunction runtimeSkillRoots(homeDir: string, runtime: RuntimeId): Array<{ abs: string; label: string }> {\n  void runtime;\n  return [{ abs: path.join(homeDir, \".wm\", \"skills\"), label: \"~/.wm/skills\" }];\n}\n\nfunction workspaceSkillRoots(workspaceDir: string, runtime: RuntimeId): Array<{ abs: string; label: string }> {\n  const platform = [{ abs: path.join(workspaceDir, \".wm\", \"skills\"), label: \".wm/skills\" }];\n  if (runtime === \"claude\") {\n    return [\n      { abs: path.join(workspaceDir, \".claude\", \"skills\"), label: \".claude/skills\" },\n      { abs: path.join(workspaceDir, \".claude\", \"commands\"), label: \".claude/commands\" },\n      ...platform,\n    ];\n  }\n  return [\n    { abs: path.join(workspaceDir, \".codex\", \"skills\"), label: \".codex/skills\" },\n    { abs: path.join(workspaceDir, \".agents\", \"skills\"), label: \".agents/skills\" },\n    ...platform,\n  ];\n}\n\nasync function scanGroupedSkillRoots(\n  roots: Array<{ abs: string; label: string }>,\n  source: AIEmployeeSkillGroup[\"source\"]\n): Promise<AIEmployeeSkillGroup[]> {\n  const groups = await Promise.all(roots.map(async (root) => {\n    const skills = await scanSkillRoot(root.abs, root.label);\n    return skills.length ? { source, root: root.label, skills } : null;\n  }));\n  return groups.filter((group): group is AIEmployeeSkillGroup => Boolean(group));\n}\n\nasync function scanSkillRoot(absRoot: string, labelRoot: string): Promise<AIEmployeeSkillDescriptor[]> {\n  const entries = await readdir(absRoot, { withFileTypes: true }).catch((error) => {\n    if (error?.code === \"ENOENT\") return [];\n    throw error;\n  });\n  const skills: AIEmployeeSkillDescriptor[] = [];\n  const seen = new Set<string>();\n  for (const entry of entries) {\n    let name = \"\";\n    let skillFile = \"\";\n    let skillPath = \"\";\n    if (entry.isDirectory() || entry.isSymbolicLink()) {\n      if (entry.name === \".system\") continue;\n      name = entry.name;\n      skillFile = path.join(absRoot, entry.name, \"SKILL.md\");\n      skillPath = `${labelRoot}/${entry.name}`;\n    } else if (entry.name.endsWith(\".md\")) {\n      name = entry.name.replace(/\\.md$/, \"\");\n      skillFile = path.join(absRoot, entry.name);\n      skillPath = `${labelRoot}/${entry.name}`;\n    } else {\n      continue;\n    }\n    if (seen.has(name) || !(await existsFile(skillFile))) continue;\n    seen.add(name);\n    const meta = await readSkillMeta(skillFile);\n    skills.push({\n      name,\n      path: skillPath,\n      description: meta.description,\n      version: meta.version,\n      updatedAt: meta.updatedAt,\n    });\n  }\n  return skills.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nasync function existsFile(filePath: string): Promise<boolean> {\n  return stat(filePath).then((info) => info.isFile()).catch(() => false);\n}\n\nasync function readSkillMeta(filePath: string): Promise<{\n  description?: string;\n  version?: string;\n  updatedAt?: number;\n}> {\n  const text = await readFile(filePath, \"utf8\").catch(() => \"\");\n  if (!text) return {};\n  const match = text.match(/^description:\\s*(.+)$/m);\n  const version = text.match(/^version:\\s*(.+)$/m)?.[1]?.trim().replace(/^[\"']|[\"']$/g, \"\");\n  const description = match?.[1]?.trim().replace(/^[\"']|[\"']$/g, \"\")\n    ?? text.split(/\\r?\\n/).find((line) => line.trim() && !line.startsWith(\"#\"))?.trim();\n  const updatedAt = await stat(filePath).then((info) => info.mtimeMs).catch(() => undefined);\n  return { description, version, updatedAt };\n}\n", "import path from \"node:path\";\nimport { mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\n\nconst SESSION_DIR = \".wm/feishu-sessions\";\n\ninterface FeishuSessionRecord {\n  sessionId: string;\n  chatId: string;\n  updatedAt: number;\n}\n\nfunction encodeChatId(chatId: string): string {\n  return chatId.replace(/[^a-zA-Z0-9_-]/g, (c) => `_${c.charCodeAt(0).toString(16).toUpperCase()}_`);\n}\n\nfunction sessionPath(aiEmployeeDir: string, chatId: string): string {\n  return path.join(aiEmployeeDir, SESSION_DIR, `${encodeChatId(chatId)}.json`);\n}\n\nexport async function saveFeishuSession(aiEmployeeDir: string, chatId: string, sessionId: string): Promise<void> {\n  const dir = path.join(aiEmployeeDir, SESSION_DIR);\n  await mkdir(dir, { recursive: true });\n  const record: FeishuSessionRecord = { sessionId, chatId, updatedAt: Date.now() };\n  await writeFile(sessionPath(aiEmployeeDir, chatId), JSON.stringify(record), \"utf-8\");\n}\n\nexport async function loadFeishuSessions(aiEmployeeDir: string): Promise<Map<string, string>> {\n  const dir = path.join(aiEmployeeDir, SESSION_DIR);\n  const result = new Map<string, string>();\n  let files: string[];\n  try {\n    files = await readdir(dir);\n  } catch {\n    return result;\n  }\n  for (const file of files) {\n    if (!file.endsWith(\".json\")) continue;\n    try {\n      const raw = await readFile(path.join(dir, file), \"utf-8\");\n      const record = JSON.parse(raw) as FeishuSessionRecord;\n      if (record.sessionId && record.chatId) {\n        result.set(record.chatId, record.sessionId);\n      }\n    } catch {\n      // corrupted file \u2014 skip\n    }\n  }\n  return result;\n}\n\nexport async function removeFeishuSession(aiEmployeeDir: string, chatId: string): Promise<void> {\n  try {\n    await rm(sessionPath(aiEmployeeDir, chatId), { force: true });\n  } catch {\n    // ignore\n  }\n}\n\nexport async function removeAllFeishuSessions(aiEmployeeDir: string): Promise<void> {\n  const dir = path.join(aiEmployeeDir, SESSION_DIR);\n  try {\n    await rm(dir, { recursive: true, force: true });\n  } catch {\n    // ignore\n  }\n}\n", "import { mkdir, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FileContent, FileEntry } from \"@claude-console/shared\";\n\ntype WorkspaceBrowserOptions =\n  | ((aiEmployeeId: string) => string | undefined)\n  | {\n      rootDir: string;\n      workspaceDirectoryForAIEmployee: (aiEmployeeId: string, serverNamespace?: string, machineId?: string) => string | undefined;\n    };\n\nexport class WorkspaceBrowser {\n  constructor(private readonly options: WorkspaceBrowserOptions) {}\n\n  async listFiles(aiEmployeeId: string, dirPath = \".\", serverNamespace?: string, machineId?: string): Promise<FileEntry[]> {\n    const base = this.requireBase(aiEmployeeId, serverNamespace, machineId);\n    const dir = this.resolveInside(base, dirPath);\n    const entries = await readdir(dir, { withFileTypes: true }).catch((error) => {\n      if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n      throw error;\n    });\n    const result: FileEntry[] = [];\n    for (const entry of entries) {\n      if (dirPath === \".\" && entry.name === \".wm\") continue;\n      const fullPath = path.join(dir, entry.name);\n      const info = await stat(fullPath);\n      result.push({\n        name: entry.name,\n        path: path.relative(base, fullPath) || \".\",\n        type: entry.isDirectory() ? \"directory\" : \"file\",\n        size: info.size,\n        modified_at: info.mtimeMs,\n      });\n    }\n    return result.sort((a, b) => a.type.localeCompare(b.type) || a.name.localeCompare(b.name));\n  }\n\n  async readFile(aiEmployeeId: string, filePath: string, serverNamespace?: string, machineId?: string): Promise<FileContent> {\n    const base = this.requireBase(aiEmployeeId, serverNamespace, machineId);\n    const fullPath = this.resolveInside(base, filePath);\n    const info = await stat(fullPath);\n    if (info.size > 1024 * 1024) {\n      return { path: filePath, content: null, binary: true, size: info.size };\n    }\n    const buffer = await readFile(fullPath);\n    const ext = path.extname(fullPath).toLowerCase();\n    const image = [\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\"].includes(ext);\n    if (image || buffer.includes(0)) {\n      return {\n        path: filePath,\n        content: buffer.toString(\"base64\"),\n        binary: true,\n        size: info.size,\n        mime_type: image ? `image/${ext.slice(1).replace(\"jpg\", \"jpeg\")}` : \"application/octet-stream\",\n        encoding: \"base64\",\n      };\n    }\n    return { path: filePath, content: buffer.toString(\"utf8\"), binary: false, size: info.size, encoding: \"utf8\" };\n  }\n\n  async writeFile(aiEmployeeId: string, filePath: string, content: string, serverNamespace?: string, machineId?: string): Promise<{ ok: true; path: string; size: number }> {\n    const base = this.requireBase(aiEmployeeId, serverNamespace, machineId);\n    const fullPath = this.resolveInside(base, filePath);\n    await mkdir(path.dirname(fullPath), { recursive: true });\n    await writeFile(fullPath, content, \"utf8\");\n    return { ok: true, path: path.relative(base, fullPath) || \".\", size: Buffer.byteLength(content, \"utf8\") };\n  }\n\n  private requireBase(aiEmployeeId: string, serverNamespace?: string, machineId?: string): string {\n    const base = this.rootDirForAIEmployee(aiEmployeeId, serverNamespace, machineId);\n    if (!base) throw new Error(`Unknown AI employee workspace: ${aiEmployeeId}`);\n    return path.resolve(base);\n  }\n\n  private rootDirForAIEmployee(aiEmployeeId: string, serverNamespace?: string, machineId?: string): string | undefined {\n    if (typeof this.options === \"function\") return this.options(aiEmployeeId);\n    return this.options.workspaceDirectoryForAIEmployee(aiEmployeeId, serverNamespace, machineId);\n  }\n\n  private resolveInside(base: string, relativePath: string): string {\n    const resolved = path.resolve(base, relativePath);\n    if (resolved !== base && !resolved.startsWith(`${base}${path.sep}`)) {\n      throw new Error(\"path escapes workspace\");\n    }\n    return resolved;\n  }\n}\n\nexport function isSafeWorkspaceDirectoryName(directoryName: string): boolean {\n  return Boolean(\n    directoryName &&\n      directoryName !== \".\" &&\n      directoryName !== \"..\" &&\n      !directoryName.includes(\"/\") &&\n      !directoryName.includes(\"\\\\\") &&\n      !directoryName.includes(\"..\")\n  );\n}\n\nexport function displayNameToWorkspaceDirectoryName(displayName: string, fallback = \"machine\"): string {\n  const cleaned = displayName\n    .trim()\n    .normalize(\"NFKC\")\n    .replace(/[\\/\\\\:]+/g, \"-\")\n    .replace(/\\s+/g, \"-\")\n    .replace(/[^A-Za-z0-9._-]+/g, \"-\")\n    .replace(/-+/g, \"-\")\n    .replace(/^[.-]+|[.-]+$/g, \"\")\n    .slice(0, 80);\n  return cleaned || fallback;\n}\n\nexport function namedWorkspaceDirectoryName(displayName: string, id: string, fallback = \"item\"): string {\n  if (fallback === \"machine\") return displayNameToWorkspaceDirectoryName(id, fallback);\n  const namePart = displayNameToWorkspaceDirectoryName(displayName, fallback);\n  const idPart = workspaceDirectoryIdPart(namePart, id);\n  return `${namePart}-${idPart}`;\n}\n\nexport function workspaceDirectoryIdPart(namePart: string, id: string): string {\n  let idPart = displayNameToWorkspaceDirectoryName(id, \"id\");\n  if (idPart.startsWith(`${namePart}-`)) idPart = idPart.slice(namePart.length + 1);\n  idPart = idPart.replace(/^(machine|agent|org)[_-]/, \"\");\n  return idPart || displayNameToWorkspaceDirectoryName(id, \"id\");\n}\n", "const PROXY_ENV_KEYS = [\n  \"HTTP_PROXY\",\n  \"HTTPS_PROXY\",\n  \"ALL_PROXY\",\n  \"http_proxy\",\n  \"https_proxy\",\n  \"all_proxy\",\n] as const;\n\nexport function buildPlatformNoProxy(serverUrl: string, existing?: string): string {\n  const entries = [\"127.0.0.1\", \"localhost\", \"::1\"];\n  try {\n    const url = new URL(serverUrl);\n    if (url.hostname) entries.push(url.hostname);\n  } catch {\n    // Invalid URLs are handled by the caller; keep the default local bypass list.\n  }\n  if (existing) entries.push(...existing.split(\",\"));\n\n  const seen = new Set<string>();\n  return entries\n    .map((entry) => entry.trim())\n    .filter((entry) => {\n      if (!entry || seen.has(entry)) return false;\n      seen.add(entry);\n      return true;\n    })\n    .join(\",\");\n}\n\nexport async function withPlatformProxyBypass<T>(serverUrl: string, action: () => Promise<T>): Promise<T> {\n  const previous = new Map<string, string | undefined>();\n  for (const key of PROXY_ENV_KEYS) {\n    previous.set(key, process.env[key]);\n    delete process.env[key];\n  }\n  previous.set(\"NO_PROXY\", process.env.NO_PROXY);\n  previous.set(\"no_proxy\", process.env.no_proxy);\n  process.env.NO_PROXY = buildPlatformNoProxy(serverUrl, process.env.NO_PROXY);\n  process.env.no_proxy = buildPlatformNoProxy(serverUrl, process.env.no_proxy);\n\n  try {\n    return await action();\n  } finally {\n    for (const [key, value] of previous) {\n      if (value === undefined) {\n        delete process.env[key];\n      } else {\n        process.env[key] = value;\n      }\n    }\n  }\n}\n", "import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport type { IncomingHttpHeaders } from \"node:http\";\nimport path from \"node:path\";\nimport { URL } from \"node:url\";\nimport { withPlatformProxyBypass } from \"../platform-proxy\";\nimport { runProxyProbe, runProxyVerify } from \"../proxy-module/proxy-verifier\";\n\nexport interface AIEmployeeProxyRegistration {\n  aiEmployeeId: string;\n  serverUrl: string;\n  authToken: string;\n  aiEmployeeWorkspaceDir: string;\n}\n\nexport interface AIEmployeeProxyRegistrationOptions {\n  advertiseHost?: string;\n}\n\nexport interface AIEmployeeProxyHandle {\n  proxyUrl: string;\n  proxyToken: string;\n}\n\nexport interface AIEmployeeLocalProxyOptions {\n  /** \u76D1\u542C\u5730\u5740\uFF0C\u9ED8\u8BA4 127.0.0.1\uFF1B\u5BB9\u5668\u6A21\u5F0F\u4F20 bridge \u7F51\u5173\u5730\u5740\u6216 0.0.0.0\u3002 */\n  bindHost?: string;\n  /** \u516C\u544A\u5730\u5740\uFF08\u5199\u5165 proxyUrl\uFF09\uFF0C\u9ED8\u8BA4 127.0.0.1\uFF1B\u5BB9\u5668\u6A21\u5F0F\u4F20 host.docker.internal \u7B49\u3002 */\n  advertiseHost?: string;\n  log?: (message: string) => void;\n}\n\nexport class AIEmployeeLocalProxy {\n  private server: http.Server | undefined;\n  private proxyUrl: string | undefined;\n  private readonly bindHost: string;\n  private readonly advertiseHost: string;\n  private readonly log: (message: string) => void;\n  private readonly registrations = new Map<string, AIEmployeeProxyRegistration>();\n\n  constructor(options: AIEmployeeLocalProxyOptions = {}) {\n    this.bindHost = options.bindHost ?? \"127.0.0.1\";\n    this.advertiseHost = options.advertiseHost ?? \"127.0.0.1\";\n    this.log = options.log ?? ((message) => console.warn(message));\n  }\n\n  async start(): Promise<string> {\n    if (this.proxyUrl) return this.proxyUrl;\n    this.server = http.createServer((request, response) => {\n      void this.handle(request, response);\n    });\n    if (!isLoopbackHost(this.bindHost)) {\n      // token \u6821\u9A8C\u903B\u8F91\u4E0D\u53D8\uFF08per-employee token\uFF09\uFF0C\u4F46\u975E\u56DE\u73AF\u76D1\u542C\u9762\u5411\u66F4\u5927\u7F51\u7EDC\u9762\uFF0C\u63D0\u9192\u90E8\u7F72\u65B9\u786E\u8BA4\u3002\n      this.log(`AI employee local proxy is listening on non-loopback host ${this.bindHost}; requests are still token-authenticated, make sure this is intended (container mode)`);\n    }\n    await new Promise<void>((resolve, reject) => {\n      const server = this.server;\n      if (!server) {\n        reject(new Error(\"AI employee local proxy server was not initialized\"));\n        return;\n      }\n      server.once(\"error\", reject);\n      server.listen(0, this.bindHost, () => {\n        server.off(\"error\", reject);\n        resolve();\n      });\n    });\n    const address = this.server.address();\n    if (!address || typeof address === \"string\") throw new Error(\"AI employee local proxy did not bind a TCP port\");\n    this.proxyUrl = this.proxyUrlFor(this.advertiseHost);\n    this.server.unref();\n    return this.proxyUrl;\n  }\n\n  async registerAIEmployee(input: AIEmployeeProxyRegistration, options: AIEmployeeProxyRegistrationOptions = {}): Promise<AIEmployeeProxyHandle> {\n    await this.start();\n    const proxyToken = randomBytes(32).toString(\"hex\");\n    this.registrations.set(proxyToken, input);\n    const proxyUrl = this.proxyUrlFor(options.advertiseHost ?? this.advertiseHost);\n    return { proxyUrl, proxyToken };\n  }\n\n  unregisterToken(proxyToken: string): void {\n    this.registrations.delete(proxyToken);\n  }\n\n  async close(): Promise<void> {\n    const server = this.server;\n    this.server = undefined;\n    this.proxyUrl = undefined;\n    this.registrations.clear();\n    if (!server) return;\n    await new Promise<void>((resolve) => server.close(() => resolve()));\n  }\n\n  private proxyUrlFor(advertiseHost: string): string {\n    const address = this.server?.address();\n    if (!address || typeof address === \"string\") throw new Error(\"AI employee local proxy did not bind a TCP port\");\n    return `http://${formatUrlHost(advertiseHost)}:${address.port}`;\n  }\n\n  private async handle(request: http.IncomingMessage, response: http.ServerResponse): Promise<void> {\n    const token = bearerToken(request.headers.authorization);\n    const registration = token ? this.registrations.get(token) : undefined;\n    if (!registration) {\n      sendJson(response, 401, { error: \"invalid local AI employee proxy token\" });\n      return;\n    }\n\n    const targetUrl = new URL(request.url ?? \"/\", registration.serverUrl);\n    if (!isAllowedAIEmployeePath(targetUrl.pathname, registration.aiEmployeeId)) {\n      sendJson(response, 403, { error: \"AI employee local proxy path is not allowed\" });\n      return;\n    }\n\n    // Local intercepts: proxy probe/verify run inside the daemon process so they can inspect\n    // the AI employee workspace without exposing local paths to the server.\n    const probePath = `/internal/ai-employee/${encodeURIComponent(registration.aiEmployeeId)}/proxy/probe`;\n    const verifyPath = `/internal/ai-employee/${encodeURIComponent(registration.aiEmployeeId)}/proxy/verify`;\n    if ((targetUrl.pathname === verifyPath || targetUrl.pathname === probePath) && request.method === \"POST\") {\n      try {\n        const body = await readBody(request);\n        const parsed = JSON.parse(body || \"{}\") as { dir?: unknown };\n        if (typeof parsed.dir !== \"string\") {\n          sendJson(response, 400, { ok: false, error: \"dir must be a string\" });\n          return;\n        }\n        const requestedDir = path.resolve(registration.aiEmployeeWorkspaceDir, parsed.dir);\n        const baseDir = path.resolve(registration.aiEmployeeWorkspaceDir);\n        if (requestedDir !== baseDir && !requestedDir.startsWith(`${baseDir}${path.sep}`)) {\n          sendJson(response, 400, { ok: false, error: \"dir must be inside AI employee workspace\" });\n          return;\n        }\n        const result = targetUrl.pathname === probePath\n          ? await runProxyProbe({ dir: requestedDir })\n          : await runProxyVerify({ dir: requestedDir });\n        sendJson(response, 200, result);\n      } catch (error) {\n        sendJson(response, 400, { ok: false, error: error instanceof Error ? error.message : String(error) });\n      }\n      return;\n    }\n\n    const headers = copyHeaders(request.headers);\n    headers.set(\"authorization\", `Bearer ${registration.authToken}`);\n    headers.set(\"x-wm-agent-id\", registration.aiEmployeeId);\n\n    try {\n      const upstream = await withPlatformProxyBypass(registration.serverUrl, () =>\n        fetch(targetUrl, {\n          method: request.method,\n          headers,\n          body: request.method === \"GET\" || request.method === \"HEAD\" ? undefined : request,\n          duplex: request.method === \"GET\" || request.method === \"HEAD\" ? undefined : \"half\",\n        } as RequestInit & { duplex?: \"half\" })\n      );\n      response.writeHead(upstream.status, responseHeaders(upstream.headers));\n      response.end(await upstream.text());\n    } catch (error) {\n      sendJson(response, 502, { error: error instanceof Error ? error.message : String(error) });\n    }\n  }\n}\n\nfunction isLoopbackHost(host: string): boolean {\n  return host === \"127.0.0.1\" || host === \"::1\" || host === \"localhost\";\n}\n\nfunction formatUrlHost(host: string): string {\n  return host.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n}\n\nasync function readBody(request: http.IncomingMessage): Promise<string> {\n  let body = \"\";\n  request.setEncoding(\"utf8\");\n  for await (const chunk of request) body += chunk;\n  return body;\n}\n\nfunction bearerToken(value: string | undefined): string | undefined {\n  const match = value?.match(/^Bearer\\s+(.+)$/i);\n  return match?.[1];\n}\n\nfunction isAllowedAIEmployeePath(pathname: string, aiEmployeeId: string): boolean {\n  const prefix = `/internal/ai-employee/${encodeURIComponent(aiEmployeeId)}`;\n  if (!pathname.startsWith(`${prefix}/`)) return false;\n  const suffix = pathname.slice(prefix.length);\n  if (suffix === \"/send\" || suffix === \"/server\" || suffix === \"/history\" || suffix === \"/search\") return true;\n  if (suffix === \"/receive\" || suffix === \"/receive-ack\") return true;\n  if (suffix === \"/dm/send\" || suffix === \"/channel/members\" || suffix === \"/member/find\" || suffix === \"/members/find\") return true;\n  if (suffix === \"/tasks\" || suffix === \"/task/list\" || suffix === \"/task/claim\" || suffix === \"/task/unclaim\" || suffix === \"/task/update\" || suffix === \"/task/create\") return true;\n  if (suffix === \"/upload\" || suffix === \"/attachment/upload\" || suffix === \"/download-attachment\" || suffix === \"/profile\") return true;\n  if (suffix === \"/runtime-profile/migration-ack\") return true;\n  return suffix.startsWith(\"/reminder/\")\n    || suffix.startsWith(\"/inbox/\")\n    || suffix.startsWith(\"/routine\")\n    || suffix.startsWith(\"/proxy\");\n}\n\nfunction copyHeaders(headers: IncomingHttpHeaders): Headers {\n  const copied = new Headers();\n  for (const [key, value] of Object.entries(headers)) {\n    if (key === \"host\" || key === \"connection\" || key === \"content-length\") continue;\n    if (Array.isArray(value)) {\n      for (const item of value) copied.append(key, item);\n    } else if (value !== undefined) {\n      copied.set(key, value);\n    }\n  }\n  return copied;\n}\n\nfunction responseHeaders(headers: Headers): Record<string, string> {\n  const copied: Record<string, string> = {};\n  headers.forEach((value, key) => {\n    if (key === \"connection\" || key === \"transfer-encoding\") return;\n    copied[key] = value;\n  });\n  return copied;\n}\n\nfunction sendJson(response: http.ServerResponse, status: number, payload: unknown): void {\n  response.writeHead(status, { \"content-type\": \"application/json\" });\n  response.end(JSON.stringify(payload));\n}\n", "import { chmod, readFile, readdir, writeFile, mkdir, rm } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { transform } from \"esbuild\";\nimport { validateProxyModuleSpec } from \"@claude-console/shared\";\nimport type { ProxyModuleSpec } from \"@claude-console/shared\";\nimport { createMockCtx } from \"./mock-ctx\";\nimport { DEFAULT_TIMEOUT_MS } from \"./proxy-module-runner\";\n\nexport interface VerifyOptions {\n  dir: string;\n}\n\nexport interface CheckResult {\n  name: \"structure\" | \"config\" | \"contract\" | \"handler\" | \"empty_dry_run\" | \"positive_fixture\";\n  ok: boolean;\n  fixture?: string;\n  duration_ms?: number;\n  draft_count?: number;\n  logs?: Array<{ level: string; message: string }>;\n}\n\nexport interface VerifyResult {\n  ok: boolean;\n  checks: CheckResult[];\n  errors: Array<{ check: string; message: string }>;\n  warnings: string[];\n  contract?: ProxyContract;\n  fixture_count?: number;\n  fixture_draft_count?: number;\n}\n\nexport interface ProbeResult {\n  ready: boolean;\n  sample_count: number;\n  sample_path?: string;\n  source_status: \"fixture_available\" | \"not_configured\" | \"empty\" | \"error\";\n  reason_if_empty?: string;\n}\n\nconst SUSPICIOUS = [/\\.env$/i, /\\.key$/i, /\\.pem$/i, /\\.p12$/i, /id_rsa/i];\nconst CONTRACT_FILE = \"contract.json\";\nconst FIXTURES_DIR = \"fixtures\";\n\nexport async function runProxyVerify(options: VerifyOptions): Promise<VerifyResult> {\n  const checks: CheckResult[] = [];\n  const errors: Array<{ check: string; message: string }> = [];\n  const warnings: string[] = [];\n  const dir = path.resolve(options.dir);\n\n  const structureErrors = await checkStructure(dir);\n  checks.push({ name: \"structure\", ok: structureErrors.length === 0 });\n  if (structureErrors.length) {\n    structureErrors.forEach((m) => errors.push({ check: \"structure\", message: m }));\n    return { ok: false, checks, errors, warnings };\n  }\n\n  const configResult = await checkConfig(dir);\n  checks.push({ name: \"config\", ok: configResult.ok });\n  if (!configResult.ok) {\n    configResult.errors.forEach((m) => errors.push({ check: \"config\", message: m }));\n    return { ok: false, checks, errors, warnings };\n  }\n\n  const handlerResult = await checkHandler(dir);\n  checks.push({ name: \"handler\", ok: handlerResult.ok });\n  if (!handlerResult.ok) {\n    handlerResult.errors.forEach((m) => errors.push({ check: \"handler\", message: m }));\n    return { ok: false, checks, errors, warnings };\n  }\n\n  const contractResult = await checkContractAndFixtures(dir);\n  checks.push({ name: \"contract\", ok: contractResult.ok });\n  if (!contractResult.ok) {\n    contractResult.errors.forEach((m) => errors.push({ check: \"contract\", message: m }));\n    return { ok: false, checks, errors, warnings };\n  }\n\n  const dryResult = await runWithHarness(handlerResult.runFn, {\n    triggerKind: configResult.spec.trigger.type,\n    commands: contractResult.fixtures[0]?.commands ?? [],\n  });\n  checks.push({\n    name: \"empty_dry_run\",\n    ok: dryResult.ok,\n    duration_ms: dryResult.duration_ms,\n    draft_count: dryResult.draftCount,\n    logs: dryResult.logs,\n  });\n  if (!dryResult.ok) {\n    dryResult.errors.forEach((m) => errors.push({ check: \"empty_dry_run\", message: m }));\n    return { ok: false, checks, errors, warnings };\n  }\n  if (dryResult.draftCount === 0) {\n    warnings.push(\"empty_dry_run produced no drafts; positive fixtures decide business readiness\");\n  }\n\n  for (const fixture of contractResult.fixtures) {\n    const result = await runWithHarness(handlerResult.runFn, {\n      triggerKind: fixture.trigger?.kind ?? configResult.spec.trigger.type,\n      triggerHeaders: fixture.trigger?.headers,\n      triggerBody: fixture.trigger?.body,\n      commands: fixture.commands,\n      fetch: fixture.fetch,\n    });\n    const expectationErrors = result.ok ? checkFixtureExpectations(fixture, result.drafts) : [];\n    const ok = result.ok && expectationErrors.length === 0;\n    checks.push({\n      name: \"positive_fixture\",\n      fixture: fixture.name,\n      ok,\n      duration_ms: result.duration_ms,\n      draft_count: result.draftCount,\n      logs: result.logs,\n    });\n    if (!ok) {\n      [...result.errors, ...expectationErrors].forEach((m) => errors.push({ check: `positive_fixture:${fixture.name}`, message: m }));\n      return { ok: false, checks, errors, warnings };\n    }\n  }\n  return {\n    ok: true,\n    checks,\n    errors,\n    warnings,\n    contract: contractResult.contract,\n    fixture_count: contractResult.fixtures.length,\n    fixture_draft_count: checks\n      .filter((check) => check.name === \"positive_fixture\")\n      .reduce((sum, check) => sum + (check.draft_count ?? 0), 0),\n  };\n}\n\nexport async function runProxyProbe(options: VerifyOptions): Promise<ProbeResult> {\n  const dir = path.resolve(options.dir);\n  const fixturesDir = path.join(dir, FIXTURES_DIR);\n  const entries = await readdir(fixturesDir).catch(() => []);\n  const fixtures = entries.filter((entry) => entry.endsWith(\".json\")).sort();\n  if (fixtures.length > 0) {\n    return {\n      ready: true,\n      sample_count: fixtures.length,\n      sample_path: path.join(FIXTURES_DIR, fixtures[0]),\n      source_status: \"fixture_available\",\n    };\n  }\n  const contractRaw = await readFile(path.join(dir, CONTRACT_FILE), \"utf8\").catch(() => null);\n  if (!contractRaw) {\n    return {\n      ready: false,\n      sample_count: 0,\n      source_status: \"not_configured\",\n      reason_if_empty: \"contract.json missing; define source/watch/acceptance before probing\",\n    };\n  }\n  return {\n    ready: false,\n    sample_count: 0,\n    source_status: \"empty\",\n    reason_if_empty: \"no positive fixture found; perform a read-only source probe and save a sanitized sample under fixtures/positive.json\",\n  };\n}\n\nasync function checkStructure(dir: string): Promise<string[]> {\n  const errs: string[] = [];\n  const entries = await readdir(dir).catch(() => null);\n  if (!entries) return [`directory not found: ${dir}`];\n  if (!entries.includes(\"proxy.json\")) errs.push(\"proxy.json missing\");\n  if (!entries.includes(\"handler.ts\")) errs.push(\"handler.ts missing\");\n  for (const entry of entries) {\n    if (SUSPICIOUS.some((re) => re.test(entry))) {\n      errs.push(`suspicious file detected: ${entry} (credentials must not live in proxy dir)`);\n    }\n  }\n  return errs;\n}\n\ntype ConfigOk = { ok: true; spec: ProxyModuleSpec };\ntype ConfigFail = { ok: false; errors: string[] };\n\nasync function checkConfig(dir: string): Promise<ConfigOk | ConfigFail> {\n  const raw = await readFile(path.join(dir, \"proxy.json\"), \"utf8\").catch(() => null);\n  if (raw === null) return { ok: false, errors: [\"proxy.json unreadable\"] };\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(raw);\n  } catch (e) {\n    return { ok: false, errors: [`proxy.json invalid JSON: ${(e as Error).message}`] };\n  }\n  const result = validateProxyModuleSpec(parsed);\n  if (!result.ok) return { ok: false, errors: result.errors };\n  return { ok: true, spec: result.spec };\n}\n\ntype ContractOk = { ok: true; contract: ProxyContract; fixtures: PositiveFixture[] };\ntype ContractFail = { ok: false; errors: string[] };\n\nexport interface ProxyContract {\n  source: string;\n  watch: string[];\n  output: \"inbox_draft\";\n  delivery_policy: \"draft_only\";\n  positive_sample_required: boolean;\n  acceptance: {\n    min_drafts_from_fixture: number;\n  };\n}\n\ninterface PositiveFixture {\n  name: string;\n  trigger?: {\n    kind?: \"interval\" | \"event\";\n    headers?: Record<string, string>;\n    body?: unknown;\n  };\n  commands: CommandFixture[];\n  fetch?: FetchFixture[];\n  expect: {\n    min_drafts: number;\n    draft_title_includes?: string;\n    draft_description_includes?: string;\n  };\n}\n\ninterface CommandFixture {\n  name: string;\n  stdout?: unknown;\n  stderr?: string;\n  exit_code: number;\n}\n\ninterface FetchFixture {\n  url: string;\n  status?: number;\n  body?: unknown;\n  headers?: Record<string, string>;\n}\n\nasync function checkContractAndFixtures(dir: string): Promise<ContractOk | ContractFail> {\n  const contractRaw = await readFile(path.join(dir, CONTRACT_FILE), \"utf8\").catch(() => null);\n  if (contractRaw === null) return { ok: false, errors: [`${CONTRACT_FILE} missing`] };\n  const errors: string[] = [];\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(contractRaw);\n  } catch (error) {\n    return { ok: false, errors: [`${CONTRACT_FILE} invalid JSON: ${(error as Error).message}`] };\n  }\n  const contract = normalizeContract(parsed, errors);\n  const fixtures = await readPositiveFixtures(path.join(dir, FIXTURES_DIR), contract?.acceptance.min_drafts_from_fixture ?? 1, errors);\n  if (errors.length > 0 || !contract) return { ok: false, errors };\n  if (contract.positive_sample_required && fixtures.length === 0) {\n    return { ok: false, errors: [\"positive fixture required but none found in fixtures/*.json\"] };\n  }\n  return { ok: true, contract, fixtures };\n}\n\nfunction normalizeContract(value: unknown, errors: string[]): ProxyContract | undefined {\n  const record = objectValue(value);\n  if (!record) {\n    errors.push(`${CONTRACT_FILE} must be an object`);\n    return undefined;\n  }\n  const source = typeof record.source === \"string\" ? record.source.trim() : \"\";\n  if (!source) errors.push(\"contract.source must be a non-empty string\");\n  const watch = Array.isArray(record.watch) ? record.watch.filter((item): item is string => typeof item === \"string\" && item.trim() !== \"\") : [];\n  if (watch.length === 0) errors.push(\"contract.watch must contain at least one item\");\n  if (record.output !== \"inbox_draft\") errors.push(\"contract.output must be inbox_draft\");\n  if (record.delivery_policy !== \"draft_only\") errors.push(\"contract.delivery_policy must be draft_only\");\n  const acceptance = objectValue(record.acceptance);\n  const minDrafts = Number(acceptance?.min_drafts_from_fixture);\n  if (!Number.isInteger(minDrafts) || minDrafts < 1) errors.push(\"contract.acceptance.min_drafts_from_fixture must be a positive integer\");\n  return {\n    source,\n    watch,\n    output: \"inbox_draft\",\n    delivery_policy: \"draft_only\",\n    positive_sample_required: record.positive_sample_required !== false,\n    acceptance: { min_drafts_from_fixture: Number.isInteger(minDrafts) && minDrafts > 0 ? minDrafts : 1 },\n  };\n}\n\nasync function readPositiveFixtures(fixturesDir: string, defaultMinDrafts: number, errors: string[]): Promise<PositiveFixture[]> {\n  let entries: string[];\n  try {\n    entries = await readdir(fixturesDir);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return [];\n    throw error;\n  }\n  const fixtures: PositiveFixture[] = [];\n  for (const entry of entries.filter((item) => item.endsWith(\".json\")).sort()) {\n    const raw = await readFile(path.join(fixturesDir, entry), \"utf8\");\n    let parsed: unknown;\n    try {\n      parsed = JSON.parse(raw);\n    } catch (error) {\n      errors.push(`${FIXTURES_DIR}/${entry} invalid JSON: ${(error as Error).message}`);\n      continue;\n    }\n    const fixture = normalizeFixture(parsed, entry, defaultMinDrafts, errors);\n    if (fixture) fixtures.push(fixture);\n  }\n  return fixtures;\n}\n\nfunction normalizeFixture(value: unknown, fallbackName: string, defaultMinDrafts: number, errors: string[]): PositiveFixture | undefined {\n  const record = objectValue(value);\n  if (!record) {\n    errors.push(`${fallbackName} must be an object`);\n    return undefined;\n  }\n  const name = typeof record.name === \"string\" && record.name.trim() ? record.name.trim() : fallbackName;\n  const trigger = normalizeTrigger(record.trigger, `${name}.trigger`, errors);\n  const commands = normalizeCommands(record.commands, `${name}.commands`, errors);\n  const fetchFixtures = normalizeFetchFixtures(record.fetch, `${name}.fetch`, errors);\n  const expect = normalizeFixtureExpect(record.expect, defaultMinDrafts, `${name}.expect`, errors);\n  return { name, trigger, commands, fetch: fetchFixtures, expect };\n}\n\ntype HandlerOk = { ok: true; runFn: (ctx: unknown) => Promise<unknown>; errors: never[] };\ntype HandlerFail = { ok: false; errors: string[]; runFn?: undefined };\n\nasync function checkHandler(dir: string): Promise<HandlerOk | HandlerFail> {\n  const src = await readFile(path.join(dir, \"handler.ts\"), \"utf8\").catch(() => null);\n  if (src === null) return { ok: false, errors: [\"handler.ts unreadable\"] };\n  let built: { code: string };\n  try {\n    built = await transform(src, { loader: \"ts\", format: \"esm\", target: \"node20\" });\n  } catch (e) {\n    return { ok: false, errors: [`handler.ts esbuild failed: ${(e as Error).message}`] };\n  }\n  const tempBase = path.join(os.tmpdir(), \"wm-verify\");\n  await mkdir(tempBase, { recursive: true });\n  const handlerPath = path.join(tempBase, `handler-${Date.now()}-${Math.random().toString(16).slice(2)}.mjs`);\n  await writeFile(handlerPath, built.code, \"utf8\");\n  try {\n    let mod: { run?: unknown };\n    try {\n      mod = await import(pathToFileURL(handlerPath).href);\n    } catch (e) {\n      return { ok: false, errors: [`handler.ts import failed: ${(e as Error).message}`] };\n    }\n    if (typeof mod.run !== \"function\") {\n      return { ok: false, errors: [`handler.ts must export 'run' as async function (got ${typeof mod.run})`] };\n    }\n    if ((mod.run as Function).constructor.name !== \"AsyncFunction\") {\n      return { ok: false, errors: [`handler.ts 'run' must be async function (got ${(mod.run as Function).constructor.name})`] };\n    }\n    return { ok: true, runFn: mod.run as (ctx: unknown) => Promise<unknown>, errors: [] };\n  } finally {\n    await rm(handlerPath, { force: true });\n  }\n}\n\ninterface HarnessResult {\n  ok: boolean;\n  errors: string[];\n  duration_ms: number;\n  draftCount: number;\n  drafts: Array<{ title: string; description: string }>;\n  logs: Array<{ level: string; message: string }>;\n}\n\nasync function runWithHarness(\n  runFn: (ctx: unknown) => Promise<unknown>,\n  options: {\n    triggerKind: \"interval\" | \"event\";\n    triggerHeaders?: Record<string, string>;\n    triggerBody?: unknown;\n    commands?: CommandFixture[];\n    fetch?: FetchFixture[];\n  },\n): Promise<HarnessResult> {\n  const binDir = await prepareCommandMocks(options.commands ?? []);\n  const previousPath = process.env.PATH;\n  if (binDir) process.env.PATH = `${binDir}${path.delimiter}${previousPath ?? \"\"}`;\n  const { ctx, drafts, logs } = createMockCtx({\n    triggerKind: options.triggerKind,\n    triggerHeaders: options.triggerHeaders,\n    triggerBody: options.triggerBody,\n    fetch: options.fetch ? mockedFetch(options.fetch) : undefined,\n  });\n  const start = Date.now();\n  let timer: ReturnType<typeof setTimeout> | undefined;\n  try {\n    await Promise.race([\n      runFn(ctx),\n      new Promise<never>((_, reject) => {\n        timer = setTimeout(\n          () => reject(new Error(`handler timeout after ${DEFAULT_TIMEOUT_MS}ms`)),\n          DEFAULT_TIMEOUT_MS,\n        );\n      }),\n    ]);\n    return {\n      ok: true,\n      errors: [],\n      duration_ms: Date.now() - start,\n      draftCount: drafts.length,\n      drafts,\n      logs: logs.map(({ level, message }) => ({ level, message })),\n    };\n  } catch (e) {\n    return {\n      ok: false,\n      errors: [(e as Error).message],\n      duration_ms: Date.now() - start,\n      draftCount: drafts.length,\n      drafts,\n      logs: logs.map(({ level, message }) => ({ level, message })),\n    };\n  } finally {\n    if (timer) clearTimeout(timer);\n    if (previousPath === undefined) delete process.env.PATH;\n    else process.env.PATH = previousPath;\n    if (binDir) await rm(binDir, { recursive: true, force: true });\n  }\n}\n\nfunction normalizeTrigger(value: unknown, pathName: string, errors: string[]): PositiveFixture[\"trigger\"] {\n  if (value === undefined) return undefined;\n  const record = objectValue(value);\n  if (!record) {\n    errors.push(`${pathName} must be an object`);\n    return undefined;\n  }\n  const kind = record.kind;\n  if (kind !== undefined && kind !== \"interval\" && kind !== \"event\") errors.push(`${pathName}.kind must be interval or event`);\n  const headers = record.headers === undefined ? undefined : stringRecord(record.headers, `${pathName}.headers`, errors);\n  return {\n    kind: kind === \"interval\" || kind === \"event\" ? kind : undefined,\n    headers,\n    body: record.body,\n  };\n}\n\nfunction normalizeCommands(value: unknown, pathName: string, errors: string[]): CommandFixture[] {\n  if (value === undefined) return [];\n  if (!Array.isArray(value)) {\n    errors.push(`${pathName} must be an array`);\n    return [];\n  }\n  const commands: CommandFixture[] = [];\n  value.forEach((entry, index) => {\n    const record = objectValue(entry);\n    if (!record) {\n      errors.push(`${pathName}[${index}] must be an object`);\n      return;\n    }\n    const name = typeof record.name === \"string\" ? record.name.trim() : \"\";\n    if (!/^[a-zA-Z0-9._-]+$/.test(name)) {\n      errors.push(`${pathName}[${index}].name must be a simple executable name`);\n      return;\n    }\n    const exitCode = record.exit_code === undefined ? 0 : Number(record.exit_code);\n    if (!Number.isInteger(exitCode) || exitCode < 0 || exitCode > 255) {\n      errors.push(`${pathName}[${index}].exit_code must be an integer between 0 and 255`);\n      return;\n    }\n    commands.push({\n      name,\n      stdout: record.stdout,\n      stderr: typeof record.stderr === \"string\" ? record.stderr : undefined,\n      exit_code: exitCode,\n    });\n  });\n  return commands;\n}\n\nfunction normalizeFetchFixtures(value: unknown, pathName: string, errors: string[]): FetchFixture[] | undefined {\n  if (value === undefined) return undefined;\n  if (!Array.isArray(value)) {\n    errors.push(`${pathName} must be an array`);\n    return undefined;\n  }\n  const fixtures: FetchFixture[] = [];\n  value.forEach((entry, index) => {\n    const record = objectValue(entry);\n    if (!record) {\n      errors.push(`${pathName}[${index}] must be an object`);\n      return;\n    }\n    const url = typeof record.url === \"string\" ? record.url.trim() : \"\";\n    if (!url) {\n      errors.push(`${pathName}[${index}].url must be a non-empty string`);\n      return;\n    }\n    fixtures.push({\n      url,\n      status: Number.isInteger(Number(record.status)) ? Number(record.status) : 200,\n      body: record.body,\n      headers: record.headers === undefined ? undefined : stringRecord(record.headers, `${pathName}[${index}].headers`, errors),\n    });\n  });\n  return fixtures;\n}\n\nfunction normalizeFixtureExpect(value: unknown, defaultMinDrafts: number, pathName: string, errors: string[]): PositiveFixture[\"expect\"] {\n  const record = objectValue(value);\n  if (!record) {\n    errors.push(`${pathName} must be an object`);\n    return { min_drafts: defaultMinDrafts };\n  }\n  const minDrafts = record.min_drafts === undefined ? defaultMinDrafts : Number(record.min_drafts);\n  if (!Number.isInteger(minDrafts) || minDrafts < 1) errors.push(`${pathName}.min_drafts must be a positive integer`);\n  return {\n    min_drafts: Number.isInteger(minDrafts) && minDrafts > 0 ? minDrafts : defaultMinDrafts,\n    draft_title_includes: typeof record.draft_title_includes === \"string\" ? record.draft_title_includes : undefined,\n    draft_description_includes: typeof record.draft_description_includes === \"string\" ? record.draft_description_includes : undefined,\n  };\n}\n\nasync function prepareCommandMocks(commands: CommandFixture[]): Promise<string | undefined> {\n  if (commands.length === 0) return undefined;\n  const binDir = path.join(os.tmpdir(), \"wm-verify-bin\", `${Date.now()}-${Math.random().toString(16).slice(2)}`);\n  await mkdir(binDir, { recursive: true });\n  for (const command of commands) {\n    const script = [\n      \"#!/usr/bin/env node\",\n      `process.stdout.write(${JSON.stringify(stringifyCommandOutput(command.stdout))});`,\n      `process.stderr.write(${JSON.stringify(command.stderr ?? \"\")});`,\n      `process.exit(${command.exit_code});`,\n      \"\",\n    ].join(\"\\n\");\n    const scriptPath = path.join(binDir, command.name);\n    await writeFile(scriptPath, script, \"utf8\");\n    await chmod(scriptPath, 0o755);\n  }\n  return binDir;\n}\n\nfunction stringifyCommandOutput(value: unknown): string {\n  if (value === undefined) return \"\";\n  return typeof value === \"string\" ? value : `${JSON.stringify(value)}\\n`;\n}\n\nfunction mockedFetch(fixtures: FetchFixture[]): typeof fetch {\n  return (async (input: string | URL | Request) => {\n    const url = typeof input === \"string\"\n      ? input\n      : input instanceof URL\n        ? input.toString()\n        : input.url;\n    const fixture = fixtures.find((item) => item.url === url);\n    if (!fixture) return new Response(\"{}\", { status: 404, headers: { \"content-type\": \"application/json\" } });\n    return new Response(stringifyCommandOutput(fixture.body), {\n      status: fixture.status ?? 200,\n      headers: fixture.headers ?? { \"content-type\": \"application/json\" },\n    });\n  }) as typeof fetch;\n}\n\nfunction checkFixtureExpectations(fixture: PositiveFixture, drafts: Array<{ title: string; description: string }>): string[] {\n  const errors: string[] = [];\n  if (drafts.length < fixture.expect.min_drafts) {\n    errors.push(`expected at least ${fixture.expect.min_drafts} drafts, got ${drafts.length}`);\n  }\n  if (fixture.expect.draft_title_includes && !drafts.some((draft) => draft.title.includes(fixture.expect.draft_title_includes!))) {\n    errors.push(`expected a draft title containing ${JSON.stringify(fixture.expect.draft_title_includes)}`);\n  }\n  if (fixture.expect.draft_description_includes && !drafts.some((draft) => draft.description.includes(fixture.expect.draft_description_includes!))) {\n    errors.push(`expected a draft description containing ${JSON.stringify(fixture.expect.draft_description_includes)}`);\n  }\n  return errors;\n}\n\nfunction objectValue(value: unknown): Record<string, any> | undefined {\n  return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, any> : undefined;\n}\n\nfunction stringRecord(value: unknown, pathName: string, errors: string[]): Record<string, string> | undefined {\n  const record = objectValue(value);\n  if (!record) {\n    errors.push(`${pathName} must be an object`);\n    return undefined;\n  }\n  const out: Record<string, string> = {};\n  for (const [key, item] of Object.entries(record)) {\n    if (typeof item !== \"string\") {\n      errors.push(`${pathName}.${key} must be a string`);\n      continue;\n    }\n    out[key] = item;\n  }\n  return out;\n}\n", "import type { ProxyContext, ProxyDraftInput } from \"./proxy-context\";\n\nexport interface MockCtxOptions {\n  triggerKind: \"interval\" | \"event\";\n  triggerHeaders?: Record<string, string>;\n  triggerBody?: unknown;\n  fetch?: typeof fetch;\n}\n\nexport interface MockDraftRecord extends ProxyDraftInput {}\n\nexport interface MockLogEntry {\n  level: \"info\" | \"warn\" | \"error\";\n  message: string;\n  meta?: Record<string, unknown>;\n}\n\nexport interface MockReplyRecord {\n  text: string;\n}\n\nexport interface MockCtxBundle {\n  ctx: ProxyContext;\n  drafts: MockDraftRecord[];\n  logs: MockLogEntry[];\n  replies: MockReplyRecord[];\n}\n\nexport function createMockCtx(options: MockCtxOptions): MockCtxBundle {\n  const drafts: MockDraftRecord[] = [];\n  const logs: MockLogEntry[] = [];\n  const replies: MockReplyRecord[] = [];\n  const cursor = new Map<string, unknown>();\n  const dedupe = new Set<string>();\n  const ctx: ProxyContext = {\n    trigger: {\n      kind: options.triggerKind,\n      received_at: Date.now(),\n      headers: options.triggerHeaders ?? {},\n      body: options.triggerBody ?? {},\n    },\n    fetch: options.fetch ?? (async () => new Response(\"{}\", { status: 200, headers: { \"content-type\": \"application/json\" } })),\n    cursor: {\n      get: (k) => cursor.get(k),\n      set: (k, v) => { cursor.set(k, v); },\n    },\n    dedupe: {\n      seen: (k) => dedupe.has(k),\n      mark: (k) => { dedupe.add(k); },\n    },\n    inbox: {\n      createDraft: async (draft) => {\n        if (typeof draft.title !== \"string\" || draft.title.trim() === \"\") {\n          throw new Error(\"ctx.inbox.createDraft: title must be non-empty string\");\n        }\n        if (typeof draft.description !== \"string\" || draft.description.trim() === \"\") {\n          throw new Error(\"ctx.inbox.createDraft: description must be non-empty string\");\n        }\n        drafts.push({ ...draft });\n        return { id: \"verify-mock\" };\n      },\n    },\n    reply: async (text: string) => {\n      replies.push({ text });\n      return { ok: true };\n    },\n    log: {\n      info: (message, meta) => { logs.push({ level: \"info\", message, meta }); },\n      warn: (message, meta) => { logs.push({ level: \"warn\", message, meta }); },\n      error: (message, meta) => { logs.push({ level: \"error\", message, meta }); },\n    },\n  };\n  return { ctx, drafts, logs, replies };\n}\n", "import { access, mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { fork } from \"node:child_process\";\nimport { lookup } from \"node:dns/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { transform } from \"esbuild\";\nimport type {\n  AIEmployeeRoutine,\n  DaemonMsg_AIEmployeeStart,\n  DaemonToServerMessage,\n  ProxyModuleSpec,\n  ProxyModuleTriggerEvent,\n  RoutineStepTrace,\n} from \"@claude-console/shared\";\nimport { isProxyModuleSpec } from \"@claude-console/shared\";\nimport { namedWorkspaceDirectoryName } from \"../agent-manager/workspace-browser\";\nimport type { ProxyContext, ProxyDraftInput } from \"./proxy-context\";\n\n/** Internal extension of ProxyContext that tracks cursor/dedupe state for IPC handoff. */\ninterface InternalProxyContext extends ProxyContext {\n  __state: { cursor: Record<string, unknown>; dedupe: Record<string, unknown> };\n  trigger: ProxyModuleTriggerEvent;\n}\n\nexport const MIN_INTERVAL_MS = 30_000;\nexport const DEFAULT_TIMEOUT_MS = 30_000;\nexport const HANDLER_RELATIVE_PATH = \"handler.ts\";\nconst MAX_FETCH_REDIRECTS = 5;\n\nexport interface ProxyModuleRunnerOptions {\n  rootDir: string;\n  routine: AIEmployeeRoutine;\n  config: DaemonMsg_AIEmployeeStart[\"config\"];\n  sendToServer: (message: DaemonToServerMessage) => void;\n  createInboxDraft?: (draft: ProxyDraftInput) => Promise<{ id: string }>;\n  sendReply?: (text: string) => Promise<{ ok: boolean }>;\n  fetchFn?: typeof fetch;\n  resolveHostnameFn?: (hostname: string) => Promise<string[]>;\n  allowPrivateHttp?: boolean;\n  setIntervalFn?: typeof setInterval;\n  clearIntervalFn?: typeof clearInterval;\n  log?: (line: string) => void;\n}\n\nexport class ProxyModuleRunner {\n  private timer?: ReturnType<typeof setInterval>;\n  private inFlight = false;\n  private dedupeAdded = 0;\n  private draftCreated = 0;\n\n  constructor(private readonly options: ProxyModuleRunnerOptions) {\n    if (!isProxyModuleSpec(options.routine.spec)) {\n      throw new Error(\"ProxyModuleRunner requires proxy_module spec\");\n    }\n  }\n\n  start(): void {\n    const spec = this.spec();\n    if (spec.trigger.type !== \"interval\" || this.timer) return;\n    const intervalMs = Math.max(MIN_INTERVAL_MS, spec.trigger.interval_seconds * 1000);\n    this.options.log?.(`[proxy-module] start routine=${this.options.routine.id} ai_employee=${this.options.routine.ai_employee_id} interval_ms=${intervalMs}`);\n    this.timer = (this.options.setIntervalFn ?? setInterval)(() => {\n      void this.trigger({ kind: \"interval\", received_at: Date.now() });\n    }, intervalMs);\n  }\n\n  stop(): void {\n    if (this.timer) (this.options.clearIntervalFn ?? clearInterval)(this.timer);\n    this.timer = undefined;\n    this.options.log?.(`[proxy-module] stop routine=${this.options.routine.id}`);\n  }\n\n  async trigger(event: ProxyModuleTriggerEvent): Promise<void> {\n    if (this.inFlight) {\n      this.options.log?.(`[proxy-module] skip busy routine=${this.options.routine.id}`);\n      return;\n    }\n    this.inFlight = true;\n    const startedAt = Date.now();\n    this.dedupeAdded = 0;\n    this.draftCreated = 0;\n    const traces: RoutineStepTrace[] = [];\n    try {\n      this.options.log?.(`[proxy-module] run routine=${this.options.routine.id} trigger=${event.kind}`);\n      const ctx = this.buildContext(event);\n      const dedupeKeysBefore = new Set(Object.keys(ctx.__state.dedupe));\n      await runProxyModuleInChild(await this.moduleEntryPath(), ctx, DEFAULT_TIMEOUT_MS);\n      this.dedupeAdded = Math.max(\n        this.dedupeAdded,\n        Object.keys(ctx.__state.dedupe).filter((key) => !dedupeKeysBefore.has(key)).length,\n      );\n      const outcomeDetail = this.classifySuccessOutcome();\n      const metrics = this.buildRunMetrics(outcomeDetail);\n      traces.push({\n        step_id: \"proxy_module\",\n        primitive: \"proxy_module\",\n        output: metrics,\n        started_at: startedAt,\n        finished_at: Date.now(),\n      });\n      const statePatch = {\n        last_run_at: startedAt,\n        last_success_at: Date.now(),\n        last_error: undefined,\n        consecutive_failures: 0,\n        last_run_status: outcomeDetail,\n        first_run_status: this.options.routine.state.first_run_status ?? outcomeDetail,\n        source_candidates: 0,\n        filtered_count: 0,\n        draft_count: this.draftCreated,\n        failure_reason: undefined,\n        attention_required: outcomeDetail === \"run_suspicious_zero_output\",\n        cursor: ctx.__state.cursor,\n        dedupe: ctx.__state.dedupe,\n      };\n      this.options.routine.state = { ...this.options.routine.state, ...statePatch };\n      this.options.sendToServer({\n        type: \"routine:state_writeback\",\n        routineId: this.options.routine.id,\n        statePatch,\n        run: {\n          startedAt,\n          finishedAt: Date.now(),\n          outcome: \"success\",\n          stepTraces: traces,\n          wakeCount: 0,\n          dedupeAdded: this.dedupeAdded,\n          outcomeDetail,\n          sourceCandidates: 0,\n          filteredCount: 0,\n          draftCount: this.draftCreated,\n          failureReason: undefined,\n        },\n      });\n    } catch (error) {\n      const message = error instanceof Error ? error.message : String(error);\n      this.options.log?.(`[proxy-module] run failed routine=${this.options.routine.id} error=${message}`);\n      const statePatch = {\n        last_run_at: startedAt,\n        last_error: message,\n        consecutive_failures: (this.options.routine.state.consecutive_failures ?? 0) + 1,\n        last_run_status: \"run_failed_transform\",\n        first_run_status: this.options.routine.state.first_run_status ?? \"run_failed_transform\",\n        draft_count: this.draftCreated,\n        failure_reason: message,\n        attention_required: true,\n      };\n      this.options.routine.state = { ...this.options.routine.state, ...statePatch };\n      this.options.sendToServer({\n        type: \"routine:state_writeback\",\n        routineId: this.options.routine.id,\n        statePatch,\n        run: {\n          startedAt,\n          finishedAt: Date.now(),\n          outcome: \"failure\",\n          stepTraces: traces,\n          errorMessage: message,\n          wakeCount: 0,\n          dedupeAdded: this.dedupeAdded,\n          outcomeDetail: \"run_failed_transform\",\n          sourceCandidates: 0,\n          filteredCount: 0,\n          draftCount: this.draftCreated,\n          failureReason: message,\n        },\n      });\n    } finally {\n      this.inFlight = false;\n    }\n  }\n\n  private spec(): ProxyModuleSpec {\n    return this.options.routine.spec as ProxyModuleSpec;\n  }\n\n  private classifySuccessOutcome(): string {\n    if (this.draftCreated > 0) return \"run_ok_drafts_created\";\n    const verifiedDrafts = Number((this.options.routine.state.verify as Record<string, unknown> | undefined)?.fixture_draft_count ?? 0);\n    if (verifiedDrafts > 0) return \"run_suspicious_zero_output\";\n    return \"run_ok_no_candidates\";\n  }\n\n  private buildRunMetrics(outcomeDetail: string): Record<string, unknown> {\n    return {\n      outcome_detail: outcomeDetail,\n      source_candidates: 0,\n      filtered_count: 0,\n      draft_count: this.draftCreated,\n      dedupe_added: this.dedupeAdded,\n      failure_reason: undefined,\n    };\n  }\n\n  private async moduleEntryPath(): Promise<string> {\n    const aiEmployeeDir = path.join(\n      this.options.rootDir,\n      this.options.config.machineId,\n      namedWorkspaceDirectoryName(this.options.config.aiEmployeeName, this.options.routine.ai_employee_id, \"ai-employee\"),\n    );\n    const baseDir = path.resolve(aiEmployeeDir, \".wm\", \"proxies\");\n    const modulePath = this.options.routine.state.module_path;\n    if (modulePath) {\n      const explicitDir = path.resolve(aiEmployeeDir, modulePath);\n      return this.handlerPathInProxyDir(explicitDir, baseDir);\n    }\n\n    const proxyDir = path.resolve(baseDir, this.options.routine.id);\n    const legacyPath = this.handlerPathInProxyDir(proxyDir, baseDir);\n    if (await fileExists(legacyPath)) return legacyPath;\n\n    const candidates = await this.findLegacyProxyHandlerCandidates(baseDir);\n    if (candidates.length === 1) return candidates[0];\n    if (candidates.length > 1) {\n      throw new Error(`routine ${this.options.routine.id} has no module_path and multiple proxy handlers exist`);\n    }\n    return legacyPath;\n  }\n\n  private handlerPathInProxyDir(proxyDir: string, baseDir: string): string {\n    if (proxyDir !== baseDir && !proxyDir.startsWith(baseDir + path.sep)) {\n      throw new Error(`proxy module path escapes proxies directory: ${this.options.routine.id}`);\n    }\n    return path.join(proxyDir, HANDLER_RELATIVE_PATH);\n  }\n\n  private async findLegacyProxyHandlerCandidates(baseDir: string): Promise<string[]> {\n    let entries: Array<{ isDirectory(): boolean; name: string }>;\n    try {\n      entries = await readdir(baseDir, { withFileTypes: true });\n    } catch (error) {\n      if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return [];\n      throw error;\n    }\n    const candidates: string[] = [];\n    for (const entry of entries) {\n      if (!entry.isDirectory()) continue;\n      const candidate = path.join(baseDir, entry.name, HANDLER_RELATIVE_PATH);\n      if (await fileExists(candidate)) candidates.push(candidate);\n    }\n    return candidates;\n  }\n\n  private buildContext(event: ProxyModuleTriggerEvent): InternalProxyContext {\n    const state = {\n      cursor: cloneRecord(this.options.routine.state.cursor),\n      dedupe: cloneRecord(this.options.routine.state.dedupe),\n    };\n    const createDraft = this.options.createInboxDraft ?? ((draft: ProxyDraftInput) => this.createInboxDraftViaServer(draft));\n    const replySink = this.options.routine.policy.reply_sink ?? \"inbox\";\n    const actionMode = this.options.routine.policy.action_mode ?? \"draft_only\";\n    const canCreateDraft = replySink === \"inbox\" || actionMode !== \"auto_low_risk\";\n    const canReply = actionMode === \"auto_low_risk\" && replySink === \"direct_reply\";\n    const sendReply = this.options.sendReply ?? ((text: string) => this.replyViaServer(text));\n    const ctxFetch = async (url: string, init?: RequestInit): Promise<Response> => {\n      const ssrfEnforced = !this.options.allowPrivateHttp && process.env.WM_PROXY_MODULE_ALLOW_PRIVATE_HTTP !== \"1\";\n      const doFetch = this.options.fetchFn ?? fetch;\n      if (!ssrfEnforced) {\n        const parsed = new URL(url);\n        if (![\"http:\", \"https:\"].includes(parsed.protocol)) throw new Error(\"ctx.fetch only supports http/https\");\n        return doFetch(parsed, init);\n      }\n      // SSRF enforcement: follow redirects manually so each hop is re-validated against the\n      // private-address policy. fetch's automatic redirect would otherwise reach an internal\n      // host if a public server returned a 3xx pointing at a private IP.\n      let current = new URL(url);\n      for (let hop = 0; hop <= MAX_FETCH_REDIRECTS; hop += 1) {\n        if (![\"http:\", \"https:\"].includes(current.protocol)) throw new Error(\"ctx.fetch only supports http/https\");\n        await assertPublicHttpTarget(current, this.options.resolveHostnameFn);\n        const response = await doFetch(current, { ...init, redirect: \"manual\" });\n        if (response.status < 300 || response.status >= 400) return response;\n        const location = response.headers.get(\"location\");\n        if (!location) return response;\n        current = new URL(location, current);\n      }\n      throw new Error(`ctx.fetch exceeded ${MAX_FETCH_REDIRECTS} redirects`);\n    };\n    return {\n      __state: state,\n      trigger: event,\n      cursor: {\n        get: (key: string) => state.cursor[key],\n        set: (key: string, value: unknown) => {\n          state.cursor[key] = value;\n        },\n      },\n      dedupe: {\n        seen: (key: string) => Boolean(state.dedupe[key]),\n        mark: (key: string) => {\n          if (!state.dedupe[key]) this.dedupeAdded += 1;\n          state.dedupe[key] = Date.now();\n        },\n      },\n      inbox: {\n        createDraft: async (draft: ProxyDraftInput) => {\n          if (!canCreateDraft) throw new Error(\"ctx.inbox.createDraft is disabled by routine policy\");\n          if (draft.dedupeKey && state.dedupe[draft.dedupeKey]) return { id: \"deduped\" };\n          const result = await createDraft(draft);\n          this.draftCreated += 1;\n          if (draft.dedupeKey) {\n            state.dedupe[draft.dedupeKey] = Date.now();\n            this.dedupeAdded += 1;\n          }\n          return result;\n        },\n      },\n      reply: async (text: string) => {\n        if (!canReply) throw new Error(\"ctx.reply is disabled by routine policy\");\n        return sendReply(text);\n      },\n      fetch: ctxFetch,\n      log: {\n        info: (message: string, meta?: Record<string, unknown>) => {\n          this.options.log?.(`[proxy-module] info routine=${this.options.routine.id} ${message}${meta ? ` ${safeJson(meta)}` : \"\"}`);\n        },\n        warn: (message: string, meta?: Record<string, unknown>) => {\n          this.options.log?.(`[proxy-module] warn routine=${this.options.routine.id} ${message}${meta ? ` ${safeJson(meta)}` : \"\"}`);\n        },\n        error: (message: string, meta?: Record<string, unknown>) => {\n          this.options.log?.(`[proxy-module] error routine=${this.options.routine.id} ${message}${meta ? ` ${safeJson(meta)}` : \"\"}`);\n        },\n      },\n    };\n  }\n\n  private async createInboxDraftViaServer(draft: ProxyDraftInput): Promise<{ id: string }> {\n    const response = await fetch(new URL(`/internal/ai-employee/${encodeURIComponent(this.options.routine.ai_employee_id)}/inbox/proxy-draft`, this.options.config.serverUrl), {\n      method: \"POST\",\n      headers: {\n        authorization: `Bearer ${this.options.config.authToken}`,\n        \"content-type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        routine_id: this.options.routine.id,\n        title: draft.title,\n        description: draft.description,\n        dedupe_key: draft.dedupeKey,\n        metadata: draft.metadata,\n      }),\n    });\n    const payload = await response.json().catch(() => ({})) as { id?: string; item?: { id?: string }; error?: string };\n    if (!response.ok) throw new Error(payload.error || `proxy draft create failed: HTTP ${response.status}`);\n    return { id: payload.item?.id ?? payload.id ?? \"unknown\" };\n  }\n\n  private async replyViaServer(text: string): Promise<{ ok: boolean }> {\n    const response = await fetch(new URL(`/internal/ai-employee/${encodeURIComponent(this.options.routine.ai_employee_id)}/reply`, this.options.config.serverUrl), {\n      method: \"POST\",\n      headers: {\n        authorization: `Bearer ${this.options.config.authToken}`,\n        \"content-type\": \"application/json\",\n      },\n      body: JSON.stringify({ routine_id: this.options.routine.id, text }),\n    });\n    const payload = await response.json().catch(() => ({})) as { ok?: boolean; error?: string };\n    if (!response.ok) throw new Error(payload.error || `reply failed: HTTP ${response.status}`);\n    return { ok: Boolean(payload.ok) };\n  }\n}\n\nasync function runProxyModuleInChild(entryPath: string, ctx: InternalProxyContext, timeoutMs: number): Promise<void> {\n  const source = await readFile(entryPath, \"utf8\");\n  const built = await transform(source, {\n    loader: \"ts\",\n    format: \"esm\",\n    target: \"node20\",\n    sourcemap: false,\n  });\n  const tempDir = await mkdir(path.join(os.tmpdir(), \"wm-proxy-modules\"), { recursive: true }).then(() => path.join(os.tmpdir(), \"wm-proxy-modules\"));\n  const suffix = `${Date.now()}-${Math.random().toString(16).slice(2)}`;\n  const handlerPath = path.join(tempDir, `${path.basename(entryPath, path.extname(entryPath))}-${suffix}.mjs`);\n  const inputPath = path.join(tempDir, `input-${suffix}.json`);\n  const childPath = path.join(tempDir, `runner-${suffix}.mjs`);\n  await writeFile(handlerPath, built.code, \"utf8\");\n  await writeFile(inputPath, JSON.stringify({\n    event: ctx.trigger,\n    state: ctx.__state,\n  }), \"utf8\");\n  await writeFile(childPath, proxyModuleChildSource(pathToFileURL(handlerPath).href, inputPath), \"utf8\");\n\n  const child = fork(childPath, [], { stdio: [\"ignore\", \"ignore\", \"ignore\", \"ipc\"] });\n  let settled = false;\n  await withTimeout(new Promise<void>((resolve, reject) => {\n    child.on(\"message\", (raw) => {\n      void handleProxyChildMessage(ctx, raw, child, resolve, reject, (nextState) => {\n        ctx.__state.cursor = nextState.cursor;\n        ctx.__state.dedupe = nextState.dedupe;\n        settled = true;\n      });\n    });\n    child.on(\"error\", (error) => {\n      if (!settled) reject(error);\n    });\n    child.on(\"exit\", (code, signal) => {\n      if (!settled && code !== 0) reject(new Error(`proxy module child exited code=${code ?? \"null\"} signal=${signal ?? \"null\"}`));\n    });\n  }), timeoutMs).finally(() => {\n    if (!child.killed) child.kill();\n  });\n}\n\ntype ProxyChildState = { cursor: Record<string, unknown>; dedupe: Record<string, unknown> };\ntype ProxyChildRequest = { id: string; op: string; args?: Record<string, unknown> };\ntype ProxyChildDone = { done: true; state?: ProxyChildState };\ntype ProxyChildError = { error: string };\n\nasync function handleProxyChildMessage(\n  ctx: InternalProxyContext,\n  raw: unknown,\n  child: ReturnType<typeof fork>,\n  resolve: () => void,\n  reject: (error: Error) => void,\n  markDone: (state: ProxyChildState) => void,\n): Promise<void> {\n  const message = raw && typeof raw === \"object\" ? raw as Partial<ProxyChildRequest & ProxyChildDone & ProxyChildError> : undefined;\n  if (!message) return;\n  if (message.done) {\n    const state = message.state && typeof message.state === \"object\" ? message.state : { cursor: {}, dedupe: {} };\n    markDone({ cursor: cloneRecord(state.cursor), dedupe: cloneRecord(state.dedupe) });\n    resolve();\n    return;\n  }\n  if (message.error) {\n    reject(new Error(message.error));\n    return;\n  }\n  if (!message.id || !message.op) return;\n  try {\n    const value = await handleProxyChildRequest(ctx, message as ProxyChildRequest);\n    child.send?.({ id: message.id, ok: true, value });\n  } catch (error) {\n    child.send?.({ id: message.id, ok: false, error: error instanceof Error ? error.message : String(error) });\n  }\n}\n\nasync function handleProxyChildRequest(ctx: ProxyContext, request: ProxyChildRequest): Promise<unknown> {\n  const args = request.args ?? {};\n  if (request.op === \"inbox:createDraft\") return ctx.inbox.createDraft(args.draft as ProxyDraftInput);\n  if (request.op === \"reply\") return ctx.reply(String(args.text ?? \"\"));\n  if (request.op === \"fetch\") {\n    const response = await ctx.fetch(String(args.url ?? \"\"), args.init as RequestInit | undefined);\n    const body = await response.arrayBuffer();\n    return {\n      body: Buffer.from(body).toString(\"base64\"),\n      status: response.status,\n      headers: Object.fromEntries(response.headers.entries()),\n    };\n  }\n  if (request.op === \"log\") {\n    const level = args.level === \"warn\" || args.level === \"error\" ? args.level : \"info\";\n    ctx.log[level](String(args.message ?? \"\"), objectValue(args.meta));\n    return undefined;\n  }\n  throw new Error(`unsupported proxy module ctx operation: ${request.op}`);\n}\n\nfunction proxyModuleChildSource(handlerUrl: string, inputPath: string): string {\n  return `\nimport { readFile } from \"node:fs/promises\";\n\nconst input = JSON.parse(await readFile(${JSON.stringify(inputPath)}, \"utf8\"));\nconst state = {\n  cursor: input.state?.cursor && typeof input.state.cursor === \"object\" ? input.state.cursor : {},\n  dedupe: input.state?.dedupe && typeof input.state.dedupe === \"object\" ? input.state.dedupe : {},\n};\nconst pending = new Map();\nlet nextId = 0;\n\nfunction callParent(op, args) {\n  return new Promise((resolve, reject) => {\n    const id = String(++nextId);\n    pending.set(id, { resolve, reject });\n    process.send?.({ id, op, args });\n  });\n}\n\nprocess.on(\"message\", (message) => {\n  const pendingCall = message?.id ? pending.get(message.id) : undefined;\n  if (!pendingCall) return;\n  pending.delete(message.id);\n  if (message.ok) pendingCall.resolve(message.value);\n  else pendingCall.reject(new Error(message.error || \"proxy module ctx operation failed\"));\n});\n\nconst ctx = {\n  trigger: input.event,\n  cursor: {\n    get: (key) => state.cursor[key],\n    set: (key, value) => { state.cursor[key] = value; },\n  },\n  dedupe: {\n    seen: (key) => Boolean(state.dedupe[key]),\n    mark: (key) => { state.dedupe[key] = Date.now(); },\n  },\n  inbox: {\n    createDraft: async (draft) => {\n      const result = await callParent(\"inbox:createDraft\", { draft });\n      if (draft?.dedupeKey) state.dedupe[draft.dedupeKey] = Date.now();\n      return result;\n    },\n  },\n  reply: async (text) => callParent(\"reply\", { text }),\n  fetch: async (url, init) => {\n    const payload = await callParent(\"fetch\", { url, init });\n    const body = Buffer.from(payload.body, \"base64\");\n    return new Response(body, { status: payload.status, headers: payload.headers });\n  },\n  log: {\n    info: (message, meta) => callParent(\"log\", { level: \"info\", message, meta }),\n    warn: (message, meta) => callParent(\"log\", { level: \"warn\", message, meta }),\n    error: (message, meta) => callParent(\"log\", { level: \"error\", message, meta }),\n  },\n};\n\ntry {\n  const loaded = await import(${JSON.stringify(handlerUrl)});\n  if (typeof loaded.run !== \"function\") throw new Error(\"handler.ts must export async function run(ctx)\");\n  await Promise.resolve(loaded.run(ctx));\n  process.send?.({ done: true, state });\n} catch (error) {\n  process.send?.({ error: error instanceof Error ? error.message : String(error) });\n  process.exitCode = 1;\n}\n`;\n}\n\nfunction withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n  let timer: ReturnType<typeof setTimeout> | undefined;\n  return Promise.race([\n    promise.finally(() => {\n      if (timer) clearTimeout(timer);\n    }),\n    new Promise<T>((_resolve, reject) => {\n      timer = setTimeout(() => reject(new Error(`proxy module timeout after ${timeoutMs}ms`)), timeoutMs);\n    }),\n  ]);\n}\n\nfunction cloneRecord(value: unknown): Record<string, unknown> {\n  return value && typeof value === \"object\" && !Array.isArray(value)\n    ? JSON.parse(JSON.stringify(value)) as Record<string, unknown>\n    : {};\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n  try {\n    await access(filePath);\n    return true;\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return false;\n    throw error;\n  }\n}\n\nasync function assertPublicHttpTarget(url: URL, resolveHostnameFn?: (hostname: string) => Promise<string[]>): Promise<void> {\n  const hostname = url.hostname.toLowerCase();\n  if (hostname === \"localhost\" || hostname.endsWith(\".localhost\")) throw new Error(\"ctx.fetch target is blocked by SSRF policy\");\n  const directIp = net.isIP(hostname) ? [hostname] : [];\n  const addresses = directIp.length > 0\n    ? directIp\n    : await (resolveHostnameFn ?? defaultResolveHostname)(hostname);\n  if (addresses.some(isPrivateAddress)) throw new Error(\"ctx.fetch target is blocked by SSRF policy\");\n}\n\nasync function defaultResolveHostname(hostname: string): Promise<string[]> {\n  const records = await lookup(hostname, { all: true, verbatim: false });\n  return records.map((record) => record.address);\n}\n\nfunction isPrivateAddress(address: string): boolean {\n  if (net.isIPv4(address)) {\n    const parts = address.split(\".\").map((part) => Number(part));\n    const [a, b] = parts;\n    return (\n      a === 10 ||\n      a === 127 ||\n      (a === 172 && b >= 16 && b <= 31) ||\n      (a === 192 && b === 168) ||\n      (a === 169 && b === 254) ||\n      address === \"0.0.0.0\"\n    );\n  }\n  if (net.isIPv6(address)) {\n    const normalized = address.toLowerCase();\n    return normalized === \"::1\" || normalized.startsWith(\"fc\") || normalized.startsWith(\"fd\") || normalized.startsWith(\"fe80:\");\n  }\n  return true;\n}\n\nfunction safeJson(value: unknown): string {\n  return JSON.stringify(value, (_key, item) => {\n    if (typeof item === \"string\" && item.length > 200) return `${item.slice(0, 200)}...`;\n    return item;\n  });\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | undefined {\n  return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n}\n", "import { spawn } from \"node:child_process\";\nimport type { ChildProcess, ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { mkdirSync } from \"node:fs\";\nimport { copyFile, mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AIEmployeeTemplateSetupState, AIEmployeeTemplateSetupStepState } from \"@claude-console/shared\";\nimport { resolveLarkCliBinary } from \"./lark-cli-bin\";\nimport type { ExecutionBackend } from \"../runtime/execution-backend\";\nimport type { RuntimeId } from \"../runtime/capabilities\";\n\nexport type ExecRunner = (\n  cmd: string,\n  args: string[],\n  opts: { env: Record<string, string>; stdinData?: string; timeoutMs?: number; cwd?: string }\n) => Promise<{ code: number; stdout: string; stderr: string }>;\n\nexport function createFeishuRuntimeExecRunner(\n  input: {\n    workspaceDir: string;\n    runtimeWorkspaceDir: string;\n    employeeId: string;\n    runtime?: RuntimeId;\n    env?: NodeJS.ProcessEnv;\n    command?: string;\n  },\n  executionBackend: ExecutionBackend\n): ExecRunner {\n  const command = input.command ?? path.posix.join(input.runtimeWorkspaceDir, \".wm\", \"lark-cli\");\n  const env = larkRuntimeEnv(input.runtimeWorkspaceDir, input.env);\n  return async (_cmd, args, opts) => {\n    const child = executionBackend.spawnRuntime({\n      command,\n      args,\n      cwd: input.workspaceDir,\n      workspaceDir: input.workspaceDir,\n      runtime: input.runtime,\n      env: {\n        ...env,\n        ...opts.env,\n        ...larkRuntimeEnv(input.runtimeWorkspaceDir, input.env),\n      },\n      employeeId: input.employeeId,\n      stdio: \"pipe\",\n    });\n    return collectRuntimeChild(child, opts);\n  };\n}\n\nconst FEISHU_CREDENTIAL_INVALID_MESSAGE = \"\u98DE\u4E66\u5E94\u7528\u51ED\u8BC1\u65E0\u6548\uFF1AApp ID \u6216 App Secret \u6821\u9A8C\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u586B\u5199\u7684\u662F\u98DE\u4E66\u81EA\u5EFA\u5E94\u7528\u7684 App ID \u548C App Secret\uFF0C\u5E76\u5728\u98DE\u4E66\u540E\u53F0\u91CD\u65B0\u590D\u5236\u540E\u91CD\u8BD5\u3002\";\nconst FEISHU_BOT_NOT_ENABLED_MESSAGE = \"\u98DE\u4E66\u5E94\u7528\u672A\u542F\u7528\u673A\u5668\u4EBA\u80FD\u529B\uFF1A\u8BF7\u5728\u98DE\u4E66\u5F00\u53D1\u8005\u540E\u53F0\u6DFB\u52A0\u673A\u5668\u4EBA\u80FD\u529B\u5E76\u53D1\u5E03\u751F\u6548\u540E\u91CD\u8BD5\u3002\";\nconst FEISHU_SECRET_UNREADABLE_MESSAGE = \"\u98DE\u4E66\u5E94\u7528\u51ED\u8BC1\u672A\u6B63\u786E\u5199\u5165\uFF1Alark-cli \u65E0\u6CD5\u8BFB\u53D6 App Secret\uFF0C\u8BF7\u91CD\u65B0\u4FDD\u5B58 App Secret \u540E\u91CD\u8BD5\u3002\";\n\nexport function larkConfigDir(workspaceDir: string): string {\n  return path.join(workspaceDir, \".wm\", \"lark-cli-config\");\n}\n\nfunction larkHomeDir(workspaceDir: string): string {\n  return path.join(workspaceDir, \".home\");\n}\n\nexport function larkWorkspaceHomeEnv(workspaceDir: string): Record<string, string> {\n  const home = larkHomeDir(workspaceDir);\n  for (const dir of [\n    path.join(home, \".local\", \"share\"),\n    path.join(home, \".config\"),\n    path.join(home, \".cache\"),\n    path.join(home, \".local\", \"state\"),\n  ]) {\n    try {\n      mkdirSync(dir, { recursive: true });\n    } catch {\n      // The lark command will surface a concrete filesystem error if the\n      // workspace is truly unusable. Unit tests may pass synthetic paths.\n    }\n  }\n  return {\n    HOME: home,\n    XDG_DATA_HOME: path.join(home, \".local\", \"share\"),\n    XDG_CONFIG_HOME: path.join(home, \".config\"),\n    XDG_CACHE_HOME: path.join(home, \".cache\"),\n    XDG_STATE_HOME: path.join(home, \".local\", \"state\"),\n  };\n}\n\nfunction larkEnv(workspaceDir: string): Record<string, string> {\n  return {\n    ...(process.env as Record<string, string>),\n    ...larkWorkspaceHomeEnv(workspaceDir),\n    LARKSUITE_CLI_CONFIG_DIR: larkConfigDir(workspaceDir),\n  };\n}\n\nexport function larkRuntimeHomeEnv(runtimeWorkspaceDir: string): Record<string, string> {\n  const home = path.posix.join(runtimeWorkspaceDir, \".home\");\n  return {\n    HOME: home,\n    XDG_DATA_HOME: path.posix.join(home, \".local\", \"share\"),\n    XDG_CONFIG_HOME: path.posix.join(home, \".config\"),\n    XDG_CACHE_HOME: path.posix.join(home, \".cache\"),\n    XDG_STATE_HOME: path.posix.join(home, \".local\", \"state\"),\n  };\n}\n\nfunction larkRuntimeEnv(runtimeWorkspaceDir: string, baseEnv?: NodeJS.ProcessEnv): Record<string, string> {\n  return {\n    ...((baseEnv ?? process.env) as Record<string, string>),\n    ...larkRuntimeHomeEnv(runtimeWorkspaceDir),\n    LARKSUITE_CLI_CONFIG_DIR: path.posix.join(runtimeWorkspaceDir, \".wm\", \"lark-cli-config\"),\n  };\n}\n\nexport async function initFeishuCredential(\n  input: { workspaceDir: string; appId: string; appSecret: string },\n  run: ExecRunner = spawnRunner\n): Promise<void> {\n  const preservedUsers = await readPreservedLarkUsers(input.workspaceDir, input.appId);\n  await run(await resolveLarkCliBinary(), [\"config\", \"keychain-downgrade\"], { env: larkEnv(input.workspaceDir) });\n  // Best-effort only: this command is an environment repair for macOS Keychain\n  // access and may legitimately be unsupported inside sandbox/container runtimes.\n  // The credential source of truth is the config init + auth status verification\n  // below, so do not block setup just because downgrade is unavailable.\n  const args = [\"config\", \"init\", \"--force-init\", \"--app-id\", input.appId, \"--brand\", \"feishu\", \"--app-secret-stdin\"];\n  const result = await run(await resolveLarkCliBinary(), args, { env: larkEnv(input.workspaceDir), stdinData: input.appSecret });\n  if (result.code !== 0) throw new Error(`lark-cli init failed: ${result.stderr || result.stdout}`);\n  await restorePreservedLarkUsers(input.workspaceDir, input.appId, preservedUsers);\n  const check = await run(await resolveLarkCliBinary(), [\"config\", \"show\"], { env: larkEnv(input.workspaceDir) });\n  if (check.code !== 0 || !check.stdout.includes(input.appId)) {\n    throw new Error(`lark-cli init verification failed: ${check.stderr || check.stdout || \"config not found\"}`);\n  }\n  await verifyFeishuCredentialReadable(input.workspaceDir, run);\n}\n\nexport async function initFeishuCredentialInRuntime(\n  input: {\n    workspaceDir: string;\n    runtimeWorkspaceDir: string;\n    appId: string;\n    appSecret: string;\n    employeeId: string;\n    runtime?: RuntimeId;\n    env?: NodeJS.ProcessEnv;\n    command?: string;\n  },\n  executionBackend: ExecutionBackend\n): Promise<void> {\n  const preservedUsers = await readPreservedLarkUsers(input.workspaceDir, input.appId);\n  const command = input.command ?? path.posix.join(input.runtimeWorkspaceDir, \".wm\", \"lark-cli\");\n  const env = larkRuntimeEnv(input.runtimeWorkspaceDir, input.env);\n  const keychainChild = executionBackend.spawnRuntime({\n    command,\n    args: [\"config\", \"keychain-downgrade\"],\n    cwd: input.workspaceDir,\n    workspaceDir: input.workspaceDir,\n    runtime: input.runtime,\n    env,\n    employeeId: input.employeeId,\n    stdio: \"pipe\",\n  });\n  await waitForOptionalCredentialChild(keychainChild);\n\n  const initChild = executionBackend.spawnRuntime({\n    command,\n    args: [\"config\", \"init\", \"--force-init\", \"--app-id\", input.appId, \"--brand\", \"feishu\", \"--app-secret-stdin\"],\n    cwd: input.workspaceDir,\n    workspaceDir: input.workspaceDir,\n    runtime: input.runtime,\n    env,\n    employeeId: input.employeeId,\n    stdio: \"pipe\",\n  });\n  initChild.stdin?.write(input.appSecret);\n  initChild.stdin?.end();\n  await waitForCredentialChild(initChild, \"lark-cli runtime init\");\n  await restorePreservedLarkUsers(input.workspaceDir, input.appId, preservedUsers);\n  await syncDarwinLarkCredentialStoreToRuntime(input.workspaceDir, input.appId);\n\n  const showChild = executionBackend.spawnRuntime({\n    command,\n    args: [\"config\", \"show\"],\n    cwd: input.workspaceDir,\n    workspaceDir: input.workspaceDir,\n    runtime: input.runtime,\n    env,\n    employeeId: input.employeeId,\n    stdio: \"pipe\",\n  });\n  const show = await waitForCredentialChild(showChild, \"lark-cli runtime init verification\");\n  if (!show.stdout.includes(input.appId)) {\n    throw new Error(`lark-cli runtime init verification failed: ${show.stderr || show.stdout || \"config not found\"}`);\n  }\n  const statusChild = executionBackend.spawnRuntime({\n    command,\n    args: [\"auth\", \"status\", \"--verify\", \"--json\"],\n    cwd: input.workspaceDir,\n    workspaceDir: input.workspaceDir,\n    runtime: input.runtime,\n    env,\n    employeeId: input.employeeId,\n    stdio: \"pipe\",\n  });\n  const status = await waitForCredentialChild(statusChild, \"lark-cli runtime credential verification\");\n  assertFeishuCredentialStatusReadable(status.stdout, status.stderr);\n}\n\nasync function readPreservedLarkUsers(workspaceDir: string, appId: string): Promise<unknown[]> {\n  try {\n    const config = JSON.parse(await readFile(path.join(larkConfigDir(workspaceDir), \"config.json\"), \"utf8\"));\n    const app = Array.isArray(config?.apps) ? config.apps.find((entry: unknown) => {\n      return Boolean(entry && typeof entry === \"object\" && (entry as { appId?: unknown }).appId === appId);\n    }) : undefined;\n    const users = app && typeof app === \"object\" ? (app as { users?: unknown }).users : undefined;\n    return Array.isArray(users) ? users : [];\n  } catch {\n    return [];\n  }\n}\n\nasync function restorePreservedLarkUsers(workspaceDir: string, appId: string, preservedUsers: unknown[]): Promise<void> {\n  if (preservedUsers.length === 0) return;\n  const configPath = path.join(larkConfigDir(workspaceDir), \"config.json\");\n  try {\n    const config = JSON.parse(await readFile(configPath, \"utf8\"));\n    if (!Array.isArray(config?.apps)) return;\n    const app = config.apps.find((entry: unknown) => {\n      return Boolean(entry && typeof entry === \"object\" && (entry as { appId?: unknown }).appId === appId);\n    });\n    if (!app || typeof app !== \"object\") return;\n    const holder = app as { users?: unknown[] };\n    const currentUsers = Array.isArray(holder.users) ? holder.users : [];\n    const seen = new Set(currentUsers.map((user) => JSON.stringify(user)));\n    const merged = [...currentUsers];\n    for (const user of preservedUsers) {\n      const key = JSON.stringify(user);\n      if (!seen.has(key)) {\n        seen.add(key);\n        merged.push(user);\n      }\n    }\n    holder.users = merged;\n    await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n  } catch {\n    // Config preservation is best-effort. The following auth status check will\n    // surface a concrete failure if the user identity was not recoverable.\n  }\n}\n\nexport async function syncDarwinLarkCredentialStoreToRuntime(workspaceDir: string, appId: string): Promise<void> {\n  const homeDir = path.join(workspaceDir, \".home\");\n  const darwinStoreDir = path.join(homeDir, \"Library\", \"Application Support\", \"lark-cli\");\n  const runtimeStoreDir = path.join(homeDir, \".local\", \"share\", \"lark-cli\");\n  const masterKeyPath = path.join(darwinStoreDir, \"master.key.file\");\n  const appSecretName = `appsecret_${appId}.enc`;\n  try {\n    const entries = await readdir(darwinStoreDir);\n    if (!entries.includes(\"master.key.file\") || !entries.includes(appSecretName)) return;\n    const credentialNames = entries.filter((entry) => entry === appSecretName || entry.startsWith(`${appId}_`) && entry.endsWith(\".enc\"));\n    if (credentialNames.length === 0) return;\n    await mkdir(runtimeStoreDir, { recursive: true });\n    await copyFile(masterKeyPath, path.join(runtimeStoreDir, \"master.key\"));\n    for (const name of credentialNames) {\n      await copyFile(path.join(darwinStoreDir, name), path.join(runtimeStoreDir, name));\n    }\n  } catch {\n    // Best-effort compatibility path for credentials created before runtime auth\n    // was executed inside the container. Fresh device-flow auth already writes\n    // to the runtime store directly.\n  }\n}\n\nexport async function removeFeishuCredential(\n  input: { workspaceDir: string },\n  run: ExecRunner = spawnRunner\n): Promise<void> {\n  const result = await run(await resolveLarkCliBinary(), [\"config\", \"remove\"], { env: larkEnv(input.workspaceDir) });\n  if (result.code !== 0) throw new Error(`lark-cli remove failed: ${result.stderr || result.stdout}`);\n  await rm(larkConfigDir(input.workspaceDir), { recursive: true, force: true });\n}\n\n// ---- \u7528\u6237\u8EAB\u4EFD\u6388\u6743\uFF08lark-cli device flow\uFF09----\n// bot \u8EAB\u4EFD\u7528 tenant token \u6536\u53D1\u6D88\u606F\uFF1Buser \u8EAB\u4EFD\u7528 OAuth user token \u8BFB\u4E91\u7A7A\u95F4\u6587\u6863\u3002\n// device flow \u4E24\u6B65\uFF1AstartUserAuth \u62FF\u9A8C\u8BC1 URL + device_code\uFF08\u4E0D\u963B\u585E\uFF09\uFF0C\u7528\u6237\u6D4F\u89C8\u5668\u6388\u6743\u540E\n// completeUserAuth \u7528 device_code \u5B8C\u6210\u3002\u4E24\u6B65\u5171\u7528\u540C\u4E00\u4E2A LARKSUITE_CLI_CONFIG_DIR\u3002\n\ntype LarkJson = Record<string, unknown>;\n\nfunction parseLarkJson(stdout: string): LarkJson | undefined {\n  const trimmed = stdout.trim();\n  if (!trimmed) return undefined;\n  try {\n    const value = JSON.parse(trimmed);\n    return value && typeof value === \"object\" ? (value as LarkJson) : undefined;\n  } catch {\n    const start = trimmed.indexOf(\"{\");\n    const end = trimmed.lastIndexOf(\"}\");\n    if (start < 0 || end <= start) return undefined;\n    try {\n      const value = JSON.parse(trimmed.slice(start, end + 1));\n      return value && typeof value === \"object\" ? (value as LarkJson) : undefined;\n    } catch {\n      return undefined;\n    }\n  }\n}\n\nfunction waitForCredentialChild(child: ChildProcess | ChildProcessWithoutNullStreams, label: string): Promise<{ stdout: string; stderr: string }> {\n  return new Promise((resolve, reject) => {\n    let stdout = \"\";\n    let stderr = \"\";\n    child.stdout?.setEncoding(\"utf8\");\n    child.stderr?.setEncoding(\"utf8\");\n    child.stdout?.on(\"data\", (chunk) => {\n      stdout += String(chunk);\n    });\n    child.stderr?.on(\"data\", (chunk) => {\n      stderr += String(chunk);\n    });\n    child.once(\"error\", reject);\n    child.once(\"exit\", (code, signal) => {\n      if (code === 0) {\n        resolve({ stdout, stderr });\n        return;\n      }\n      const detail = [stderr.trim(), stdout.trim()].filter(Boolean).join(\"\\n\").slice(0, 2000);\n      reject(new Error(`${label} failed code=${code ?? \"-\"} signal=${signal ?? \"-\"}${detail ? `: ${detail}` : \"\"}`));\n    });\n  });\n}\n\nfunction collectRuntimeChild(\n  child: ChildProcess | ChildProcessWithoutNullStreams,\n  opts: { stdinData?: string; timeoutMs?: number }\n): Promise<{ code: number; stdout: string; stderr: string }> {\n  return new Promise((resolve) => {\n    let stdout = \"\";\n    let stderr = \"\";\n    let settled = false;\n    const finish = (code: number, extraStderr = \"\") => {\n      if (settled) return;\n      settled = true;\n      if (timer) clearTimeout(timer);\n      resolve({ code, stdout, stderr: stderr || extraStderr });\n    };\n    const timer = opts.timeoutMs && opts.timeoutMs > 0\n      ? setTimeout(() => {\n        stderr = stderr || `command timed out after ${opts.timeoutMs}ms`;\n        child.kill(\"SIGTERM\");\n        setTimeout(() => {\n          if (!settled) child.kill(\"SIGKILL\");\n        }, 750).unref?.();\n        finish(124);\n      }, opts.timeoutMs)\n      : undefined;\n    timer?.unref?.();\n    child.stdout?.setEncoding(\"utf8\");\n    child.stderr?.setEncoding(\"utf8\");\n    child.stdout?.on(\"data\", (chunk) => { stdout += String(chunk); });\n    child.stderr?.on(\"data\", (chunk) => { stderr += String(chunk); });\n    child.once(\"error\", (error) => finish(1, error.message));\n    child.once(\"close\", (code) => finish(code ?? 1));\n    child.once(\"exit\", (code) => finish(code ?? 1));\n    if (opts.stdinData !== undefined) child.stdin?.end(opts.stdinData);\n    else child.stdin?.end();\n  });\n}\n\nasync function waitForOptionalCredentialChild(child: ChildProcess | ChildProcessWithoutNullStreams): Promise<void> {\n  try {\n    await waitForCredentialChild(child, \"lark-cli optional keychain downgrade\");\n  } catch {\n    // See initFeishuCredential: keychain-downgrade is best-effort and should\n    // never be the final authority for whether bot credentials are usable.\n  }\n}\n\nfunction pickString(obj: LarkJson | undefined, ...keys: string[]): string | undefined {\n  if (!obj) return undefined;\n  for (const key of keys) {\n    const value = obj[key];\n    if (typeof value === \"string\" && value.length > 0) return value;\n  }\n  return undefined;\n}\n\nfunction pickNumber(obj: LarkJson | undefined, ...keys: string[]): number | undefined {\n  if (!obj) return undefined;\n  for (const key of keys) {\n    const value = obj[key];\n    if (typeof value === \"number\" && Number.isFinite(value)) return value;\n  }\n  return undefined;\n}\n\nfunction larkErrorMessage(obj: LarkJson | undefined, fallback: string): string {\n  const error = obj?.error;\n  if (error && typeof error === \"object\") {\n    const message = (error as LarkJson).message;\n    if (typeof message === \"string\" && message) return message;\n  }\n  if (typeof obj?.message === \"string\" && obj.message) return obj.message as string;\n  return fallback;\n}\n\nfunction larkErrorInfo(obj: LarkJson | undefined): { type?: string; subtype?: string; message?: string } {\n  const error = obj?.error;\n  const holder = error && typeof error === \"object\" ? (error as LarkJson) : obj;\n  return {\n    type: typeof holder?.type === \"string\" ? holder.type : undefined,\n    subtype: typeof holder?.subtype === \"string\" ? holder.subtype : undefined,\n    message: typeof holder?.message === \"string\" ? holder.message : undefined,\n  };\n}\n\nasync function verifyFeishuCredentialReadable(workspaceDir: string, run: ExecRunner): Promise<void> {\n  const result = await run(await resolveLarkCliBinary(), [\"auth\", \"status\", \"--verify\", \"--json\"], { env: larkEnv(workspaceDir) });\n  assertFeishuCredentialStatusReadable(result.stdout, result.stderr);\n}\n\nfunction assertFeishuCredentialStatusReadable(stdout: string, stderr: string): void {\n  const json = parseLarkCommandJson({ stdout, stderr });\n  const identities = json?.identities;\n  const bot = identities && typeof identities === \"object\" ? (identities as LarkJson).bot : undefined;\n  if (!bot || typeof bot !== \"object\") {\n    const message = larkErrorMessage(json, stderr || stdout || \"bot identity check failed\");\n    if (/missing app secret|missing.*bot token|not configured/i.test(message)) throw new Error(FEISHU_SECRET_UNREADABLE_MESSAGE);\n    if (/invalid client|specified app does not exist|auth method is not supported/i.test(message)) throw new Error(FEISHU_CREDENTIAL_INVALID_MESSAGE);\n    return;\n  }\n  const holder = bot as LarkJson;\n  if (holder.available === true) return;\n  const message = typeof holder.message === \"string\" ? holder.message : larkErrorMessage(json, stderr || stdout || \"bot identity check failed\");\n  const status = typeof holder.status === \"string\" ? holder.status : undefined;\n  const code = pickNumber(holder, \"code\");\n  if (isBotSecretUnreadableError({ error: message, status, code })) throw new Error(FEISHU_SECRET_UNREADABLE_MESSAGE);\n  if (/invalid client|specified app does not exist|auth method is not supported/i.test(message)) throw new Error(FEISHU_CREDENTIAL_INVALID_MESSAGE);\n}\n\nfunction isCredentialConfigError(input: { type?: string; subtype?: string; message?: string; missingScopes?: string[] }): boolean {\n  if (input.missingScopes?.length) return false;\n  if (/invalid param|auth method is not supported/i.test(input.message ?? \"\")) return false;\n  if (input.type === \"config\") return true;\n  if (input.subtype === \"invalid_client\") return true;\n  return /invalid client/i.test(input.message ?? \"\");\n}\n\nfunction normalizeCredentialConfigError(message: string): string {\n  return /invalid client/i.test(message)\n    ? FEISHU_CREDENTIAL_INVALID_MESSAGE\n    : message;\n}\n\nfunction parseLarkCommandJson(result: { stdout: string; stderr: string }): LarkJson | undefined {\n  return parseLarkJson(result.stdout) ?? parseLarkJson(result.stderr) ?? parseLarkJson(`${result.stdout}\\n${result.stderr}`);\n}\n\nfunction pickStringArray(obj: LarkJson | undefined, ...keys: string[]): string[] {\n  if (!obj) return [];\n  for (const key of keys) {\n    const value = obj[key];\n    if (Array.isArray(value)) return value.map((item) => String(item)).filter(Boolean);\n  }\n  return [];\n}\n\nfunction larkMissingScopes(obj: LarkJson | undefined): string[] {\n  const error = obj?.error;\n  const nested = error && typeof error === \"object\" ? (error as LarkJson) : undefined;\n  return [...new Set([\n    ...pickStringArray(obj, \"missing_scopes\", \"missingScopes\"),\n    ...pickStringArray(nested, \"missing_scopes\", \"missingScopes\"),\n  ])];\n}\n\nasync function readBotIdentityStatus(\n  workspaceDir: string,\n  run: ExecRunner\n): Promise<{ ok: true; available: boolean } | { ok: false; error: string; status?: string; code?: number }> {\n  const result = await run(await resolveLarkCliBinary(), [\"auth\", \"status\", \"--verify\", \"--json\"], { env: larkEnv(workspaceDir) });\n  const json = parseLarkCommandJson(result);\n  const identities = json?.identities;\n  const bot = identities && typeof identities === \"object\" ? (identities as LarkJson).bot : undefined;\n  if (bot && typeof bot === \"object\") {\n    const holder = bot as LarkJson;\n    const available = holder.available === true;\n    if (available) return { ok: true, available: true };\n    return {\n      ok: false,\n      error: typeof holder.message === \"string\" && holder.message ? holder.message : larkErrorMessage(json, result.stderr || result.stdout || \"bot identity check failed\"),\n      status: typeof holder.status === \"string\" ? holder.status : undefined,\n      code: pickNumber(holder, \"code\"),\n    };\n  }\n  if (result.code === 0) return { ok: true, available: false };\n  const info = larkErrorInfo(json);\n  return {\n    ok: false,\n    error: larkErrorMessage(json, result.stderr || result.stdout || \"bot identity check failed\"),\n    status: info.subtype ?? info.type,\n    code: pickNumber(json, \"code\"),\n  };\n}\n\nfunction isBotNotEnabledError(input: { error?: string; code?: number; status?: string }): boolean {\n  return input.code === 11205\n    || /app do not have bot|no bot|bot identity: verify failed:\\s*\\[11205\\]/i.test(input.error ?? \"\")\n    || /bot identity:\\s*not configured.*bot capability|missing app secret or bot capability/i.test(input.error ?? \"\")\n    || input.status === \"bot_not_enabled\"\n}\n\nfunction isBotSecretUnreadableError(input: { error?: string; code?: number; status?: string }): boolean {\n  if (/bot capability/i.test(input.error ?? \"\")) return false;\n  return input.status === \"not_configured\"\n    && /missing app secret|missing.*bot token/i.test(input.error ?? \"\");\n}\n\nasync function readAvailableUserScopes(\n  workspaceDir: string,\n  run: ExecRunner\n): Promise<{ ok: true; scopes: string[] } | { ok: false; error: string; missingScopes: string[]; errorType?: string; errorSubtype?: string }> {\n  const result = await run(await resolveLarkCliBinary(), [\"auth\", \"scopes\", \"--format\", \"json\"], { env: larkEnv(workspaceDir) });\n  const json = parseLarkCommandJson(result);\n  if (result.code !== 0) {\n    const info = larkErrorInfo(json);\n    return {\n      ok: false,\n      error: larkErrorMessage(json, result.stderr || result.stdout || \"auth scopes failed\"),\n      missingScopes: larkMissingScopes(json),\n      errorType: info.type,\n      errorSubtype: info.subtype,\n    };\n  }\n  const scopes = pickStringArray(json, \"userScopes\", \"user_scopes\", \"scopes\", \"availableScopes\", \"available_scopes\");\n  return { ok: true, scopes };\n}\n\nasync function readFeishuApplicationCallbackType(\n  workspaceDir: string,\n  appId: string,\n  run: ExecRunner\n): Promise<{ ok: true; callbackType?: string } | { ok: false; error: string }> {\n  const normalizedAppId = appId.trim();\n  if (!normalizedAppId) return { ok: true };\n  const result = await run(await resolveLarkCliBinary(), [\n    \"api\",\n    \"GET\",\n    `/open-apis/application/v6/applications/${normalizedAppId}`,\n    \"--params\",\n    JSON.stringify({ lang: \"zh_cn\" }),\n    \"--as\",\n    \"bot\",\n  ], { env: larkEnv(workspaceDir) });\n  const json = parseLarkCommandJson(result);\n  if (result.code !== 0) return { ok: false, error: larkErrorMessage(json, \"application info failed\") };\n  const data = json?.data;\n  const app = data && typeof data === \"object\" ? (data as LarkJson).app : undefined;\n  const callbackInfo = app && typeof app === \"object\" ? (app as LarkJson).callback_info : undefined;\n  const callbackType = callbackInfo && typeof callbackInfo === \"object\" ? pickString(callbackInfo as LarkJson, \"callback_type\", \"callbackType\") : undefined;\n  return { ok: true, callbackType };\n}\n\nfunction connectionCheckStep(input: {\n  webhookVerified?: boolean;\n  requiredEvents?: string[];\n  callbackType?: string;\n  error?: string;\n  skillsInjected?: boolean;\n}, checkedAt: number): AIEmployeeTemplateSetupStepState {\n  const requiredEvents = input.requiredEvents?.length ? input.requiredEvents : undefined;\n  // callbackType === \"callback\" \u5373\u98DE\u4E66\u540E\u53F0\u5DF2\u914D\u7F6E HTTP Callback\uFF0C\u53EF\u76F4\u63A5\u89C6\u4E3A\u901A\u8FC7\uFF08\u65E0\u9700\u7B49\u5F85 challenge \u5185\u5B58\u6807\u8BB0\uFF09\u3002\n  const callbackConfigured = input.callbackType === \"callback\";\n  if (input.webhookVerified || callbackConfigured) {\n    return { id: \"connection_check\", status: \"passed\", required_events: requiredEvents, callback_type: input.callbackType, checked_at: checkedAt };\n  }\n  return {\n    id: \"connection_check\",\n    status: \"blocked\",\n    action: \"open_webhook_config\",\n    required_events: requiredEvents,\n    callback_type: input.callbackType,\n    error: input.error ?? (input.callbackType ? `\u5F53\u524D\u98DE\u4E66\u4E8B\u4EF6\u56DE\u8C03\u65B9\u5F0F\u662F ${input.callbackType}\uFF0C\u8BF7\u5728\u98DE\u4E66\u540E\u53F0\u5C06\u8BA2\u9605\u65B9\u5F0F\u6539\u4E3A\"\u5C06\u4E8B\u4EF6\u53D1\u9001\u81F3\u5F00\u53D1\u8005\u670D\u52A1\u5668\"\u3002` : undefined),\n    checked_at: checkedAt,\n  };\n}\n\nfunction isTransientAuthStartError(message: string): boolean {\n  if (/not configured|app does not exist|invalid app|invalid client|permission denied|missing scope/i.test(message)) {\n    return false;\n  }\n  return /unexpected server error|please retry|try again|temporar|server error|gateway|timeout/i.test(message);\n}\n\nfunction sleep(ms: number): Promise<void> {\n  if (ms <= 0) return Promise.resolve();\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface StartUserAuthResult {\n  ok: boolean;\n  verificationUrl?: string;\n  deviceCode?: string;\n  expiresInSec?: number;\n  error?: string;\n}\n\nexport async function startUserAuth(\n  input: { workspaceDir: string; domains: string[]; scopes?: string[]; retryDelayMs?: number; skipScopePrecheck?: boolean },\n  run: ExecRunner = spawnRunner\n): Promise<StartUserAuthResult> {\n  const domains = [...new Set(input.domains.map((domain) => domain.trim()).filter(Boolean))];\n  const scopes = [...new Set((input.scopes ?? []).map((scope) => scope.trim()).filter(Boolean))];\n  const args = [\"auth\", \"login\", \"--no-wait\", \"--json\"];\n  if (domains.length > 0) {\n    args.push(\"--domain\", domains.join(\",\"));\n  } else if (scopes.length === 0) {\n    args.push(\"--domain\", \"drive,docs,wiki\");\n  }\n  if (scopes.length > 0) args.push(\"--scope\", scopes.join(\" \"));\n  if (scopes.length > 0 && !input.skipScopePrecheck) {\n    const available = await readAvailableUserScopes(input.workspaceDir, run);\n    if (!available.ok) return { ok: false, error: `\u98DE\u4E66\u5E94\u7528\u6743\u9650\u68C0\u67E5\u5931\u8D25\uFF1A${available.error}` };\n    const availableScopes = new Set(available.scopes);\n    const missing = scopes.filter((scope) => !availableScopes.has(scope));\n    if (missing.length > 0) {\n      return {\n        ok: false,\n        error: `\u98DE\u4E66\u5E94\u7528\u5C1A\u672A\u5F00\u901A\u6216\u53D1\u5E03\u4EE5\u4E0B\u7528\u6237\u6388\u6743\u6743\u9650\uFF1A${missing.join(\", \")}\u3002\u8BF7\u5148\u5728\u98DE\u4E66\u5F00\u653E\u5E73\u53F0\u4E3A\u8BE5\u5E94\u7528\u5F00\u901A\u5E76\u53D1\u5E03\u8FD9\u4E9B\u6743\u9650\uFF0C\u518D\u91CD\u8BD5\u6388\u6743\u3002`,\n      };\n    }\n  }\n  const retryDelayMs = input.retryDelayMs ?? 450;\n  const maxAttempts = 2;\n\n  for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n    const result = await run(await resolveLarkCliBinary(), args, { env: larkEnv(input.workspaceDir) });\n    const json = parseLarkJson(result.stdout);\n    if (json?.ok !== false && result.code === 0) {\n      return {\n        ok: true,\n        verificationUrl: pickString(json, \"verificationUrl\", \"verification_url\", \"url\", \"verificationUri\", \"verification_uri\"),\n        deviceCode: pickString(json, \"deviceCode\", \"device_code\"),\n        expiresInSec: pickNumber(json, \"expiresInSec\", \"expires_in\", \"expiresIn\", \"expire_in\"),\n      };\n    }\n\n    const error = larkErrorMessage(json, result.stderr || \"auth login failed\");\n    if (attempt < maxAttempts && isTransientAuthStartError(error)) {\n      await sleep(retryDelayMs);\n      continue;\n    }\n    return { ok: false, error };\n  }\n\n  return { ok: false, error: \"auth login failed\" };\n}\n\nexport interface CompleteUserAuthResult {\n  status: \"authorized\" | \"pending\" | \"expired\" | \"error\";\n  error?: string;\n}\n\nexport async function completeUserAuth(\n  input: { workspaceDir: string; deviceCode: string; timeoutMs?: number },\n  run: ExecRunner = spawnRunner\n): Promise<CompleteUserAuthResult> {\n  const args = [\"auth\", \"login\", \"--device-code\", input.deviceCode, \"--json\"];\n  const result = await run(await resolveLarkCliBinary(), args, { env: larkEnv(input.workspaceDir), timeoutMs: input.timeoutMs });\n  const json = parseLarkJson(result.stdout);\n  if (json?.ok === true || (result.code === 0 && json?.ok !== false)) {\n    return { status: \"authorized\" };\n  }\n  const message = larkErrorMessage(json, result.stderr || \"device authorization failed\");\n  // \u98DE\u4E66 device flow \u9519\u8BEF\u5206\u7C7B\uFF1Adevice_code \u5931\u6548\u9700\u91CD\u65B0\u53D1\u8D77\uFF1B\u5C1A\u672A\u6388\u6743\u662F pending\u3002\n  if (/device_code is invalid|restart the device authorization|expired/i.test(message)) {\n    return { status: \"expired\", error: message };\n  }\n  if (/authorization_pending|not yet approved|slow_down|pending/i.test(message)) {\n    return { status: \"pending\", error: message };\n  }\n  return { status: \"error\", error: message };\n}\n\nexport interface CheckUserAuthResult {\n  authorized: boolean;\n  /** \u6388\u6743\u7528\u6237\u7684\u98DE\u4E66 open_id\uFF0C\u6765\u81EA auth status identities.user.openId\uFF1B\u7528\u4E8E\u4E2A\u4EBA /agent \u4EE3\u7406\u8BC6\u522B\u64CD\u4F5C\u4EBA\u672C\u4EBA\u3002 */\n  openId?: string;\n  error?: string;\n}\n\nexport async function checkUserAuth(\n  input: { workspaceDir: string },\n  run: ExecRunner = spawnRunner\n): Promise<CheckUserAuthResult> {\n  // `auth status`\uFF08\u65E0\u53C2\uFF09\u8F93\u51FA\u7ED3\u6784\u5316 JSON\uFF0Cidentities.user.available \u5373\u7528\u6237\u8EAB\u4EFD\u662F\u5426\u5C31\u7EEA\uFF0C\n  // identities.user.openId \u662F\u6388\u6743\u7528\u6237\u672C\u4EBA\u7684\u98DE\u4E66 open_id\u3002\n  const result = await run(await resolveLarkCliBinary(), [\"auth\", \"status\"], { env: larkEnv(input.workspaceDir) });\n  const json = parseLarkJson(result.stdout);\n  const identities = json?.identities;\n  if (identities && typeof identities === \"object\") {\n    const user = (identities as LarkJson).user;\n    if (user && typeof user === \"object\") {\n      const holder = user as LarkJson;\n      return {\n        authorized: holder.available === true,\n        openId: pickString(holder, \"openId\", \"open_id\"),\n      };\n    }\n  }\n  return { authorized: false, error: result.code !== 0 ? (result.stderr || \"auth status failed\") : undefined };\n}\n\nexport async function checkFeishuTemplateSetup(\n  input: {\n    workspaceDir: string;\n    inspectorScopes: string[];\n    botScopes?: string[];\n    businessScopes: string[];\n    appId?: string;\n    requiredEvents?: string[];\n    webhookVerified?: boolean;\n    skillsInjected?: boolean;\n  },\n  run: ExecRunner = spawnRunner\n): Promise<AIEmployeeTemplateSetupState> {\n  const checkedAt = Date.now();\n  const steps: AIEmployeeTemplateSetupStepState[] = [];\n  const show = await run(await resolveLarkCliBinary(), [\"config\", \"show\"], { env: larkEnv(input.workspaceDir) });\n  if (show.code !== 0) {\n    const error = show.stderr || show.stdout || \"\u98DE\u4E66\u5E94\u7528\u51ED\u8BC1\u68C0\u67E5\u5931\u8D25\";\n    return {\n      status: \"error\",\n      steps: [\n        { id: \"credential_check\", status: \"error\", action: \"recheck\", error: normalizeCredentialConfigError(error), checked_at: checkedAt },\n        { id: \"permission_inspector\", status: \"pending\" },\n        { id: \"bot_capability\", status: \"pending\" },\n        { id: \"platform_permissions\", status: \"pending\" },\n        { id: \"connection_check\", status: \"pending\" },\n        { id: \"user_auth\", status: \"pending\" },\n        { id: \"runtime_ready\", status: \"pending\" },\n      ],\n    };\n  }\n  steps.push({ id: \"credential_check\", status: \"passed\", checked_at: checkedAt });\n\n  const botStatus = await readBotIdentityStatus(input.workspaceDir, run);\n  if (!botStatus.ok && isBotSecretUnreadableError(botStatus)) {\n    return {\n      status: \"error\",\n      steps: [\n        { id: \"credential_check\", status: \"error\", action: \"recheck\", error: FEISHU_SECRET_UNREADABLE_MESSAGE, checked_at: checkedAt },\n        { id: \"permission_inspector\", status: \"pending\" },\n        { id: \"bot_capability\", status: \"pending\" },\n        { id: \"platform_permissions\", status: \"pending\" },\n        connectionCheckStep(input, checkedAt),\n        { id: \"user_auth\", status: \"pending\" },\n        { id: \"runtime_ready\", status: input.skillsInjected ? \"passed\" : \"pending\", checked_at: checkedAt },\n      ],\n    };\n  }\n  if ((!botStatus.ok && isBotNotEnabledError(botStatus)) || (botStatus.ok && !botStatus.available)) {\n    return {\n      status: \"blocked\",\n      steps: [\n        ...steps,\n        { id: \"permission_inspector\", status: \"pending\" },\n        { id: \"bot_capability\", status: \"blocked\", action: \"recheck\", error: FEISHU_BOT_NOT_ENABLED_MESSAGE, checked_at: checkedAt },\n        { id: \"platform_permissions\", status: \"pending\" },\n        connectionCheckStep(input, checkedAt),\n        { id: \"user_auth\", status: \"pending\" },\n        { id: \"runtime_ready\", status: input.skillsInjected ? \"passed\" : \"pending\", checked_at: checkedAt },\n      ],\n    };\n  }\n  if (!botStatus.ok && /invalid client/i.test(botStatus.error)) {\n    return {\n      status: \"error\",\n      steps: [\n        { id: \"credential_check\", status: \"error\", action: \"recheck\", error: normalizeCredentialConfigError(botStatus.error), checked_at: checkedAt },\n        { id: \"permission_inspector\", status: \"pending\" },\n        { id: \"bot_capability\", status: \"pending\" },\n        { id: \"platform_permissions\", status: \"pending\" },\n        connectionCheckStep(input, checkedAt),\n        { id: \"user_auth\", status: \"pending\" },\n        { id: \"runtime_ready\", status: input.skillsInjected ? \"passed\" : \"pending\", checked_at: checkedAt },\n      ],\n    };\n  }\n  steps.push({ id: \"bot_capability\", status: \"passed\", checked_at: checkedAt });\n\n  const available = await readAvailableUserScopes(input.workspaceDir, run);\n  let missingBusinessFromScopeError: string[] | undefined;\n  if (!available.ok) {\n    if (isCredentialConfigError({\n      type: available.errorType,\n      subtype: available.errorSubtype,\n      message: available.error,\n      missingScopes: available.missingScopes,\n    })) {\n      return {\n        status: \"error\",\n        steps: [\n          { id: \"credential_check\", status: \"error\", action: \"recheck\", error: normalizeCredentialConfigError(available.error), checked_at: checkedAt },\n          { id: \"permission_inspector\", status: \"pending\" },\n          { id: \"bot_capability\", status: \"pending\" },\n          { id: \"platform_permissions\", status: \"pending\" },\n          connectionCheckStep(input, checkedAt),\n          { id: \"user_auth\", status: \"pending\" },\n          { id: \"runtime_ready\", status: input.skillsInjected ? \"passed\" : \"pending\", checked_at: checkedAt },\n        ],\n      };\n    }\n    const missingScopes = new Set(available.missingScopes);\n    const missingInspector = input.inspectorScopes.filter((scope) => missingScopes.has(scope));\n    const missingBusiness = [...(input.botScopes ?? []), ...input.businessScopes].filter((scope) => missingScopes.has(scope));\n    if (missingInspector.length > 0) {\n      // Inspector permissions missing: cannot query which business permissions are already\n      // open. Surface the full required business list so the user can open everything in\n      // one Feishu console trip.\n      const allBusinessPermissions = [\n        ...(input.botScopes ?? []).map((scope) => ({ scope, group: \"bot_messaging\" as const })),\n        ...input.businessScopes.map((scope) => ({ scope, group: \"business_user_auth\" as const })),\n      ];\n      return {\n        status: \"blocked\",\n        steps: [\n          ...steps,\n          {\n            id: \"permission_inspector\",\n            status: \"blocked\",\n            action: \"open_permissions\",\n            checked_at: checkedAt,\n            missing_permissions: missingInspector.map((scope) => ({ scope, group: \"inspector\" as const })),\n          },\n          { id: \"bot_capability\", status: \"pending\" },\n          { id: \"platform_permissions\", status: \"blocked\", action: \"open_permissions\", checked_at: checkedAt, missing_permissions: allBusinessPermissions },\n          connectionCheckStep(input, checkedAt),\n          { id: \"user_auth\", status: \"pending\" },\n          { id: \"runtime_ready\", status: input.skillsInjected ? \"passed\" : \"pending\", checked_at: checkedAt },\n        ],\n      };\n    }\n    if (missingBusiness.length > 0) missingBusinessFromScopeError = missingBusiness;\n    else {\n      return {\n        status: \"error\",\n        steps: [\n          ...steps,\n          { id: \"permission_inspector\", status: \"error\", action: \"recheck\", error: available.error, checked_at: checkedAt },\n          { id: \"bot_capability\", status: \"pending\" },\n          { id: \"platform_permissions\", status: \"pending\" },\n          { id: \"connection_check\", status: \"pending\", action: \"open_webhook_config\", required_events: input.requiredEvents },\n          { id: \"user_auth\", status: \"pending\" },\n          { id: \"runtime_ready\", status: \"pending\" },\n        ],\n      };\n    }\n  }\n\n  const availableScopes = available.ok ? new Set(available.scopes) : new Set(input.inspectorScopes);\n  steps.push({ id: \"permission_inspector\", status: \"passed\", checked_at: checkedAt });\n\n  const missingBusiness = missingBusinessFromScopeError ?? [...(input.botScopes ?? []), ...input.businessScopes].filter((scope) => !availableScopes.has(scope));\n  if (missingBusiness.length > 0) {\n    return {\n      status: \"blocked\",\n      steps: [\n        ...steps,\n        {\n          id: \"platform_permissions\",\n          status: \"blocked\",\n          action: \"open_permissions\",\n          checked_at: checkedAt,\n          missing_permissions: missingBusiness.map((scope) => ({ scope, group: (input.botScopes ?? []).includes(scope) ? \"bot_messaging\" : \"business_user_auth\" })),\n        },\n        connectionCheckStep(input, checkedAt),\n        { id: \"user_auth\", status: \"pending\" },\n        { id: \"runtime_ready\", status: input.skillsInjected ? \"passed\" : \"pending\", checked_at: checkedAt },\n      ],\n    };\n  }\n  steps.push({ id: \"platform_permissions\", status: \"passed\", checked_at: checkedAt });\n  const appInfo = await readFeishuApplicationCallbackType(input.workspaceDir, input.appId ?? \"\", run);\n  steps.push(connectionCheckStep({\n    ...input,\n    callbackType: appInfo.ok ? appInfo.callbackType : undefined,\n    error: appInfo.ok ? undefined : appInfo.error,\n  }, checkedAt));\n\n  const auth = await checkUserAuth({ workspaceDir: input.workspaceDir }, run);\n  steps.push({\n    id: \"user_auth\",\n    status: auth.authorized ? \"passed\" : \"blocked\",\n    action: auth.authorized ? undefined : \"start_user_auth\",\n    error: auth.error,\n    checked_at: checkedAt,\n  });\n  steps.push({ id: \"runtime_ready\", status: input.skillsInjected ? \"passed\" : \"pending\", checked_at: checkedAt });\n\n  const hasError = steps.some((step) => step.status === \"error\");\n  const hasBlocked = steps.some((step) => step.status === \"blocked\");\n  const allPassed = steps.every((step) => step.status === \"passed\");\n  return { status: hasError ? \"error\" : allPassed ? \"ready\" : hasBlocked ? \"blocked\" : \"draft\", steps };\n}\n\nexport const spawnRunner: ExecRunner = (cmd, args, opts) => new Promise((resolve) => {\n  const child = spawn(cmd, args, { cwd: opts.cwd, env: opts.env, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n  let stdout = \"\";\n  let stderr = \"\";\n  let settled = false;\n  const finish = (code: number, extraStderr = \"\") => {\n    if (settled) return;\n    settled = true;\n    if (timer) clearTimeout(timer);\n    resolve({ code, stdout, stderr: stderr || extraStderr });\n  };\n  const timer = opts.timeoutMs && opts.timeoutMs > 0\n    ? setTimeout(() => {\n      stderr = stderr || `command timed out after ${opts.timeoutMs}ms`;\n      child.kill(\"SIGTERM\");\n      setTimeout(() => {\n        if (!settled) child.kill(\"SIGKILL\");\n      }, 750).unref?.();\n      finish(124);\n    }, opts.timeoutMs)\n    : undefined;\n  timer?.unref?.();\n  child.stdout.setEncoding(\"utf8\");\n  child.stderr.setEncoding(\"utf8\");\n  child.stdout.on(\"data\", (chunk) => { stdout += chunk; });\n  child.stderr.on(\"data\", (chunk) => { stderr += chunk; });\n  child.on(\"error\", (error) => finish(1, error.message));\n  child.on(\"close\", (code) => finish(code ?? 1));\n  if (opts.stdinData !== undefined) child.stdin.end(opts.stdinData);\n  else child.stdin.end();\n});\n", "import type { DaemonToServerMessage } from \"@claude-console/shared\";\nimport { appendFile, mkdir, readdir, rm, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { resolveLarkCliBinary } from \"./lark-cli-bin\";\nimport { larkConfigDir, larkWorkspaceHomeEnv, spawnRunner, type ExecRunner } from \"./lark-credential\";\n\nconst MAX_MEMORY_PROCESSED_IDS = 500;\nconst MIN_LOOKBACK_MS = 10 * 60 * 1000;\nconst PERSONAL_AGENT_ACK_REACTION = \"Typing\";\nconst FEISHU_PERSONAL_AGENT_PAGE_SIZE = 50;\nconst FEISHU_LOG_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;\nconst DEFAULT_AMBIENT_MIN_MESSAGES = 3;\nconst DEFAULT_AMBIENT_SILENCE_THRESHOLD_MS = 60 * 1000;\nconst FEISHU_IMAGE_DOWNLOAD_TIMEOUT_MS = 15_000;\nconst FEISHU_DOC_PREFETCH_TIMEOUT_MS = 10_000;\nconst FEISHU_PREFETCH_DOC_MAX_CHARS = 2_000;\n\nexport interface FeishuPersonalAgentPollerConfig {\n  aiEmployeeId: string;\n  /** \u53EF\u7A7A \u2014 \u9996\u6B21 poll \u65F6\u60F0\u6027\u89E3\u6790\u3002Host \u6A21\u5F0F\u517C\u5BB9\u8DEF\u5F84\u3002 */\n  resolveWorkspaceDir: () => Promise<string | undefined>;\n  /** \u5BB9\u5668\u6A21\u5F0F\u4F7F\u7528 runtime runner\uFF0C\u907F\u514D host lark-cli \u8BFB\u4E0D\u5230 runtime \u5185\u7684 user token\u3002 */\n  resolveCommandContext?: () => Promise<FeishuPersonalAgentCommandContext | undefined>;\n  operatorOpenId: string;\n  triggerPrefix: string;\n  pollIntervalMs: number;\n  ambientEnabled?: boolean;\n  ambientSilenceThresholdMs?: number;\n  /**\n   * \u81EA\u52A8\u56DE\u7B54\u76D1\u542C\u8303\u56F4\u3002undefined \u4FDD\u6301\u5386\u53F2\u884C\u4E3A\u76D1\u542C\u6240\u6709\u4F1A\u8BDD\uFF1B\n   * \u7A7A\u6570\u7EC4\u8868\u793A\u5173\u95ED\u81EA\u52A8\u56DE\u7B54\u3002/agent \u89E6\u53D1\u4ECD\u5168\u5C40\u626B\u63CF\u3002\n   */\n  autoReplyChats?: Array<{ chat_id: string; chat_type: \"p2p\" | \"group\"; name?: string; external?: boolean }>;\n}\n\nexport interface FeishuPersonalAgentCommandContext {\n  workspaceDir: string;\n  runner?: ExecRunner;\n}\n\nexport interface FeishuPersonalAgentPollerOptions {\n  sendToServer: (msg: DaemonToServerMessage) => void;\n  log?: (line: string) => void;\n}\n\ninterface ChatListItem {\n  chat_id: string;\n  chat_mode?: string;\n  name?: string;\n  external?: boolean;\n}\n\ninterface MessageSender {\n  id?: string;\n  open_id?: string;\n  sender_type?: string;\n  name?: string;\n  sender_name?: string;\n}\n\ninterface MessageItem {\n  message_id?: string;\n  msg_type?: string;\n  create_time?: string;\n  sender?: MessageSender;\n  body?: { content?: string };\n  content?: string;\n  deleted?: boolean;\n}\n\ninterface RecentFeishuMessage {\n  messageId: string;\n  chatId?: string;\n  chatType?: string;\n  senderOpenId?: string;\n  senderName?: string;\n  text: string;\n  messageType?: string;\n  imageKey?: string;\n  localImagePath?: string;\n  localImageRelativePath?: string;\n  imageDownloadError?: string;\n  sentAt?: number;\n}\n\ninterface FeishuImageDownloadResult {\n  imageKey?: string;\n  localImagePath?: string;\n  localImageRelativePath?: string;\n  imageDownloadError?: string;\n}\n\ninterface FeishuPreFetchedDoc {\n  url: string;\n  title?: string;\n  content: string;\n  truncated?: boolean;\n  error?: string;\n}\n\ninterface ChatAmbientState {\n  pendingMessageIds: Set<string>;\n  recentMessages: RecentFeishuMessage[];\n  lastMessageAt: number;\n  ambientTriggeredAt?: number;\n}\n\nexport class FeishuPersonalAgentPoller {\n  private timer: ReturnType<typeof setTimeout> | undefined;\n  private running = false;\n  private processedIds = new Set<string>();\n  private loggedIds = new Set<string>();\n  private ambientStates = new Map<string, ChatAmbientState>();\n  private lastLogCleanupAt = 0;\n  private cachedCommandContext: FeishuPersonalAgentCommandContext | undefined;\n\n  constructor(\n    private readonly config: FeishuPersonalAgentPollerConfig,\n    private readonly options: FeishuPersonalAgentPollerOptions,\n  ) {}\n\n  start(): void {\n    if (this.running) return;\n    this.running = true;\n    void this.poll().finally(() => {\n      if (this.running) this.schedule();\n    });\n  }\n\n  stop(): void {\n    this.running = false;\n    if (this.timer) {\n      clearTimeout(this.timer);\n      this.timer = undefined;\n    }\n  }\n\n  private schedule(): void {\n    if (!this.running) return;\n    this.timer = setTimeout(() => {\n      void this.poll().finally(() => {\n        if (this.running) this.schedule();\n      });\n    }, this.config.pollIntervalMs);\n  }\n\n  private log(msg: string): void {\n    this.options.log?.(`[feishu-poll:${this.config.aiEmployeeId}] ${msg}`);\n  }\n\n  private reportPoll(input: {\n    status: \"ok\" | \"skipped\" | \"failed\";\n    activeTimeCursor?: number;\n    chatCount?: number;\n    scannedMessageCount?: number;\n    matchedMessageCount?: number;\n    detail?: string;\n  }): void {\n    this.options.sendToServer({\n      type: \"feishu:personal_agent_poll\",\n      aiEmployeeId: this.config.aiEmployeeId,\n      checkedAt: Date.now(),\n      ...input,\n    });\n  }\n\n  private larkEnv(workspaceDir: string): Record<string, string> {\n    return {\n      ...(process.env as Record<string, string>),\n      ...larkWorkspaceHomeEnv(workspaceDir),\n      LARKSUITE_CLI_CONFIG_DIR: larkConfigDir(workspaceDir),\n    };\n  }\n\n  private async poll(): Promise<void> {\n    if (!this.cachedCommandContext) {\n      const resolved = this.config.resolveCommandContext\n        ? await this.config.resolveCommandContext()\n        : await this.config.resolveWorkspaceDir().then((workspaceDir) => workspaceDir ? { workspaceDir } : undefined);\n      if (!resolved) {\n        this.log(\"workspace not ready, skipping poll\");\n        this.reportPoll({ status: \"skipped\", detail: \"workspace not ready\" });\n        return;\n      }\n      this.cachedCommandContext = resolved;\n    }\n    const { workspaceDir, runner } = this.cachedCommandContext;\n    const env = this.larkEnv(workspaceDir);\n    const run = runner ?? spawnRunner;\n    let bin = \"lark-cli\";\n    if (!runner) {\n      try {\n        bin = await resolveLarkCliBinary();\n      } catch {\n        this.log(\"lark-cli binary not found, skipping poll\");\n        this.reportPoll({ status: \"skipped\", detail: \"lark-cli binary not found\" });\n        return;\n      }\n    }\n\n    // 1. \u62FF\u6700\u8FD1\u6D3B\u8DC3\u7684\u4F1A\u8BDD\u5217\u8868\n    let chats: ChatListItem[] = [];\n    let scannedMessageCount = 0;\n    let matchedMessageCount = 0;\n    let activeTimeCursor = 0;\n    try {\n      const result = await run(bin, feishuPersonalAgentChatListArgs(), { cwd: workspaceDir, env, timeoutMs: 15000 });\n      if (result.code !== 0) {\n        this.log(`chat-list failed code=${result.code}: ${result.stderr.slice(0, 200)}`);\n        this.reportPoll({ status: \"failed\", detail: `chat-list failed code=${result.code}` });\n        return;\n      }\n      const parsed = JSON.parse(result.stdout) as { data?: { chats?: ChatListItem[] } };\n      chats = parsed?.data?.chats ?? [];\n    } catch (error) {\n      this.log(`chat-list error: ${error instanceof Error ? error.message : String(error)}`);\n      this.reportPoll({ status: \"failed\", detail: error instanceof Error ? error.message : String(error) });\n      return;\n    }\n\n    // 2. \u5BF9\u6BCF\u4E2A\u4F1A\u8BDD\u62C9\u53D6\u8FD1\u671F\u6D88\u606F\u3002\u5916\u90E8\u7FA4\u4E0D\u80FD\u4EE3\u8868\u7528\u6237\u53D1\u9001\u56DE\u590D\uFF0C\u4F46\u4E0D\u80FD\u9759\u9ED8\u4E22\u6389\uFF1A\n    // \u5982\u679C\u53D1\u73B0\u89E6\u53D1\u8BCD\uFF0C\u9700\u8981\u4E0A\u62A5 skipped \u4F9B\u4E1A\u52A1/\u6267\u884C\u6D3B\u52A8\u5BA1\u8BA1\u3002\n    // \u65F6\u95F4\u7A97\u53E3\u5728\u672C\u5730\u5224\u65AD\uFF0C\u907F\u514D lark-cli \u4E0D\u540C\u7248\u672C\u5BF9 --start \u683C\u5F0F\u7684\u89E3\u6790\u5DEE\u5F02\u5BFC\u81F4\u65B0\u6D88\u606F\u88AB\u9759\u9ED8\u8FC7\u6EE4\u3002\n    const windowStartMs = Date.now() - Math.max(this.config.pollIntervalMs * 4, MIN_LOOKBACK_MS);\n    for (const chat of chats) {\n      if (!this.running) break;\n      const chatId = chat.chat_id;\n      if (!chatId) continue;\n\n      let messages: MessageItem[] = [];\n      try {\n        const result = await run(bin, feishuPersonalAgentChatMessagesListArgs(chatId), { cwd: workspaceDir, env, timeoutMs: 15000 });\n        if (result.code !== 0) {\n          this.log(`chat-messages-list failed chat=${chatId} code=${result.code}`);\n          continue;\n        }\n        const parsed = JSON.parse(result.stdout) as { data?: { messages?: MessageItem[] } };\n        messages = parsed?.data?.messages ?? [];\n      } catch {\n        continue;\n      }\n      scannedMessageCount += messages.length;\n      const autoReplyAllowed = this.autoReplyAllowedFor(chat);\n      const recentMessages = this.recentMessagesFor(chat, messages);\n\n      for (const msg of messages) {\n        if (!this.running) break;\n        if (!msg.message_id || msg.deleted) continue;\n        const senderOpenId = msg.sender?.open_id ?? msg.sender?.id ?? \"\";\n        const receivedAt = parseFeishuMessageTimeMs(msg.create_time) ?? Date.now();\n        activeTimeCursor = Math.max(activeTimeCursor, receivedAt);\n        if (receivedAt < windowStartMs) continue;\n\n        const text = extractMessageText(msg);\n        if (senderOpenId !== this.config.operatorOpenId) {\n          if (autoReplyAllowed) this.ingestAmbientMessage(chat, msg, text, receivedAt);\n          continue;\n        }\n        if (this.processedIds.has(msg.message_id)) continue;\n        if (!text.trimStart().startsWith(this.config.triggerPrefix)) continue;\n\n        if (chat.external) {\n          this.rememberProcessedId(msg.message_id);\n          const detail = \"\u5916\u90E8\u7FA4\u6682\u4E0D\u652F\u6301\u4EE5\u7528\u6237\u8EAB\u4EFD\u53D1\u9001\u56DE\u590D\uFF0C\u5DF2\u8DF3\u8FC7\u8BE5\u89E6\u53D1\u6D88\u606F\u3002\";\n          this.log(`trigger skipped external chat=${chatId} message=${msg.message_id}`);\n          this.options.sendToServer({\n            type: \"feishu:personal_agent_skipped\",\n            aiEmployeeId: this.config.aiEmployeeId,\n            chatId,\n            chatType: chat.chat_mode === \"p2p\" ? \"p2p\" : \"group\",\n            chatName: chat.name,\n            messageId: msg.message_id,\n            text,\n            senderOpenId,\n            senderName: senderDisplayName(msg),\n            receivedAt,\n            reason: \"external_chat_unsupported\",\n            detail,\n          });\n          continue;\n        }\n\n        matchedMessageCount += 1;\n        this.rememberProcessedId(msg.message_id);\n        this.log(`trigger detected chat=${chatId} message=${msg.message_id}`);\n        void this.addAckReaction(run, bin, env, msg.message_id);\n        const image = await this.downloadTriggerImage({\n          workspaceDir,\n          run,\n          bin,\n          env,\n          messageId: msg.message_id,\n          imageKey: extractFeishuImageKey(msg),\n        });\n        const preFetchedDocs = await this.preFetchDocs({\n          workspaceDir,\n          run,\n          bin,\n          env,\n          texts: [text, rawFeishuMessageContent(msg), ...recentMessages.map((recent) => recent.text)],\n        });\n        const enrichedRecentMessages = recentMessages.map((recent) => {\n          if (recent.messageId !== msg.message_id) return recent;\n          return {\n            ...recent,\n            localImagePath: image.localImagePath,\n            localImageRelativePath: image.localImageRelativePath,\n            imageDownloadError: image.imageDownloadError,\n          };\n        });\n\n        this.options.sendToServer({\n          type: \"feishu:personal_agent_trigger\",\n          aiEmployeeId: this.config.aiEmployeeId,\n          chatId,\n          chatType: chat.chat_mode === \"p2p\" ? \"p2p\" : \"group\",\n          chatName: chat.name,\n          messageId: msg.message_id,\n          text,\n          senderOpenId,\n          senderName: senderDisplayName(msg),\n          receivedAt,\n          messageType: msg.msg_type,\n          rawContent: rawFeishuMessageContent(msg),\n          imageKey: image.imageKey,\n          localImagePath: image.localImagePath,\n          localImageRelativePath: image.localImageRelativePath,\n          imageDownloadError: image.imageDownloadError,\n          preFetchedDocs,\n          recentMessages: enrichedRecentMessages,\n        });\n      }\n      if (autoReplyAllowed) {\n        await this.logMessages(workspaceDir, chat, messages);\n        this.maybeEmitAmbient(chat);\n      }\n    }\n    for (const chat of chats) {\n      if (this.autoReplyAllowedFor(chat)) this.maybeEmitAmbient(chat);\n    }\n    await this.cleanupOldMessageLogs(workspaceDir);\n    this.reportPoll({\n      status: \"ok\",\n      activeTimeCursor,\n      chatCount: chats.length,\n      scannedMessageCount,\n      matchedMessageCount,\n    });\n  }\n\n  private rememberProcessedId(messageId: string): void {\n    this.processedIds.add(messageId);\n    if (this.processedIds.size > MAX_MEMORY_PROCESSED_IDS) {\n      const first = this.processedIds.values().next().value;\n      if (first !== undefined) this.processedIds.delete(first);\n    }\n  }\n\n  private rememberLoggedId(messageId: string): boolean {\n    if (this.loggedIds.has(messageId)) return false;\n    this.loggedIds.add(messageId);\n    if (this.loggedIds.size > MAX_MEMORY_PROCESSED_IDS * 4) {\n      const first = this.loggedIds.values().next().value;\n      if (first !== undefined) this.loggedIds.delete(first);\n    }\n    return true;\n  }\n\n  private async logMessages(workspaceDir: string, chat: ChatListItem, messages: MessageItem[]): Promise<void> {\n    const rows: string[] = [];\n    for (const msg of messages) {\n      if (!msg.message_id || msg.deleted) continue;\n      if (!this.rememberLoggedId(msg.message_id)) continue;\n      const sentAt = parseFeishuMessageTimeMs(msg.create_time) ?? Date.now();\n      rows.push(JSON.stringify({\n        message_id: msg.message_id,\n        chat_id: chat.chat_id,\n        chat_type: chatTypeFor(chat),\n        chat_name: chat.name,\n        external: Boolean(chat.external),\n        sender_open_id: msg.sender?.open_id ?? msg.sender?.id,\n        sender_type: msg.sender?.sender_type,\n        message_type: msg.msg_type,\n        text: extractMessageText(msg),\n        raw_content: rawFeishuMessageContent(msg),\n        image_key: extractFeishuImageKey(msg),\n        sent_at: sentAt,\n        logged_at: Date.now(),\n      }));\n    }\n    if (!rows.length) return;\n    try {\n      const dir = path.join(workspaceDir, \".wm\", \"feishu-log\");\n      await mkdir(dir, { recursive: true });\n      const suffix = new Date().toISOString().slice(0, 10);\n      const file = path.join(dir, `${safeLogName(chat.chat_id)}-${suffix}.jsonl`);\n      await appendFile(file, `${rows.join(\"\\n\")}\\n`, \"utf8\");\n    } catch (error) {\n      this.log(`message-log failed chat=${chat.chat_id}: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  private async cleanupOldMessageLogs(workspaceDir: string): Promise<void> {\n    const now = Date.now();\n    if (now - this.lastLogCleanupAt < 60 * 60 * 1000) return;\n    this.lastLogCleanupAt = now;\n    const dir = path.join(workspaceDir, \".wm\", \"feishu-log\");\n    let entries: string[] = [];\n    try {\n      entries = await readdir(dir);\n    } catch {\n      return;\n    }\n    for (const entry of entries) {\n      if (!entry.endsWith(\".jsonl\")) continue;\n      const file = path.join(dir, entry);\n      try {\n        const info = await stat(file);\n        if (now - info.mtimeMs > FEISHU_LOG_RETENTION_MS) await rm(file, { force: true });\n      } catch {\n        // best effort cleanup\n      }\n    }\n  }\n\n  private recentMessagesFor(chat: ChatListItem, messages: MessageItem[]): RecentFeishuMessage[] {\n    return messages\n      .filter((msg) => msg.message_id && !msg.deleted)\n      .map((msg) => recentMessageFor(chat, msg))\n      .sort((left, right) => (left.sentAt ?? 0) - (right.sentAt ?? 0))\n      .slice(-20);\n  }\n\n  private ingestAmbientMessage(chat: ChatListItem, msg: MessageItem, text: string, receivedAt: number): void {\n    if (!this.config.ambientEnabled) return;\n    if (chat.external) return;\n    if (!msg.message_id) return;\n    const trimmedText = text.trim();\n    if (!trimmedText && !extractFeishuImageKey(msg)) return;\n    const key = chat.chat_id;\n    let state = this.ambientStates.get(key);\n    if (!state) {\n      state = { pendingMessageIds: new Set(), recentMessages: [], lastMessageAt: 0 };\n      this.ambientStates.set(key, state);\n    }\n    if (state.pendingMessageIds.has(msg.message_id)) return;\n    state.pendingMessageIds.add(msg.message_id);\n    state.lastMessageAt = Math.max(state.lastMessageAt, receivedAt);\n    state.recentMessages.push(recentMessageFor(chat, msg));\n    state.recentMessages = state.recentMessages\n      .sort((left, right) => (left.sentAt ?? 0) - (right.sentAt ?? 0))\n      .slice(-20);\n  }\n\n  private maybeEmitAmbient(chat: ChatListItem): void {\n    if (!this.config.ambientEnabled) return;\n    if (chat.external) return;\n    const state = this.ambientStates.get(chat.chat_id);\n    if (!state || state.pendingMessageIds.size < DEFAULT_AMBIENT_MIN_MESSAGES) return;\n    const threshold = Math.max(10_000, this.config.ambientSilenceThresholdMs ?? DEFAULT_AMBIENT_SILENCE_THRESHOLD_MS);\n    const now = Date.now();\n    if (now - state.lastMessageAt < threshold) return;\n    if (state.ambientTriggeredAt === state.lastMessageAt) return;\n    state.ambientTriggeredAt = state.lastMessageAt;\n    const messageIds = Array.from(state.pendingMessageIds);\n    state.pendingMessageIds.clear();\n    this.log(`ambient trigger chat=${chat.chat_id} messages=${messageIds.length}`);\n    this.options.sendToServer({\n      type: \"feishu:personal_agent_ambient\",\n      aiEmployeeId: this.config.aiEmployeeId,\n      chatId: chat.chat_id,\n      chatType: chatTypeFor(chat),\n      chatName: chat.name,\n      messageIds,\n      recentMessages: state.recentMessages,\n      messageCount: messageIds.length,\n      lastMessageAt: state.lastMessageAt,\n      receivedAt: now,\n      reason: \"silence_threshold\",\n    });\n  }\n\n  private autoReplyAllowedFor(chat: ChatListItem): boolean {\n    const configured = this.config.autoReplyChats;\n    if (configured === undefined) return true;\n    if (!configured.length) return false;\n    return configured.some((item) => item.chat_id === chat.chat_id);\n  }\n\n  private async downloadTriggerImage(input: {\n    workspaceDir: string;\n    run: ExecRunner;\n    bin: string;\n    env: Record<string, string>;\n    messageId: string;\n    imageKey?: string;\n  }): Promise<FeishuImageDownloadResult> {\n    if (!input.imageKey) return {};\n    const relativeBase = path.posix.join(\n      \".wm\",\n      \"feishu-tmp\",\n      `${safeLogName(input.messageId)}-${safeLogName(input.imageKey)}`,\n    );\n    try {\n      await mkdir(path.join(input.workspaceDir, \".wm\", \"feishu-tmp\"), { recursive: true });\n      const result = await input.run(\n        input.bin,\n        feishuPersonalAgentImageDownloadArgs(input.messageId, input.imageKey, relativeBase),\n        { cwd: input.workspaceDir, env: input.env, timeoutMs: FEISHU_IMAGE_DOWNLOAD_TIMEOUT_MS },\n      );\n      if (result.code !== 0) {\n        return {\n          imageKey: input.imageKey,\n          imageDownloadError: compactError(`image download failed code=${result.code}: ${result.stderr || result.stdout}`),\n        };\n      }\n      const relativePath = await resolveDownloadedRelativePath(input.workspaceDir, relativeBase, result.stdout);\n      if (!relativePath) {\n        return {\n          imageKey: input.imageKey,\n          imageDownloadError: \"image download completed but local file was not found\",\n        };\n      }\n      return {\n        imageKey: input.imageKey,\n        localImagePath: path.join(input.workspaceDir, relativePath),\n        localImageRelativePath: relativePath,\n      };\n    } catch (error) {\n      return {\n        imageKey: input.imageKey,\n        imageDownloadError: compactError(error instanceof Error ? error.message : String(error)),\n      };\n    }\n  }\n\n  private async preFetchDocs(input: {\n    workspaceDir: string;\n    run: ExecRunner;\n    bin: string;\n    env: Record<string, string>;\n    texts: Array<string | undefined>;\n  }): Promise<FeishuPreFetchedDoc[] | undefined> {\n    const url = extractFirstFeishuDocUrl(input.texts);\n    if (!url) return undefined;\n    try {\n      const result = await input.run(\n        input.bin,\n        feishuPersonalAgentDocFetchArgs(url),\n        { cwd: input.workspaceDir, env: input.env, timeoutMs: FEISHU_DOC_PREFETCH_TIMEOUT_MS },\n      );\n      if (result.code !== 0) {\n        return [{ url, content: \"\", error: compactError(`doc prefetch failed code=${result.code}: ${result.stderr || result.stdout}`) }];\n      }\n      const extracted = extractReadableDoc(result.stdout);\n      const compacted = compactWhitespace(extracted.content || result.stdout);\n      const truncated = compacted.length > FEISHU_PREFETCH_DOC_MAX_CHARS;\n      return [{\n        url,\n        title: extracted.title,\n        content: truncated ? compacted.slice(0, FEISHU_PREFETCH_DOC_MAX_CHARS) : compacted,\n        truncated,\n      }];\n    } catch (error) {\n      return [{ url, content: \"\", error: compactError(error instanceof Error ? error.message : String(error)) }];\n    }\n  }\n\n  private async addAckReaction(\n    run: ExecRunner,\n    bin: string,\n    env: Record<string, string>,\n    messageId: string,\n  ): Promise<void> {\n    try {\n      const result = await run(bin, feishuPersonalAgentReactionCreateArgs(messageId), { env, timeoutMs: 5000 });\n      if (result.code !== 0) {\n        this.log(`ack-reaction failed message=${messageId} code=${result.code}: ${result.stderr.slice(0, 200)}`);\n      }\n    } catch (error) {\n      this.log(`ack-reaction error message=${messageId}: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n}\n\nexport function feishuPersonalAgentChatListArgs(): string[] {\n  return [\"im\", \"+chat-list\", \"--as\", \"user\", \"--types\", \"p2p,group\", \"--sort\", \"active_time\", \"--page-size\", String(FEISHU_PERSONAL_AGENT_PAGE_SIZE), \"--format\", \"json\"];\n}\n\nexport function feishuPersonalAgentChatMessagesListArgs(chatId: string): string[] {\n  return [\"im\", \"+chat-messages-list\", \"--as\", \"user\", \"--chat-id\", chatId, \"--order\", \"desc\", \"--page-size\", String(FEISHU_PERSONAL_AGENT_PAGE_SIZE), \"--format\", \"json\"];\n}\n\nexport function feishuPersonalAgentReactionCreateArgs(messageId: string): string[] {\n  return [\n    \"im\",\n    \"reactions\",\n    \"create\",\n    \"--as\",\n    \"user\",\n    \"--message-id\",\n    messageId,\n    \"--data\",\n    JSON.stringify({ reaction_type: { emoji_type: PERSONAL_AGENT_ACK_REACTION } }),\n    \"--format\",\n    \"json\",\n  ];\n}\n\nexport function feishuPersonalAgentImageDownloadArgs(messageId: string, fileKey: string, outputRelativePath: string): string[] {\n  return [\n    \"im\",\n    \"+messages-resources-download\",\n    \"--as\",\n    \"user\",\n    \"--message-id\",\n    messageId,\n    \"--file-key\",\n    fileKey,\n    \"--type\",\n    \"image\",\n    \"--output\",\n    outputRelativePath,\n    \"--format\",\n    \"json\",\n  ];\n}\n\nexport function feishuPersonalAgentDocFetchArgs(url: string): string[] {\n  return [\n    \"docs\",\n    \"+fetch\",\n    \"--api-version\",\n    \"v2\",\n    \"--as\",\n    \"user\",\n    \"--doc\",\n    url,\n    \"--doc-format\",\n    \"markdown\",\n    \"--format\",\n    \"json\",\n  ];\n}\n\nexport function extractMessageText(msg: MessageItem): string {\n  const raw = msg.body?.content ?? msg.content ?? \"\";\n  if (!raw) return \"\";\n  try {\n    const parsed = JSON.parse(raw) as unknown;\n    const text = extractFeishuContentText(parsed);\n    if (text) return text;\n  } catch {\n    // not JSON\n  }\n  return raw;\n}\n\nfunction extractFeishuContentText(value: unknown): string {\n  if (typeof value === \"string\") return value;\n  if (Array.isArray(value)) {\n    return value.map(extractFeishuContentText).filter(Boolean).join(\"\");\n  }\n  if (!value || typeof value !== \"object\") return \"\";\n\n  const record = value as Record<string, unknown>;\n  if (typeof record.text === \"string\") return record.text;\n  if (typeof record.content === \"string\") return record.content;\n  if (Array.isArray(record.content)) return extractFeishuContentText(record.content);\n  if (record.tag === \"at\" && typeof record.name === \"string\") return `@${record.name}`;\n  return \"\";\n}\n\nfunction recentMessageFor(chat: ChatListItem, msg: MessageItem): RecentFeishuMessage {\n  return {\n    messageId: msg.message_id ?? \"\",\n    chatId: chat.chat_id,\n    chatType: chatTypeFor(chat),\n    senderOpenId: msg.sender?.open_id ?? msg.sender?.id,\n    senderName: senderDisplayName(msg),\n    text: extractMessageText(msg),\n    messageType: msg.msg_type,\n    imageKey: extractFeishuImageKey(msg),\n    sentAt: parseFeishuMessageTimeMs(msg.create_time),\n  };\n}\n\nfunction chatTypeFor(chat: ChatListItem): \"p2p\" | \"group\" {\n  return chat.chat_mode === \"p2p\" ? \"p2p\" : \"group\";\n}\n\nfunction senderDisplayName(msg: MessageItem): string | undefined {\n  const sender = msg.sender;\n  if (typeof sender?.name === \"string\") return sender.name;\n  if (typeof sender?.sender_name === \"string\") return sender.sender_name;\n  return undefined;\n}\n\nfunction rawFeishuMessageContent(msg: MessageItem): string | undefined {\n  return msg.body?.content ?? msg.content;\n}\n\nfunction extractFeishuImageKey(msg: MessageItem): string | undefined {\n  const raw = rawFeishuMessageContent(msg);\n  if (!raw) return undefined;\n  try {\n    const parsed = JSON.parse(raw) as unknown;\n    return findStringByKey(parsed, new Set([\"image_key\", \"imageKey\"]));\n  } catch {\n    return undefined;\n  }\n}\n\nfunction extractFirstFeishuDocUrl(texts: Array<string | undefined>): string | undefined {\n  const pattern = /https?:\\/\\/[^\\s\"'<>()[\\]{}\uFF0C\u3002\uFF1B;!?\uFF01\uFF1F]*?(?:feishu\\.cn|larksuite\\.com)\\/(?:docx|wiki)\\/[A-Za-z0-9_-]+[^\\s\"'<>()[\\]{}\uFF0C\u3002\uFF1B;!?\uFF01\uFF1F]*/gi;\n  for (const text of texts) {\n    if (!text) continue;\n    const match = pattern.exec(text);\n    pattern.lastIndex = 0;\n    if (match?.[0]) return match[0].replace(/[.,\uFF0C\u3002;\uFF1B!\uFF01?\uFF1F]+$/g, \"\");\n  }\n  return undefined;\n}\n\nasync function resolveDownloadedRelativePath(workspaceDir: string, relativeBase: string, stdout: string): Promise<string | undefined> {\n  const candidates = [\n    extractOutputPath(stdout),\n    relativeBase,\n    `${relativeBase}.jpg`,\n    `${relativeBase}.jpeg`,\n    `${relativeBase}.png`,\n    `${relativeBase}.gif`,\n    `${relativeBase}.webp`,\n  ].filter((item): item is string => Boolean(item));\n  for (const candidate of candidates) {\n    const normalized = candidate.replaceAll(\"\\\\\", \"/\").replace(/^\\/+/, \"\");\n    if (!normalized || normalized.includes(\"..\")) continue;\n    try {\n      const info = await stat(path.join(workspaceDir, normalized));\n      if (info.isFile()) return normalized;\n    } catch {\n      // try next candidate\n    }\n  }\n  return undefined;\n}\n\nfunction extractOutputPath(stdout: string): string | undefined {\n  if (!stdout.trim()) return undefined;\n  try {\n    const parsed = JSON.parse(stdout) as unknown;\n    const found = findStringByKey(parsed, new Set([\n      \"path\",\n      \"output\",\n      \"output_path\",\n      \"outputPath\",\n      \"local_path\",\n      \"localPath\",\n      \"file_path\",\n      \"filePath\",\n      \"saved_path\",\n      \"savedPath\",\n    ]));\n    return found;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction extractReadableDoc(stdout: string): { title?: string; content: string } {\n  if (!stdout.trim()) return { content: \"\" };\n  try {\n    const parsed = JSON.parse(stdout) as unknown;\n    const title = findStringByKey(parsed, new Set([\"title\", \"name\"]));\n    const preferred = findStringByKey(parsed, new Set([\"markdown\", \"content\", \"text\", \"plain_text\", \"body\", \"xml\"]));\n    if (preferred) return { title, content: preferred };\n    return { title, content: collectDocStrings(parsed).join(\"\\n\") };\n  } catch {\n    return { content: stdout };\n  }\n}\n\nfunction collectDocStrings(value: unknown, keyPath: string[] = []): string[] {\n  if (typeof value === \"string\") {\n    const parentKey = keyPath[keyPath.length - 1] ?? \"\";\n    if (/^(id|token|url|href|type|revision|block_id|parent_id)$/i.test(parentKey)) return [];\n    const trimmed = value.trim();\n    return trimmed ? [trimmed] : [];\n  }\n  if (Array.isArray(value)) return value.flatMap((item) => collectDocStrings(item, keyPath));\n  if (!value || typeof value !== \"object\") return [];\n  const record = value as Record<string, unknown>;\n  return Object.entries(record).flatMap(([key, child]) => collectDocStrings(child, [...keyPath, key]));\n}\n\nfunction compactWhitespace(value: string): string {\n  return value\n    .replace(/\\r\\n/g, \"\\n\")\n    .replace(/[ \\t]+/g, \" \")\n    .replace(/\\n{3,}/g, \"\\n\\n\")\n    .trim();\n}\n\nfunction compactError(value: string): string {\n  return compactWhitespace(value).slice(0, 500) || \"unknown error\";\n}\n\nfunction findStringByKey(value: unknown, keys: Set<string>): string | undefined {\n  if (!value || typeof value !== \"object\") return undefined;\n  if (Array.isArray(value)) {\n    for (const item of value) {\n      const found = findStringByKey(item, keys);\n      if (found) return found;\n    }\n    return undefined;\n  }\n  const record = value as Record<string, unknown>;\n  for (const key of keys) {\n    if (typeof record[key] === \"string\") return record[key] as string;\n  }\n  for (const child of Object.values(record)) {\n    const found = findStringByKey(child, keys);\n    if (found) return found;\n  }\n  return undefined;\n}\n\nfunction safeLogName(value: string): string {\n  const sanitized = value.replace(/[^a-zA-Z0-9._-]+/g, \"_\").slice(0, 120);\n  return sanitized || \"unknown\";\n}\n\nexport function parseFeishuMessageTimeMs(value: string | undefined): number | undefined {\n  if (!value) return undefined;\n  const trimmed = value.trim();\n  if (!trimmed) return undefined;\n\n  if (/^\\d+$/.test(trimmed)) {\n    const numeric = Number(trimmed);\n    if (!Number.isFinite(numeric)) return undefined;\n    return trimmed.length <= 10 ? numeric * 1000 : numeric;\n  }\n\n  const normalized = trimmed.includes(\"T\") ? trimmed : trimmed.replace(\" \", \"T\");\n  const hasTimezone = /(?:Z|[+-]\\d{2}:?\\d{2})$/i.test(normalized);\n  const valueWithTimezone = hasTimezone ? normalized : `${normalized}Z`;\n  const parsed = Date.parse(valueWithTimezone);\n  return Number.isFinite(parsed) ? parsed : undefined;\n}\n", "import { lstat, mkdir, rm, symlink } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { RuntimeId } from \"@claude-console/shared\";\n\nconst RUNTIME_SKILL_DIRS: Record<RuntimeId, string[]> = {\n  claude: [\".claude/skills\"],\n  codex: [\".agents/skills\"],\n  kimi: [\".agents/skills\"],\n  antigravity: [\".gemini/skills\"],\n  cursor: [\".cursor/skills\"],\n  opencode: [\".opencode/skills\"],\n  hermes: [],\n};\n\nexport function defaultEmployeeSkillStores(): string[] {\n  const configured = process.env.WM_EMPLOYEE_SKILLS_DIR?.trim();\n  return [\n    ...(configured ? [configured] : []),\n    path.join(os.homedir(), \".wm\", \"employee-skills\"),\n    path.join(os.homedir(), \".agents\", \"skills\"),\n  ];\n}\n\nexport async function injectEmployeeSkills(opts: {\n  workspaceDir: string;\n  runtime: RuntimeId;\n  skills: string[];\n  storeDirs?: string[];\n}): Promise<void> {\n  const stores = opts.storeDirs ?? defaultEmployeeSkillStores();\n  for (const rel of RUNTIME_SKILL_DIRS[opts.runtime] ?? []) {\n    const farm = path.join(opts.workspaceDir, rel);\n    await mkdir(farm, { recursive: true });\n    for (const name of opts.skills) {\n      const src = await findSkillDir(stores, name);\n      if (!src) continue;\n      const dest = path.join(farm, name);\n      await rm(dest, { recursive: true, force: true });\n      await symlink(src, dest, \"dir\");\n    }\n  }\n}\n\nexport async function removeEmployeeSkills(opts: {\n  workspaceDir: string;\n  runtime: RuntimeId;\n  skills: string[];\n}): Promise<void> {\n  for (const rel of RUNTIME_SKILL_DIRS[opts.runtime] ?? []) {\n    for (const name of opts.skills) {\n      await rm(path.join(opts.workspaceDir, rel, name), { recursive: true, force: true });\n    }\n  }\n}\n\nasync function findSkillDir(stores: string[], name: string): Promise<string | undefined> {\n  for (const store of stores) {\n    const candidate = path.join(store, name);\n    try {\n      const info = await lstat(candidate);\n      if (info.isDirectory() || info.isSymbolicLink()) return candidate;\n    } catch {\n      // Continue to the next store.\n    }\n  }\n  return undefined;\n}\n", "import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { ContainerEngineInfo } from \"@claude-console/shared\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface ContainerEngineDetectorOptions {\n  execFileImpl?: typeof execFile;\n  timeoutMs?: number;\n}\n\nexport class ContainerEngineDetector {\n  constructor(private readonly options: ContainerEngineDetectorOptions = {}) {}\n\n  async detect(): Promise<ContainerEngineInfo | null> {\n    return (await this.detectOne(\"docker\")) ?? (await this.detectOne(\"podman\"));\n  }\n\n  private async detectOne(kind: \"docker\" | \"podman\"): Promise<ContainerEngineInfo | null> {\n    try {\n      const info = await this.exec(kind, [\"info\", \"--format\", \"{{.ServerVersion}}\"]);\n      const version = info.stdout.trim() || await this.version(kind);\n      return { kind, version: version.trim() || \"unknown\" };\n    } catch {\n      return null;\n    }\n  }\n\n  private async version(kind: \"docker\" | \"podman\"): Promise<string> {\n    try {\n      const result = await this.exec(kind, [\"--version\"]);\n      const match = result.stdout.match(/(?:version|podman)\\s+v?([0-9][^\\s,]*)/i);\n      return match?.[1] ?? result.stdout.trim();\n    } catch {\n      return \"unknown\";\n    }\n  }\n\n  private async exec(command: string, args: string[]): Promise<{ stdout: string; stderr: string }> {\n    const impl = this.options.execFileImpl ?? execFile;\n    const execAsync = promisify(impl);\n    const result = await execAsync(command, args, { timeout: this.options.timeoutMs ?? 5_000 });\n    if (typeof result === \"string\" || Buffer.isBuffer(result)) {\n      return { stdout: String(result), stderr: \"\" };\n    }\n    return {\n      stdout: typeof result.stdout === \"string\" ? result.stdout : String(result.stdout ?? \"\"),\n      stderr: typeof result.stderr === \"string\" ? result.stderr : String(result.stderr ?? \"\"),\n    };\n  }\n}\n", "import type { ContainerEngineInfo, RuntimeId, RuntimeModelDetectionResult } from \"@claude-console/shared\";\n\nconst RUNTIME_LABELS: Record<RuntimeId, string> = {\n  claude: \"Claude Code\",\n  codex: \"Codex CLI\",\n  kimi: \"Kimi CLI\",\n  cursor: \"Cursor Agent\",\n  antigravity: \"Antigravity\",\n  hermes: \"Hermes\",\n  opencode: \"OpenCode\",\n};\n\nconst INSTALL_HINTS: Record<RuntimeId, string> = {\n  claude: \"npm install -g @anthropic-ai/claude-code\",\n  codex: \"npm install -g @openai/codex\",\n  kimi: \"npm install -g @moonshotai/kimi-cli\",\n  cursor: \"Install Cursor, then ensure cursor-agent is on PATH\",\n  antigravity: \"Install Google Antigravity, then ensure agy is on PATH\",\n  hermes: \"npm install -g @byted/hermes-cli\",\n  opencode: \"npm install -g opencode-ai\",\n};\n\nconst LOGIN_HINTS: Record<RuntimeId, string> = {\n  claude: \"claude /login\",\n  codex: \"codex login\",\n  kimi: \"kimi login\",\n  cursor: \"cursor-agent login\",\n  antigravity: \"agy login\",\n  hermes: \"hermes auth login\",\n  opencode: \"opencode auth login\",\n};\n\nexport function buildSetupReport(input: {\n  runtimes: RuntimeModelDetectionResult[];\n  containerEngine: ContainerEngineInfo | null;\n}): string {\n  const lines = [\n    \"wm-daemon setup report\",\n    \"\",\n    \"Runtimes:\",\n    ...input.runtimes.map(runtimeSetupLine),\n    \"\",\n    \"Sandbox:\",\n    input.containerEngine\n      ? `  \u2713 ${input.containerEngine.kind} ${input.containerEngine.version}`\n      : \"  \u26A0 No Docker/Podman engine detected. Install Docker Desktop or Podman to enable sandbox-backed employees.\",\n  ];\n  return lines.join(\"\\n\");\n}\n\nfunction runtimeSetupLine(result: RuntimeModelDetectionResult): string {\n  const label = RUNTIME_LABELS[result.runtime] ?? result.runtime;\n  if (result.installStatus === \"not_installed\") {\n    return `  \u2717 ${label}: not installed. Install: ${INSTALL_HINTS[result.runtime]}`;\n  }\n  if (result.authStatus === \"unauthenticated\") {\n    return `  \u26A0 ${label}: installed but not authenticated. Run: ${LOGIN_HINTS[result.runtime]}`;\n  }\n  if (result.authStatus === \"expired\") {\n    return `  \u26A0 ${label}: authentication expired. Run: ${LOGIN_HINTS[result.runtime]}`;\n  }\n  if (result.authStatus === \"authenticated\") {\n    const method = result.authMethod === \"api_key\" ? \"API key\" : result.authMethod === \"oauth\" ? \"OAuth\" : \"credentials\";\n    return `  \u2713 ${label}: authenticated via ${method}.`;\n  }\n  if (result.installStatus === \"installed\") {\n    return `  ? ${label}: installed, authentication status unknown. If startup fails, run: ${LOGIN_HINTS[result.runtime]}`;\n  }\n  return `  ? ${label}: detection unavailable. ${result.error ?? \"Run the runtime CLI manually to verify.\"}`;\n}\n\n", "import type { AIEmployeeRoutine, RoutineCredentialMaterial, RoutineStep } from \"@claude-console/shared\";\n\nexport class SpecError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"SpecError\";\n  }\n}\n\nexport interface VariableScope {\n  get(path: string): unknown;\n  set?(path: string, value: unknown): void;\n}\n\nexport interface StepContext {\n  routine: AIEmployeeRoutine;\n  vars: VariableScope;\n  credentials: RoutineCredentialMaterial | null;\n  log(level: \"info\" | \"warn\" | \"error\", msg: string, meta?: unknown): void;\n  trace(stepId: string, io: { input: unknown; output?: unknown; error?: unknown }): void;\n  executeSteps?(steps: RoutineStep[], vars: VariableScope): Promise<unknown[]>;\n  wakeAgentForRoutine?(input: {\n    aiEmployeeId: string;\n    routineId: string;\n    routine: AIEmployeeRoutine;\n    sessionKey: string;\n    payload: unknown;\n    metadata?: Record<string, unknown>;\n  }): Promise<{ wake_id: string; queued: boolean }>;\n}\n\nexport interface Primitive<I, O> {\n  name: string;\n  validate(input: unknown): I;\n  execute(input: I, ctx: StepContext): Promise<O>;\n}\n\nexport function assertRecord(value: unknown, label = \"input\"): Record<string, unknown> {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new SpecError(`${label} must be an object`);\n  return value as Record<string, unknown>;\n}\n\nexport function optionalRecord(value: unknown, label: string): Record<string, string> | undefined {\n  if (value === undefined) return undefined;\n  const record = assertRecord(value, label);\n  const out: Record<string, string> = {};\n  for (const [key, item] of Object.entries(record)) {\n    if (typeof item !== \"string\") throw new SpecError(`${label}.${key} must be a string`);\n    out[key] = item;\n  }\n  return out;\n}\n\nexport function resolveInput(value: unknown, vars: VariableScope): unknown {\n  if (typeof value === \"string\") {\n    const exact = value.match(/^\\$\\{([^}]+)\\}$/);\n    if (exact) return vars.get(exact[1]);\n    return renderTemplate(value, vars);\n  }\n  if (Array.isArray(value)) return value.map((item) => resolveInput(item, vars));\n  if (value && typeof value === \"object\") {\n    const out: Record<string, unknown> = {};\n    for (const [key, item] of Object.entries(value)) out[key] = resolveInput(item, vars);\n    return out;\n  }\n  return value;\n}\n\nexport function renderTemplate(template: string, vars: VariableScope): string {\n  return template.replace(/\\$\\{([^}]+)\\}/g, (_match, path) => {\n    const value = vars.get(String(path).trim());\n    if (value === undefined || value === null) return \"\";\n    if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n    return JSON.stringify(value);\n  });\n}\n\nexport function getPath(source: unknown, path: string): unknown {\n  if (!path) return source;\n  let current = source;\n  for (const part of path.split(\".\")) {\n    if (!part) return undefined;\n    if (current === null || current === undefined || typeof current !== \"object\") return undefined;\n    current = (current as Record<string, unknown>)[part];\n  }\n  return current;\n}\n\nexport class ObjectVariableScope implements VariableScope {\n  constructor(private readonly data: Record<string, unknown>) {}\n\n  get(path: string): unknown {\n    return getPath(this.data, path);\n  }\n\n  set(path: string, value: unknown): void {\n    const parts = path.split(\".\").filter(Boolean);\n    if (!parts.length) throw new SpecError(\"path is required\");\n    let current = this.data;\n    for (const part of parts.slice(0, -1)) {\n      const existing = current[part];\n      if (!existing || typeof existing !== \"object\" || Array.isArray(existing)) current[part] = {};\n      current = current[part] as Record<string, unknown>;\n    }\n    current[parts[parts.length - 1]!] = value;\n  }\n}\n", "import { assertRecord, getPath, resolveInput, SpecError, type Primitive, type StepContext } from \"./types\";\n\nexport interface DedupeInput {\n  items: unknown;\n  key_path: string;\n  scope: string;\n  max_keep: number;\n}\n\nexport const dedupePrimitive: Primitive<DedupeInput, unknown[]> = {\n  name: \"dedupe\",\n\n  validate(input: unknown): DedupeInput {\n    const record = assertRecord(input);\n    if (typeof record.key_path !== \"string\" || !record.key_path.trim()) throw new SpecError(\"dedupe.key_path is required\");\n    if (typeof record.scope !== \"string\" || !record.scope.trim()) throw new SpecError(\"dedupe.scope is required\");\n    const maxKeep = record.max_keep === undefined ? 5000 : Number(record.max_keep);\n    if (!Number.isFinite(maxKeep) || maxKeep < 1) throw new SpecError(\"dedupe.max_keep must be positive\");\n    return { items: record.items, key_path: record.key_path, scope: record.scope, max_keep: Math.floor(maxKeep) };\n  },\n\n  async execute(input: DedupeInput, ctx: StepContext): Promise<unknown[]> {\n    const items = resolveInput(input.items, ctx.vars);\n    if (!Array.isArray(items)) throw new SpecError(\"dedupe.items must resolve to an array\");\n    const dedupeState = ensureDedupeState(ctx, input.scope);\n    const now = Date.now();\n    const fresh: unknown[] = [];\n    for (const item of items) {\n      const rawKey = getPath(item, input.key_path);\n      if (rawKey === undefined || rawKey === null) continue;\n      const key = String(rawKey);\n      if (dedupeState[key] !== undefined) continue;\n      dedupeState[key] = now;\n      fresh.push(item);\n    }\n    trimDedupeState(dedupeState, input.max_keep);\n    return fresh;\n  },\n};\n\nfunction ensureDedupeState(ctx: StepContext, scope: string): Record<string, number> {\n  const state = ctx.routine.state;\n  if (!state.dedupe || typeof state.dedupe !== \"object\") state.dedupe = {};\n  const existing = state.dedupe[scope];\n  if (existing && typeof existing === \"object\" && !Array.isArray(existing)) return existing as Record<string, number>;\n  const created: Record<string, number> = {};\n  state.dedupe[scope] = created;\n  return created;\n}\n\nfunction trimDedupeState(state: Record<string, number>, maxKeep: number): void {\n  const entries = Object.entries(state);\n  if (entries.length <= maxKeep) return;\n  entries.sort((a, b) => a[1] - b[1]);\n  for (const [key] of entries.slice(0, entries.length - maxKeep)) delete state[key];\n}\n", "import { assertRecord, getPath, resolveInput, SpecError, type Primitive, type StepContext } from \"./types\";\n\nexport interface FilterInput {\n  items: unknown;\n  expression: string;\n}\n\ntype Token =\n  | { type: \"identifier\"; value: string }\n  | { type: \"string\"; value: string }\n  | { type: \"number\"; value: number }\n  | { type: \"boolean\"; value: boolean }\n  | { type: \"null\"; value: null }\n  | { type: \"symbol\"; value: \"(\" | \")\" | \"[\" | \"]\" | \",\" | \"==\" | \"!=\" };\n\ntype Expr =\n  | { type: \"literal\"; value: unknown }\n  | { type: \"field\"; path: string }\n  | { type: \"array\"; values: unknown[] }\n  | { type: \"not\"; expr: Expr }\n  | { type: \"and\" | \"or\"; left: Expr; right: Expr }\n  | { type: \"compare\"; op: \"==\" | \"!=\" | \"in\" | \"not in\"; left: Expr; right: Expr };\n\nexport const filterPrimitive: Primitive<FilterInput, unknown[]> = {\n  name: \"filter\",\n\n  validate(input: unknown): FilterInput {\n    const record = assertRecord(input);\n    if (typeof record.expression !== \"string\" || !record.expression.trim()) throw new SpecError(\"filter.expression is required\");\n    return { items: record.items, expression: record.expression };\n  },\n\n  async execute(input: FilterInput, ctx: StepContext): Promise<unknown[]> {\n    const items = resolveInput(input.items, ctx.vars);\n    if (!Array.isArray(items)) throw new SpecError(\"filter.items must resolve to an array\");\n    const expr = parseFilterExpression(input.expression);\n    return items.filter((item) => Boolean(evaluate(expr, item)));\n  },\n};\n\nexport function parseFilterExpression(source: string): Expr {\n  const parser = new Parser(tokenize(source));\n  const expr = parser.parseExpression();\n  parser.expectEnd();\n  return expr;\n}\n\nfunction evaluate(expr: Expr, item: unknown): unknown {\n  switch (expr.type) {\n    case \"literal\":\n      return expr.value;\n    case \"array\":\n      return expr.values;\n    case \"field\":\n      return getPath({ item }, expr.path);\n    case \"not\":\n      return !Boolean(evaluate(expr.expr, item));\n    case \"and\":\n      return Boolean(evaluate(expr.left, item)) && Boolean(evaluate(expr.right, item));\n    case \"or\":\n      return Boolean(evaluate(expr.left, item)) || Boolean(evaluate(expr.right, item));\n    case \"compare\": {\n      const left = evaluate(expr.left, item);\n      const right = evaluate(expr.right, item);\n      if (expr.op === \"==\") return left === right;\n      if (expr.op === \"!=\") return left !== right;\n      if (!Array.isArray(right)) throw new SpecError(`${expr.op} right side must be an array`);\n      return expr.op === \"in\" ? right.includes(left) : !right.includes(left);\n    }\n  }\n}\n\nfunction tokenize(source: string): Token[] {\n  const tokens: Token[] = [];\n  let i = 0;\n  while (i < source.length) {\n    const char = source[i]!;\n    if (/\\s/.test(char)) {\n      i += 1;\n      continue;\n    }\n    if (char === \"'\" || char === '\"') {\n      const quote = char;\n      let value = \"\";\n      i += 1;\n      while (i < source.length && source[i] !== quote) {\n        if (source[i] === \"\\\\\") {\n          i += 1;\n          if (i < source.length) value += source[i];\n        } else {\n          value += source[i];\n        }\n        i += 1;\n      }\n      if (source[i] !== quote) throw new SpecError(\"unterminated string literal\");\n      i += 1;\n      tokens.push({ type: \"string\", value });\n      continue;\n    }\n    if (/[0-9]/.test(char)) {\n      let raw = char;\n      i += 1;\n      while (i < source.length && /[0-9.]/.test(source[i]!)) raw += source[i++]!;\n      const value = Number(raw);\n      if (!Number.isFinite(value)) throw new SpecError(`invalid number ${raw}`);\n      tokens.push({ type: \"number\", value });\n      continue;\n    }\n    const two = source.slice(i, i + 2);\n    if (two === \"==\" || two === \"!=\") {\n      tokens.push({ type: \"symbol\", value: two });\n      i += 2;\n      continue;\n    }\n    if (\"()[],\".includes(char)) {\n      tokens.push({ type: \"symbol\", value: char as Extract<Token, { type: \"symbol\" }>[\"value\"] });\n      i += 1;\n      continue;\n    }\n    if (/[A-Za-z_]/.test(char)) {\n      let value = char;\n      i += 1;\n      while (i < source.length && /[A-Za-z0-9_.]/.test(source[i]!)) value += source[i++]!;\n      if (value === \"true\" || value === \"false\") tokens.push({ type: \"boolean\", value: value === \"true\" });\n      else if (value === \"null\") tokens.push({ type: \"null\", value: null });\n      else tokens.push({ type: \"identifier\", value });\n      continue;\n    }\n    throw new SpecError(`unexpected token ${char}`);\n  }\n  return tokens;\n}\n\nclass Parser {\n  private index = 0;\n\n  constructor(private readonly tokens: Token[]) {}\n\n  parseExpression(): Expr {\n    return this.parseOr();\n  }\n\n  expectEnd(): void {\n    if (this.peek()) throw new SpecError(\"unexpected trailing token\");\n  }\n\n  private parseOr(): Expr {\n    let expr = this.parseAnd();\n    while (this.consumeIdentifier(\"or\")) expr = { type: \"or\", left: expr, right: this.parseAnd() };\n    return expr;\n  }\n\n  private parseAnd(): Expr {\n    let expr = this.parseNot();\n    while (this.consumeIdentifier(\"and\")) expr = { type: \"and\", left: expr, right: this.parseNot() };\n    return expr;\n  }\n\n  private parseNot(): Expr {\n    if (this.consumeIdentifier(\"not\")) {\n      if (this.consumeIdentifier(\"in\")) throw new SpecError(\"not in requires a left side\");\n      return { type: \"not\", expr: this.parseNot() };\n    }\n    return this.parseCompare();\n  }\n\n  private parseCompare(): Expr {\n    const left = this.parsePrimary();\n    const op = this.consumeCompareOp();\n    if (!op) return left;\n    return { type: \"compare\", op, left, right: this.parsePrimary() };\n  }\n\n  private parsePrimary(): Expr {\n    const token = this.next();\n    if (!token) throw new SpecError(\"unexpected end of expression\");\n    if (token.type === \"string\" || token.type === \"number\" || token.type === \"boolean\" || token.type === \"null\") {\n      return { type: \"literal\", value: token.value };\n    }\n    if (token.type === \"identifier\") {\n      if (!token.value.startsWith(\"item.\")) throw new SpecError(`field must start with item: ${token.value}`);\n      if (token.value.split(\".\").length > 4) throw new SpecError(\"field path is too deep\");\n      return { type: \"field\", path: token.value };\n    }\n    if (token.type === \"symbol\" && token.value === \"(\") {\n      const expr = this.parseExpression();\n      this.expectSymbol(\")\");\n      return expr;\n    }\n    if (token.type === \"symbol\" && token.value === \"[\") {\n      const values: unknown[] = [];\n      if (!this.consumeSymbol(\"]\")) {\n        do {\n          const item = this.next();\n          if (!item || ![\"string\", \"number\", \"boolean\", \"null\"].includes(item.type)) throw new SpecError(\"array literal only supports scalar values\");\n          values.push((item as Extract<Token, { type: \"string\" | \"number\" | \"boolean\" | \"null\" }>).value);\n        } while (this.consumeSymbol(\",\"));\n        this.expectSymbol(\"]\");\n      }\n      return { type: \"array\", values };\n    }\n    throw new SpecError(\"invalid expression\");\n  }\n\n  private consumeCompareOp(): Expr extends { type: \"compare\"; op: infer T } ? T | undefined : never {\n    const token = this.peek();\n    if (token?.type === \"symbol\" && (token.value === \"==\" || token.value === \"!=\")) {\n      this.index += 1;\n      return token.value as never;\n    }\n    if (this.consumeIdentifier(\"in\")) return \"in\" as never;\n    if (this.consumeIdentifier(\"not\")) {\n      if (!this.consumeIdentifier(\"in\")) throw new SpecError(\"expected in after not\");\n      return \"not in\" as never;\n    }\n    return undefined as never;\n  }\n\n  private consumeIdentifier(value: string): boolean {\n    const token = this.peek();\n    if (token?.type === \"identifier\" && token.value === value) {\n      this.index += 1;\n      return true;\n    }\n    return false;\n  }\n\n  private consumeSymbol(value: Extract<Token, { type: \"symbol\" }>[\"value\"]): boolean {\n    const token = this.peek();\n    if (token?.type === \"symbol\" && token.value === value) {\n      this.index += 1;\n      return true;\n    }\n    return false;\n  }\n\n  private expectSymbol(value: Extract<Token, { type: \"symbol\" }>[\"value\"]): void {\n    if (!this.consumeSymbol(value)) throw new SpecError(`expected ${value}`);\n  }\n\n  private peek(): Token | undefined {\n    return this.tokens[this.index];\n  }\n\n  private next(): Token | undefined {\n    return this.tokens[this.index++];\n  }\n}\n", "import type { RoutineStep } from \"@claude-console/shared\";\nimport { assertRecord, ObjectVariableScope, resolveInput, SpecError, type Primitive, type StepContext, type VariableScope } from \"./types\";\n\nexport interface ForeachInput {\n  items: unknown;\n  do: RoutineStep[];\n}\n\nexport const foreachPrimitive: Primitive<ForeachInput, unknown[]> = {\n  name: \"foreach\",\n\n  validate(input: unknown): ForeachInput {\n    const record = assertRecord(input);\n    if (!Array.isArray(record.do)) throw new SpecError(\"foreach.do must be an array\");\n    return { items: record.items, do: record.do as RoutineStep[] };\n  },\n\n  async execute(input: ForeachInput, ctx: StepContext): Promise<unknown[]> {\n    if (!ctx.executeSteps) throw new SpecError(\"foreach requires StepExecutor\");\n    const items = resolveInput(input.items, ctx.vars);\n    if (!Array.isArray(items)) throw new SpecError(\"foreach.items must resolve to an array\");\n    const outputs: unknown[] = [];\n    for (const item of items) {\n      outputs.push(await ctx.executeSteps(input.do, childScope(ctx.vars, item)));\n    }\n    return outputs;\n  },\n};\n\nfunction childScope(parent: VariableScope, item: unknown): VariableScope {\n  return {\n    get(path: string): unknown {\n      if (path === \"item\" || path.startsWith(\"item.\")) return new ObjectVariableScope({ item }).get(path);\n      return parent.get(path);\n    },\n    set(path: string, value: unknown): void {\n      parent.set?.(path, value);\n    },\n  };\n}\n", "import { assertRecord, optionalRecord, renderTemplate, resolveInput, SpecError, type Primitive, type StepContext } from \"./types\";\n\nexport interface HttpRequestInput {\n  method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n  url: string;\n  headers?: Record<string, string>;\n  query?: Record<string, string | number | boolean>;\n  body?: unknown;\n  auth_from?: string;\n  timeout_ms: number;\n}\n\nexport interface HttpRequestOutput {\n  status: number;\n  headers: Record<string, string>;\n  body: unknown;\n}\n\nconst METHODS = new Set([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"]);\nconst MAX_REQUEST_BODY_BYTES = 1024 * 1024;\nconst MAX_RESPONSE_BODY_BYTES = 4 * 1024 * 1024;\n\nexport const httpRequestPrimitive: Primitive<HttpRequestInput, HttpRequestOutput> = {\n  name: \"http_request\",\n\n  validate(input: unknown): HttpRequestInput {\n    const record = assertRecord(input);\n    const method = String(record.method ?? \"GET\").toUpperCase();\n    if (!METHODS.has(method)) throw new SpecError(\"http_request.method is invalid\");\n    if (typeof record.url !== \"string\" || !record.url.trim()) throw new SpecError(\"http_request.url is required\");\n    const timeoutMs = record.timeout_ms === undefined ? 15000 : Number(record.timeout_ms);\n    if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || timeoutMs > 60000) throw new SpecError(\"http_request.timeout_ms must be between 1 and 60000\");\n    return {\n      method: method as HttpRequestInput[\"method\"],\n      url: record.url,\n      headers: optionalRecord(record.headers, \"http_request.headers\"),\n      query: validateQuery(record.query),\n      body: record.body,\n      auth_from: record.auth_from === undefined ? undefined : String(record.auth_from),\n      timeout_ms: timeoutMs,\n    };\n  },\n\n  async execute(input: HttpRequestInput, ctx: StepContext): Promise<HttpRequestOutput> {\n    const url = new URL(renderTemplate(input.url, ctx.vars));\n    for (const [key, value] of Object.entries(input.query ?? {})) url.searchParams.set(key, String(resolveInput(value, ctx.vars)));\n    const headers: Record<string, string> = { ...(input.headers ?? {}) };\n    const authToken = resolveAuthToken(input.auth_from, ctx);\n    if (authToken && !headers.authorization && !headers.Authorization) headers.Authorization = `Bearer ${authToken}`;\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), input.timeout_ms);\n    try {\n      const body = input.body === undefined ? undefined : JSON.stringify(resolveInput(input.body, ctx.vars));\n      if (body && Buffer.byteLength(body, \"utf8\") > MAX_REQUEST_BODY_BYTES) throw new Error(\"http_request body exceeds 1MB\");\n      const response = await fetch(url, {\n        method: input.method,\n        headers: {\n          ...(input.body === undefined ? {} : { \"content-type\": \"application/json\" }),\n          ...headers,\n        },\n        body,\n        signal: controller.signal,\n      });\n      const output: HttpRequestOutput = {\n        status: response.status,\n        headers: Object.fromEntries(response.headers.entries()),\n        body: await readResponseBody(response),\n      };\n      if (response.status === 429 || response.status >= 500) throw new Error(`http_request failed with status ${response.status}`);\n      return output;\n    } catch (error) {\n      if (error instanceof Error && error.name === \"AbortError\") throw new Error(`http_request timed out after ${input.timeout_ms}ms`);\n      throw error;\n    } finally {\n      clearTimeout(timeout);\n    }\n  },\n};\n\nfunction validateQuery(value: unknown): HttpRequestInput[\"query\"] {\n  if (value === undefined) return undefined;\n  const record = assertRecord(value, \"http_request.query\");\n  const out: HttpRequestInput[\"query\"] = {};\n  for (const [key, item] of Object.entries(record)) {\n    if (![\"string\", \"number\", \"boolean\"].includes(typeof item)) throw new SpecError(`http_request.query.${key} is invalid`);\n    out[key] = item as string | number | boolean;\n  }\n  return out;\n}\n\nfunction resolveAuthToken(authFrom: string | undefined, ctx: StepContext): string | undefined {\n  if (authFrom) {\n    const value = ctx.vars.get(`steps.${authFrom}.access_token`) ?? ctx.vars.get(`steps.${authFrom}.token`) ?? ctx.vars.get(`steps.${authFrom}`);\n    if (typeof value === \"string\") return value;\n  }\n  const payload = ctx.credentials?.payload;\n  const value = payload?.access_token ?? payload?.token;\n  return typeof value === \"string\" ? value : undefined;\n}\n\nasync function readResponseBody(response: Response): Promise<unknown> {\n  let text = await response.text();\n  if (Buffer.byteLength(text, \"utf8\") > MAX_RESPONSE_BODY_BYTES) text = text.slice(0, MAX_RESPONSE_BODY_BYTES);\n  if (!text) return null;\n  const contentType = response.headers.get(\"content-type\") ?? \"\";\n  if (!contentType.includes(\"application/json\")) return text;\n  try {\n    return JSON.parse(text);\n  } catch {\n    return text;\n  }\n}\n", "import { assertRecord, resolveInput, SpecError, type Primitive, type StepContext } from \"./types\";\n\nexport interface WakeAgentInput {\n  payload: unknown;\n  session_key: unknown;\n  routine_metadata?: Record<string, unknown>;\n  proxy?: unknown;\n}\n\nexport interface WakeAgentOutput {\n  wake_id: string;\n  queued: boolean;\n}\n\nexport const wakeAgentPrimitive: Primitive<WakeAgentInput, WakeAgentOutput> = {\n  name: \"wake_agent\",\n\n  validate(input: unknown): WakeAgentInput {\n    const record = assertRecord(input);\n    const metadata = record.routine_metadata === undefined ? undefined : assertRecord(record.routine_metadata, \"wake_agent.routine_metadata\");\n    return {\n      payload: record.payload,\n      session_key: record.session_key,\n      routine_metadata: metadata,\n      proxy: record.proxy,\n    };\n  },\n\n  async execute(input: WakeAgentInput, ctx: StepContext): Promise<WakeAgentOutput> {\n    if (!ctx.wakeAgentForRoutine) throw new SpecError(\"wake_agent requires AI employee process manager bridge\");\n    const sessionKey = resolveInput(input.session_key, ctx.vars);\n    if (typeof sessionKey !== \"string\" || !sessionKey.trim()) throw new SpecError(\"wake_agent.session_key must resolve to a string\");\n    return ctx.wakeAgentForRoutine({\n      aiEmployeeId: ctx.routine.ai_employee_id,\n      routineId: ctx.routine.id,\n      routine: ctx.routine,\n      sessionKey,\n      payload: resolveInput(input.payload, ctx.vars),\n      metadata: {\n        ...(input.routine_metadata ?? {}),\n        ...(input.proxy === undefined ? {} : { proxy: resolveInput(input.proxy, ctx.vars) }),\n      },\n    });\n  },\n};\n", "import type { Primitive } from \"./types\";\nimport { dedupePrimitive } from \"./dedupe\";\nimport { filterPrimitive } from \"./filter\";\nimport { foreachPrimitive } from \"./foreach\";\nimport { httpRequestPrimitive } from \"./http-request\";\nimport { wakeAgentPrimitive } from \"./wake-agent\";\n\nexport * from \"./types\";\n\nexport const routinePrimitives = new Map<string, Primitive<unknown, unknown>>([\n  [httpRequestPrimitive.name, httpRequestPrimitive as Primitive<unknown, unknown>],\n  [filterPrimitive.name, filterPrimitive as Primitive<unknown, unknown>],\n  [dedupePrimitive.name, dedupePrimitive as Primitive<unknown, unknown>],\n  [foreachPrimitive.name, foreachPrimitive as Primitive<unknown, unknown>],\n  [wakeAgentPrimitive.name, wakeAgentPrimitive as Primitive<unknown, unknown>],\n]);\n\nexport function getRoutinePrimitive(name: string): Primitive<unknown, unknown> | undefined {\n  return routinePrimitives.get(name);\n}\n", "import type { AIEmployeeRoutine } from \"@claude-console/shared\";\nimport { getPath, type VariableScope as PrimitiveVariableScope } from \"./primitives\";\n\nexport class VarResolveError extends Error {\n  constructor(readonly path: string) {\n    super(`failed to resolve routine variable: ${path}`);\n    this.name = \"VarResolveError\";\n  }\n}\n\nexport class RoutineVariableScope implements PrimitiveVariableScope {\n  private readonly root: Record<string, unknown>;\n  private readonly routine: AIEmployeeRoutine;\n\n  constructor(input: { routine: AIEmployeeRoutine; now?: number; item?: unknown; event?: unknown }) {\n    this.routine = input.routine;\n    this.root = {\n      routine: { state: input.routine.state, id: input.routine.id, ai_employee_id: input.routine.ai_employee_id },\n      steps: {},\n      now: input.now ?? Date.now(),\n    };\n    if (input.item !== undefined) this.root.item = input.item;\n    if (input.event !== undefined) this.root.event = input.event;\n  }\n\n  get(path: string): unknown {\n    const value = getPath(this.root, path);\n    if (value === undefined) throw new VarResolveError(path);\n    return value;\n  }\n\n  set(path: string, value: unknown): void {\n    const parts = path.split(\".\").filter(Boolean);\n    if (!parts.length) throw new VarResolveError(path);\n    let current = this.root;\n    for (const part of parts.slice(0, -1)) {\n      const existing = current[part];\n      if (!existing || typeof existing !== \"object\" || Array.isArray(existing)) current[part] = {};\n      current = current[part] as Record<string, unknown>;\n    }\n    current[parts[parts.length - 1]!] = value;\n  }\n\n  childWithItem(item: unknown): RoutineVariableScope {\n    const child = new RoutineVariableScope({ routine: this.routine, now: this.root.now as number, item });\n    child.root.steps = this.root.steps;\n    return child;\n  }\n}\n\nexport function resolveTemplate(input: unknown, scope: PrimitiveVariableScope, seen = new WeakSet<object>()): unknown {\n  if (typeof input === \"string\") {\n    const exact = input.match(/^\\$\\{([^}]+)\\}$/);\n    if (exact) return scope.get(exact[1]!.trim());\n    return input.replace(/\\$\\{([^}]+)\\}/g, (_match, path) => stringifyTemplateValue(scope.get(String(path).trim())));\n  }\n  if (Array.isArray(input)) return input.map((item) => resolveTemplate(item, scope, seen));\n  if (input && typeof input === \"object\") {\n    if (seen.has(input)) throw new VarResolveError(\"<cycle>\");\n    seen.add(input);\n    const out: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(input)) out[key] = resolveTemplate(value, scope, seen);\n    seen.delete(input);\n    return out;\n  }\n  return input;\n}\n\nfunction stringifyTemplateValue(value: unknown): string {\n  if (value === null) return \"\";\n  if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n  return JSON.stringify(value);\n}\n", "import type { AIEmployeeRoutine, RoutineCredentialMaterial, RoutineOutcome, RoutineStep, RoutineStepTrace } from \"@claude-console/shared\";\nimport { isProxyModuleSpec } from \"@claude-console/shared\";\nimport { getRoutinePrimitive, type Primitive, type StepContext, type VariableScope } from \"./primitives\";\nimport { resolveTemplate } from \"./variable-scope\";\n\nexport type PrimitiveRegistry = Map<string, Primitive<unknown, unknown>>;\nexport type RoutineLogger = (level: \"info\" | \"warn\" | \"error\", message: string, meta?: unknown) => void;\n\nexport interface StepExecutorOptions {\n  routine: AIEmployeeRoutine;\n  scope: VariableScope;\n  registry?: PrimitiveRegistry;\n  credentials?: Record<string, RoutineCredentialMaterial>;\n  log?: RoutineLogger;\n  wakeAgentForRoutine?: StepContext[\"wakeAgentForRoutine\"];\n}\n\nexport interface StepExecutorResult {\n  outcome: RoutineOutcome;\n  traces: RoutineStepTrace[];\n  statePatch: AIEmployeeRoutine[\"state\"];\n  error?: Error;\n}\n\nexport class StepExecutor {\n  private readonly registry: PrimitiveRegistry;\n  private readonly traces: RoutineStepTrace[] = [];\n\n  constructor(private readonly options: StepExecutorOptions) {\n    this.registry = options.registry ?? new Map(Array.from(defaultRegistryEntries()));\n  }\n\n  async run(steps: RoutineStep[]): Promise<StepExecutorResult> {\n    for (const step of steps) {\n      const result = await this.runStep(step);\n      if (!result.ok) {\n        const action = this.errorAction(step.id);\n        if (action === \"skip\") continue;\n        return { outcome: \"failure\", traces: this.traces, statePatch: this.options.routine.state, error: result.error };\n      }\n    }\n    return { outcome: \"success\", traces: this.traces, statePatch: this.options.routine.state };\n  }\n\n  private async runStep(step: RoutineStep): Promise<{ ok: true } | { ok: false; error: Error }> {\n    const primitive = this.registry.get(step.primitive);\n    if (!primitive) {\n      const error = new Error(`unknown routine primitive: ${step.primitive}`);\n      this.trace(step, step.input, undefined, error);\n      return { ok: false, error };\n    }\n    let resolvedInput: unknown;\n    try {\n      resolvedInput = resolveStepInput(step, this.options.scope);\n      const input = primitive.validate(resolvedInput);\n      this.options.log?.(\"info\", `routine step start: ${step.id}`, { primitive: step.primitive });\n      const output = await primitive.execute(input, this.buildStepContext());\n      this.options.scope.set?.(`steps.${step.id}`, output);\n      this.trace(step, resolvedInput, output);\n      return { ok: true };\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n      this.trace(step, resolvedInput ?? step.input, undefined, err);\n      this.options.log?.(\"error\", `routine step failed: ${step.id}`, { primitive: step.primitive, error: err.message });\n      return { ok: false, error: err };\n    }\n  }\n\n  private buildStepContext(): StepContext {\n    return {\n      routine: this.options.routine,\n      vars: this.options.scope,\n      credentials: this.options.credentials?.auth ?? null,\n      log: (level, msg, meta) => this.options.log?.(level, msg, meta),\n      trace: (stepId, io) => {\n        const spec = this.options.routine.spec;\n        const step = isProxyModuleSpec(spec) ? undefined : spec.steps.find((candidate) => candidate.id === stepId);\n        this.traces.push({\n          step_id: stepId,\n          primitive: step?.primitive,\n          input: io.input,\n          output: io.output,\n          error: io.error,\n          started_at: Date.now(),\n          finished_at: Date.now(),\n        });\n      },\n      executeSteps: async (steps, vars) => {\n        const executor = new StepExecutor({ ...this.options, scope: vars, registry: this.registry });\n        const result = await executor.run(steps);\n        this.traces.push(...result.traces);\n        if (result.outcome === \"failure\") throw result.error ?? new Error(\"foreach child step failed\");\n        return steps.map((step) => vars.get(`steps.${step.id}`));\n      },\n      wakeAgentForRoutine: this.options.wakeAgentForRoutine,\n    };\n  }\n\n  private trace(step: RoutineStep, input: unknown, output?: unknown, error?: Error): void {\n    this.traces.push({\n      step_id: step.id,\n      primitive: step.primitive,\n      input,\n      output,\n      error: error ? { message: error.message, name: error.name } : undefined,\n      started_at: Date.now(),\n      finished_at: Date.now(),\n    });\n  }\n\n  private errorAction(stepId: string): \"skip\" | \"fail\" {\n    const spec = this.options.routine.spec;\n    if (isProxyModuleSpec(spec)) return \"fail\";\n    return spec.on_error?.find((rule) => rule.match === `step:${stepId}`)?.action ?? \"fail\";\n  }\n}\n\nfunction resolveStepInput(step: RoutineStep, scope: VariableScope): unknown {\n  if (step.primitive !== \"foreach\") return resolveTemplate(step.input, scope);\n  if (!step.input || typeof step.input !== \"object\" || Array.isArray(step.input)) {\n    return resolveTemplate(step.input, scope);\n  }\n  const input = step.input as Record<string, unknown>;\n  const resolved: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(input)) {\n    resolved[key] = key === \"do\" ? value : resolveTemplate(value, scope);\n  }\n  return resolved;\n}\n\nfunction defaultRegistryEntries(): Iterable<[string, Primitive<unknown, unknown>]> {\n  const names = [\"http_request\", \"filter\", \"dedupe\", \"foreach\", \"wake_agent\"];\n  return names.flatMap((name) => {\n    const primitive = getRoutinePrimitive(name);\n    return primitive ? [[name, primitive] as [string, Primitive<unknown, unknown>]] : [];\n  });\n}\n", "import type { AIEmployeeRoutine, DaemonToServerMessage, ProxyModuleTriggerEvent, RoutineCredentialMaterial, RoutineSpec } from \"@claude-console/shared\";\nimport { isProxyModuleSpec } from \"@claude-console/shared\";\nimport { StepExecutor, type StepExecutorOptions } from \"./step-executor\";\nimport { RoutineVariableScope } from \"./variable-scope\";\n\nconst MIN_INTERVAL_MS = 60_000;\n\nexport interface RoutineRunnerOptions {\n  routine: AIEmployeeRoutine;\n  credentials?: Record<string, RoutineCredentialMaterial>;\n  sendToServer: (message: DaemonToServerMessage) => void;\n  wakeAgentForRoutine?: StepExecutorOptions[\"wakeAgentForRoutine\"];\n  log?: (line: string) => void;\n}\n\nexport class RoutineRunner {\n  private timer?: ReturnType<typeof setInterval>;\n  private inFlight = false;\n\n  constructor(private readonly options: RoutineRunnerOptions) {}\n\n  start(): void {\n    if (this.timer) return;\n    const spec = this.spec();\n    if (spec.trigger.kind === \"event\") {\n      this.options.log?.(`[routine] start routine=${this.options.routine.id} ai_employee=${this.options.routine.ai_employee_id} trigger=event`);\n      return;\n    }\n    const intervalMs = Math.max(MIN_INTERVAL_MS, (spec.trigger.interval_seconds ?? 60) * 1000);\n    this.options.log?.(`[routine] start routine=${this.options.routine.id} ai_employee=${this.options.routine.ai_employee_id} interval_ms=${intervalMs}`);\n    this.timer = setInterval(() => {\n      void this.tick();\n    }, intervalMs);\n  }\n\n  stop(): void {\n    if (this.timer) clearInterval(this.timer);\n    this.timer = undefined;\n    this.options.log?.(`[routine] stop routine=${this.options.routine.id}`);\n  }\n\n  async trigger(event: ProxyModuleTriggerEvent): Promise<void> {\n    if (this.spec().trigger.kind !== \"event\") return;\n    await this.tick(event);\n  }\n\n  private async tick(event?: ProxyModuleTriggerEvent): Promise<void> {\n    if (this.inFlight) {\n      this.options.log?.(`[routine] skip busy routine=${this.options.routine.id}`);\n      return;\n    }\n    this.inFlight = true;\n    const startedAt = Date.now();\n    try {\n      this.options.log?.(`[routine] tick routine=${this.options.routine.id} ai_employee=${this.options.routine.ai_employee_id}`);\n      const stateBeforeRun = cloneState(this.options.routine.state);\n      const scope = new RoutineVariableScope({ routine: this.options.routine, now: startedAt, event });\n      const authPayload = this.options.credentials?.auth?.payload;\n      if (authPayload) scope.set(\"auth\", authPayload);\n      const executor = new StepExecutor({\n        routine: this.options.routine,\n        scope,\n        credentials: this.options.credentials,\n        wakeAgentForRoutine: this.options.wakeAgentForRoutine,\n        log: (level, message, meta) => {\n          this.options.log?.(`[routine] ${level} routine=${this.options.routine.id} ${message}${meta ? ` ${JSON.stringify(meta)}` : \"\"}`);\n        },\n      });\n      const result = await executor.run(this.spec().steps);\n      const durableStepState = result.outcome === \"success\" ? result.statePatch : stateBeforeRun;\n      const failures = result.outcome === \"failure\"\n        ? (this.options.routine.state.consecutive_failures ?? 0) + 1\n        : 0;\n      this.options.sendToServer({\n        type: \"routine:state_writeback\",\n        routineId: this.options.routine.id,\n        statePatch: {\n          ...durableStepState,\n          last_run_at: startedAt,\n          last_success_at: result.outcome === \"success\" ? Date.now() : this.options.routine.state.last_success_at,\n          last_error: result.outcome === \"failure\" ? result.error?.message : null,\n          consecutive_failures: failures,\n        },\n        run: {\n          startedAt,\n          finishedAt: Date.now(),\n          outcome: result.outcome,\n          stepTraces: result.traces,\n          errorMessage: result.error?.message,\n          wakeCount: 0,\n          dedupeAdded: 0,\n        },\n      });\n    } catch (error) {\n      const message = error instanceof Error ? error.message : String(error);\n      this.options.log?.(`[routine] tick failed routine=${this.options.routine.id} error=${message}`);\n      this.options.sendToServer({\n        type: \"routine:state_writeback\",\n        routineId: this.options.routine.id,\n        statePatch: { last_run_at: startedAt, last_error: message },\n        run: {\n          startedAt,\n          finishedAt: Date.now(),\n          outcome: \"failure\",\n          stepTraces: [],\n          errorMessage: message,\n          wakeCount: 0,\n          dedupeAdded: 0,\n        },\n      });\n    } finally {\n      this.inFlight = false;\n    }\n  }\n\n  private spec(): RoutineSpec {\n    if (isProxyModuleSpec(this.options.routine.spec)) {\n      throw new Error(\"RoutineRunner cannot run proxy_module specs\");\n    }\n    return this.options.routine.spec;\n  }\n}\n\nfunction cloneState(state: AIEmployeeRoutine[\"state\"]): AIEmployeeRoutine[\"state\"] {\n  return JSON.parse(JSON.stringify(state)) as AIEmployeeRoutine[\"state\"];\n}\n", "import { isProxyModuleSpec } from \"@claude-console/shared\";\nimport type { DaemonMsg_AIEmployeeStart, DaemonToServerMessage, ServerToDaemonMessage } from \"@claude-console/shared\";\nimport type { StepExecutorOptions } from \"./step-executor\";\nimport { RoutineRunner } from \"./routine-runner\";\nimport { ProxyModuleRunner } from \"../proxy-module/proxy-module-runner\";\n\nexport interface RoutineDispatcherOptions {\n  rootDir: string;\n  sendToServer: (message: DaemonToServerMessage) => void;\n  wakeAgentForRoutine?: StepExecutorOptions[\"wakeAgentForRoutine\"];\n  log?: (line: string) => void;\n}\n\nexport class RoutineDispatcher {\n  private readonly runners = new Map<string, RoutineRunner | ProxyModuleRunner>();\n  private readonly aiEmployeeIds = new Map<string, string>();\n\n  constructor(private readonly options: RoutineDispatcherOptions) {}\n\n  handle(message: ServerToDaemonMessage): boolean {\n    if (message.type === \"routine:start\") {\n      this.start(message);\n      return true;\n    }\n    if (message.type === \"routine:update\") {\n      this.stop(message.routine.id);\n      this.start(message);\n      return true;\n    }\n    if (message.type === \"routine:stop\") {\n      this.stop(message.routineId);\n      return true;\n    }\n    if (message.type === \"routine:trigger\") {\n      const runner = this.runners.get(message.routineId);\n      if (!runner) {\n        const aiEmployeeId = this.aiEmployeeIds.get(message.routineId);\n        if (aiEmployeeId) this.sendStatus(message.routineId, aiEmployeeId, \"error\", \"routine runner not mounted\");\n        return true;\n      }\n      const triggered = runner instanceof ProxyModuleRunner || runner instanceof RoutineRunner\n        ? runner.trigger(message.event)\n        : undefined;\n      void triggered?.catch((error) => {\n        const aiEmployeeId = this.aiEmployeeIds.get(message.routineId);\n        if (!aiEmployeeId) return;\n        this.sendStatus(message.routineId, aiEmployeeId, \"error\", error instanceof Error ? error.message : String(error));\n      });\n      return true;\n    }\n    return false;\n  }\n\n  stopAll(): void {\n    for (const runner of this.runners.values()) runner.stop();\n    this.runners.clear();\n  }\n\n  private start(message: Extract<ServerToDaemonMessage, { type: \"routine:start\" | \"routine:update\" }>): void {\n    const existing = this.runners.get(message.routine.id);\n    if (existing) existing.stop();\n    this.sendStatus(message.routine.id, message.routine.ai_employee_id, \"starting\", \"routine start received\");\n    try {\n      const runner = isProxyModuleSpec(message.routine.spec)\n        ? new ProxyModuleRunner({\n          rootDir: this.options.rootDir,\n          routine: message.routine,\n          config: message.config as DaemonMsg_AIEmployeeStart[\"config\"],\n          sendToServer: this.options.sendToServer,\n          log: this.options.log,\n        })\n        : new RoutineRunner({\n          routine: message.routine,\n          credentials: message.credentials,\n          sendToServer: this.options.sendToServer,\n          wakeAgentForRoutine: this.options.wakeAgentForRoutine,\n          log: this.options.log,\n        });\n      this.runners.set(message.routine.id, runner);\n      this.aiEmployeeIds.set(message.routine.id, message.routine.ai_employee_id);\n      runner.start();\n      this.sendStatus(message.routine.id, message.routine.ai_employee_id, \"running\", \"routine mounted\");\n    } catch (error) {\n      this.sendStatus(message.routine.id, message.routine.ai_employee_id, \"error\", error instanceof Error ? error.message : String(error));\n    }\n  }\n\n  private stop(routineId: string): void {\n    const runner = this.runners.get(routineId);\n    const aiEmployeeId = this.aiEmployeeIds.get(routineId);\n    if (!runner) {\n      if (aiEmployeeId) this.sendStatus(routineId, aiEmployeeId, \"stopped\", \"routine stopped\");\n      this.aiEmployeeIds.delete(routineId);\n      return;\n    }\n    runner.stop();\n    this.runners.delete(routineId);\n    if (aiEmployeeId) this.sendStatus(routineId, aiEmployeeId, \"stopped\", \"routine stopped\");\n    this.aiEmployeeIds.delete(routineId);\n  }\n\n  private sendStatus(routineId: string, aiEmployeeId: string, status: \"starting\" | \"running\" | \"stopped\" | \"error\", detail?: string): void {\n    this.options.sendToServer({ type: \"routine:status\", routineId, aiEmployeeId, status, detail });\n  }\n}\n", "import type { DaemonMsg_AIEmployeeStart, DaemonToServerMessage } from \"@claude-console/shared\";\nimport { FeishuPersonalAgentPoller, type FeishuPersonalAgentCommandContext } from \"./feishu-personal-agent-poller\";\n\nexport interface FeishuPersonalAgentPollerLike {\n  start(): void;\n  stop(): void;\n}\n\nexport interface SyncFeishuPersonalAgentPollerInput {\n  aiEmployeeId: string;\n  config: DaemonMsg_AIEmployeeStart[\"config\"];\n  pollers: Map<string, FeishuPersonalAgentPollerLike>;\n  resolveWorkspaceDir: (aiEmployeeId: string) => Promise<string | undefined>;\n  resolveCommandContext?: (aiEmployeeId: string) => Promise<FeishuPersonalAgentCommandContext | undefined>;\n  sendToServer: (msg: DaemonToServerMessage) => void;\n  log?: (line: string) => void;\n  pollerFactory?: (input: {\n    aiEmployeeId: string;\n    operatorOpenId: string;\n    triggerPrefix: string;\n    pollIntervalMs: number;\n    ambientEnabled: boolean;\n    ambientSilenceThresholdMs: number;\n    autoReplyChats?: Array<{ chat_id: string; chat_type: \"p2p\" | \"group\"; name?: string; external?: boolean }>;\n  }) => FeishuPersonalAgentPollerLike;\n}\n\nexport function syncFeishuPersonalAgentPoller(input: SyncFeishuPersonalAgentPollerInput): void {\n  const tc = input.config.aiEmployeeWorkContext?.templateConfig;\n  const aiEmployeeId = input.aiEmployeeId;\n  if (tc?.feishu_ingestion_mode !== \"personal_agent_polling\" && tc?.feishu_ingestion_mode !== \"webhook_and_polling\") {\n    stopFeishuPersonalAgentPoller(input.pollers, aiEmployeeId, input.log);\n    return;\n  }\n\n  const operatorOpenId = typeof tc.personal_agent_operator_open_id === \"string\" ? tc.personal_agent_operator_open_id.trim() : \"\";\n  if (!operatorOpenId) {\n    stopFeishuPersonalAgentPoller(input.pollers, aiEmployeeId, input.log);\n    input.log?.(`feishu personal agent poller skipped ai_employee=${aiEmployeeId} reason=missing_operator_open_id`);\n    return;\n  }\n\n  const triggerPrefix = typeof tc.personal_agent_trigger === \"string\" ? tc.personal_agent_trigger.trim() : \"/agent\";\n  const pollIntervalMs = typeof tc.personal_agent_poll_interval_ms === \"number\" ? tc.personal_agent_poll_interval_ms : 30000;\n  const ambientEnabled = tc.ambient_enabled !== false;\n  const ambientSilenceThresholdMs = typeof tc.ambient_silence_threshold_ms === \"number\"\n    ? Math.max(10_000, tc.ambient_silence_threshold_ms)\n    : 60_000;\n  const autoReplyChats = normalizeAutoReplyChats(tc.auto_reply_chats);\n  input.pollers.get(aiEmployeeId)?.stop();\n  const pollerConfig = { aiEmployeeId, operatorOpenId, triggerPrefix, pollIntervalMs, ambientEnabled, ambientSilenceThresholdMs, ...(autoReplyChats !== undefined ? { autoReplyChats } : {}) };\n  const poller = input.pollerFactory?.(pollerConfig)\n    ?? new FeishuPersonalAgentPoller(\n      {\n        aiEmployeeId,\n        resolveWorkspaceDir: () => input.resolveWorkspaceDir(aiEmployeeId),\n        resolveCommandContext: input.resolveCommandContext ? () => input.resolveCommandContext!(aiEmployeeId) : undefined,\n        operatorOpenId,\n        triggerPrefix,\n        pollIntervalMs,\n        ambientEnabled,\n        ambientSilenceThresholdMs,\n        autoReplyChats,\n      },\n      { sendToServer: input.sendToServer, log: input.log }\n    );\n  input.pollers.set(aiEmployeeId, poller);\n  poller.start();\n  input.log?.(`feishu personal agent poller started ai_employee=${aiEmployeeId} interval=${pollIntervalMs}ms trigger=${triggerPrefix}`);\n}\n\nfunction normalizeAutoReplyChats(value: unknown): Array<{ chat_id: string; chat_type: \"p2p\" | \"group\"; name?: string; external?: boolean }> | undefined {\n  if (!Array.isArray(value)) return undefined;\n  const seen = new Set<string>();\n  return value.flatMap((item) => {\n    if (!item || typeof item !== \"object\") return [];\n    const record = item as Record<string, unknown>;\n    const chatId = typeof record.chat_id === \"string\"\n      ? record.chat_id.trim()\n      : typeof record.chatId === \"string\" ? record.chatId.trim() : \"\";\n    if (!chatId || seen.has(chatId)) return [];\n    seen.add(chatId);\n    const rawType = typeof record.chat_type === \"string\"\n      ? record.chat_type\n      : typeof record.chatType === \"string\" ? record.chatType : \"\";\n    return [{\n      chat_id: chatId,\n      chat_type: rawType === \"p2p\" ? \"p2p\" as const : \"group\" as const,\n      name: typeof record.name === \"string\" ? record.name.trim() || undefined : undefined,\n      external: typeof record.external === \"boolean\" ? record.external : undefined,\n    }];\n  });\n}\n\nfunction stopFeishuPersonalAgentPoller(\n  pollers: Map<string, FeishuPersonalAgentPollerLike>,\n  aiEmployeeId: string,\n  log?: (line: string) => void,\n): void {\n  const existing = pollers.get(aiEmployeeId);\n  if (!existing) return;\n  existing.stop();\n  pollers.delete(aiEmployeeId);\n  log?.(`feishu personal agent poller stopped ai_employee=${aiEmployeeId}`);\n}\n", "import { createHash, randomUUID } from \"node:crypto\";\nimport { access, chmod, lstat, mkdir, readFile, realpath, rename, stat, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type {\n  DaemonMsg_NativeSessionCollaborationExecute,\n  DaemonMsg_NativeSessionCollaborationExecuteResult,\n  NativeSessionCollaborationCommand,\n  NativeSessionCompletionSignal,\n  NativeSessionRuntime,\n  ServerToDaemonMessage,\n} from \"@claude-console/shared\";\nimport { ClaudeAdapter } from \"../runtime/claude-adapter\";\nimport { CodexAdapter } from \"../runtime/codex-adapter\";\nimport type { RuntimeAdapter } from \"../runtime/adapter\";\nimport { discoverNativeSessions, resolveCurrentNativeSession, type NativeSessionCandidate } from \"./session-discovery\";\n\ninterface RegisteredEndpoint extends NativeSessionCandidate {\n  lastKnownMtimeMs: number;\n}\n\ninterface PendingCommand {\n  commandKind: NativeSessionCollaborationCommand[\"kind\"];\n  resolve: (result: Record<string, unknown>) => void;\n  reject: (error: Error) => void;\n  timeout: NodeJS.Timeout;\n}\n\ntype NativeSessionE2EFaultAction = \"pause_before_provider\" | \"pause_after_persisted_result\" | \"drop_command_result\";\n\ninterface NativeSessionE2EFault {\n  action: NativeSessionE2EFaultAction;\n  directory: string;\n  commandKind?: \"start\" | \"send\" | \"finish\";\n  consumed: boolean;\n}\n\nexport interface NativeSessionLocalStartInput {\n  command: Omit<Extract<NativeSessionCollaborationCommand, { kind: \"start\" }>, \"projectScopeFingerprint\">;\n  selfProjectPath: string;\n  peerEndpoint: NativeSessionCandidate;\n  confirmedPeerHistoryMutation: true;\n}\n\nexport class NativeSessionCollaborationManager {\n  private readonly endpoints = new Map<string, RegisteredEndpoint>();\n  private readonly leases = new Map<string, string>();\n  private readonly pendingCommands = new Map<string, PendingCommand>();\n  private readonly adapters: Record<NativeSessionRuntime, RuntimeAdapter>;\n  private readonly stateDir: string;\n  private readonly endpointFile: string;\n  private readonly resultDir: string;\n  private readonly e2eFault: NativeSessionE2EFault | undefined;\n\n  constructor(private readonly options: {\n    rootDir: string;\n    sendToServer: (message: Parameters<import(\"../connection/server-connection\").ServerConnection[\"send\"]>[0]) => void;\n    isServerConnected: () => boolean;\n    log?: (line: string) => void;\n    adapters?: Partial<Record<NativeSessionRuntime, RuntimeAdapter>>;\n    homeDir?: string;\n  }) {\n    this.stateDir = path.join(options.rootDir, \"native-session\");\n    this.endpointFile = path.join(this.stateDir, \"endpoints.json\");\n    this.resultDir = path.join(this.stateDir, \"results\");\n    this.e2eFault = nativeSessionE2EFault(this.stateDir);\n    this.adapters = {\n      codex: options.adapters?.codex ?? new CodexAdapter(),\n      claude: options.adapters?.claude ?? new ClaudeAdapter(),\n    };\n  }\n\n  async initialize(): Promise<void> {\n    await ensurePrivateDirectory(this.options.rootDir);\n    await ensurePrivateDirectory(this.stateDir);\n    await ensurePrivateDirectory(this.resultDir);\n    if (this.e2eFault) await ensurePrivateDirectory(this.e2eFault.directory);\n    const systemPromptPath = path.join(this.stateDir, \"discussion-system.md\");\n    await writeFile(systemPromptPath, `${NATIVE_SESSION_DISCUSSION_SYSTEM_PROMPT}\\n`, { mode: 0o600 });\n    await chmod(systemPromptPath, 0o600);\n    try {\n      const endpointInfo = await lstat(this.endpointFile);\n      if (endpointInfo.isSymbolicLink() || !endpointInfo.isFile()) throw new Error(\"native session endpoint registry must be a regular non-symlink file\");\n      assertCurrentOwner(endpointInfo.uid, \"native session endpoint registry\");\n      await chmod(this.endpointFile, 0o600);\n      const stored = JSON.parse(await readFile(this.endpointFile, \"utf8\")) as unknown;\n      if (!Array.isArray(stored)) throw new Error(\"native session endpoint registry must contain an array\");\n      for (const raw of stored) {\n        const endpoint = await this.validateEndpoint(raw as NativeSessionCandidate, true);\n        this.endpoints.set(endpointKey(endpoint.runtime, endpoint.sessionId), endpoint);\n      }\n    } catch (error) {\n      if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n    }\n  }\n\n  async listSessions(input: { runtime: NativeSessionRuntime; projectPath: string; limit?: number }): Promise<NativeSessionCandidate[]> {\n    return discoverNativeSessions(input);\n  }\n\n  async currentSession(input: { runtime: NativeSessionRuntime; env?: NodeJS.ProcessEnv }): Promise<Awaited<ReturnType<typeof resolveCurrentNativeSession>>> {\n    return resolveCurrentNativeSession(input);\n  }\n\n  async start(input: NativeSessionLocalStartInput): Promise<Record<string, unknown>> {\n    if (!input.confirmedPeerHistoryMutation) throw new Error(\"peer session history mutation must be confirmed\");\n    const selfProjectPath = await realpath(input.selfProjectPath);\n    const peerProjectPath = await realpath(input.peerEndpoint.projectScopePath);\n    if (selfProjectPath !== peerProjectPath) throw new Error(\"peer session launch path does not match the current session\");\n    if (input.command.peerRuntime !== input.peerEndpoint.runtime || input.command.peerSessionId !== input.peerEndpoint.sessionId) {\n      throw new Error(\"selected peer endpoint does not match the start command\");\n    }\n    await this.registerEndpoint(input.peerEndpoint);\n    return this.sendCommand({\n      ...input.command,\n      projectScopeFingerprint: createHash(\"sha256\").update(selfProjectPath).digest(\"hex\"),\n    });\n  }\n\n  send(command: Extract<NativeSessionCollaborationCommand, { kind: \"send\" }>): Promise<Record<string, unknown>> {\n    return this.sendCommand(command);\n  }\n\n  async wait(command: Extract<NativeSessionCollaborationCommand, { kind: \"wait\" }>, timeoutMs = 90_000): Promise<Record<string, unknown>> {\n    const boundedTimeout = Math.min(Math.max(timeoutMs, 1_000), 90_000);\n    const deadline = Date.now() + boundedTimeout;\n    let lastResult: Record<string, unknown> = { status: \"pending\", events: [], nextCursor: command.afterSeq };\n    do {\n      lastResult = await this.sendCommand(command, Math.min(10_000, Math.max(deadline - Date.now(), 1_000)));\n      if (lastResult.status !== \"pending\") return lastResult;\n      const remaining = deadline - Date.now();\n      if (remaining <= 0) break;\n      await new Promise((resolve) => setTimeout(resolve, Math.min(1_000, remaining)));\n    } while (Date.now() < deadline);\n    return lastResult;\n  }\n\n  finish(command: Extract<NativeSessionCollaborationCommand, { kind: \"finish\" }>): Promise<Record<string, unknown>> {\n    return this.sendCommand(command);\n  }\n\n  status(command: Extract<NativeSessionCollaborationCommand, { kind: \"status\" }>): Promise<Record<string, unknown>> {\n    return this.sendCommand(command);\n  }\n\n  async confirmSessionChange(input: {\n    runtime: NativeSessionRuntime;\n    sessionId: string;\n    confirmed: true;\n    command: Extract<NativeSessionCollaborationCommand, { kind: \"retry\" }>;\n  }): Promise<Record<string, unknown>> {\n    if (input.confirmed !== true) throw new Error(\"session history change confirmation is required\");\n    const key = endpointKey(input.runtime, input.sessionId);\n    if (this.leases.has(key)) throw Object.assign(new Error(\"SESSION_BUSY\"), { code: \"SESSION_BUSY\" });\n    const endpoint = this.endpoints.get(key);\n    if (!endpoint) throw new Error(\"selected peer session is not registered on this daemon\");\n    const current = await stat(endpoint.nativeSessionFile);\n    if (!current.isFile()) throw new Error(\"peer session path is not a regular file\");\n    endpoint.lastKnownMtimeMs = current.mtimeMs;\n    endpoint.updatedAt = Date.now();\n    await this.persistEndpoints();\n    return this.sendCommand(input.command);\n  }\n\n  handleServerMessage(message: ServerToDaemonMessage): boolean {\n    if (message.type === \"native_session_collaboration:result\") {\n      const pending = this.pendingCommands.get(message.requestId);\n      if (!pending) return true;\n      if (this.dropE2ECommandResult(pending.commandKind)) return true;\n      clearTimeout(pending.timeout);\n      this.pendingCommands.delete(message.requestId);\n      if (message.ok) pending.resolve(message.result ?? {});\n      else pending.reject(Object.assign(new Error(message.error ?? \"collaboration command failed\"), { code: message.errorCode }));\n      return true;\n    }\n    if (message.type === \"native_session_collaboration:event\") return true;\n    if (message.type === \"native_session_collaboration:execute\") {\n      void this.executePeerTurn(message);\n      return true;\n    }\n    return false;\n  }\n\n  private async sendCommand(command: NativeSessionCollaborationCommand, timeoutMs = nativeSessionCommandTimeoutMs()): Promise<Record<string, unknown>> {\n    if (!this.options.isServerConnected()) throw new Error(\"NiuMa daemon is offline\");\n    const requestId = randomUUID();\n    return new Promise((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        this.pendingCommands.delete(requestId);\n        reject(new Error(\"NiuMa collaboration command timed out; retry with the same client request id\"));\n      }, timeoutMs);\n      this.pendingCommands.set(requestId, { commandKind: command.kind, resolve, reject, timeout });\n      this.options.sendToServer({ type: \"native_session_collaboration:command\", requestId, command });\n    });\n  }\n\n  private async registerEndpoint(candidate: NativeSessionCandidate): Promise<void> {\n    const endpoint = await this.validateEndpoint(candidate, false);\n    this.endpoints.set(endpointKey(endpoint.runtime, endpoint.sessionId), endpoint);\n    await this.persistEndpoints();\n  }\n\n  private async validateEndpoint(candidate: NativeSessionCandidate, restored: boolean): Promise<RegisteredEndpoint> {\n    if (candidate.runtime !== \"codex\" && candidate.runtime !== \"claude\") throw new Error(\"peer session runtime is invalid\");\n    if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(candidate.sessionId)) throw new Error(\"peer session id is invalid\");\n    const canonicalProject = await realpath(candidate.projectScopePath);\n    const homeDir = this.options.homeDir ?? os.homedir();\n    const providerRoot = await realpath(path.join(homeDir, candidate.runtime === \"claude\" ? \".claude\" : \".codex\"));\n    const fileInfo = await lstat(candidate.nativeSessionFile);\n    if (fileInfo.isSymbolicLink() || !fileInfo.isFile()) throw new Error(\"peer session path is not a regular non-symlink file\");\n    assertCurrentOwner(fileInfo.uid, \"peer session file\");\n    const canonicalFile = await realpath(candidate.nativeSessionFile);\n    if (canonicalFile !== providerRoot && !canonicalFile.startsWith(`${providerRoot}${path.sep}`)) {\n      throw new Error(\"peer session path escapes provider root\");\n    }\n    return {\n      ...candidate,\n      projectScopePath: canonicalProject,\n      nativeSessionFile: canonicalFile,\n      lastKnownMtimeMs: restored\n        ? finiteTimestamp((candidate as RegisteredEndpoint).lastKnownMtimeMs, \"stored peer session mtime\")\n        : fileInfo.mtimeMs,\n    };\n  }\n\n  private async persistEndpoints(): Promise<void> {\n    const temporary = `${this.endpointFile}.${process.pid}.tmp`;\n    await writeFile(temporary, JSON.stringify([...this.endpoints.values()], null, 2), { mode: 0o600 });\n    await chmod(temporary, 0o600);\n    await rename(temporary, this.endpointFile);\n    await chmod(this.endpointFile, 0o600);\n  }\n\n  private async executePeerTurn(message: DaemonMsg_NativeSessionCollaborationExecute): Promise<void> {\n    if (message.discussionOnly !== true) {\n      this.sendExecutionResult(message, { status: \"failed\", error: \"native session collaboration must be discussion-only\" });\n      return;\n    }\n    let completed: Awaited<ReturnType<NativeSessionCollaborationManager[\"readCompletedResult\"]>>;\n    try {\n      completed = await this.readCompletedResult(message.turnId);\n    } catch (error) {\n      this.sendExecutionResult(message, { status: \"failed\", error: error instanceof Error ? error.message : String(error) });\n      return;\n    }\n    if (completed) {\n      this.sendExecutionResult(message, completed);\n      return;\n    }\n    const key = endpointKey(message.peerRuntime, message.peerSessionId);\n    const endpoint = this.endpoints.get(key);\n    if (!endpoint) {\n      this.sendExecutionResult(message, { status: \"failed\", error: \"selected peer session is not registered on this daemon\" });\n      return;\n    }\n    const ownerToken = `${message.turnId}:${message.leaseGeneration}`;\n    if (this.leases.has(key)) {\n      this.sendExecutionResult(message, { status: \"paused\", warning: \"SESSION_BUSY\" });\n      return;\n    }\n    this.leases.set(key, ownerToken);\n    try {\n      const before = await stat(endpoint.nativeSessionFile);\n      if (before.mtimeMs !== endpoint.lastKnownMtimeMs) {\n        this.sendExecutionResult(message, {\n          status: \"paused\",\n          warning: \"peer session changed outside the collaboration lease; confirm before retrying\",\n        });\n        return;\n      }\n      await this.pauseForE2EFault(\"pause_before_provider\", message);\n      const runtimeResult = await this.adapters[message.peerRuntime].run({\n        aiEmployeeId: `native-session:${message.turnId}`,\n        cwd: endpoint.projectScopePath,\n        prompt: buildPeerPrompt(message),\n        systemPrompt: NATIVE_SESSION_DISCUSSION_SYSTEM_PROMPT,\n        systemPromptPath: path.join(this.stateDir, \"discussion-system.md\"),\n        permissionMode: \"read_only\",\n        runtimeSessionId: endpoint.sessionId,\n        timeoutMs: 10 * 60_000,\n        requestPermission: async () => ({ action: \"reject\", metadata: { reason: \"discussion_only\" } }),\n      });\n      if (runtimeResult.status !== \"ok\") {\n        const failed = { status: \"failed\" as const, error: runtimeResult.errorMessage ?? runtimeResult.finalMessage ?? runtimeResult.status };\n        await this.persistCompletedResult(message.turnId, failed);\n        this.sendExecutionResult(message, failed);\n        return;\n      }\n      const envelope = parsePeerEnvelope(runtimeResult.finalMessage);\n      const after = await stat(endpoint.nativeSessionFile);\n      endpoint.lastKnownMtimeMs = after.mtimeMs;\n      endpoint.updatedAt = Date.now();\n      await this.persistEndpoints();\n      const succeeded = {\n        status: \"ok\" as const,\n        replyText: envelope.replyText,\n        completionSignal: envelope.completionSignal,\n        proposalTurnId: envelope.proposalTurnId,\n        runtimeSessionId: runtimeResult.runtimeSessionId,\n        warning: envelope.warning,\n      };\n      await this.persistCompletedResult(message.turnId, succeeded);\n      await this.pauseForE2EFault(\"pause_after_persisted_result\", message);\n      this.sendExecutionResult(message, succeeded);\n    } catch (error) {\n      const failed = { status: \"failed\" as const, error: error instanceof Error ? error.message : String(error) };\n      await this.persistCompletedResult(message.turnId, failed).catch(() => undefined);\n      this.sendExecutionResult(message, failed);\n    } finally {\n      if (this.leases.get(key) === ownerToken) this.leases.delete(key);\n    }\n  }\n\n  private sendExecutionResult(\n    message: DaemonMsg_NativeSessionCollaborationExecute,\n    result: Omit<DaemonMsg_NativeSessionCollaborationExecuteResult, \"type\" | \"requestId\" | \"collaborationId\" | \"turnId\" | \"leaseGeneration\">,\n  ): void {\n    this.options.sendToServer({\n      type: \"native_session_collaboration:execute_result\",\n      requestId: message.requestId,\n      collaborationId: message.collaborationId,\n      turnId: message.turnId,\n      leaseGeneration: message.leaseGeneration,\n      ...result,\n    });\n  }\n\n  private dropE2ECommandResult(commandKind: NativeSessionCollaborationCommand[\"kind\"]): boolean {\n    if (!this.e2eFault || this.e2eFault.consumed || this.e2eFault.action !== \"drop_command_result\") return false;\n    if (this.e2eFault.commandKind && this.e2eFault.commandKind !== commandKind) return false;\n    this.e2eFault.consumed = true;\n    void this.writeE2EFaultMarker(\"dropped\", { action: this.e2eFault.action, commandKind, at: new Date().toISOString() });\n    return true;\n  }\n\n  private async pauseForE2EFault(action: Extract<NativeSessionE2EFaultAction, `pause_${string}`>, message: DaemonMsg_NativeSessionCollaborationExecute): Promise<void> {\n    if (!this.e2eFault || this.e2eFault.consumed || this.e2eFault.action !== action) return;\n    this.e2eFault.consumed = true;\n    await this.writeE2EFaultMarker(\"entered\", {\n      action,\n      turnId: message.turnId,\n      collaborationId: message.collaborationId,\n      at: new Date().toISOString(),\n    });\n    const release = path.join(this.e2eFault.directory, `${action}.release`);\n    const timeoutMs = nativeSessionE2EFaultPauseTimeoutMs();\n    const startedAt = Date.now();\n    while (Date.now() - startedAt < timeoutMs) {\n      try {\n        await access(release);\n        return;\n      } catch {\n        await new Promise((resolve) => setTimeout(resolve, 25));\n      }\n    }\n    throw new Error(`native-session E2E fault ${action} was not released within ${timeoutMs}ms`);\n  }\n\n  private async writeE2EFaultMarker(kind: \"entered\" | \"dropped\", payload: Record<string, unknown>): Promise<void> {\n    if (!this.e2eFault) return;\n    await writeFile(\n      path.join(this.e2eFault.directory, `${this.e2eFault.action}.${kind}.json`),\n      `${JSON.stringify(payload)}\\n`,\n      { mode: 0o600 },\n    );\n  }\n\n  private async persistCompletedResult(\n    turnId: string,\n    result: Omit<DaemonMsg_NativeSessionCollaborationExecuteResult, \"type\" | \"requestId\" | \"collaborationId\" | \"turnId\" | \"leaseGeneration\">,\n  ): Promise<void> {\n    assertSafeStateId(turnId, \"turn id\");\n    const file = path.join(this.resultDir, `${turnId}.json`);\n    const temporary = `${file}.${process.pid}.${randomUUID()}.tmp`;\n    await writeFile(temporary, JSON.stringify(result), { mode: 0o600 });\n    await chmod(temporary, 0o600);\n    await rename(temporary, file);\n    await chmod(file, 0o600);\n  }\n\n  private async readCompletedResult(\n    turnId: string,\n  ): Promise<Omit<DaemonMsg_NativeSessionCollaborationExecuteResult, \"type\" | \"requestId\" | \"collaborationId\" | \"turnId\" | \"leaseGeneration\"> | undefined> {\n    try {\n      assertSafeStateId(turnId, \"turn id\");\n      const file = path.join(this.resultDir, `${turnId}.json`);\n      const info = await lstat(file);\n      if (info.isSymbolicLink() || !info.isFile()) throw new Error(\"native session result must be a regular non-symlink file\");\n      assertCurrentOwner(info.uid, \"native session result\");\n      return JSON.parse(await readFile(file, \"utf8\"));\n    } catch (error) {\n      if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n      return undefined;\n    }\n  }\n}\n\nconst NATIVE_SESSION_DISCUSSION_SYSTEM_PROMPT = [\n  \"You are participating in a NiuMa native-session collaboration.\",\n  \"This turn is discussion-only. Do not modify files, commit, push, deploy, or request elevated permissions.\",\n  \"Use the existing context in this resumed native session to evaluate the other endpoint's latest message.\",\n  \"Return one JSON object only with reply_text, completion_signal, and optional proposal_turn_id.\",\n  \"completion_signal must be continue, propose_consensus, or confirm_consensus.\",\n].join(\"\\n\");\n\nfunction buildPeerPrompt(message: DaemonMsg_NativeSessionCollaborationExecute): string {\n  return [\n    `Collaboration: ${message.collaborationId}`,\n    `Round: ${message.roundNumber}`,\n    \"Latest message from the other native session:\",\n    message.prompt,\n    \"Respond with the required JSON envelope. Keep reply_text useful to the other session.\",\n  ].join(\"\\n\\n\");\n}\n\nfunction parsePeerEnvelope(value: string): {\n  replyText: string;\n  completionSignal: NativeSessionCompletionSignal;\n  proposalTurnId?: string;\n  warning?: string;\n} {\n  const trimmed = value.trim();\n  const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```\\s*$/i)?.[1]?.trim();\n  let parsed: Record<string, unknown> | undefined;\n  try {\n    const candidate = JSON.parse(fenced ?? trimmed);\n    if (candidate && typeof candidate === \"object\" && !Array.isArray(candidate)) parsed = candidate;\n  } catch {\n    return { replyText: trimmed || \"Peer returned an empty response\", completionSignal: \"continue\", warning: \"invalid collaboration result envelope\" };\n  }\n  const hasReplyText = typeof parsed?.reply_text === \"string\" && parsed.reply_text.trim().length > 0;\n  const replyText = hasReplyText ? (parsed!.reply_text as string).trim() : trimmed || \"Peer returned an empty response\";\n  const signal = parsed?.completion_signal;\n  let completionSignal: NativeSessionCompletionSignal = signal === \"propose_consensus\" || signal === \"confirm_consensus\" ? signal : \"continue\";\n  const proposalTurnId = typeof parsed?.proposal_turn_id === \"string\" && parsed.proposal_turn_id.trim() ? parsed.proposal_turn_id.trim() : undefined;\n  const warnings: string[] = [];\n  if (!hasReplyText) {\n    completionSignal = \"continue\";\n    warnings.push(\"collaboration result envelope is missing reply_text; completion signal was downgraded to continue\");\n  }\n  if (signal !== completionSignal) warnings.push(\"invalid completion signal was downgraded to continue\");\n  if (completionSignal === \"confirm_consensus\" && !proposalTurnId) {\n    completionSignal = \"continue\";\n    warnings.push(\"consensus confirmation without proposal_turn_id was downgraded to continue\");\n  }\n  return {\n    replyText,\n    completionSignal,\n    proposalTurnId,\n    ...(warnings.length === 0 ? {} : { warning: warnings.join(\"; \") }),\n  };\n}\n\nasync function ensurePrivateDirectory(directory: string): Promise<void> {\n  try {\n    const info = await lstat(directory);\n    if (info.isSymbolicLink() || !info.isDirectory()) throw new Error(`${directory} must be a real directory`);\n    assertCurrentOwner(info.uid, directory);\n  } catch (error) {\n    if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n    await mkdir(directory, { mode: 0o700 });\n  }\n  await chmod(directory, 0o700);\n}\n\nfunction assertCurrentOwner(uid: number, label: string): void {\n  if (typeof process.getuid === \"function\" && uid !== process.getuid()) throw new Error(`${label} owner mismatch`);\n}\n\nfunction assertSafeStateId(value: string, label: string): void {\n  if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(value)) throw new Error(`${label} is not a safe provider identifier`);\n}\n\nfunction finiteTimestamp(value: number, label: string): number {\n  if (!Number.isFinite(value) || value < 0) throw new Error(`${label} is invalid`);\n  return value;\n}\n\nfunction nativeSessionE2EFault(stateDir: string): NativeSessionE2EFault | undefined {\n  if (process.env.WM_NATIVE_SESSION_E2E !== \"1\") return undefined;\n  const action = process.env.WM_NATIVE_SESSION_E2E_FAULT_ACTION;\n  if (!action) return undefined;\n  if (action !== \"pause_before_provider\" && action !== \"pause_after_persisted_result\" && action !== \"drop_command_result\") {\n    throw new Error(\"WM_NATIVE_SESSION_E2E_FAULT_ACTION is invalid\");\n  }\n  const configuredCommandKind = process.env.WM_NATIVE_SESSION_E2E_FAULT_COMMAND_KIND;\n  if (configuredCommandKind && configuredCommandKind !== \"start\" && configuredCommandKind !== \"send\" && configuredCommandKind !== \"finish\") {\n    throw new Error(\"WM_NATIVE_SESSION_E2E_FAULT_COMMAND_KIND is invalid\");\n  }\n  if (configuredCommandKind && action !== \"drop_command_result\") {\n    throw new Error(\"WM_NATIVE_SESSION_E2E_FAULT_COMMAND_KIND requires drop_command_result\");\n  }\n  return {\n    action,\n    directory: path.join(stateDir, \"e2e-fault\"),\n    ...(configuredCommandKind ? { commandKind: configuredCommandKind as \"start\" | \"send\" | \"finish\" } : {}),\n    consumed: false,\n  };\n}\n\nfunction nativeSessionCommandTimeoutMs(): number {\n  if (process.env.WM_NATIVE_SESSION_E2E !== \"1\") return 30_000;\n  const parsed = Number(process.env.WM_NATIVE_SESSION_E2E_COMMAND_TIMEOUT_MS ?? \"\");\n  return Number.isInteger(parsed) && parsed >= 1_000 && parsed <= 30_000 ? parsed : 30_000;\n}\n\nfunction nativeSessionE2EFaultPauseTimeoutMs(): number {\n  if (process.env.WM_NATIVE_SESSION_E2E !== \"1\") return 120_000;\n  const parsed = Number(process.env.WM_NATIVE_SESSION_E2E_FAULT_PAUSE_TIMEOUT_MS ?? \"\");\n  return Number.isInteger(parsed) && parsed >= 5_000 && parsed <= 300_000 ? parsed : 120_000;\n}\n\nfunction endpointKey(runtime: NativeSessionRuntime, sessionId: string): string {\n  return `${runtime}:${sessionId}`;\n}\n", "import { createReadStream } from \"node:fs\";\nimport { lstat, readdir, readFile, realpath, stat } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport type { NativeSessionRuntime } from \"@claude-console/shared\";\n\nexport interface NativeSessionCandidate {\n  runtime: NativeSessionRuntime;\n  sessionId: string;\n  title: string;\n  projectScopePath: string;\n  nativeSessionFile: string;\n  updatedAt: number;\n  branch?: string;\n  status: \"idle\" | \"unavailable\";\n}\n\nexport interface CurrentNativeSession {\n  runtime: NativeSessionRuntime;\n  sessionId: string;\n  projectScopePath: string;\n  nativeSessionFile: string;\n}\n\nexport async function discoverNativeSessions(input: {\n  runtime: NativeSessionRuntime;\n  projectPath: string;\n  limit?: number;\n  homeDir?: string;\n}): Promise<NativeSessionCandidate[]> {\n  const homeDir = input.homeDir ?? os.homedir();\n  const projectScopePath = await realpath(input.projectPath);\n  const candidates = input.runtime === \"claude\"\n    ? await discoverClaudeSessions(homeDir, projectScopePath)\n    : await discoverCodexSessions(homeDir, projectScopePath);\n  const uniqueCandidates = new Map<string, NativeSessionCandidate>();\n  for (const candidate of candidates.filter((item) => item.projectScopePath === projectScopePath)) {\n    const existing = uniqueCandidates.get(candidate.sessionId);\n    if (!existing || candidate.updatedAt > existing.updatedAt) uniqueCandidates.set(candidate.sessionId, candidate);\n  }\n  return [...uniqueCandidates.values()]\n    .sort((left, right) => right.updatedAt - left.updatedAt || left.sessionId.localeCompare(right.sessionId))\n    .slice(0, Math.min(Math.max(input.limit ?? 10, 1), 10));\n}\n\nexport async function resolveCurrentNativeSession(input: {\n  runtime: NativeSessionRuntime;\n  env?: NodeJS.ProcessEnv;\n  homeDir?: string;\n}): Promise<CurrentNativeSession> {\n  const env = input.env ?? process.env;\n  const homeDir = input.homeDir ?? os.homedir();\n  if (input.runtime === \"claude\") return resolveCurrentClaudeSession(homeDir, env);\n  return resolveCurrentCodexSession(homeDir, env);\n}\n\nasync function discoverClaudeSessions(homeDir: string, projectScopePath: string): Promise<NativeSessionCandidate[]> {\n  const registryDir = path.join(homeDir, \".claude\", \".niuma-collab\", \"sessions\");\n  let names: string[] = [];\n  try {\n    names = await readdir(registryDir);\n  } catch {\n    return discoverHistoricalClaudeSessions(homeDir, projectScopePath);\n  }\n  const candidates: NativeSessionCandidate[] = [];\n  for (const name of names.filter((value) => value.endsWith(\".json\"))) {\n    const registryPath = path.join(registryDir, name);\n    try {\n      await assertOwnedRegularFile(registryPath, registryDir);\n      const record = JSON.parse(await readFile(registryPath, \"utf8\")) as Record<string, unknown>;\n      const sessionId = stringValue(record.session_id ?? record.sessionId);\n      const launchCwd = stringValue(record.launch_cwd ?? record.launchCwd);\n      const transcriptPath = stringValue(record.transcript_path ?? record.transcriptPath);\n      if (!sessionId || !launchCwd || !transcriptPath) continue;\n      const canonicalCwd = await realpath(launchCwd);\n      if (canonicalCwd !== projectScopePath) continue;\n      const claudeRoot = path.join(homeDir, \".claude\");\n      await assertOwnedRegularFile(transcriptPath, claudeRoot);\n      const transcriptIdentity = await readClaudeTranscriptIdentity(transcriptPath);\n      if (!transcriptIdentity || transcriptIdentity.sessionId !== sessionId || transcriptIdentity.launchCwd !== canonicalCwd) continue;\n      const fileStat = await stat(transcriptPath);\n      candidates.push({\n        runtime: \"claude\",\n        sessionId,\n        title: stringValue(record.title) ?? `Claude ${sessionId.slice(0, 8)}`,\n        projectScopePath: canonicalCwd,\n        nativeSessionFile: transcriptPath,\n        updatedAt: dateValue(record.updated_at ?? record.updatedAt) ?? fileStat.mtimeMs,\n        branch: stringValue(record.git_branch ?? record.gitBranch),\n        status: \"idle\",\n      });\n    } catch {\n      continue;\n    }\n  }\n  const historical = await discoverHistoricalClaudeSessions(homeDir, projectScopePath);\n  const registeredIds = new Set(candidates.map((candidate) => candidate.sessionId));\n  return [...candidates, ...historical.filter((candidate) => !registeredIds.has(candidate.sessionId))];\n}\n\nasync function resolveCurrentClaudeSession(homeDir: string, env: NodeJS.ProcessEnv): Promise<CurrentNativeSession> {\n  const sessionId = env.NIUMA_CLAUDE_SESSION_ID?.trim();\n  const launchCwd = env.NIUMA_CLAUDE_LAUNCH_CWD?.trim();\n  const transcriptPath = env.NIUMA_CLAUDE_TRANSCRIPT_PATH?.trim();\n  if (!sessionId || !launchCwd || !transcriptPath) {\n    throw new Error(\"Claude SessionStart hook is required; restart or resume the current Claude session\");\n  }\n  const canonicalCwd = await realpath(launchCwd);\n  const claudeRoot = path.join(homeDir, \".claude\");\n  await assertOwnedRegularFile(transcriptPath, claudeRoot);\n  const registryPath = path.join(claudeRoot, \".niuma-collab\", \"sessions\", `${sessionId}.json`);\n  try {\n    await assertOwnedRegularFile(registryPath, path.dirname(registryPath));\n  } catch {\n    throw new Error(\"Claude session registry entry is missing or invalid\");\n  }\n  const record = JSON.parse(await readFile(registryPath, \"utf8\")) as Record<string, unknown>;\n  const transcriptIdentity = await readClaudeTranscriptIdentity(transcriptPath);\n  if (stringValue(record.session_id ?? record.sessionId) !== sessionId\n    || await realpath(stringValue(record.launch_cwd ?? record.launchCwd) ?? \"\") !== canonicalCwd\n    || path.resolve(stringValue(record.transcript_path ?? record.transcriptPath) ?? \"\") !== path.resolve(transcriptPath)\n    || transcriptIdentity?.sessionId !== sessionId\n    || transcriptIdentity.launchCwd !== canonicalCwd) {\n    throw new Error(\"Claude session environment, registry and transcript identity do not match\");\n  }\n  return { runtime: \"claude\", sessionId, projectScopePath: canonicalCwd, nativeSessionFile: transcriptPath };\n}\n\nasync function discoverHistoricalClaudeSessions(homeDir: string, projectScopePath: string): Promise<NativeSessionCandidate[]> {\n  const root = path.join(homeDir, \".claude\", \"projects\");\n  const files = await collectFiles(root, (name) => name.endsWith(\".jsonl\"), 3);\n  const candidates: NativeSessionCandidate[] = [];\n  for (const file of files) {\n    try {\n      await assertOwnedRegularFile(file, root);\n      const identity = await readClaudeTranscriptIdentity(file);\n      if (!identity || identity.launchCwd !== projectScopePath) continue;\n      const fileStat = await stat(file);\n      candidates.push({\n        runtime: \"claude\",\n        sessionId: identity.sessionId,\n        title: `Claude ${identity.sessionId.slice(0, 8)}`,\n        projectScopePath: identity.launchCwd,\n        nativeSessionFile: file,\n        updatedAt: fileStat.mtimeMs,\n        status: \"idle\",\n      });\n    } catch {\n      continue;\n    }\n  }\n  return candidates;\n}\n\nasync function readClaudeTranscriptIdentity(file: string): Promise<{ sessionId: string; launchCwd: string } | undefined> {\n  const records = await readJsonLines(file, 40);\n  for (const record of records) {\n    if (record.isSidechain === true || record.is_sidechain === true) continue;\n    const sessionId = stringValue(record.sessionId ?? record.session_id);\n    const cwd = stringValue(record.cwd);\n    if (!sessionId || !cwd) continue;\n    return { sessionId, launchCwd: await realpath(cwd) };\n  }\n  return undefined;\n}\n\nasync function discoverCodexSessions(homeDir: string, projectScopePath: string): Promise<NativeSessionCandidate[]> {\n  const codexRoot = path.join(homeDir, \".codex\");\n  const indexPath = path.join(codexRoot, \"session_index.jsonl\");\n  await assertOwnedRegularFile(indexPath, codexRoot);\n  const indexRows = await readJsonLines(indexPath);\n  const index = new Map(indexRows.map((record) => [stringValue(record.id), record]).filter((entry): entry is [string, Record<string, unknown>] => Boolean(entry[0])));\n  const rollouts = await collectFiles(path.join(codexRoot, \"sessions\"), (name) => name.endsWith(\".jsonl\"), 5);\n  const candidates: NativeSessionCandidate[] = [];\n  for (const rolloutPath of rollouts) {\n    try {\n      await assertOwnedRegularFile(rolloutPath, codexRoot);\n      const meta = await readCodexSessionMeta(rolloutPath);\n      if (!meta || meta.launchCwd !== projectScopePath) continue;\n      const indexed = index.get(meta.sessionId);\n      const fileStat = await stat(rolloutPath);\n      candidates.push({\n        runtime: \"codex\",\n        sessionId: meta.sessionId,\n        title: stringValue(indexed?.thread_name) ?? `Codex ${meta.sessionId.slice(0, 8)}`,\n        projectScopePath: meta.launchCwd,\n        nativeSessionFile: rolloutPath,\n        updatedAt: dateValue(indexed?.updated_at) ?? fileStat.mtimeMs,\n        branch: meta.branch,\n        status: \"idle\",\n      });\n    } catch {\n      continue;\n    }\n  }\n  return candidates;\n}\n\nasync function resolveCurrentCodexSession(homeDir: string, env: NodeJS.ProcessEnv): Promise<CurrentNativeSession> {\n  const sessionId = env.CODEX_THREAD_ID?.trim();\n  if (!sessionId) throw new Error(\"CODEX_THREAD_ID is required to identify the current Codex session\");\n  const candidates = await findCodexRollouts(homeDir, sessionId);\n  if (candidates.length !== 1) throw new Error(`Codex session ${sessionId} could not be resolved uniquely`);\n  const meta = await readCodexSessionMeta(candidates[0]);\n  if (!meta || meta.sessionId !== sessionId) throw new Error(\"Codex rollout session identity does not match CODEX_THREAD_ID\");\n  return { runtime: \"codex\", sessionId, projectScopePath: meta.launchCwd, nativeSessionFile: candidates[0] };\n}\n\nasync function findCodexRollouts(homeDir: string, sessionId: string): Promise<string[]> {\n  const root = path.join(homeDir, \".codex\", \"sessions\");\n  const files = await collectFiles(root, (name) => name.endsWith(`${sessionId}.jsonl`), 5);\n  const matches: string[] = [];\n  for (const file of files) {\n    const meta = await readCodexSessionMeta(file).catch(() => undefined);\n    if (meta?.sessionId === sessionId) matches.push(file);\n  }\n  return matches;\n}\n\nasync function readCodexSessionMeta(file: string): Promise<{ sessionId: string; launchCwd: string; branch?: string } | undefined> {\n  const records = await readJsonLines(file, 5);\n  const record = records.find((item) => item.type === \"session_meta\");\n  const payload = objectValue(record?.payload);\n  const sessionId = stringValue(payload?.id);\n  const cwd = stringValue(payload?.cwd);\n  if (!sessionId || !cwd) return undefined;\n  return {\n    sessionId,\n    launchCwd: await realpath(cwd),\n    branch: stringValue(payload?.git_branch ?? payload?.branch),\n  };\n}\n\nasync function assertOwnedRegularFile(file: string, allowedRoot: string): Promise<void> {\n  const absoluteRoot = path.resolve(allowedRoot);\n  const resolved = path.resolve(file);\n  if (resolved !== absoluteRoot && !resolved.startsWith(`${absoluteRoot}${path.sep}`)) throw new Error(\"session file escapes provider root\");\n  const linkStat = await lstat(resolved);\n  if (linkStat.isSymbolicLink() || !linkStat.isFile()) throw new Error(\"session path must be a regular non-symlink file\");\n  if (typeof process.getuid === \"function\" && linkStat.uid !== process.getuid()) throw new Error(\"session file owner mismatch\");\n  const root = await realpath(allowedRoot);\n  const canonical = await realpath(resolved);\n  if (canonical !== root && !canonical.startsWith(`${root}${path.sep}`)) throw new Error(\"session file resolves outside provider root\");\n}\n\nasync function collectFiles(root: string, accept: (name: string) => boolean, maxDepth: number): Promise<string[]> {\n  const files: string[] = [];\n  async function visit(dir: string, depth: number): Promise<void> {\n    if (depth > maxDepth) return;\n    let entries;\n    try {\n      entries = await readdir(dir, { withFileTypes: true });\n    } catch {\n      return;\n    }\n    for (const entry of entries) {\n      const target = path.join(dir, entry.name);\n      if (entry.isDirectory()) await visit(target, depth + 1);\n      else if (entry.isFile() && accept(entry.name)) files.push(target);\n    }\n  }\n  await visit(root, 0);\n  return files;\n}\n\nasync function readJsonLines(file: string, limit = Number.POSITIVE_INFINITY): Promise<Array<Record<string, unknown>>> {\n  const records: Array<Record<string, unknown>> = [];\n  const stream = createReadStream(file, { encoding: \"utf8\" });\n  const lines = readline.createInterface({ input: stream, crlfDelay: Infinity });\n  try {\n    for await (const line of lines) {\n      const trimmed = line.trim();\n      if (!trimmed) continue;\n      try {\n        const value = JSON.parse(trimmed);\n        if (value && typeof value === \"object\" && !Array.isArray(value)) records.push(value as Record<string, unknown>);\n      } catch {\n        continue;\n      }\n      if (records.length >= limit) break;\n    }\n  } finally {\n    lines.close();\n    stream.destroy();\n  }\n  return records;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | undefined {\n  return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n  return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction dateValue(value: unknown): number | undefined {\n  if (typeof value === \"number\" && Number.isFinite(value)) return value;\n  if (typeof value !== \"string\") return undefined;\n  const parsed = Date.parse(value);\n  return Number.isFinite(parsed) ? parsed : undefined;\n}\n"],
  "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmXT;AAEA,SAAS,kBAA0B;AACjC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
  "names": ["exports", "isSeq", "exports", "path", "exports", "exports", "exports", "exports", "res", "exports", "res", "exports", "anchors", "exports", "exports", "node", "exports", "path", "exports", "exports", "i", "end", "exports", "exports", "exports", "exports", "exports", "value", "exports", "exports", "exports", "stringify", "comment", "str", "exports", "exports", "map", "exports", "YAMLSeq", "exports", "YAMLSeq", "seq", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "require_schema", "exports", "exports", "exports", "YAMLSeq", "pairs", "exports", "YAMLSeq", "omap", "require_bool", "exports", "require_float", "exports", "require_int", "exports", "n", "exports", "set", "exports", "res", "require_schema", "exports", "exports", "tags", "exports", "exports", "exports", "Document", "path", "res", "exports", "exports", "exports", "exports", "exports", "exports", "exports", "YAMLSeq", "exports", "exports", "YAMLSeq", "exports", "YAMLSeq", "exports", "value", "end", "exports", "exports", "tag", "exports", "exports", "exports", "Document", "exports", "Document", "exports", "exports", "exports", "path", "exports", "exports", "i", "ch", "exports", "exports", "Parser", "start", "exports", "Document", "lineCounter", "parseDocument", "exports", "Document", "YAMLSeq", "import_node_os", "import_node_crypto", "import_node_fs", "import_node_child_process", "import_node_path", "import_promises", "import_node_http", "import_promises", "import_node_os", "import_node_path", "import_node_readline", "import_node_child_process", "import_node_child_process", "readline", "stringValue", "DEFAULT_TURN_TIMEOUT_MS", "sdkQuery", "stringValue", "emit", "contentBlocks", "readline", "killProcessTree", "import_node_crypto", "DEFAULT_TURN_TIMEOUT_MS", "emit", "completion", "import_node_readline", "DEFAULT_TURN_TIMEOUT_MS", "path", "readline", "killProcessTree", "stringValue", "stableScopeSuffix", "import_promises", "import_node_path", "sessionId", "exported", "path", "import_promises", "import_node_path", "path", "import_promises", "import_node_path", "import_node_crypto", "import_node_fs", "import_promises", "import_node_os", "import_node_path", "import_promises", "import_node_path", "require", "path", "fsConstants", "import_promises", "import_node_path", "import_promises", "import_node_path", "path", "os", "import_promises", "import_node_os", "import_node_path", "path", "os", "pathExists", "path", "import_node_crypto", "import_node_fs", "import_promises", "import_node_path", "path", "pathExists", "nextManifest", "fsConstants", "path", "pathExists", "fsConstants", "heading", "compact", "path", "sha256", "fsConstants", "backupPath", "path", "fsConstants", "sha256", "os", "assert", "path", "path", "os", "import_promises", "import_node_path", "import_promises", "import_node_os", "import_node_path", "path", "os", "sessionPath", "import_node_readline", "index", "readline", "import_node_os", "import_node_path", "open", "os", "path", "defaultOutput", "defaultInput", "path", "stringValue", "import_node_os", "WebSocket", "os", "import_node_child_process", "import_node_crypto", "import_node_fs", "import_promises", "import_node_os", "import_node_path", "stringValue", "stringValue", "import_node_child_process", "import_promises", "import_node_os", "import_node_path", "import_node_util", "import_node_child_process", "import_node_fs", "import_node_os", "import_node_path", "stat", "path", "os", "path", "os", "model", "stripAnsi", "stripAnsi", "import_node_child_process", "import_node_crypto", "import_node_util", "import_promises", "import_node_os", "import_node_path", "path", "os", "stringValue", "import_promises", "import_node_os", "import_node_path", "os", "path", "import_node_path", "import_promises", "path", "import_promises", "import_node_path", "path", "import_node_crypto", "import_node_path", "import_node_url", "import_promises", "import_node_os", "import_node_path", "import_node_url", "import_esbuild", "import_promises", "import_node_child_process", "import_node_os", "import_node_path", "path", "os", "withTimeout", "objectValue", "net", "path", "objectValue", "normalizeTrigger", "commands", "os", "http", "path", "import_node_child_process", "import_node_fs", "import_promises", "import_node_path", "path", "message", "sleep", "missingBusiness", "import_promises", "import_node_path", "workspaceDir", "path", "import_promises", "import_node_os", "import_node_path", "path", "os", "path", "os", "path", "message", "result", "memorySettlement", "memoryStats", "sleep", "stringValue", "payload", "objectValue", "generationId", "snapshotMessage", "workspace", "pathExists", "item", "numberValue", "shellSingleQuote", "shellSingleQuote", "path", "model", "pathExists", "stringValue", "sleep", "import_node_child_process", "import_node_util", "execFileAsync", "optionalRecord", "path", "path", "optionalRecord", "value", "path", "MIN_INTERVAL_MS", "import_node_crypto", "import_promises", "import_node_os", "import_node_path", "import_node_fs", "import_promises", "import_node_os", "import_node_path", "import_node_readline", "os", "path", "stringValue", "objectValue", "readline", "path", "os", "runCommand", "path", "os", "createHttpServer", "httpRequest", "isProcessAlive", "commands", "runCommand", "path", "os", "isProcessAlive", "httpRequest"]
}
