@posthog/agent 2.3.110 → 2.3.116

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../node_modules/ms/index.js","../../../../node_modules/debug/src/common.js","../../../../node_modules/debug/src/browser.js","../../../../node_modules/has-flag/index.js","../../../../node_modules/supports-color/index.js","../../../../node_modules/debug/src/node.js","../../../../node_modules/debug/src/index.js","../../../../node_modules/@kwsites/file-exists/src/index.ts","../../../../node_modules/@kwsites/file-exists/index.ts","../../../../node_modules/@kwsites/promise-deferred/src/index.ts","../../src/server/agent-server.ts","../../package.json","../../src/acp-extensions.ts","../../src/adapters/acp-connection.ts","../../src/gateway-models.ts","../../src/utils/logger.ts","../../src/utils/streams.ts","../../src/adapters/claude/claude-agent.ts","../../src/utils/common.ts","../../src/adapters/base-acp-agent.ts","../../src/adapters/claude/conversion/acp-to-sdk.ts","../../src/adapters/claude/conversion/sdk-to-acp.ts","../../src/utils/acp-content.ts","../../src/adapters/claude/hooks.ts","../../src/adapters/claude/conversion/tool-use-to-acp.ts","../../src/adapters/claude/mcp/tool-metadata.ts","../../src/adapters/claude/plan/utils.ts","../../src/adapters/claude/questions/utils.ts","../../src/execution-mode.ts","../../src/adapters/claude/tools.ts","../../src/adapters/claude/permissions/permission-options.ts","../../src/adapters/claude/permissions/permission-handlers.ts","../../src/adapters/claude/session/commands.ts","../../src/adapters/claude/session/mcp-config.ts","../../src/adapters/claude/session/models.ts","../../src/adapters/claude/session/options.ts","../../src/adapters/claude/session/instructions.ts","../../src/adapters/claude/session/settings.ts","../../src/adapters/codex/spawn.ts","../../src/adapters/claude/session/jsonl-hydration.ts","../../src/utils/gateway.ts","../../src/posthog-api.ts","../../../shared/src/saga.ts","../../../git/src/queries.ts","../../../../node_modules/simple-git/src/lib/args/pathspec.ts","../../../../node_modules/simple-git/src/lib/errors/git-error.ts","../../../../node_modules/simple-git/src/lib/errors/git-response-error.ts","../../../../node_modules/simple-git/src/lib/errors/task-configuration-error.ts","../../../../node_modules/simple-git/src/lib/utils/util.ts","../../../../node_modules/simple-git/src/lib/utils/argument-filters.ts","../../../../node_modules/simple-git/src/lib/utils/exit-codes.ts","../../../../node_modules/simple-git/src/lib/utils/git-output-streams.ts","../../../../node_modules/simple-git/src/lib/utils/line-parser.ts","../../../../node_modules/simple-git/src/lib/utils/simple-git-options.ts","../../../../node_modules/simple-git/src/lib/utils/task-options.ts","../../../../node_modules/simple-git/src/lib/utils/task-parser.ts","../../../../node_modules/simple-git/src/lib/utils/index.ts","../../../../node_modules/simple-git/src/lib/tasks/check-is-repo.ts","../../../../node_modules/simple-git/src/lib/responses/CleanSummary.ts","../../../../node_modules/simple-git/src/lib/tasks/task.ts","../../../../node_modules/simple-git/src/lib/tasks/clean.ts","../../../../node_modules/simple-git/src/lib/responses/ConfigList.ts","../../../../node_modules/simple-git/src/lib/tasks/config.ts","../../../../node_modules/simple-git/src/lib/tasks/diff-name-status.ts","../../../../node_modules/simple-git/src/lib/tasks/grep.ts","../../../../node_modules/simple-git/src/lib/tasks/reset.ts","../../../../node_modules/simple-git/src/lib/git-logger.ts","../../../../node_modules/simple-git/src/lib/runners/tasks-pending-queue.ts","../../../../node_modules/simple-git/src/lib/runners/git-executor-chain.ts","../../../../node_modules/simple-git/src/lib/runners/git-executor.ts","../../../../node_modules/simple-git/src/lib/task-callback.ts","../../../../node_modules/simple-git/src/lib/tasks/change-working-directory.ts","../../../../node_modules/simple-git/src/lib/tasks/checkout.ts","../../../../node_modules/simple-git/src/lib/tasks/count-objects.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-commit.ts","../../../../node_modules/simple-git/src/lib/tasks/commit.ts","../../../../node_modules/simple-git/src/lib/tasks/first-commit.ts","../../../../node_modules/simple-git/src/lib/tasks/hash-object.ts","../../../../node_modules/simple-git/src/lib/responses/InitSummary.ts","../../../../node_modules/simple-git/src/lib/tasks/init.ts","../../../../node_modules/simple-git/src/lib/args/log-format.ts","../../../../node_modules/simple-git/src/lib/responses/DiffSummary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-diff-summary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-list-log-summary.ts","../../../../node_modules/simple-git/src/lib/tasks/diff.ts","../../../../node_modules/simple-git/src/lib/tasks/log.ts","../../../../node_modules/simple-git/src/lib/responses/MergeSummary.ts","../../../../node_modules/simple-git/src/lib/responses/PullSummary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-remote-objects.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-remote-messages.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-pull.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-merge.ts","../../../../node_modules/simple-git/src/lib/tasks/merge.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-push.ts","../../../../node_modules/simple-git/src/lib/tasks/push.ts","../../../../node_modules/simple-git/src/lib/tasks/show.ts","../../../../node_modules/simple-git/src/lib/responses/FileStatusSummary.ts","../../../../node_modules/simple-git/src/lib/responses/StatusSummary.ts","../../../../node_modules/simple-git/src/lib/tasks/status.ts","../../../../node_modules/simple-git/src/lib/tasks/version.ts","../../../../node_modules/simple-git/src/lib/simple-git-api.ts","../../../../node_modules/simple-git/src/lib/runners/scheduler.ts","../../../../node_modules/simple-git/src/lib/tasks/apply-patch.ts","../../../../node_modules/simple-git/src/lib/responses/BranchDeleteSummary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-branch-delete.ts","../../../../node_modules/simple-git/src/lib/responses/BranchSummary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-branch.ts","../../../../node_modules/simple-git/src/lib/tasks/branch.ts","../../../../node_modules/simple-git/src/lib/responses/CheckIgnore.ts","../../../../node_modules/simple-git/src/lib/tasks/check-ignore.ts","../../../../node_modules/simple-git/src/lib/tasks/clone.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-fetch.ts","../../../../node_modules/simple-git/src/lib/tasks/fetch.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-move.ts","../../../../node_modules/simple-git/src/lib/tasks/move.ts","../../../../node_modules/simple-git/src/lib/tasks/pull.ts","../../../../node_modules/simple-git/src/lib/responses/GetRemoteSummary.ts","../../../../node_modules/simple-git/src/lib/tasks/remote.ts","../../../../node_modules/simple-git/src/lib/tasks/stash-list.ts","../../../../node_modules/simple-git/src/lib/tasks/sub-module.ts","../../../../node_modules/simple-git/src/lib/responses/TagList.ts","../../../../node_modules/simple-git/src/lib/tasks/tag.ts","../../../../node_modules/simple-git/src/git.js","../../../../node_modules/simple-git/src/lib/api.ts","../../../../node_modules/simple-git/src/lib/errors/git-construct-error.ts","../../../../node_modules/simple-git/src/lib/errors/git-plugin-error.ts","../../../../node_modules/simple-git/src/lib/plugins/abort-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/completion-detection.plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/custom-binary.plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/error-detection.plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/plugin-store.ts","../../../../node_modules/simple-git/src/lib/plugins/progress-monitor-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/spawn-options-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/timout-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/suffix-paths.plugin.ts","../../../../node_modules/simple-git/src/lib/git-factory.ts","../../../../node_modules/simple-git/src/lib/runners/promise-wrapped.ts","../../../../node_modules/simple-git/src/esm.mjs","../../../git/src/client.ts","../../../git/src/lock-detector.ts","../../../git/src/rw-lock.ts","../../../git/src/operation-manager.ts","../../src/sagas/apply-snapshot-saga.ts","../../../git/src/sagas/tree.ts","../../../git/src/git-saga.ts","../../src/sagas/capture-tree-saga.ts","../../src/tree-tracker.ts","../../src/sagas/resume-saga.ts","../../src/resume.ts","../../src/session-log-writer.ts","../../src/utils/async-mutex.ts","../../src/server/jwt.ts","../../src/server/schemas.ts"],"sourcesContent":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n",null,null,null,"import {\n ClientSideConnection,\n ndJsonStream,\n PROTOCOL_VERSION,\n} from \"@agentclientprotocol/sdk\";\nimport { type ServerType, serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions\";\nimport {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"../adapters/acp-connection\";\nimport { selectRecentTurns } from \"../adapters/claude/session/jsonl-hydration\";\nimport { PostHogAPIClient } from \"../posthog-api\";\nimport {\n type ConversationTurn,\n type ResumeState,\n resumeFromLog,\n} from \"../resume\";\nimport { SessionLogWriter } from \"../session-log-writer\";\nimport { TreeTracker } from \"../tree-tracker\";\nimport type {\n AgentMode,\n DeviceInfo,\n LogLevel,\n TaskRun,\n TreeSnapshotEvent,\n} from \"../types\";\nimport { AsyncMutex } from \"../utils/async-mutex\";\nimport { getLlmGatewayUrl } from \"../utils/gateway\";\nimport { Logger } from \"../utils/logger\";\nimport { type JwtPayload, JwtValidationError, validateJwt } from \"./jwt\";\nimport { jsonRpcRequestSchema, validateCommandParams } from \"./schemas\";\nimport type { AgentServerConfig } from \"./types\";\n\ntype MessageCallback = (message: unknown) => void;\n\nclass NdJsonTap {\n private decoder = new TextDecoder();\n private buffer = \"\";\n\n constructor(private onMessage: MessageCallback) {}\n\n process(chunk: Uint8Array): void {\n this.buffer += this.decoder.decode(chunk, { stream: true });\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n this.onMessage(JSON.parse(line));\n } catch {\n // Not valid JSON, skip\n }\n }\n }\n}\n\nfunction createTappedReadableStream(\n underlying: ReadableStream<Uint8Array>,\n onMessage: MessageCallback,\n logger?: Logger,\n): ReadableStream<Uint8Array> {\n const reader = underlying.getReader();\n const tap = new NdJsonTap(onMessage);\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { value, done } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n tap.process(value);\n controller.enqueue(value);\n } catch (error) {\n logger?.debug(\"Read failed, closing stream\", error);\n controller.close();\n }\n },\n cancel() {\n reader.releaseLock();\n },\n });\n}\n\nfunction createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n onMessage: MessageCallback,\n logger?: Logger,\n): WritableStream<Uint8Array> {\n const tap = new NdJsonTap(onMessage);\n const mutex = new AsyncMutex();\n\n return new WritableStream<Uint8Array>({\n async write(chunk) {\n tap.process(chunk);\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Write failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n async close() {\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Close failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n async abort(reason) {\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Abort failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n });\n}\n\ninterface SseController {\n send: (data: unknown) => void;\n close: () => void;\n}\n\ninterface ActiveSession {\n payload: JwtPayload;\n acpSessionId: string;\n acpConnection: InProcessAcpConnection;\n clientConnection: ClientSideConnection;\n treeTracker: TreeTracker | null;\n sseController: SseController | null;\n deviceInfo: DeviceInfo;\n logWriter: SessionLogWriter;\n}\n\nexport class AgentServer {\n private config: AgentServerConfig;\n private logger: Logger;\n private server: ServerType | null = null;\n private session: ActiveSession | null = null;\n private app: Hono;\n private posthogAPI: PostHogAPIClient;\n private questionRelayedToSlack = false;\n private detectedPrUrl: string | null = null;\n private resumeState: ResumeState | null = null;\n // Guards against concurrent session initialization. autoInitializeSession() and\n // the GET /events SSE handler can both call initializeSession() — the SSE connection\n // often arrives while newSession() is still awaited (this.session is still null),\n // causing a second session to be created and duplicate Slack messages to be sent.\n private initializationPromise: Promise<void> | null = null;\n private pendingEvents: Record<string, unknown>[] = [];\n\n private emitConsoleLog = (\n level: LogLevel,\n _scope: string,\n message: string,\n data?: unknown,\n ): void => {\n if (!this.session) return;\n\n const formatted =\n data !== undefined ? `${message} ${JSON.stringify(data)}` : message;\n\n const notification = {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.CONSOLE,\n params: { level, message: formatted },\n };\n\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification,\n });\n\n this.session.logWriter.appendRawLine(\n this.session.payload.run_id,\n JSON.stringify(notification),\n );\n };\n\n constructor(config: AgentServerConfig) {\n this.config = config;\n this.logger = new Logger({ debug: true, prefix: \"[AgentServer]\" });\n this.posthogAPI = new PostHogAPIClient({\n apiUrl: config.apiUrl,\n projectId: config.projectId,\n getApiKey: () => config.apiKey,\n userAgent: `posthog/cloud.hog.dev; version: ${config.version ?? packageJson.version}`,\n });\n this.app = this.createApp();\n }\n\n private getEffectiveMode(payload: JwtPayload): AgentMode {\n return payload.mode ?? this.config.mode;\n }\n\n private createApp(): Hono {\n const app = new Hono();\n\n app.get(\"/health\", (c) => {\n return c.json({ status: \"ok\", hasSession: !!this.session });\n });\n\n app.get(\"/events\", async (c) => {\n let payload: JwtPayload;\n\n try {\n payload = this.authenticateRequest(c.req.header.bind(c.req));\n } catch (error) {\n return c.json(\n {\n error:\n error instanceof JwtValidationError\n ? error.message\n : \"Invalid token\",\n code:\n error instanceof JwtValidationError\n ? error.code\n : \"invalid_token\",\n },\n 401,\n );\n }\n\n const stream = new ReadableStream({\n start: async (controller) => {\n const sseController: SseController = {\n send: (data: unknown) => {\n try {\n controller.enqueue(\n new TextEncoder().encode(`data: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch (error) {\n this.logger.debug(\n \"SSE send failed (stream may be closed)\",\n error,\n );\n }\n },\n close: () => {\n try {\n controller.close();\n } catch (error) {\n this.logger.debug(\"SSE close failed (already closed)\", error);\n }\n },\n };\n\n if (!this.session || this.session.payload.run_id !== payload.run_id) {\n await this.initializeSession(payload, sseController);\n } else {\n this.session.sseController = sseController;\n this.replayPendingEvents();\n }\n\n this.sendSseEvent(sseController, {\n type: \"connected\",\n run_id: payload.run_id,\n });\n },\n cancel: () => {\n this.logger.info(\"SSE connection closed\");\n if (this.session?.sseController) {\n this.session.sseController = null;\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n });\n\n app.post(\"/command\", async (c) => {\n let payload: JwtPayload;\n\n try {\n payload = this.authenticateRequest(c.req.header.bind(c.req));\n } catch (error) {\n return c.json(\n {\n error:\n error instanceof JwtValidationError\n ? error.message\n : \"Invalid token\",\n },\n 401,\n );\n }\n\n if (!this.session || this.session.payload.run_id !== payload.run_id) {\n return c.json({ error: \"No active session for this run\" }, 400);\n }\n\n const rawBody = await c.req.json().catch(() => null);\n const parseResult = jsonRpcRequestSchema.safeParse(rawBody);\n\n if (!parseResult.success) {\n return c.json({ error: \"Invalid JSON-RPC request\" }, 400);\n }\n\n const command = parseResult.data;\n const paramsValidation = validateCommandParams(\n command.method,\n command.params ?? {},\n );\n\n if (!paramsValidation.success) {\n return c.json(\n {\n jsonrpc: \"2.0\",\n id: command.id,\n error: {\n code: -32602,\n message: paramsValidation.error,\n },\n },\n 200,\n );\n }\n\n try {\n const result = await this.executeCommand(\n command.method,\n (command.params as Record<string, unknown>) || {},\n );\n return c.json({\n jsonrpc: \"2.0\",\n id: command.id,\n result,\n });\n } catch (error) {\n return c.json({\n jsonrpc: \"2.0\",\n id: command.id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : \"Unknown error\",\n },\n });\n }\n });\n\n app.notFound((c) => {\n return c.json({ error: \"Not found\" }, 404);\n });\n\n return app;\n }\n\n async start(): Promise<void> {\n await new Promise<void>((resolve) => {\n this.server = serve(\n {\n fetch: this.app.fetch,\n port: this.config.port,\n },\n () => {\n this.logger.info(`HTTP server listening on port ${this.config.port}`);\n resolve();\n },\n );\n });\n\n await this.autoInitializeSession();\n }\n\n private async autoInitializeSession(): Promise<void> {\n const { taskId, runId, mode, projectId } = this.config;\n\n this.logger.info(\"Auto-initializing session\", { taskId, runId, mode });\n\n // Check if this is a resume from a previous run\n const resumeRunId = process.env.POSTHOG_RESUME_RUN_ID;\n if (resumeRunId) {\n this.logger.info(\"Resuming from previous run\", {\n resumeRunId,\n currentRunId: runId,\n });\n try {\n this.resumeState = await resumeFromLog({\n taskId,\n runId: resumeRunId,\n repositoryPath: this.config.repositoryPath,\n apiClient: this.posthogAPI,\n logger: new Logger({ debug: true, prefix: \"[Resume]\" }),\n });\n this.logger.info(\"Resume state loaded\", {\n conversationTurns: this.resumeState.conversation.length,\n snapshotApplied: this.resumeState.snapshotApplied,\n logEntries: this.resumeState.logEntryCount,\n });\n } catch (error) {\n this.logger.warn(\"Failed to load resume state, starting fresh\", {\n error,\n });\n this.resumeState = null;\n }\n }\n\n // Create a synthetic payload from config (no JWT needed for auto-init)\n const payload: JwtPayload = {\n task_id: taskId,\n run_id: runId,\n team_id: projectId,\n user_id: 0, // System-initiated\n distinct_id: \"agent-server\",\n mode,\n };\n\n await this.initializeSession(payload, null);\n }\n\n async stop(): Promise<void> {\n this.logger.info(\"Stopping agent server...\");\n\n if (this.session) {\n await this.cleanupSession();\n }\n\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n\n this.logger.info(\"Agent server stopped\");\n }\n\n private authenticateRequest(\n getHeader: (name: string) => string | undefined,\n ): JwtPayload {\n // Always require JWT validation - never trust unverified headers\n if (!this.config.jwtPublicKey) {\n throw new JwtValidationError(\n \"Server not configured with JWT public key\",\n \"server_error\",\n );\n }\n\n const authHeader = getHeader(\"authorization\");\n if (!authHeader?.startsWith(\"Bearer \")) {\n throw new JwtValidationError(\n \"Missing authorization header\",\n \"invalid_token\",\n );\n }\n\n const token = authHeader.slice(7);\n return validateJwt(token, this.config.jwtPublicKey);\n }\n\n private async executeCommand(\n method: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n if (!this.session) {\n throw new Error(\"No active session\");\n }\n\n switch (method) {\n case POSTHOG_NOTIFICATIONS.USER_MESSAGE:\n case \"user_message\": {\n const content = params.content as string;\n\n this.logger.info(\n `Processing user message (detectedPrUrl=${this.detectedPrUrl ?? \"none\"}): ${content.substring(0, 100)}...`,\n );\n\n this.session.logWriter.resetTurnMessages(this.session.payload.run_id);\n\n const result = await this.session.clientConnection.prompt({\n sessionId: this.session.acpSessionId,\n prompt: [{ type: \"text\", text: content }],\n ...(this.detectedPrUrl && {\n _meta: {\n prContext:\n `IMPORTANT — OVERRIDE PREVIOUS INSTRUCTIONS ABOUT CREATING BRANCHES/PRs.\\n` +\n `You already have an open pull request: ${this.detectedPrUrl}\\n` +\n `You MUST:\\n` +\n `1. Check out the existing PR branch with \\`gh pr checkout ${this.detectedPrUrl}\\`\\n` +\n `2. Make changes, commit, and push to that branch\\n` +\n `You MUST NOT create a new branch, close the existing PR, or create a new PR.`,\n },\n }),\n });\n\n this.broadcastTurnComplete(result.stopReason);\n\n if (result.stopReason === \"end_turn\") {\n // Relay the response to Slack. For follow-ups this is the primary\n // delivery path — the HTTP caller only handles reactions.\n this.relayAgentResponse(this.session.payload).catch((err) =>\n this.logger.warn(\"Failed to relay follow-up response\", err),\n );\n }\n\n // Flush logs and include the assistant's response text so callers\n // (e.g. Slack follow-up forwarding) can extract it without racing\n // against async log persistence to object storage.\n let assistantMessage: string | undefined;\n try {\n await this.session.logWriter.flush(this.session.payload.run_id);\n assistantMessage = this.session.logWriter.getFullAgentResponse(\n this.session.payload.run_id,\n );\n } catch {\n this.logger.warn(\"Failed to extract assistant message from logs\");\n }\n\n return {\n stopReason: result.stopReason,\n ...(assistantMessage && { assistant_message: assistantMessage }),\n };\n }\n\n case POSTHOG_NOTIFICATIONS.CANCEL:\n case \"cancel\": {\n this.logger.info(\"Cancel requested\", {\n acpSessionId: this.session.acpSessionId,\n });\n await this.session.clientConnection.cancel({\n sessionId: this.session.acpSessionId,\n });\n return { cancelled: true };\n }\n\n case POSTHOG_NOTIFICATIONS.CLOSE:\n case \"close\": {\n this.logger.info(\"Close requested\");\n await this.cleanupSession();\n return { closed: true };\n }\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n }\n\n private async initializeSession(\n payload: JwtPayload,\n sseController: SseController | null,\n ): Promise<void> {\n // Race condition guard: autoInitializeSession() starts first, but while it awaits\n // newSession() (which takes ~1-2s for MCP metadata fetch), the Temporal relay connects\n // to GET /events. That handler sees this.session === null and calls initializeSession()\n // again, creating a duplicate session that sends the same prompt twice — resulting in\n // duplicate Slack messages. This lock ensures the second caller waits for the first\n // initialization to finish and reuses the session.\n if (this.initializationPromise) {\n this.logger.info(\"Waiting for in-progress initialization\", {\n runId: payload.run_id,\n });\n await this.initializationPromise;\n // After waiting, just attach the SSE controller if needed\n if (this.session && sseController) {\n this.session.sseController = sseController;\n this.replayPendingEvents();\n }\n return;\n }\n\n this.initializationPromise = this._doInitializeSession(\n payload,\n sseController,\n );\n try {\n await this.initializationPromise;\n } finally {\n this.initializationPromise = null;\n }\n }\n\n private async _doInitializeSession(\n payload: JwtPayload,\n sseController: SseController | null,\n ): Promise<void> {\n if (this.session) {\n await this.cleanupSession();\n }\n\n this.logger.info(\"Initializing session\", {\n runId: payload.run_id,\n taskId: payload.task_id,\n });\n\n const deviceInfo: DeviceInfo = {\n type: \"cloud\",\n name: process.env.HOSTNAME || \"cloud-sandbox\",\n };\n\n this.configureEnvironment();\n\n const posthogAPI = new PostHogAPIClient({\n apiUrl: this.config.apiUrl,\n projectId: this.config.projectId,\n getApiKey: () => this.config.apiKey,\n userAgent: `posthog/cloud.hog.dev; version: ${this.config.version ?? packageJson.version}`,\n });\n\n const treeTracker = this.config.repositoryPath\n ? new TreeTracker({\n repositoryPath: this.config.repositoryPath,\n taskId: payload.task_id,\n runId: payload.run_id,\n apiClient: posthogAPI,\n logger: new Logger({ debug: true, prefix: \"[TreeTracker]\" }),\n })\n : null;\n\n const logWriter = new SessionLogWriter({\n posthogAPI,\n logger: new Logger({ debug: true, prefix: \"[SessionLogWriter]\" }),\n });\n\n const acpConnection = createAcpConnection({\n taskRunId: payload.run_id,\n taskId: payload.task_id,\n deviceType: deviceInfo.type,\n logWriter,\n });\n\n // Tap both streams to broadcast all ACP messages via SSE (mimics local transport)\n const onAcpMessage = (message: unknown) => {\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification: message,\n });\n };\n\n const tappedReadable = createTappedReadableStream(\n acpConnection.clientStreams.readable as ReadableStream<Uint8Array>,\n onAcpMessage,\n this.logger,\n );\n\n const tappedWritable = createTappedWritableStream(\n acpConnection.clientStreams.writable as WritableStream<Uint8Array>,\n onAcpMessage,\n this.logger,\n );\n\n const clientStream = ndJsonStream(tappedWritable, tappedReadable);\n\n const clientConnection = new ClientSideConnection(\n () => this.createCloudClient(payload),\n clientStream,\n );\n\n await clientConnection.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {},\n });\n\n let preTaskRun: TaskRun | null = null;\n try {\n preTaskRun = await this.posthogAPI.getTaskRun(\n payload.task_id,\n payload.run_id,\n );\n } catch {\n this.logger.warn(\"Failed to fetch task run for session context\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n });\n }\n\n const prUrl =\n typeof (preTaskRun?.state as Record<string, unknown>)\n ?.slack_notified_pr_url === \"string\"\n ? ((preTaskRun?.state as Record<string, unknown>)\n .slack_notified_pr_url as string)\n : null;\n\n if (prUrl) {\n this.detectedPrUrl = prUrl;\n }\n\n const sessionResponse = await clientConnection.newSession({\n cwd: this.config.repositoryPath ?? \"/tmp/workspace\",\n mcpServers: this.config.mcpServers ?? [],\n _meta: {\n sessionId: payload.run_id,\n taskRunId: payload.run_id,\n systemPrompt: this.buildSessionSystemPrompt(prUrl),\n allowedDomains: this.config.allowedDomains,\n ...(this.config.claudeCode?.plugins?.length && {\n claudeCode: {\n options: {\n plugins: this.config.claudeCode.plugins,\n },\n },\n }),\n },\n });\n\n const acpSessionId = sessionResponse.sessionId;\n this.logger.info(\"ACP session created\", {\n acpSessionId,\n runId: payload.run_id,\n });\n\n this.session = {\n payload,\n acpSessionId,\n acpConnection,\n clientConnection,\n treeTracker,\n sseController,\n deviceInfo,\n logWriter,\n };\n\n this.logger = new Logger({\n debug: true,\n prefix: \"[AgentServer]\",\n onLog: (level, scope, message, data) => {\n // Preserve console output (onLog suppresses default console.*)\n const _formatted =\n data !== undefined ? `${message} ${JSON.stringify(data)}` : message;\n this.emitConsoleLog(level, scope, message, data);\n },\n });\n\n this.logger.info(\"Session initialized successfully\");\n\n // Signal in_progress so the UI can start polling for updates\n this.posthogAPI\n .updateTaskRun(payload.task_id, payload.run_id, {\n status: \"in_progress\",\n })\n .catch((err) =>\n this.logger.warn(\"Failed to set task run to in_progress\", err),\n );\n\n await this.sendInitialTaskMessage(payload, preTaskRun);\n }\n\n private async sendInitialTaskMessage(\n payload: JwtPayload,\n prefetchedRun?: TaskRun | null,\n ): Promise<void> {\n if (!this.session) return;\n\n // Fetch TaskRun early — needed for both resume detection and initial prompt\n let taskRun = prefetchedRun ?? null;\n if (!taskRun) {\n try {\n taskRun = await this.posthogAPI.getTaskRun(\n payload.task_id,\n payload.run_id,\n );\n } catch (error) {\n this.logger.warn(\"Failed to fetch task run\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n error,\n });\n }\n }\n\n // Check for resume if not already loaded from env var in autoInitializeSession\n if (!this.resumeState) {\n const resumeRunId = this.getResumeRunId(taskRun);\n if (resumeRunId) {\n this.logger.info(\"Resuming from previous run (via TaskRun state)\", {\n resumeRunId,\n currentRunId: payload.run_id,\n });\n try {\n this.resumeState = await resumeFromLog({\n taskId: payload.task_id,\n runId: resumeRunId,\n repositoryPath: this.config.repositoryPath,\n apiClient: this.posthogAPI,\n logger: new Logger({ debug: true, prefix: \"[Resume]\" }),\n });\n this.logger.info(\"Resume state loaded (via TaskRun state)\", {\n conversationTurns: this.resumeState.conversation.length,\n snapshotApplied: this.resumeState.snapshotApplied,\n logEntries: this.resumeState.logEntryCount,\n });\n } catch (error) {\n this.logger.warn(\"Failed to load resume state, starting fresh\", {\n error,\n });\n this.resumeState = null;\n }\n }\n }\n\n // Resume flow: if we have resume state, format conversation history as context\n if (this.resumeState && this.resumeState.conversation.length > 0) {\n await this.sendResumeMessage(payload, taskRun);\n return;\n }\n\n try {\n const task = await this.posthogAPI.getTask(payload.task_id);\n\n const initialPromptOverride = taskRun\n ? this.getInitialPromptOverride(taskRun)\n : null;\n const initialPrompt = initialPromptOverride ?? task.description;\n\n if (!initialPrompt) {\n this.logger.warn(\"Task has no description, skipping initial message\");\n return;\n }\n\n this.logger.info(\"Sending initial task message\", {\n taskId: payload.task_id,\n descriptionLength: initialPrompt.length,\n usedInitialPromptOverride: !!initialPromptOverride,\n });\n\n this.session.logWriter.resetTurnMessages(payload.run_id);\n\n const result = await this.session.clientConnection.prompt({\n sessionId: this.session.acpSessionId,\n prompt: [{ type: \"text\", text: initialPrompt }],\n });\n\n this.logger.info(\"Initial task message completed\", {\n stopReason: result.stopReason,\n });\n\n this.broadcastTurnComplete(result.stopReason);\n\n if (result.stopReason === \"end_turn\") {\n await this.relayAgentResponse(payload);\n }\n } catch (error) {\n this.logger.error(\"Failed to send initial task message\", error);\n if (this.session) {\n await this.session.logWriter.flushAll();\n }\n await this.signalTaskComplete(payload, \"error\");\n }\n }\n\n private async sendResumeMessage(\n payload: JwtPayload,\n taskRun: TaskRun | null,\n ): Promise<void> {\n if (!this.session || !this.resumeState) return;\n\n try {\n const conversationSummary = this.formatConversationForResume(\n this.resumeState.conversation,\n );\n\n // Read the pending user message from TaskRun state (set by the workflow\n // when the user sends a follow-up message that triggers a resume).\n const pendingUserMessage = this.getPendingUserMessage(taskRun);\n\n const sandboxContext = this.resumeState.snapshotApplied\n ? `The workspace environment (all files, packages, and code changes) has been fully restored from where you left off.`\n : `The workspace files from the previous session were not restored (the file snapshot may have expired), so you are starting with a fresh environment. Your conversation history is fully preserved below.`;\n\n let resumePrompt: string;\n if (pendingUserMessage) {\n // Include the pending message as the user's new question so the agent\n // responds to it directly instead of the generic resume context.\n resumePrompt =\n `You are resuming a previous conversation. ${sandboxContext}\\n\\n` +\n `Here is the conversation history from the previous session:\\n\\n` +\n `${conversationSummary}\\n\\n` +\n `The user has sent a new message:\\n\\n` +\n `${pendingUserMessage}\\n\\n` +\n `Respond to the user's new message above. You have full context from the previous session.`;\n } else {\n resumePrompt =\n `You are resuming a previous conversation. ${sandboxContext}\\n\\n` +\n `Here is the conversation history from the previous session:\\n\\n` +\n `${conversationSummary}\\n\\n` +\n `Continue from where you left off. The user is waiting for your response.`;\n }\n\n this.logger.info(\"Sending resume message\", {\n taskId: payload.task_id,\n conversationTurns: this.resumeState.conversation.length,\n promptLength: resumePrompt.length,\n hasPendingUserMessage: !!pendingUserMessage,\n snapshotApplied: this.resumeState.snapshotApplied,\n });\n\n // Clear resume state so it's not reused\n this.resumeState = null;\n\n this.session.logWriter.resetTurnMessages(payload.run_id);\n\n const result = await this.session.clientConnection.prompt({\n sessionId: this.session.acpSessionId,\n prompt: [{ type: \"text\", text: resumePrompt }],\n });\n\n this.logger.info(\"Resume message completed\", {\n stopReason: result.stopReason,\n });\n\n this.broadcastTurnComplete(result.stopReason);\n\n if (result.stopReason === \"end_turn\") {\n await this.relayAgentResponse(payload);\n }\n } catch (error) {\n this.logger.error(\"Failed to send resume message\", error);\n if (this.session) {\n await this.session.logWriter.flushAll();\n }\n await this.signalTaskComplete(payload, \"error\");\n }\n }\n\n private static RESUME_HISTORY_TOKEN_BUDGET = 50_000;\n private static TOOL_RESULT_MAX_CHARS = 2000;\n\n private formatConversationForResume(\n conversation: ConversationTurn[],\n ): string {\n const selected = selectRecentTurns(\n conversation,\n AgentServer.RESUME_HISTORY_TOKEN_BUDGET,\n );\n const parts: string[] = [];\n\n if (selected.length < conversation.length) {\n parts.push(\n `*(${conversation.length - selected.length} earlier turns omitted)*`,\n );\n }\n\n for (const turn of selected) {\n const role = turn.role === \"user\" ? \"User\" : \"Assistant\";\n\n const textParts = turn.content\n .filter((block) => block.type === \"text\")\n .map((block) => (block as { type: \"text\"; text: string }).text);\n\n if (textParts.length > 0) {\n parts.push(`**${role}**: ${textParts.join(\"\\n\")}`);\n }\n\n if (turn.toolCalls?.length) {\n const toolSummary = turn.toolCalls\n .map((tc) => {\n let resultStr = \"\";\n if (tc.result !== undefined) {\n const raw =\n typeof tc.result === \"string\"\n ? tc.result\n : JSON.stringify(tc.result);\n resultStr =\n raw.length > AgentServer.TOOL_RESULT_MAX_CHARS\n ? ` → ${raw.substring(0, AgentServer.TOOL_RESULT_MAX_CHARS)}...(truncated)`\n : ` → ${raw}`;\n }\n return ` - ${tc.toolName}${resultStr}`;\n })\n .join(\"\\n\");\n parts.push(`**${role} (tools)**:\\n${toolSummary}`);\n }\n }\n\n return parts.join(\"\\n\\n\");\n }\n\n private getInitialPromptOverride(taskRun: TaskRun): string | null {\n const state = taskRun.state as Record<string, unknown> | undefined;\n const override = state?.initial_prompt_override;\n if (typeof override !== \"string\") {\n return null;\n }\n\n const trimmed = override.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n private getPendingUserMessage(taskRun: TaskRun | null): string | null {\n if (!taskRun) return null;\n const state = taskRun.state as Record<string, unknown> | undefined;\n const message = state?.pending_user_message;\n if (typeof message !== \"string\") {\n return null;\n }\n\n const trimmed = message.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n private getResumeRunId(taskRun: TaskRun | null): string | null {\n // Env var takes precedence (set by backend infra)\n const envRunId = process.env.POSTHOG_RESUME_RUN_ID;\n if (envRunId) return envRunId;\n\n // Fallback: read from TaskRun state (set by API when creating the run)\n if (!taskRun) return null;\n const state = taskRun.state as Record<string, unknown> | undefined;\n const stateRunId = state?.resume_from_run_id;\n return typeof stateRunId === \"string\" && stateRunId.trim().length > 0\n ? stateRunId.trim()\n : null;\n }\n\n private buildSessionSystemPrompt(\n prUrl?: string | null,\n ): string | { append: string } {\n const cloudAppend = this.buildCloudSystemPrompt(prUrl);\n const userPrompt = this.config.claudeCode?.systemPrompt;\n\n // String override: combine user prompt with cloud instructions\n if (typeof userPrompt === \"string\") {\n return [userPrompt, cloudAppend].join(\"\\n\\n\");\n }\n\n // Preset with append: merge user append with cloud instructions\n if (typeof userPrompt === \"object\") {\n return {\n append: [userPrompt.append, cloudAppend].filter(Boolean).join(\"\\n\\n\"),\n };\n }\n\n // Default: just cloud instructions\n return { append: cloudAppend };\n }\n\n private buildCloudSystemPrompt(prUrl?: string | null): string {\n if (prUrl) {\n return `\n# Cloud Task Execution\n\nThis task already has an open pull request: ${prUrl}\n\nAfter completing the requested changes:\n1. Check out the existing PR branch with \\`gh pr checkout ${prUrl}\\`\n2. Stage and commit all changes with a clear commit message\n3. Push to the existing PR branch\n\nImportant:\n- Do NOT create a new branch or a new pull request.\n- Do NOT add \"Co-Authored-By\" trailers to commit messages.\n- Do NOT add \"Generated with [Claude Code]\" or similar attribution lines to PR descriptions.\n`;\n }\n\n if (!this.config.repositoryPath) {\n return `\n# Cloud Task Execution — No Repository Mode\n\nYou are a helpful assistant with access to PostHog via MCP tools. You can help with both code tasks and data/analytics questions.\n\nWhen the user asks about analytics, data, metrics, events, funnels, dashboards, feature flags, experiments, or anything PostHog-related:\n- Use your PostHog MCP tools to query data, search insights, and provide real answers\n- Do NOT tell the user to check an external analytics platform — you ARE the analytics platform\n- Use tools like insight-query, query-run, event-definitions-list, and others to answer questions directly\n\nWhen the user asks for code changes or software engineering tasks:\n- Let them know you can help but don't have a repository connected for this session\n- Offer to write code snippets, scripts, or provide guidance\n\nImportant:\n- Do NOT create branches, commits, or pull requests in this mode.\n- Prefer using MCP tools to answer questions with real data over giving generic advice.\n`;\n }\n\n return `\n# Cloud Task Execution\n\nAfter completing the requested changes:\n1. Create a new branch with a descriptive name based on the work done\n2. Stage and commit all changes with a clear commit message\n3. Push the branch to origin\n4. Create a draft pull request using \\`gh pr create --draft${this.config.baseBranch ? ` --base ${this.config.baseBranch}` : \"\"}\\` with a descriptive title and body\n\nImportant:\n- Always create the PR as a draft. Do not ask for confirmation.\n- Do NOT add \"Co-Authored-By\" trailers to commit messages.\n- Do NOT add \"Generated with [Claude Code]\" or similar attribution lines to PR descriptions.\n`;\n }\n\n private async signalTaskComplete(\n payload: JwtPayload,\n stopReason: string,\n ): Promise<void> {\n if (this.session?.payload.run_id === payload.run_id) {\n try {\n await this.session.logWriter.flush(payload.run_id);\n } catch (error) {\n this.logger.warn(\"Failed to flush session logs before completion\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n error,\n });\n }\n }\n\n if (stopReason !== \"error\") {\n this.logger.info(\"Skipping status update for non-error stop reason\", {\n stopReason,\n });\n return;\n }\n\n const status = \"failed\";\n\n try {\n await this.posthogAPI.updateTaskRun(payload.task_id, payload.run_id, {\n status,\n error_message: stopReason === \"error\" ? \"Agent error\" : undefined,\n });\n this.logger.info(\"Task completion signaled\", { status, stopReason });\n } catch (error) {\n this.logger.error(\"Failed to signal task completion\", error);\n }\n }\n\n private configureEnvironment(): void {\n const { apiKey, apiUrl, projectId } = this.config;\n const product =\n this.config.mode === \"background\" ? \"background_agents\" : \"posthog_code\";\n const gatewayUrl =\n process.env.LLM_GATEWAY_URL || getLlmGatewayUrl(apiUrl, product);\n const openaiBaseUrl = gatewayUrl.endsWith(\"/v1\")\n ? gatewayUrl\n : `${gatewayUrl}/v1`;\n\n Object.assign(process.env, {\n // PostHog\n POSTHOG_API_KEY: apiKey,\n POSTHOG_API_URL: apiUrl,\n POSTHOG_API_HOST: apiUrl,\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n POSTHOG_PROJECT_ID: String(projectId),\n // Anthropic\n ANTHROPIC_API_KEY: apiKey,\n ANTHROPIC_AUTH_TOKEN: apiKey,\n ANTHROPIC_BASE_URL: gatewayUrl,\n // OpenAI (for models like GPT-4, o1, etc.)\n OPENAI_API_KEY: apiKey,\n OPENAI_BASE_URL: openaiBaseUrl,\n // Generic gateway\n LLM_GATEWAY_URL: gatewayUrl,\n });\n }\n\n private createCloudClient(payload: JwtPayload) {\n const mode = this.getEffectiveMode(payload);\n const interactionOrigin =\n process.env.CODE_INTERACTION_ORIGIN ??\n process.env.TWIG_INTERACTION_ORIGIN;\n\n return {\n requestPermission: async (params: {\n options: Array<{ kind: string; optionId: string; name?: string }>;\n toolCall?: {\n _meta?: Record<string, unknown> | null;\n };\n }) => {\n // Background mode: always auto-approve permissions\n // Interactive mode: also auto-approve for now (user can monitor via SSE)\n // Future: interactive mode could pause and wait for user approval via SSE\n this.logger.debug(\"Permission request\", {\n mode,\n interactionOrigin,\n options: params.options,\n });\n\n const allowOption = params.options.find(\n (o) => o.kind === \"allow_once\" || o.kind === \"allow_always\",\n );\n const selectedOptionId =\n allowOption?.optionId ?? params.options[0].optionId;\n\n if (interactionOrigin === \"slack\") {\n const codeToolKind = params.toolCall?._meta?.codeToolKind;\n if (codeToolKind === \"question\") {\n this.relaySlackQuestion(payload, params.toolCall?._meta);\n return {\n outcome: { outcome: \"cancelled\" as const },\n _meta: {\n message:\n \"This question has been relayed to the Slack thread where this task originated. \" +\n \"The user will reply there. Do NOT re-ask the question or pick an answer yourself. \" +\n \"Simply let the user know you are waiting for their reply.\",\n },\n };\n }\n }\n\n return {\n outcome: {\n outcome: \"selected\" as const,\n optionId: selectedOptionId,\n },\n };\n },\n extNotification: async (\n method: string,\n params: Record<string, unknown>,\n ) => {\n this.logger.debug(\"Extension notification\", { method, params });\n },\n sessionUpdate: async (params: {\n sessionId: string;\n update?: Record<string, unknown>;\n }) => {\n // session/update notifications flow through the tapped stream (like local transport)\n // Only handle tree state capture for file changes here\n if (params.update?.sessionUpdate === \"tool_call_update\") {\n const meta = (params.update?._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n const toolName = meta?.toolName as string | undefined;\n const toolResponse = meta?.toolResponse as\n | Record<string, unknown>\n | undefined;\n\n if (\n (toolName === \"Write\" || toolName === \"Edit\") &&\n toolResponse?.filePath\n ) {\n await this.captureTreeState();\n }\n\n if (\n toolName &&\n (toolName.includes(\"Bash\") || toolName.includes(\"bash\"))\n ) {\n this.detectAndAttachPrUrl(payload, params.update);\n }\n }\n },\n };\n }\n\n private async relayAgentResponse(payload: JwtPayload): Promise<void> {\n if (!this.session) {\n return;\n }\n\n if (this.questionRelayedToSlack) {\n this.questionRelayedToSlack = false;\n return;\n }\n\n try {\n await this.session.logWriter.flush(payload.run_id);\n } catch (error) {\n this.logger.warn(\"Failed to flush logs before Slack relay\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n error,\n });\n }\n\n const message = this.session.logWriter.getFullAgentResponse(payload.run_id);\n if (!message) {\n this.logger.warn(\"No agent message found for Slack relay\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n sessionRegistered: this.session.logWriter.isRegistered(payload.run_id),\n });\n return;\n }\n\n try {\n await this.posthogAPI.relayMessage(\n payload.task_id,\n payload.run_id,\n message,\n );\n } catch (error) {\n this.logger.warn(\"Failed to relay initial agent response to Slack\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n error,\n });\n }\n }\n\n private relaySlackQuestion(\n payload: JwtPayload,\n toolMeta: Record<string, unknown> | null | undefined,\n ): void {\n const firstQuestion = this.getFirstQuestionMeta(toolMeta);\n if (!this.isQuestionMeta(firstQuestion)) {\n return;\n }\n\n let message = `*${firstQuestion.question}*\\n\\n`;\n if (firstQuestion.options?.length) {\n firstQuestion.options.forEach(\n (opt: { label: string; description?: string }, i: number) => {\n message += `${i + 1}. *${opt.label}*`;\n if (opt.description) message += ` — ${opt.description}`;\n message += \"\\n\";\n },\n );\n }\n message += \"\\nReply in this thread with your choice.\";\n\n this.questionRelayedToSlack = true;\n this.posthogAPI\n .relayMessage(payload.task_id, payload.run_id, message)\n .catch((err) =>\n this.logger.warn(\"Failed to relay question to Slack\", { err }),\n );\n }\n\n private getFirstQuestionMeta(\n toolMeta: Record<string, unknown> | null | undefined,\n ): unknown {\n if (!toolMeta) {\n return null;\n }\n\n const questionsValue = toolMeta.questions;\n if (!Array.isArray(questionsValue) || questionsValue.length === 0) {\n return null;\n }\n\n return questionsValue[0];\n }\n\n private isQuestionMeta(value: unknown): value is {\n question: string;\n options?: Array<{ label: string; description?: string }>;\n } {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as {\n question?: unknown;\n options?: unknown;\n };\n\n if (typeof candidate.question !== \"string\") {\n return false;\n }\n\n if (candidate.options === undefined) {\n return true;\n }\n\n if (!Array.isArray(candidate.options)) {\n return false;\n }\n\n return candidate.options.every(\n (option) =>\n !!option &&\n typeof option === \"object\" &&\n typeof (option as { label?: unknown }).label === \"string\",\n );\n }\n\n private detectAndAttachPrUrl(\n payload: JwtPayload,\n update: Record<string, unknown>,\n ): void {\n try {\n const meta = (update?._meta as Record<string, unknown>)?.claudeCode as\n | Record<string, unknown>\n | undefined;\n const toolResponse = meta?.toolResponse;\n\n // Extract text content from tool response\n let textToSearch = \"\";\n\n if (toolResponse) {\n if (typeof toolResponse === \"string\") {\n textToSearch = toolResponse;\n } else if (typeof toolResponse === \"object\" && toolResponse !== null) {\n const respObj = toolResponse as Record<string, unknown>;\n textToSearch =\n String(respObj.stdout || \"\") + String(respObj.stderr || \"\");\n if (!textToSearch && respObj.output) {\n textToSearch = String(respObj.output);\n }\n }\n }\n\n // Also check content array\n const content = update?.content;\n if (Array.isArray(content)) {\n for (const item of content) {\n if (item.type === \"text\" && item.text) {\n textToSearch += ` ${item.text}`;\n }\n }\n }\n\n if (!textToSearch) return;\n\n // Match GitHub PR URLs\n const prUrlMatch = textToSearch.match(\n /https:\\/\\/github\\.com\\/[^/]+\\/[^/]+\\/pull\\/\\d+/,\n );\n if (!prUrlMatch) return;\n\n const prUrl = prUrlMatch[0];\n this.detectedPrUrl = prUrl;\n this.logger.info(\"Detected PR URL in bash output\", {\n runId: payload.run_id,\n prUrl,\n });\n\n // Fire-and-forget: attach PR URL to the task run\n this.posthogAPI\n .updateTaskRun(payload.task_id, payload.run_id, {\n output: { pr_url: prUrl },\n })\n .then(() => {\n this.logger.info(\"PR URL attached to task run\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n prUrl,\n });\n })\n .catch((err) => {\n this.logger.error(\"Failed to attach PR URL to task run\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n prUrl,\n error: err,\n });\n });\n } catch (err) {\n // Never let detection errors break message flow\n this.logger.debug(\"Error in PR URL detection\", {\n runId: payload.run_id,\n error: err,\n });\n }\n }\n\n private async cleanupSession(): Promise<void> {\n if (!this.session) return;\n\n this.logger.info(\"Cleaning up session\");\n\n try {\n await this.captureTreeState();\n } catch (error) {\n this.logger.error(\"Failed to capture final tree state\", error);\n }\n\n try {\n await this.session.logWriter.flush(this.session.payload.run_id);\n } catch (error) {\n this.logger.error(\"Failed to flush session logs\", error);\n }\n\n try {\n await this.session.acpConnection.cleanup();\n } catch (error) {\n this.logger.error(\"Failed to cleanup ACP connection\", error);\n }\n\n if (this.session.sseController) {\n this.session.sseController.close();\n }\n\n this.pendingEvents = [];\n this.session = null;\n }\n\n private async captureTreeState(): Promise<void> {\n if (!this.session?.treeTracker) return;\n\n try {\n const snapshot = await this.session.treeTracker.captureTree({});\n if (snapshot) {\n const snapshotWithDevice: TreeSnapshotEvent = {\n ...snapshot,\n device: this.session.deviceInfo,\n };\n\n const notification = {\n jsonrpc: \"2.0\" as const,\n method: POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT,\n params: snapshotWithDevice,\n };\n\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification,\n });\n\n // Persist full snapshot (including archiveUrl) so resume can restore files.\n // archiveUrl is a pre-signed S3 URL that expires — if the user resumes\n // after expiry, ApplySnapshotSaga fails gracefully and the agent continues\n // with conversation context but a fresh sandbox (snapshotApplied=false).\n this.session.logWriter.appendRawLine(\n this.session.payload.run_id,\n JSON.stringify(notification),\n );\n }\n } catch (error) {\n this.logger.error(\"Failed to capture tree state\", error);\n }\n }\n\n private broadcastTurnComplete(stopReason: string): void {\n if (!this.session) return;\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification: {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.TURN_COMPLETE,\n params: {\n sessionId: this.session.acpSessionId,\n stopReason,\n },\n },\n });\n }\n\n private broadcastEvent(event: Record<string, unknown>): void {\n if (this.session?.sseController) {\n this.sendSseEvent(this.session.sseController, event);\n } else if (this.session) {\n // Buffer events during initialization (sseController not yet attached)\n this.pendingEvents.push(event);\n }\n }\n\n private replayPendingEvents(): void {\n if (!this.session?.sseController || this.pendingEvents.length === 0) return;\n const events = this.pendingEvents;\n this.pendingEvents = [];\n for (const event of events) {\n this.sendSseEvent(this.session.sseController, event);\n }\n }\n\n private sendSseEvent(controller: SseController, data: unknown): void {\n controller.send(data);\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.3.110\",\n \"repository\": \"https://github.com/PostHog/code\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./adapters/claude/session/jsonl-hydration\": {\n \"types\": \"./dist/adapters/claude/session/jsonl-hydration.d.ts\",\n \"import\": \"./dist/adapters/claude/session/jsonl-hydration.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.cjs\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"scripts\": {\n \"build\": \"node ../../scripts/rimraf.mjs dist && tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\",\n \"clean\": \"node ../../scripts/rimraf.mjs dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@posthog/git\": \"workspace:*\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"0.16.1\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.76\",\n \"@anthropic-ai/sdk\": \"^0.78.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"minimatch\": \"^10.0.3\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^3.24.1\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","/**\n * PostHog-specific ACP extensions.\n *\n * These follow the ACP extensibility model:\n * - Custom notification methods are prefixed with `_posthog/`\n * - Custom data can be attached via `_meta` fields\n *\n * Note: When using `extNotification()` from the ACP SDK, it automatically\n * adds an extra underscore prefix (e.g., `_posthog/tree_snapshot` becomes\n * `__posthog/tree_snapshot` in the log). Code that reads logs should handle both.\n *\n * See: https://agentclientprotocol.com/docs/extensibility\n */\n\n/**\n * Custom notification methods for PostHog-specific events.\n * Used with AgentSideConnection.extNotification() or Client.extNotification()\n */\nexport const POSTHOG_NOTIFICATIONS = {\n /** Git branch was created for a task */\n BRANCH_CREATED: \"_posthog/branch_created\",\n\n /** Task run has started execution */\n RUN_STARTED: \"_posthog/run_started\",\n\n /** Task has completed (success or failure) */\n TASK_COMPLETE: \"_posthog/task_complete\",\n\n /** Agent finished processing a turn (prompt returned, waiting for next input) */\n TURN_COMPLETE: \"_posthog/turn_complete\",\n\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n\n /** Console/log output from the agent */\n CONSOLE: \"_posthog/console\",\n\n /** Maps taskRunId to agent's sessionId and adapter type (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n\n /** Tree state snapshot captured (git tree hash + file archive) */\n TREE_SNAPSHOT: \"_posthog/tree_snapshot\",\n\n /** Agent mode changed (interactive/background) */\n MODE_CHANGE: \"_posthog/mode_change\",\n\n /** Request to resume a session from previous state */\n SESSION_RESUME: \"_posthog/session/resume\",\n\n /** User message sent from client to agent */\n USER_MESSAGE: \"_posthog/user_message\",\n\n /** Request to cancel current operation */\n CANCEL: \"_posthog/cancel\",\n\n /** Request to close the session */\n CLOSE: \"_posthog/close\",\n\n /** Agent status update (thinking, working, etc.) */\n STATUS: \"_posthog/status\",\n\n /** Task-level notification (progress, milestones) */\n TASK_NOTIFICATION: \"_posthog/task_notification\",\n\n /** Marks a boundary for log compaction */\n COMPACT_BOUNDARY: \"_posthog/compact_boundary\",\n} as const;\n","import { AgentSideConnection, ndJsonStream } from \"@agentclientprotocol/sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions\";\nimport { formatModelId } from \"../gateway-models\";\nimport type { SessionLogWriter } from \"../session-log-writer\";\nimport type { ProcessSpawnedCallback } from \"../types\";\nimport { Logger } from \"../utils/logger\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n type StreamPair,\n} from \"../utils/streams\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent\";\nimport { type CodexProcessOptions, spawnCodexProcess } from \"./codex/spawn\";\n\ntype AgentAdapter = \"claude\" | \"codex\";\n\nexport type AcpConnectionConfig = {\n adapter?: AgentAdapter;\n logWriter?: SessionLogWriter;\n taskRunId?: string;\n taskId?: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n codexOptions?: CodexProcessOptions;\n allowedModelIds?: Set<string>;\n};\n\nexport type AcpConnection = {\n agentConnection?: AgentSideConnection;\n clientStreams: StreamPair;\n cleanup: () => Promise<void>;\n};\n\nexport type InProcessAcpConnection = AcpConnection;\n\ntype ModelOption = { value?: string; name?: string };\ntype ModelGroup = { group?: string; name?: string; options?: ModelOption[] };\n\ntype ConfigOption = {\n id?: string;\n category?: string | null;\n currentValue?: string;\n options?: Array<ModelOption | ModelGroup>;\n};\n\nfunction isGroupedOptions(\n options: NonNullable<ConfigOption[\"options\"]>,\n): options is ModelGroup[] {\n return options.length > 0 && \"group\" in options[0];\n}\n\nfunction formatOption(o: ModelOption): ModelOption {\n if (!o.value) return o;\n return { ...o, name: formatModelId(o.value) };\n}\n\nfunction filterModelConfigOptions(\n msg: Record<string, unknown>,\n allowedModelIds: Set<string>,\n): Record<string, unknown> | null {\n const payload = msg as {\n method?: string;\n result?: { configOptions?: ConfigOption[] };\n params?: {\n update?: { sessionUpdate?: string; configOptions?: ConfigOption[] };\n };\n };\n\n const configOptions =\n payload.result?.configOptions ?? payload.params?.update?.configOptions;\n if (!configOptions) return null;\n\n const filtered = configOptions.map((opt) => {\n if (opt.category !== \"model\" || !opt.options) return opt;\n\n const options = opt.options;\n if (isGroupedOptions(options)) {\n const filteredOptions = options.map((group) => ({\n ...group,\n options: (group.options ?? [])\n .filter((o) => o?.value && allowedModelIds.has(o.value))\n .map(formatOption),\n }));\n const flat = filteredOptions.flatMap((g) => g.options ?? []);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || flat.length === 0 ? opt.currentValue : flat[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n }\n\n const valueOptions = options as ModelOption[];\n const filteredOptions = valueOptions\n .filter((o) => o?.value && allowedModelIds.has(o.value))\n .map(formatOption);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || filteredOptions.length === 0\n ? opt.currentValue\n : filteredOptions[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n });\n\n if (payload.result?.configOptions) {\n return { ...msg, result: { ...payload.result, configOptions: filtered } };\n }\n if (payload.params?.update?.configOptions) {\n return {\n ...msg,\n params: {\n ...payload.params,\n update: { ...payload.params.update, configOptions: filtered },\n },\n };\n }\n return null;\n}\n\nfunction extractReasoningEffort(\n configOptions: ConfigOption[] | undefined,\n): string | undefined {\n if (!configOptions) return undefined;\n const option = configOptions.find((opt) => opt.id === \"reasoning_effort\");\n return option?.currentValue ?? undefined;\n}\n\n/**\n * Creates an ACP connection with the specified agent framework.\n *\n * @param config - Configuration including framework selection\n * @returns Connection with agent and client streams\n */\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): AcpConnection {\n const adapterType = config.adapter ?? \"claude\";\n\n if (adapterType === \"codex\") {\n return createCodexConnection(config);\n }\n\n return createClaudeConnection(config);\n}\n\nfunction createClaudeConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"AcpConnection\") ??\n new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { logWriter } = config;\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n const taskRunId = config.taskRunId;\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: ClaudeAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new ClaudeAcpAgent(client, config.processCallbacks);\n logger.info(`Created ${agent.adapterName} agent`);\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up ACP connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n\nfunction createCodexConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"CodexConnection\") ??\n new Logger({ debug: true, prefix: \"[CodexConnection]\" });\n\n const { logWriter } = config;\n const allowedModelIds = config.allowedModelIds;\n\n const codexProcess = spawnCodexProcess({\n ...config.codexOptions,\n logger,\n processCallbacks: config.processCallbacks,\n });\n\n let clientReadable = nodeReadableToWebReadable(codexProcess.stdout);\n let clientWritable = nodeWritableToWebWritable(codexProcess.stdin);\n\n let isLoadingSession = false;\n let loadRequestId: string | number | null = null;\n let newSessionRequestId: string | number | null = null;\n let sdkSessionEmitted = false;\n const reasoningEffortBySessionId = new Map<string, string>();\n let injectedConfigId = 0;\n\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let readBuffer = \"\";\n\n const taskRunId = config.taskRunId;\n\n const filteringReadable = clientReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n readBuffer += decoder.decode(chunk, { stream: true });\n const lines = readBuffer.split(\"\\n\");\n readBuffer = lines.pop() ?? \"\";\n\n const outputLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n outputLines.push(line);\n continue;\n }\n\n let shouldFilter = false;\n\n try {\n const msg = JSON.parse(trimmed);\n const sessionId =\n msg?.params?.sessionId ?? msg?.result?.sessionId ?? null;\n const configOptions =\n msg?.result?.configOptions ?? msg?.params?.update?.configOptions;\n if (sessionId && configOptions) {\n const effort = extractReasoningEffort(configOptions);\n if (effort) {\n reasoningEffortBySessionId.set(sessionId, effort);\n }\n }\n\n if (\n !sdkSessionEmitted &&\n newSessionRequestId !== null &&\n msg.id === newSessionRequestId &&\n \"result\" in msg\n ) {\n const sessionId = msg.result?.sessionId;\n if (sessionId && taskRunId) {\n const sdkSessionNotification = {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.SDK_SESSION,\n params: {\n taskRunId,\n sessionId,\n adapter: \"codex\",\n },\n };\n outputLines.push(JSON.stringify(sdkSessionNotification));\n sdkSessionEmitted = true;\n }\n newSessionRequestId = null;\n }\n\n if (isLoadingSession) {\n if (msg.id === loadRequestId && \"result\" in msg) {\n logger.debug(\"session/load complete, resuming stream\");\n isLoadingSession = false;\n loadRequestId = null;\n } else if (msg.method === \"session/update\") {\n shouldFilter = true;\n }\n }\n\n if (!shouldFilter && allowedModelIds && allowedModelIds.size > 0) {\n const updated = filterModelConfigOptions(msg, allowedModelIds);\n if (updated) {\n outputLines.push(JSON.stringify(updated));\n continue;\n }\n }\n } catch {\n // Not valid JSON, pass through\n }\n\n if (!shouldFilter) {\n outputLines.push(line);\n const isChunkNoise =\n trimmed.includes('\"sessionUpdate\":\"agent_message_chunk\"') ||\n trimmed.includes('\"sessionUpdate\":\"agent_thought_chunk\"');\n if (!isChunkNoise) {\n logger.debug(\"codex-acp stdout:\", trimmed);\n }\n }\n }\n\n if (outputLines.length > 0) {\n const output = `${outputLines.join(\"\\n\")}\\n`;\n controller.enqueue(encoder.encode(output));\n }\n },\n flush(controller) {\n if (readBuffer.trim()) {\n controller.enqueue(encoder.encode(readBuffer));\n }\n },\n }),\n );\n clientReadable = filteringReadable;\n\n const originalWritable = clientWritable;\n clientWritable = new WritableStream({\n write(chunk) {\n const text = decoder.decode(chunk, { stream: true });\n const trimmed = text.trim();\n logger.debug(\"codex-acp stdin:\", trimmed);\n\n try {\n const msg = JSON.parse(trimmed);\n if (\n msg.method === \"session/set_config_option\" &&\n msg.params?.configId === \"reasoning_effort\" &&\n msg.params?.sessionId &&\n msg.params?.value\n ) {\n reasoningEffortBySessionId.set(\n msg.params.sessionId,\n msg.params.value,\n );\n }\n if (msg.method === \"session/prompt\" && msg.params?.sessionId) {\n const effort = reasoningEffortBySessionId.get(msg.params.sessionId);\n if (effort) {\n const injection = {\n jsonrpc: \"2.0\",\n id: `reasoning_effort_${Date.now()}_${injectedConfigId++}`,\n method: \"session/set_config_option\",\n params: {\n sessionId: msg.params.sessionId,\n configId: \"reasoning_effort\",\n value: effort,\n },\n };\n const injectionLine = `${JSON.stringify(injection)}\\n`;\n const writer = originalWritable.getWriter();\n return writer\n .write(encoder.encode(injectionLine))\n .then(() => writer.releaseLock())\n .then(() => {\n const nextWriter = originalWritable.getWriter();\n return nextWriter\n .write(chunk)\n .finally(() => nextWriter.releaseLock());\n });\n }\n }\n if (msg.method === \"session/new\" && msg.id) {\n logger.debug(\"session/new detected, tracking request ID\");\n newSessionRequestId = msg.id;\n } else if (msg.method === \"session/load\" && msg.id) {\n logger.debug(\"session/load detected, pausing stream updates\");\n isLoadingSession = true;\n loadRequestId = msg.id;\n }\n } catch {\n // Not valid JSON\n }\n\n const writer = originalWritable.getWriter();\n return writer.write(chunk).finally(() => writer.releaseLock());\n },\n close() {\n const writer = originalWritable.getWriter();\n return writer.close().finally(() => writer.releaseLock());\n },\n });\n\n const shouldTapLogs = config.taskRunId && logWriter;\n\n if (shouldTapLogs && config.taskRunId) {\n const taskRunId = config.taskRunId;\n if (!logWriter.isRegistered(taskRunId)) {\n logWriter.register(taskRunId, {\n taskId: config.taskId ?? taskRunId,\n runId: taskRunId,\n });\n }\n\n clientWritable = createTappedWritableStream(clientWritable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n const originalReadable = clientReadable;\n const logDecoder = new TextDecoder();\n let logBuffer = \"\";\n\n clientReadable = originalReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n logBuffer += logDecoder.decode(chunk, { stream: true });\n const lines = logBuffer.split(\"\\n\");\n logBuffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.trim()) {\n logWriter.appendRawLine(taskRunId, line);\n }\n }\n\n controller.enqueue(chunk);\n },\n flush() {\n if (logBuffer.trim()) {\n logWriter.appendRawLine(taskRunId, logBuffer);\n }\n },\n }),\n );\n } else {\n logger.info(\"Tapped streams NOT enabled for Codex\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n return {\n agentConnection: undefined,\n clientStreams: {\n readable: clientReadable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up Codex connection\");\n codexProcess.kill();\n\n try {\n await clientWritable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n","export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-6\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ModelsListResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nconst CACHE_TTL = 10 * 60 * 1000; // 10 minutes\n\nlet gatewayModelsCache: {\n models: GatewayModel[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n gatewayModelsCache &&\n gatewayModelsCache.url === gatewayUrl &&\n Date.now() < gatewayModelsCache.expiry\n ) {\n return gatewayModelsCache.models;\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));\n gatewayModelsCache = {\n models,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return models;\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport interface ModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet modelsListCache: {\n models: ModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchModelsList(\n options?: FetchGatewayModelsOptions,\n): Promise<ModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n modelsListCache &&\n modelsListCache.url === gatewayUrl &&\n Date.now() < modelsListCache.expiry\n ) {\n return modelsListCache.models;\n }\n\n try {\n const modelsUrl = `${gatewayUrl}/v1/models`;\n const response = await fetch(modelsUrl);\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ModelsListResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n modelsListCache = {\n models: results,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n return formatModelId(model.id);\n}\n\nexport function formatModelId(modelId: string): string {\n let cleanId = modelId;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types\";\n\nexport interface LoggerConfig {\n debug?: boolean;\n prefix?: string;\n scope?: string;\n onLog?: OnLogCallback;\n}\n\nexport class Logger {\n private debugEnabled: boolean;\n private prefix: string;\n private scope: string;\n private onLog?: OnLogCallback;\n\n constructor(config: LoggerConfig = {}) {\n this.debugEnabled = config.debug ?? false;\n this.prefix = config.prefix ?? \"[PostHog Agent]\";\n this.scope = config.scope ?? \"agent\";\n this.onLog = config.onLog;\n }\n\n private formatMessage(\n level: string,\n message: string,\n data?: unknown,\n ): string {\n const timestamp = new Date().toISOString();\n const base = `${timestamp} ${this.prefix} [${level}] ${message}`;\n\n if (data !== undefined) {\n return `${base} ${JSON.stringify(data, null, 2)}`;\n }\n\n return base;\n }\n\n private emitLog(level: LogLevelType, message: string, data?: unknown) {\n if (this.onLog) {\n this.onLog(level, this.scope, message, data);\n return;\n }\n\n const shouldLog = this.debugEnabled || level === \"error\";\n\n if (shouldLog) {\n console[level](this.formatMessage(level.toLowerCase(), message, data));\n }\n }\n\n error(message: string, error?: Error | unknown) {\n const data =\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : error;\n\n this.emitLog(\"error\", message, data);\n }\n\n warn(message: string, data?: unknown) {\n this.emitLog(\"warn\", message, data);\n }\n\n info(message: string, data?: unknown) {\n this.emitLog(\"info\", message, data);\n }\n\n debug(message: string, data?: unknown) {\n this.emitLog(\"debug\", message, data);\n }\n\n child(childPrefix: string): Logger {\n return new Logger({\n debug: this.debugEnabled,\n prefix: `${this.prefix} [${childPrefix}]`,\n scope: `${this.scope}:${childPrefix}`,\n onLog: this.onLog,\n });\n }\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"./logger\";\n\nexport class Pushable<T> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolvers: ((value: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(item: T) {\n const resolve = this.resolvers.shift();\n if (resolve) {\n resolve({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n end() {\n this.done = true;\n for (const resolve of this.resolvers) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n this.resolvers = [];\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.queue.length > 0) {\n const value = this.queue.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (this.done) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n}\n\nexport type StreamPair = {\n readable: globalThis.ReadableStream<Uint8Array>;\n writable: globalThis.WritableStream<Uint8Array>;\n};\n\nexport type BidirectionalStreamPair = {\n client: StreamPair;\n agent: StreamPair;\n};\n\nfunction pushableToReadableStream(\n pushable: Pushable<Uint8Array>,\n): globalThis.ReadableStream<Uint8Array> {\n const iterator = pushable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function createBidirectionalStreams(): BidirectionalStreamPair {\n const clientToAgentPushable = new Pushable<Uint8Array>();\n const agentToClientPushable = new Pushable<Uint8Array>();\n\n const clientToAgentReadable = pushableToReadableStream(clientToAgentPushable);\n const agentToClientReadable = pushableToReadableStream(agentToClientPushable);\n\n const clientToAgentWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n clientToAgentPushable.push(chunk);\n },\n close() {\n clientToAgentPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n const agentToClientWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n agentToClientPushable.push(chunk);\n },\n close() {\n agentToClientPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n return {\n client: {\n readable: agentToClientReadable,\n writable: clientToAgentWritable,\n },\n agent: {\n readable: clientToAgentReadable,\n writable: agentToClientWritable,\n },\n };\n}\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\nexport function createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n options: TappedStreamOptions,\n): WritableStream<Uint8Array> {\n const { onMessage, logger } = options;\n const decoder = new TextDecoder();\n let buffer = \"\";\n let _messageCount = 0;\n\n return new WritableStream({\n async write(chunk: Uint8Array) {\n buffer += decoder.decode(chunk, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n _messageCount++;\n\n onMessage(line);\n }\n\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (err) {\n // Stream may be closed if subprocess crashed - log but don't throw\n logger?.error(\"ACP write error\", err);\n }\n },\n async close() {\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n });\n}\n\nexport function nodeReadableToWebReadable(\n nodeStream: Readable,\n): globalThis.ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n nodeStream.on(\"data\", (chunk: Buffer) => {\n controller.enqueue(new Uint8Array(chunk));\n });\n nodeStream.on(\"end\", () => {\n controller.close();\n });\n nodeStream.on(\"error\", (err) => {\n controller.error(err);\n });\n },\n cancel() {\n nodeStream.destroy();\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function nodeWritableToWebWritable(\n nodeStream: Writable,\n): globalThis.WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise((resolve, reject) => {\n const ok = nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) reject(err);\n });\n if (ok) {\n resolve();\n } else {\n nodeStream.once(\"drain\", resolve);\n }\n });\n },\n close() {\n return new Promise((resolve) => {\n nodeStream.end(resolve);\n });\n },\n abort(reason) {\n nodeStream.destroy(\n reason instanceof Error ? reason : new Error(String(reason)),\n );\n },\n }) as globalThis.WritableStream<Uint8Array>;\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type ModelInfo as AcpModelInfo,\n type AgentSideConnection,\n type ClientCapabilities,\n type ForkSessionRequest,\n type ForkSessionResponse,\n type InitializeRequest,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type ResumeSessionRequest,\n type ResumeSessionResponse,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SessionModelState,\n type SessionModeState,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n type SetSessionModelRequest,\n type SetSessionModelResponse,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n type Usage,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n getSessionMessages,\n listSessions,\n type Query,\n query,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport { unreachable, withTimeout } from \"../../utils/common\";\nimport { Logger } from \"../../utils/logger\";\nimport { Pushable } from \"../../utils/streams\";\nimport { BaseAcpAgent } from \"../base-acp-agent\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp\";\nimport {\n fetchMcpToolMetadata,\n getConnectedMcpServerNames,\n} from \"./mcp/tool-metadata\";\nimport { canUseTool } from \"./permissions/permission-handlers\";\nimport { getAvailableSlashCommands } from \"./session/commands\";\nimport { parseMcpServers } from \"./session/mcp-config\";\nimport {\n DEFAULT_MODEL,\n getEffortOptions,\n resolveModelPreference,\n supports1MContext,\n toSdkModelId,\n} from \"./session/models\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options\";\nimport { SettingsManager } from \"./session/settings\";\nimport {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n} from \"./tools\";\nimport type {\n BackgroundTerminal,\n EffortLevel,\n NewSessionMeta,\n Session,\n ToolUseCache,\n} from \"./types\";\n\nconst SESSION_VALIDATION_TIMEOUT_MS = 30_000;\nconst MAX_TITLE_LENGTH = 256;\nconst LOCAL_ONLY_COMMANDS = new Set([\"/context\", \"/heapdump\", \"/extra-usage\"]);\n\nfunction sanitizeTitle(text: string): string {\n const sanitized = text\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (sanitized.length <= MAX_TITLE_LENGTH) {\n return sanitized;\n }\n return `${sanitized.slice(0, MAX_TITLE_LENGTH - 1)}…`;\n}\n\nexport interface ClaudeAcpAgentOptions {\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n onMcpServersReady?: (serverNames: string[]) => void;\n}\n\nexport class ClaudeAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"claude\";\n declare session: Session;\n toolUseCache: ToolUseCache;\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n private options?: ClaudeAcpAgentOptions;\n\n constructor(client: AgentSideConnection, options?: ClaudeAcpAgentOptions) {\n super(client);\n this.options = options;\n this.toolUseCache = {};\n this.logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n return {\n protocolVersion: 1,\n agentCapabilities: {\n promptCapabilities: {\n image: true,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: true,\n sse: true,\n },\n loadSession: true,\n sessionCapabilities: {\n list: {},\n fork: {},\n resume: {},\n },\n _meta: {\n posthog: {\n resumeSession: true,\n },\n claudeCode: {\n promptQueueing: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Agent\",\n version: packageJson.version,\n },\n authMethods: [],\n };\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n // Upstream Claude Code renames .claude.json to .claude.json.backup on logout.\n // If the backup exists but the original doesn't, the user is logged out.\n if (\n fs.existsSync(path.resolve(os.homedir(), \".claude.json.backup\")) &&\n !fs.existsSync(path.resolve(os.homedir(), \".claude.json\"))\n ) {\n throw RequestError.authRequired();\n }\n\n const response = await this.createSession(params, {\n // Revisit these meta values once we support resume\n resume: (params._meta as NewSessionMeta | undefined)?.claudeCode?.options\n ?.resume as string | undefined,\n });\n\n return response;\n }\n\n async unstable_forkSession(\n params: ForkSessionRequest,\n ): Promise<ForkSessionResponse> {\n return this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, forkSession: true },\n );\n }\n\n async unstable_resumeSession(\n params: ResumeSessionRequest,\n ): Promise<ResumeSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n {\n resume: params.sessionId,\n },\n );\n\n return response;\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, skipBackgroundFetches: true },\n );\n\n await this.replaySessionHistory(params.sessionId);\n\n // Send available commands after replay so they don't interleave with history\n this.deferBackgroundFetches(this.session.query);\n\n return {\n modes: response.modes,\n models: response.models,\n configOptions: response.configOptions,\n };\n }\n\n async listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n const sdkSessions = await listSessions({ dir: params.cwd ?? undefined });\n const sessions = [];\n\n for (const session of sdkSessions) {\n if (!session.cwd) continue;\n sessions.push({\n sessionId: session.sessionId,\n cwd: session.cwd,\n title: sanitizeTitle(session.customTitle || session.summary || \"\"),\n updatedAt: new Date(session.lastModified).toISOString(),\n });\n }\n return {\n sessions,\n };\n }\n\n async unstable_listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.listSessions(params);\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n this.session.accumulatedUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n };\n\n const userMessage = promptToClaude(params);\n const promptUuid = randomUUID();\n userMessage.uuid = promptUuid;\n let promptReplayed = false;\n let isLocalOnlyCommand = false;\n\n // Detect local-only slash commands that return results without model invocation\n const msgContent = userMessage.message.content;\n let firstTextPart = \"\";\n if (typeof msgContent === \"string\") {\n firstTextPart = msgContent;\n } else if (Array.isArray(msgContent)) {\n for (const block of msgContent) {\n if (\"type\" in block && block.type === \"text\" && \"text\" in block) {\n firstTextPart = block.text as string;\n break;\n }\n }\n }\n const commandMatch = firstTextPart.match(/^(\\/\\S+)/);\n if (commandMatch && LOCAL_ONLY_COMMANDS.has(commandMatch[1])) {\n isLocalOnlyCommand = true;\n promptReplayed = true;\n }\n\n if (this.session.promptRunning) {\n this.session.input.push(userMessage);\n const order = this.session.nextPendingOrder++;\n const cancelled = await new Promise<boolean>((resolve) => {\n this.session.pendingMessages.set(promptUuid, { resolve, order });\n });\n if (cancelled) {\n return { stopReason: \"cancelled\" };\n }\n promptReplayed = true;\n } else {\n this.session.input.push(userMessage);\n }\n\n // Broadcast user message to client\n await this.broadcastUserMessage(params);\n\n this.session.promptRunning = true;\n let handedOff = false;\n let lastAssistantTotalUsage: number | null = null;\n if (this.session.lastContextWindowSize == null) {\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n this.session.modelId ?? \"\",\n );\n this.logger.debug(\"Initial context window size from gateway\", {\n modelId: this.session.modelId,\n contextWindowSize: this.session.lastContextWindowSize,\n });\n }\n let lastContextWindowSize = this.session.lastContextWindowSize;\n\n const supportsTerminalOutput =\n (\n this.clientCapabilities?._meta as\n | ClientCapabilities[\"_meta\"]\n | undefined\n )?.terminal_output === true;\n\n const context = {\n session: this.session,\n sessionId: params.sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n supportsTerminalOutput,\n };\n\n try {\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n if (this.session.cancelled) {\n return {\n stopReason: \"cancelled\",\n _meta: this.session.interruptReason\n ? { interruptReason: this.session.interruptReason }\n : undefined,\n };\n }\n break;\n }\n\n switch (message.type) {\n case \"system\":\n if (message.subtype === \"compact_boundary\") {\n lastAssistantTotalUsage = 0;\n promptReplayed = true;\n }\n if (message.subtype === \"local_command_output\") {\n promptReplayed = true;\n }\n await handleSystemMessage(message, context);\n break;\n\n case \"result\": {\n // Skip results from background tasks that finished after our prompt started\n if (!promptReplayed) {\n this.logger.debug(\n \"Skipping background task result before prompt replay\",\n { sessionId: params.sessionId },\n );\n break;\n }\n\n if (this.session.cancelled) {\n return { stopReason: \"cancelled\" };\n }\n\n // Accumulate usage from this result\n this.session.accumulatedUsage.inputTokens +=\n message.usage.input_tokens;\n this.session.accumulatedUsage.outputTokens +=\n message.usage.output_tokens;\n this.session.accumulatedUsage.cachedReadTokens +=\n message.usage.cache_read_input_tokens;\n this.session.accumulatedUsage.cachedWriteTokens +=\n message.usage.cache_creation_input_tokens;\n\n // SDK can underreport context window (e.g. 200k for 1M models).\n // Use SDK value only if it's larger than what gateway reported.\n const contextWindows = Object.values(message.modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n const sdkContextWindow = Math.min(...contextWindows);\n if (sdkContextWindow > lastContextWindowSize) {\n lastContextWindowSize = sdkContextWindow;\n }\n }\n this.session.lastContextWindowSize = lastContextWindowSize;\n this.logger.debug(\"Context window size from result\", {\n sdkReported: contextWindows,\n resolved: lastContextWindowSize,\n modelId: this.session.modelId,\n });\n\n this.session.contextSize = lastContextWindowSize;\n if (lastAssistantTotalUsage !== null) {\n this.session.contextUsed = lastAssistantTotalUsage;\n }\n\n // Send usage_update notification\n if (lastAssistantTotalUsage !== null) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: {\n amount: message.total_cost_usd,\n currency: \"USD\",\n },\n },\n });\n }\n\n await this.client.extNotification(\"_posthog/usage_update\", {\n sessionId: params.sessionId,\n used: {\n inputTokens: message.usage.input_tokens,\n outputTokens: message.usage.output_tokens,\n cachedReadTokens: message.usage.cache_read_input_tokens,\n cachedWriteTokens: message.usage.cache_creation_input_tokens,\n },\n cost: message.total_cost_usd,\n });\n\n const usage: Usage = {\n inputTokens: this.session.accumulatedUsage.inputTokens,\n outputTokens: this.session.accumulatedUsage.outputTokens,\n cachedReadTokens: this.session.accumulatedUsage.cachedReadTokens,\n cachedWriteTokens:\n this.session.accumulatedUsage.cachedWriteTokens,\n totalTokens:\n this.session.accumulatedUsage.inputTokens +\n this.session.accumulatedUsage.outputTokens +\n this.session.accumulatedUsage.cachedReadTokens +\n this.session.accumulatedUsage.cachedWriteTokens,\n };\n\n const result = handleResultMessage(message);\n if (result.error) throw result.error;\n\n // For local-only commands, forward the result text to the client\n if (\n isLocalOnlyCommand &&\n message.subtype === \"success\" &&\n message.result\n ) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: message.result },\n },\n });\n }\n\n return { stopReason: result.stopReason ?? \"end_turn\", usage };\n }\n\n case \"stream_event\":\n await handleStreamEvent(message, context);\n break;\n\n case \"user\":\n case \"assistant\": {\n if (this.session.cancelled) {\n break;\n }\n\n // Check for prompt replay (our own message echoed back)\n if (message.type === \"user\" && \"uuid\" in message && message.uuid) {\n if (message.uuid === promptUuid) {\n promptReplayed = true;\n break;\n }\n\n const pending = this.session.pendingMessages.get(\n message.uuid as string,\n );\n if (pending) {\n pending.resolve(false);\n this.session.pendingMessages.delete(message.uuid as string);\n handedOff = true;\n // the current loop stops with end_turn,\n // the loop of the next prompt continues running\n return { stopReason: \"end_turn\" };\n }\n }\n\n // Skip replayed user messages that aren't pending prompts\n if (\n \"isReplay\" in message &&\n (message as Record<string, unknown>).isReplay\n ) {\n break;\n }\n\n // Store latest assistant usage (excluding subagents)\n if (\n \"usage\" in message.message &&\n message.parent_tool_use_id === null\n ) {\n const usage = (\n message.message as unknown as Record<string, unknown>\n ).usage as {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens: number;\n cache_creation_input_tokens: number;\n };\n lastAssistantTotalUsage =\n usage.input_tokens +\n usage.cache_read_input_tokens +\n usage.cache_creation_input_tokens;\n\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: null,\n },\n });\n }\n\n const result = await handleUserAssistantMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return { stopReason: \"end_turn\" };\n }\n break;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n case \"tool_use_summary\":\n case \"prompt_suggestion\":\n case \"rate_limit_event\":\n break;\n\n default:\n unreachable(message as never, this.logger);\n break;\n }\n }\n throw new Error(\"Session did not end in result\");\n } catch (error) {\n if (error instanceof RequestError || !(error instanceof Error)) {\n throw error;\n }\n const msg = error.message;\n if (\n msg.includes(\"ProcessTransport\") ||\n msg.includes(\"terminated process\") ||\n msg.includes(\"process exited with\") ||\n msg.includes(\"process terminated by signal\") ||\n msg.includes(\"Failed to write to process stdin\")\n ) {\n this.logger.error(`Process died: ${msg}`, {\n sessionId: this.sessionId,\n });\n this.session.settingsManager.dispose();\n this.session.input.end();\n throw RequestError.internalError(\n undefined,\n \"The Claude Agent process exited unexpectedly. Please start a new session.\",\n );\n }\n throw error;\n } finally {\n if (!handedOff) {\n this.session.promptRunning = false;\n // Resolve all remaining pending prompts so no callers get stuck.\n for (const [key, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n this.session.pendingMessages.delete(key);\n }\n }\n }\n }\n\n // Called by BaseAcpAgent#cancel() to interrupt the session\n protected async interrupt(): Promise<void> {\n this.session.cancelled = true;\n for (const [, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n }\n this.session.pendingMessages.clear();\n await this.session.query.interrupt();\n }\n\n async unstable_setSessionModel(\n params: SetSessionModelRequest,\n ): Promise<SetSessionModelResponse | undefined> {\n await this.session.query.setModel(toSdkModelId(params.modelId));\n this.session.modelId = params.modelId;\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n params.modelId,\n );\n this.rebuildEffortConfigOption(params.modelId);\n await this.updateConfigOption(\"model\", params.modelId);\n return {};\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n await this.applySessionMode(params.modeId);\n await this.updateConfigOption(\"mode\", params.modeId);\n return {};\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const option = this.session.configOptions.find(\n (o) => o.id === params.configId,\n );\n if (!option) {\n throw new Error(`Unknown config option: ${params.configId}`);\n }\n\n if (typeof params.value !== \"string\") {\n throw new Error(\n `Invalid value type for config option ${params.configId}`,\n );\n }\n\n const allValues: { value: string; name?: string; description?: string }[] =\n \"options\" in option && Array.isArray(option.options)\n ? (option.options as Array<Record<string, unknown>>).flatMap((o) =>\n \"options\" in o && Array.isArray(o.options)\n ? (o.options as {\n value: string;\n name?: string;\n description?: string;\n }[])\n : [o as { value: string; name?: string; description?: string }],\n )\n : [];\n let validValue = allValues.find((o) => o.value === params.value);\n\n // For model options, fall back to alias resolution when exact match fails.\n // This lets callers use human-friendly aliases like \"opus\" or \"sonnet\"\n // instead of full model IDs like \"claude-opus-4-6\".\n if (!validValue && params.configId === \"model\") {\n const resolved = resolveModelPreference(params.value, allValues);\n if (resolved) {\n validValue = allValues.find((o) => o.value === resolved);\n }\n }\n\n if (!validValue) {\n throw new Error(\n `Invalid value for config option ${params.configId}: ${params.value}`,\n );\n }\n\n // Use the canonical option value so downstream code always receives the\n // model ID rather than the caller-supplied alias.\n const resolvedValue = validValue.value;\n\n if (params.configId === \"mode\") {\n await this.applySessionMode(resolvedValue);\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: resolvedValue,\n },\n });\n } else if (params.configId === \"model\") {\n const sdkModelId = toSdkModelId(resolvedValue);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = resolvedValue;\n this.session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedValue);\n this.rebuildEffortConfigOption(resolvedValue);\n } else if (params.configId === \"effort\") {\n const newEffort = resolvedValue as EffortLevel;\n this.session.effort = newEffort;\n this.session.queryOptions.effort = newEffort;\n }\n\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === params.configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: resolvedValue }\n : o,\n );\n\n return { configOptions: this.session.configOptions };\n }\n\n private async updateConfigOption(\n configId: string,\n value: string,\n ): Promise<void> {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: value }\n : o,\n );\n\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions: this.session.configOptions,\n },\n });\n }\n\n private async applySessionMode(modeId: string): Promise<void> {\n if (!CODE_EXECUTION_MODES.includes(modeId as CodeExecutionMode)) {\n throw new Error(\"Invalid Mode\");\n }\n const previousMode = this.session.permissionMode;\n this.session.permissionMode = modeId as CodeExecutionMode;\n try {\n await this.session.query.setPermissionMode(modeId as CodeExecutionMode);\n } catch (error) {\n this.session.permissionMode = previousMode;\n if (error instanceof Error) {\n if (!error.message) {\n error.message = \"Invalid Mode\";\n }\n throw error;\n }\n throw new Error(\"Invalid Mode\");\n }\n }\n\n private async createSession(\n params: {\n cwd: string;\n mcpServers: NewSessionRequest[\"mcpServers\"];\n _meta?: unknown;\n },\n creationOpts: {\n resume?: string;\n forkSession?: boolean;\n skipBackgroundFetches?: boolean;\n } = {},\n ): Promise<NewSessionResponse> {\n const { cwd } = params;\n const { resume, forkSession } = creationOpts;\n\n const isResume = !!resume;\n\n const meta = params._meta as NewSessionMeta | undefined;\n const taskId = meta?.persistence?.taskId;\n const effort = meta?.claudeCode?.options?.effort as EffortLevel | undefined;\n\n // We want to create a new session id unless it is resume,\n // but not resume + forkSession.\n let sessionId: string;\n if (forkSession) {\n sessionId = uuidv7();\n } else if (isResume) {\n sessionId = resume;\n } else {\n sessionId = uuidv7();\n }\n\n const input = new Pushable<SDKUserMessage>();\n\n const settingsManager = new SettingsManager(cwd);\n await settingsManager.initialize();\n\n const mcpServers = parseMcpServers(params);\n const systemPrompt = buildSystemPrompt(meta?.systemPrompt);\n\n this.logger.info(isResume ? \"Resuming session\" : \"Creating new session\", {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n cwd,\n });\n\n const permissionMode: CodeExecutionMode =\n meta?.permissionMode &&\n CODE_EXECUTION_MODES.includes(meta.permissionMode as CodeExecutionMode)\n ? (meta.permissionMode as CodeExecutionMode)\n : \"default\";\n\n const options = buildSessionOptions({\n cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(sessionId, meta?.allowedDomains),\n logger: this.logger,\n systemPrompt,\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId,\n isResume,\n forkSession,\n additionalDirectories: [\n ...(meta?.claudeCode?.options?.additionalDirectories ?? []),\n ...(meta?.additionalRoots ?? []),\n ],\n disableBuiltInTools: meta?.disableBuiltInTools,\n settingsManager,\n onModeChange: this.createOnModeChange(),\n onProcessSpawned: this.options?.onProcessSpawned,\n onProcessExited: this.options?.onProcessExited,\n effort,\n });\n\n // Use the same abort controller that buildSessionOptions gave to the query\n const abortController = options.abortController as AbortController;\n\n const q = query({ prompt: input, options });\n\n const session: Session = {\n query: q,\n queryOptions: options,\n input,\n cancelled: false,\n settingsManager,\n permissionMode,\n abortController,\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n },\n effort,\n configOptions: [],\n promptRunning: false,\n pendingMessages: new Map(),\n nextPendingOrder: 0,\n\n // Custom properties\n cwd,\n notificationHistory: [],\n taskRunId: meta?.taskRunId,\n };\n this.session = session;\n this.sessionId = sessionId;\n\n this.logger.info(\n isResume\n ? \"Session query initialized, awaiting resumption\"\n : \"Session query initialized, awaiting initialization\",\n { sessionId, taskId, taskRunId: meta?.taskRunId },\n );\n\n try {\n const result = await withTimeout(\n q.initializationResult(),\n SESSION_VALIDATION_TIMEOUT_MS,\n );\n if (result.result === \"timeout\") {\n throw new Error(\n `Session ${isResume ? (forkSession ? \"fork\" : \"resumption\") : \"initialization\"} timed out for sessionId=${sessionId}`,\n );\n }\n } catch (err) {\n settingsManager.dispose();\n if (\n isResume &&\n err instanceof Error &&\n err.message === \"Query closed before response received\"\n ) {\n throw RequestError.resourceNotFound(sessionId);\n }\n this.logger.error(\n isResume\n ? forkSession\n ? \"Session fork failed\"\n : \"Session resumption failed\"\n : \"Session initialization failed\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n throw err;\n }\n\n if (meta?.taskRunId) {\n await this.client.extNotification(\"_posthog/sdk_session\", {\n taskRunId: meta.taskRunId,\n sessionId,\n adapter: \"claude\",\n });\n }\n\n // Resolve model: settings model takes priority, then gateway\n const settingsModel = settingsManager.getSettings().model;\n const modelOptions = await this.getModelConfigOptions();\n const resolvedModelId = settingsModel || modelOptions.currentModelId;\n session.modelId = resolvedModelId;\n session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedModelId);\n\n const resolvedSdkModel = toSdkModelId(resolvedModelId);\n if (!isResume && resolvedSdkModel !== DEFAULT_MODEL) {\n await this.session.query.setModel(resolvedSdkModel);\n }\n\n if (supports1MContext(resolvedModelId)) {\n options.betas = [\"context-1m-2025-08-07\"];\n }\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const models: SessionModelState = {\n currentModelId: resolvedModelId,\n availableModels: modelOptions.options.map(\n (opt): AcpModelInfo => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }),\n ),\n };\n\n const configOptions = this.buildConfigOptions(\n permissionMode,\n modelOptions,\n effort ?? \"high\",\n );\n session.configOptions = configOptions;\n\n if (!creationOpts.skipBackgroundFetches) {\n this.deferBackgroundFetches(q);\n }\n\n this.logger.info(\n isResume\n ? \"Session resumed successfully\"\n : \"Session created successfully\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n },\n );\n\n return { sessionId, modes, models, configOptions };\n }\n\n private createCanUseTool(\n sessionId: string,\n allowedDomains?: string[],\n ): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID, signal }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n signal,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n updateConfigOption: (configId: string, value: string) =>\n this.updateConfigOption(configId, value),\n allowedDomains,\n });\n }\n\n private createOnModeChange() {\n return async (newMode: CodeExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.updateConfigOption(\"mode\", newMode);\n };\n }\n\n private getExistingSessionState(\n sessionId: string,\n ): NewSessionResponse | null {\n if (this.sessionId !== sessionId || !this.session) return null;\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: this.session.permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const modelOptions = this.session.configOptions.find(\n (o) => o.id === \"model\",\n );\n const models: SessionModelState = {\n currentModelId: this.session.modelId ?? DEFAULT_MODEL,\n availableModels:\n modelOptions && \"options\" in modelOptions\n ? (\n modelOptions.options as Array<{\n value: string;\n name: string;\n description?: string;\n }>\n ).map((opt) => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }))\n : [],\n };\n\n return {\n sessionId,\n modes,\n models,\n configOptions: this.session.configOptions,\n };\n }\n\n private buildConfigOptions(\n currentModeId: string,\n modelOptions: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n },\n currentEffort: EffortLevel = \"high\",\n ): SessionConfigOption[] {\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n const configOptions: SessionConfigOption[] = [\n {\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: currentModeId,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description:\n \"Choose an approval and sandboxing preset for your session\",\n },\n {\n id: \"model\",\n name: \"Model\",\n type: \"select\",\n currentValue: modelOptions.currentModelId,\n options: modelOptions.options,\n category: \"model\" as SessionConfigOptionCategory,\n description: \"Choose which model Claude should use\",\n },\n ];\n\n const effortOptions = getEffortOptions(modelOptions.currentModelId);\n if (effortOptions) {\n configOptions.push({\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: currentEffort,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n });\n }\n\n return configOptions;\n }\n\n private rebuildEffortConfigOption(modelId: string): void {\n const effortOptions = getEffortOptions(modelId);\n const existingEffort = this.session.configOptions.find(\n (o) => o.id === \"effort\",\n );\n\n if (!effortOptions) {\n this.session.configOptions = this.session.configOptions.filter(\n (o) => o.id !== \"effort\",\n );\n if (this.session.effort) {\n this.session.effort = undefined;\n this.session.queryOptions.effort = undefined;\n }\n return;\n }\n\n const rawCurrentValue = existingEffort?.currentValue;\n const currentValue =\n typeof rawCurrentValue === \"string\" ? rawCurrentValue : \"high\";\n const isValidValue = effortOptions.some((o) => o.value === currentValue);\n const resolvedValue = isValidValue ? currentValue : \"high\";\n\n if (resolvedValue !== currentValue && this.session.effort) {\n this.session.effort = resolvedValue as EffortLevel;\n this.session.queryOptions.effort = resolvedValue as EffortLevel;\n }\n\n const effortConfig: SessionConfigOption = {\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: resolvedValue,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n };\n\n if (existingEffort) {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === \"effort\" ? effortConfig : o,\n );\n } else {\n this.session.configOptions.push(effortConfig);\n }\n }\n\n private async sendAvailableCommandsUpdate(): Promise<void> {\n const commands = await this.session.query.supportedCommands();\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands: getAvailableSlashCommands(commands),\n },\n });\n }\n\n private async replaySessionHistory(sessionId: string): Promise<void> {\n try {\n const messages = await getSessionMessages(sessionId, {\n dir: this.session.cwd,\n });\n\n const replayContext = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n registerHooks: false,\n };\n\n for (const msg of messages) {\n const sdkMessage = {\n type: msg.type,\n message: msg.message as {\n content: string | Array<{ type: string; text?: string }>;\n role: typeof msg.type;\n },\n parent_tool_use_id: msg.parent_tool_use_id,\n };\n await handleUserAssistantMessage(\n sdkMessage as Parameters<typeof handleUserAssistantMessage>[0],\n replayContext,\n );\n }\n } catch (err) {\n this.logger.warn(\"Failed to replay session history\", {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // ================================\n // EXTENSION METHODS\n // ================================\n\n /**\n * Fire-and-forget: fetch slash commands and MCP tool metadata in parallel.\n * Both populate caches used later — neither is needed to return configOptions.\n */\n private deferBackgroundFetches(q: Query): void {\n this.logger.info(\"Starting background fetches (commands + MCP metadata)\");\n Promise.all([\n new Promise<void>((resolve) => setTimeout(resolve, 10)).then(() =>\n this.sendAvailableCommandsUpdate(),\n ),\n fetchMcpToolMetadata(q, this.logger).then(() => {\n const serverNames = getConnectedMcpServerNames();\n if (serverNames.length > 0) {\n this.options?.onMcpServersReady?.(serverNames);\n }\n }),\n ]).catch((err) =>\n this.logger.error(\"Background fetch failed\", { error: err }),\n );\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n}\n","import type { Logger } from \"./logger\";\n\n/**\n * Races an operation against a timeout.\n * Returns success with the value if the operation completes in time,\n * or timeout if the operation takes longer than the specified duration.\n */\nexport async function withTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n): Promise<{ result: \"success\"; value: T } | { result: \"timeout\" }> {\n const timeoutPromise = new Promise<{ result: \"timeout\" }>((resolve) =>\n setTimeout(() => resolve({ result: \"timeout\" }), timeoutMs),\n );\n const operationPromise = operation.then((value) => ({\n result: \"success\" as const,\n value,\n }));\n return Promise.race([operationPromise, timeoutPromise]);\n}\n\nexport const IS_ROOT =\n typeof process !== \"undefined\" &&\n (process.geteuid?.() ?? process.getuid?.()) === 0;\n\nexport function unreachable(value: never, logger: Logger): void {\n let valueAsString: string;\n try {\n valueAsString = JSON.stringify(value);\n } catch {\n valueAsString = String(value);\n }\n logger.error(`Unexpected case: ${valueAsString}`);\n}\n","import type {\n Agent,\n AgentSideConnection,\n AuthenticateRequest,\n CancelNotification,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n SessionConfigSelectOption,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n DEFAULT_GATEWAY_MODEL,\n fetchGatewayModels,\n formatGatewayModelName,\n type GatewayModel,\n isAnthropicModel,\n} from \"../gateway-models\";\nimport { Logger } from \"../utils/logger\";\nimport type { SettingsManager } from \"./claude/session/settings\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n settingsManager: SettingsManager;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\n\nexport abstract class BaseAcpAgent implements Agent {\n abstract readonly adapterName: string;\n protected session!: BaseSession;\n protected sessionId!: string;\n client: AgentSideConnection;\n logger: Logger;\n fileContentCache: { [key: string]: string } = {};\n protected gatewayModels: GatewayModel[] = [];\n\n constructor(client: AgentSideConnection) {\n this.client = client;\n this.logger = new Logger({ debug: true, prefix: \"[BaseAcpAgent]\" });\n }\n\n abstract initialize(request: InitializeRequest): Promise<InitializeResponse>;\n abstract newSession(params: NewSessionRequest): Promise<NewSessionResponse>;\n abstract prompt(params: PromptRequest): Promise<PromptResponse>;\n protected abstract interrupt(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session ID mismatch\");\n }\n this.session.cancelled = true;\n const meta = params._meta as { interruptReason?: string } | undefined;\n if (meta?.interruptReason) {\n this.session.interruptReason = meta.interruptReason;\n }\n await this.interrupt();\n }\n\n async closeSession(): Promise<void> {\n try {\n // Abort first so in-flight HTTP requests are cancelled,\n // otherwise interrupt() deadlocks waiting for the query to stop\n // while the query waits on an API call that will never abort.\n this.session.abortController.abort();\n await this.cancel({ sessionId: this.sessionId });\n this.session.settingsManager.dispose();\n this.logger.info(\"Closed session\", { sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"Failed to close session\", {\n sessionId: this.sessionId,\n error: err,\n });\n }\n }\n\n hasSession(sessionId: string): boolean {\n return this.sessionId === sessionId;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n if (this.sessionId === sessionId) {\n this.session.notificationHistory.push(notification);\n }\n }\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await this.client.readTextFile(params);\n if (!params.limit && !params.line) {\n this.fileContentCache[params.path] = response.content;\n }\n return response;\n }\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n const response = await this.client.writeTextFile(params);\n this.fileContentCache[params.path] = params.content;\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async getModelConfigOptions(currentModelOverride?: string): Promise<{\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }> {\n this.gatewayModels = await fetchGatewayModels();\n\n const options = this.gatewayModels\n .filter((model) => isAnthropicModel(model))\n .map((model) => ({\n value: model.id,\n name: formatGatewayModelName(model),\n description: `Context: ${model.context_window.toLocaleString()} tokens`,\n }));\n\n const isAnthropicModelId = (modelId: string): boolean =>\n modelId.startsWith(\"claude-\") || modelId.startsWith(\"anthropic/\");\n\n let currentModelId = currentModelOverride ?? DEFAULT_GATEWAY_MODEL;\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n if (!isAnthropicModelId(currentModelId)) {\n currentModelId = DEFAULT_GATEWAY_MODEL;\n }\n }\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n options.unshift({\n value: currentModelId,\n name: currentModelId,\n description: \"Custom model\",\n });\n }\n\n return { currentModelId, options };\n }\n\n getContextWindowForModel(modelId: string): number {\n const match = this.gatewayModels.find((m) => m.id === modelId);\n return match?.context_window ?? DEFAULT_CONTEXT_WINDOW;\n }\n}\n","import * as path from \"node:path\";\nimport type { PromptRequest } from \"@agentclientprotocol/sdk\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\n\ntype ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\nfunction sdkText(value: string): ContentBlockParam {\n return { type: \"text\", text: value };\n}\n\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"file://\")) {\n const filePath = uri.slice(7);\n const name = path.basename(filePath) || filePath;\n return `[@${name}](${uri})`;\n }\n if (uri.startsWith(\"zed://\")) {\n const name = path.basename(uri) || uri;\n return `[@${name}](${uri})`;\n }\n return uri;\n } catch {\n return uri;\n }\n}\n\nfunction transformMcpCommand(text: string): string {\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n return `/${server}:${command} (MCP)${args || \"\"}`;\n }\n return text;\n}\n\nfunction processPromptChunk(\n chunk: PromptRequest[\"prompt\"][number],\n content: ContentBlockParam[],\n context: ContentBlockParam[],\n): void {\n switch (chunk.type) {\n case \"text\":\n content.push(sdkText(transformMcpCommand(chunk.text)));\n break;\n\n case \"resource_link\":\n content.push(sdkText(formatUriAsLink(chunk.uri)));\n break;\n\n case \"resource\":\n if (\"text\" in chunk.resource) {\n content.push(sdkText(formatUriAsLink(chunk.resource.uri)));\n context.push(\n sdkText(\n `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n ),\n );\n }\n break;\n\n case \"image\":\n if (chunk.data) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n data: chunk.data,\n media_type: chunk.mimeType as ImageMimeType,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: chunk.uri },\n });\n }\n break;\n\n default:\n break;\n }\n}\n\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: ContentBlockParam[] = [];\n const context: ContentBlockParam[] = [];\n\n const prContext = (prompt._meta as Record<string, unknown> | undefined)\n ?.prContext;\n if (typeof prContext === \"string\") {\n content.push(sdkText(prContext));\n }\n\n for (const chunk of prompt.prompt) {\n processPromptChunk(chunk, content, context);\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: { role: \"user\", content },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n","import type {\n AgentSideConnection,\n Role,\n SessionNotification,\n SessionUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport { RequestError, type StopReason } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKAssistantMessage,\n SDKMessage,\n SDKPartialAssistantMessage,\n SDKResultMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaContentBlock,\n BetaRawContentBlockDelta,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\nimport { image, text } from \"../../../utils/acp-content\";\nimport { unreachable } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { registerHookCallback } from \"../hooks\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromEditToolResponse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp\";\n\ntype AnthropicContentChunk =\n | ContentBlockParam\n | BetaContentBlock\n | BetaRawContentBlockDelta;\n\ntype AnthropicMessageContent = string | Array<{ type: string; text?: string }>;\n\ninterface AnthropicMessageWithContent {\n type: Role;\n message: {\n content: AnthropicMessageContent;\n role?: Role;\n model?: string;\n };\n}\n\ntype ChunkHandlerContext = {\n sessionId: string;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n client: AgentSideConnection;\n logger: Logger;\n parentToolCallId?: string;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n cwd?: string;\n /** Raw MCP tool result from SDKUserMessage.tool_use_result (contains content, structuredContent, _meta) */\n mcpToolUseResult?: Record<string, unknown>;\n};\n\nexport interface MessageHandlerContext {\n session: Session;\n sessionId: string;\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(\n toolName: string,\n toolResponse?: unknown,\n parentToolCallId?: string,\n): ToolUpdateMeta {\n const meta: ToolUpdateMeta[\"claudeCode\"] = { toolName };\n if (toolResponse !== undefined) meta.toolResponse = toolResponse;\n if (parentToolCallId) meta.parentToolCallId = parentToolCallId;\n return { claudeCode: meta };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionUpdate {\n return {\n sessionUpdate: messageUpdateType(role),\n content: image(\n chunk.source.type === \"base64\" ? (chunk.source.data ?? \"\") : \"\",\n chunk.source.type === \"base64\" ? (chunk.source.media_type ?? \"\") : \"\",\n chunk.source.type === \"url\" ? chunk.source.url : undefined,\n ),\n };\n}\n\nfunction handleThinkingChunk(\n chunk: { thinking: string },\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__thinking__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionUpdate | null {\n const alreadyCached = chunk.id in ctx.toolUseCache;\n ctx.toolUseCache[chunk.id] = chunk;\n\n if (chunk.name === \"TodoWrite\") {\n const input = chunk.input as { todos?: unknown[] };\n if (Array.isArray(input.todos)) {\n return {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n return null;\n }\n\n if (!alreadyCached && ctx.registerHooks !== false) {\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n const editUpdate =\n toolUse.name === \"Edit\"\n ? toolUpdateFromEditToolResponse(toolResponse)\n : null;\n\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse, ctx.parentToolCallId),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n ...(editUpdate ? editUpdate : {}),\n },\n });\n } else {\n ctx.logger.error(\n `Got a tool response for tool use that wasn't tracked: ${toolUseId}`,\n );\n }\n },\n });\n }\n\n let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n const toolInfo = toolInfoFromToolUse(chunk, {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.id,\n cachedFileContent: ctx.fileContentCache,\n cwd: ctx.cwd,\n });\n\n const meta: Record<string, unknown> = {\n ...toolMeta(chunk.name, undefined, ctx.parentToolCallId),\n };\n if (chunk.name === \"Bash\" && ctx.supportsTerminalOutput && !alreadyCached) {\n meta.terminal_info = { terminal_id: chunk.id };\n }\n\n if (alreadyCached) {\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call_update\" as const,\n rawInput,\n ...toolInfo,\n };\n }\n\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\" as const,\n rawInput,\n status: \"pending\",\n ...toolInfo,\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n typeof (item as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((item as { text: string }).text);\n }\n }\n return parts.length > 0 ? parts.join(\"\") : null;\n }\n if (typeof content === \"string\") {\n return content;\n }\n return null;\n}\n\nfunction stripCatLineNumbers(text: string): string {\n return text.replace(/^ *\\d+[\\t→]/gm, \"\");\n}\n\nfunction updateFileContentCache(\n toolUse: { name: string; input: unknown },\n chunk: { content?: unknown },\n ctx: ChunkHandlerContext,\n): void {\n const input = toolUse.input as Record<string, unknown> | undefined;\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n if (!filePath) return;\n\n if (toolUse.name === \"Read\" && !input?.limit && !input?.offset) {\n const fileText = extractTextFromContent(chunk.content);\n if (fileText !== null) {\n ctx.fileContentCache[filePath] = stripCatLineNumbers(fileText);\n }\n } else if (toolUse.name === \"Write\") {\n const content = input?.content;\n if (typeof content === \"string\") {\n ctx.fileContentCache[filePath] = content;\n }\n } else if (toolUse.name === \"Edit\") {\n const oldString = input?.old_string;\n const newString = input?.new_string;\n if (\n typeof oldString === \"string\" &&\n typeof newString === \"string\" &&\n filePath in ctx.fileContentCache\n ) {\n const current = ctx.fileContentCache[filePath];\n ctx.fileContentCache[filePath] = input?.replace_all\n ? current.replaceAll(oldString, newString)\n : current.replace(oldString, newString);\n }\n }\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n const toolUse = ctx.toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n ctx.logger.error(\n `Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n return [];\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return [];\n }\n\n if (!chunk.is_error) {\n updateFileContentCache(toolUse, chunk, ctx);\n }\n\n const { _meta: resultMeta, ...toolUpdate } = toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.tool_use_id,\n cachedFileContent: ctx.fileContentCache,\n },\n );\n\n const updates: SessionUpdate[] = [];\n\n if (resultMeta?.terminal_output) {\n const terminalOutputMeta: Record<string, unknown> = {\n terminal_output: resultMeta.terminal_output,\n };\n if (ctx.parentToolCallId) {\n terminalOutputMeta.claudeCode = {\n parentToolCallId: ctx.parentToolCallId,\n };\n }\n updates.push({\n _meta: terminalOutputMeta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\" as const,\n });\n }\n\n const meta: Record<string, unknown> = {\n ...toolMeta(toolUse.name, undefined, ctx.parentToolCallId),\n ...(resultMeta?.terminal_exit\n ? { terminal_exit: resultMeta.terminal_exit }\n : {}),\n };\n\n updates.push({\n _meta: meta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n rawOutput: ctx.mcpToolUseResult\n ? { ...ctx.mcpToolUseResult, isError: chunk.is_error ?? false }\n : {\n content: Array.isArray(chunk.content)\n ? chunk.content\n : typeof chunk.content === \"string\"\n ? [{ type: \"text\" as const, text: chunk.content }]\n : [],\n isError: chunk.is_error ?? false,\n },\n ...toolUpdate,\n });\n\n return updates;\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\": {\n const update = handleTextChunk(chunk, role, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"image\": {\n const update = handleImageChunk(chunk, role);\n return update ? [update] : [];\n }\n\n case \"thinking\":\n case \"thinking_delta\": {\n const update = handleThinkingChunk(chunk, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\": {\n const update = handleToolUseChunk(chunk as ToolUseCache[string], ctx);\n return update ? [update] : [];\n }\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\":\n return handleToolResultChunk(\n chunk as AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx,\n );\n\n case \"document\":\n case \"search_result\":\n case \"redacted_thinking\":\n case \"input_json_delta\":\n case \"citations_delta\":\n case \"signature_delta\":\n case \"container_upload\":\n case \"compaction\":\n case \"compaction_delta\":\n return [];\n\n default:\n unreachable(chunk as never, ctx.logger);\n return [];\n }\n}\n\nfunction toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: Role,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n mcpToolUseResult?: Record<string, unknown>,\n): SessionNotification[] {\n if (typeof content === \"string\") {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return [{ sessionId, update }];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n mcpToolUseResult,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n for (const update of processContentChunk(chunk, role, ctx)) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nfunction streamEventToAcpNotifications(\n message: SDKPartialAssistantMessage,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n): SessionNotification[] {\n const event = message.event;\n switch (event.type) {\n case \"content_block_start\":\n return toAcpNotifications(\n [event.content_block],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n );\n case \"message_start\":\n case \"message_delta\":\n case \"message_stop\":\n case \"content_block_stop\":\n return [];\n\n default:\n unreachable(event as never, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: Extract<SDKMessage, { type: \"system\" }>,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n break;\n case \"compact_boundary\":\n await client.extNotification(\"_posthog/compact_boundary\", {\n sessionId,\n trigger: message.compact_metadata.trigger,\n preTokens: message.compact_metadata.pre_tokens,\n contextSize: session.contextSize,\n });\n break;\n case \"hook_response\":\n logger.info(\"Hook response received\", {\n hookName: message.hook_name,\n hookEvent: message.hook_event,\n });\n break;\n case \"status\":\n if (message.status === \"compacting\") {\n logger.info(\"Session compacting started\", { sessionId });\n await client.extNotification(\"_posthog/status\", {\n sessionId,\n status: \"compacting\",\n });\n }\n break;\n case \"task_notification\": {\n logger.info(\"Task notification received\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n });\n await client.extNotification(\"_posthog/task_notification\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n outputFile: message.output_file,\n });\n break;\n }\n default:\n break;\n }\n}\n\nexport type ResultMessageHandlerResult = {\n shouldStop: boolean;\n stopReason?: StopReason;\n error?: Error;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cachedWriteTokens: number;\n costUsd?: number;\n contextWindowSize?: number;\n };\n};\n\nexport function handleResultMessage(\n message: SDKResultMessage,\n): ResultMessageHandlerResult {\n const usage = extractUsageFromResult(message);\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n return {\n shouldStop: true,\n error: RequestError.authRequired(),\n usage,\n };\n }\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n }\n case \"error_during_execution\":\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\", usage };\n default:\n return { shouldStop: false, usage };\n }\n}\n\nfunction extractUsageFromResult(\n message: SDKResultMessage,\n): ResultMessageHandlerResult[\"usage\"] {\n const msg = message as Record<string, unknown>;\n const msgUsage = msg.usage as Record<string, number> | undefined;\n if (!msgUsage) return undefined;\n\n const modelUsage = msg.modelUsage as\n | Record<string, { contextWindow: number }>\n | undefined;\n let contextWindowSize: number | undefined;\n if (modelUsage) {\n const contextWindows = Object.values(modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n contextWindowSize = Math.min(...contextWindows);\n }\n }\n\n return {\n inputTokens: msgUsage.input_tokens ?? 0,\n outputTokens: msgUsage.output_tokens ?? 0,\n cachedReadTokens: msgUsage.cache_read_input_tokens ?? 0,\n cachedWriteTokens: msgUsage.cache_creation_input_tokens ?? 0,\n costUsd:\n typeof msg.total_cost_usd === \"number\" ? msg.total_cost_usd : undefined,\n contextWindowSize,\n };\n}\n\nexport async function handleStreamEvent(\n message: SDKPartialAssistantMessage,\n context: MessageHandlerContext,\n): Promise<void> {\n const { sessionId, client, toolUseCache, fileContentCache, logger } = context;\n const parentToolCallId = message.parent_tool_use_id ?? undefined;\n\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n context.session.cwd,\n )) {\n await client.sessionUpdate(notification);\n context.session.notificationHistory.push(notification);\n }\n}\n\nfunction hasLocalCommandStdout(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stdout>\")\n );\n}\n\nfunction hasLocalCommandStderr(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stderr>\")\n );\n}\n\nfunction isLoginRequiredMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"assistant\" &&\n message.message.model === \"<synthetic>\" &&\n Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\" &&\n message.message.content[0].text?.includes(\"Please run /login\") === true\n );\n}\n\nfunction isPlainTextUserMessage(message: AnthropicMessageWithContent): boolean {\n const content = message.message.content;\n return (\n message.type === \"user\" &&\n (typeof content === \"string\" ||\n (Array.isArray(content) &&\n content.length === 1 &&\n content[0].type === \"text\"))\n );\n}\n\nfunction shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isLoginRequiredMessage(message)\n );\n}\n\nfunction logSpecialMessages(\n message: AnthropicMessageWithContent,\n logger: Logger,\n): void {\n const content = message.message.content;\n if (hasLocalCommandStdout(content) && typeof content === \"string\") {\n logger.info(content);\n }\n if (hasLocalCommandStderr(content) && typeof content === \"string\") {\n logger.error(content);\n }\n}\n\nfunction filterMessageContent(\n content: AnthropicMessageContent,\n): AnthropicMessageContent {\n if (!Array.isArray(content)) {\n return content;\n }\n return content.filter(\n (block) => block.type !== \"text\" && block.type !== \"thinking\",\n );\n}\n\nexport async function handleUserAssistantMessage(\n message: SDKUserMessage | SDKAssistantMessage,\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n // Skip plain text user messages (already displayed by the ACP client)\n if (isPlainTextUserMessage(message)) {\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess =\n message.type === \"assistant\" ? filterMessageContent(content) : content;\n const parentToolCallId =\n \"parent_tool_use_id\" in message\n ? (message.parent_tool_use_id ?? undefined)\n : undefined;\n\n // Pass the raw MCP tool result (contains content, structuredContent, _meta)\n // so it can be forwarded as-is to the renderer for MCP Apps\n const mcpToolUseResult =\n message.type === \"user\" && message.tool_use_result != null\n ? (message.tool_use_result as Record<string, unknown>)\n : undefined;\n\n for (const notification of toAcpNotifications(\n contentToProcess as typeof content,\n message.message.role,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n session.cwd,\n mcpToolUseResult,\n )) {\n await client.sessionUpdate(notification);\n session.notificationHistory.push(notification);\n }\n\n return {};\n}\n","import type { ContentBlock, ToolCallContent } from \"@agentclientprotocol/sdk\";\n\nexport function text(value: string): ContentBlock {\n return { type: \"text\", text: value };\n}\n\nexport function image(\n data: string,\n mimeType: string,\n uri?: string,\n): ContentBlock {\n return { type: \"image\", data, mimeType, uri };\n}\n\nexport function resourceLink(\n uri: string,\n name: string,\n options?: {\n mimeType?: string;\n title?: string;\n description?: string;\n size?: number | null;\n },\n): ContentBlock {\n return {\n type: \"resource_link\",\n uri,\n name,\n ...options,\n };\n}\n\nclass ToolContentBuilder {\n private items: ToolCallContent[] = [];\n\n text(value: string): this {\n this.items.push({ type: \"content\", content: text(value) });\n return this;\n }\n\n image(data: string, mimeType: string, uri?: string): this {\n this.items.push({ type: \"content\", content: image(data, mimeType, uri) });\n return this;\n }\n\n diff(path: string, oldText: string | null, newText: string): this {\n this.items.push({ type: \"diff\", path, oldText, newText });\n return this;\n }\n\n build(): ToolCallContent[] {\n return this.items;\n }\n}\n\nexport function toolContent(): ToolContentBuilder {\n return new ToolContentBuilder();\n}\n","import type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Logger } from \"../../utils/logger\";\nimport type { SettingsManager } from \"./session/settings\";\nimport type { CodeExecutionMode } from \"./tools\";\n\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\nexport const registerHookCallback = (\n toolUseID: string,\n {\n onPostToolUseHook,\n }: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n },\n) => {\n toolUseCallbacks[toolUseID] = {\n onPostToolUseHook,\n };\n};\n\nexport type OnModeChange = (mode: CodeExecutionMode) => Promise<void>;\n\ninterface CreatePostToolUseHookParams {\n onModeChange?: OnModeChange;\n logger?: Logger;\n}\n\nexport const createPostToolUseHook =\n ({ onModeChange, logger }: CreatePostToolUseHookParams): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\") {\n const toolName = input.tool_name;\n\n if (onModeChange && toolName === \"EnterPlanMode\") {\n await onModeChange(\"plan\");\n }\n\n if (toolUseID) {\n const onPostToolUseHook =\n toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID];\n } else {\n logger?.error(\n `No onPostToolUseHook found for tool use ID: ${toolUseID}`,\n );\n delete toolUseCallbacks[toolUseID];\n }\n }\n }\n return { continue: true };\n };\n\nexport const createPreToolUseHook =\n (settingsManager: SettingsManager, logger: Logger): HookCallback =>\n async (input: HookInput, _toolUseID: string | undefined) => {\n if (input.hook_event_name !== \"PreToolUse\") {\n return { continue: true };\n }\n\n const toolName = input.tool_name;\n const toolInput = input.tool_input;\n const permissionCheck = settingsManager.checkPermission(\n toolName,\n toolInput,\n );\n\n if (permissionCheck.decision !== \"ask\") {\n logger.info(\n `[PreToolUseHook] Tool: ${toolName}, Decision: ${permissionCheck.decision}, Rule: ${permissionCheck.rule}`,\n );\n }\n\n switch (permissionCheck.decision) {\n case \"allow\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"allow\" as const,\n permissionDecisionReason: `Allowed by settings rule: ${permissionCheck.rule}`,\n },\n };\n case \"deny\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: `Denied by settings rule: ${permissionCheck.rule}`,\n },\n };\n default:\n return { continue: true };\n }\n };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\n ToolCallLocation,\n ToolCallUpdate,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type {\n ToolResultBlockParam,\n ToolUseBlock,\n WebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaBashCodeExecutionToolResultBlockParam,\n BetaCodeExecutionToolResultBlockParam,\n BetaRequestMCPToolResultBlockParam,\n BetaTextEditorCodeExecutionToolResultBlockParam,\n BetaToolSearchToolResultBlockParam,\n BetaWebFetchToolResultBlockParam,\n BetaWebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\n\nconst SYSTEM_REMINDER_REGEX =\n /\\s*<system-reminder>[\\s\\S]*?<\\/system-reminder>/g;\n\nfunction stripSystemReminders(value: string): string {\n return value.replace(SYSTEM_REMINDER_REGEX, \"\");\n}\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content\";\nimport { getMcpToolMetadata } from \"../mcp/tool-metadata\";\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\n/**\n * Convert an absolute file path to a project-relative path for display.\n * Returns the original path if it's outside the project directory or if no cwd is provided.\n */\nexport function toDisplayPath(filePath: string, cwd?: string): string {\n if (!cwd) return filePath;\n const resolvedCwd = path.resolve(cwd);\n const resolvedFile = path.resolve(filePath);\n if (\n resolvedFile.startsWith(resolvedCwd + path.sep) ||\n resolvedFile === resolvedCwd\n ) {\n return path.relative(resolvedCwd, resolvedFile);\n }\n return filePath;\n}\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n cwd?: string;\n },\n): ToolInfo {\n const name = toolUse.name;\n const input = toolUse.input as Record<string, unknown> | undefined;\n\n switch (name) {\n case \"Task\":\n case \"Agent\":\n return {\n title: input?.description ? String(input.description) : name,\n kind: \"think\",\n content: input?.prompt\n ? toolContent().text(String(input.prompt)).build()\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${String(input.notebook_path)}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${String(input.notebook_path)}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? toolContent().text(String(input.new_source)).build()\n : [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"Bash\":\n if (options?.supportsTerminalOutput && options?.toolUseId) {\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: [{ type: \"terminal\", terminalId: options.toolUseId }],\n };\n }\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: input?.command\n ? toolContent().text(String(input.command)).build()\n : [],\n };\n\n case \"BashOutput\":\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case \"Read\": {\n let limit = \"\";\n const inputLimit = input?.limit as number | undefined;\n const inputOffset = (input?.offset as number | undefined) ?? 1;\n if (inputLimit) {\n limit = ` (${inputOffset} - ${inputOffset + inputLimit - 1})`;\n } else if (inputOffset > 1) {\n limit = ` (from line ${inputOffset})`;\n }\n const displayPath = input?.file_path\n ? toDisplayPath(String(input.file_path), options?.cwd)\n : \"File\";\n return {\n title: `Read ${displayPath}${limit}`,\n kind: \"read\",\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: inputOffset,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${String(input.path)}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case \"Edit\": {\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const displayPath = filePath\n ? toDisplayPath(filePath, options?.cwd)\n : undefined;\n let oldText: string | null = input?.old_string\n ? String(input.old_string)\n : null;\n let newText: string = input?.new_string ? String(input.new_string) : \"\";\n\n // try to display a rich diff by first checking if file content is cached\n // and valid (old_text exists in the content), then fall back to reading\n // file from disk, then fall back to fragemented snippet diff\n if (filePath && oldText !== null) {\n const fileContent = resolveFileContent(\n filePath,\n oldText,\n options?.cachedFileContent,\n );\n if (fileContent) {\n const newContent = input?.replace_all\n ? fileContent.replaceAll(oldText, newText)\n : fileContent.replace(oldText, newText);\n oldText = fileContent;\n newText = newContent;\n }\n }\n\n return {\n title: displayPath ? `Edit \\`${displayPath}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && filePath\n ? [\n {\n type: \"diff\",\n path: filePath,\n oldText,\n newText,\n },\n ]\n : [],\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const writeFilePath = input?.file_path\n ? String(input.file_path)\n : undefined;\n const writeDisplayPath = writeFilePath\n ? toDisplayPath(writeFilePath, options?.cwd)\n : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (writeFilePath) {\n const oldContent =\n options?.cachedFileContent &&\n writeFilePath in options.cachedFileContent\n ? options.cachedFileContent[writeFilePath]\n : null;\n contentResult = toolContent()\n .diff(writeFilePath, oldContent, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: writeDisplayPath ? `Write ${writeDisplayPath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: writeFilePath ? [{ path: writeFilePath }] : [],\n };\n }\n\n case \"Glob\": {\n let label = \"Find\";\n const pathStr = input?.path ? String(input.path) : undefined;\n if (pathStr) {\n label += ` \"${pathStr}\"`;\n }\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: pathStr ? [{ path: pathStr }] : [],\n };\n }\n\n case \"Grep\": {\n let label = \"grep\";\n\n if (input?.[\"-i\"]) {\n label += \" -i\";\n }\n if (input?.[\"-n\"]) {\n label += \" -n\";\n }\n\n if (input?.[\"-A\"] !== undefined) {\n label += ` -A ${input[\"-A\"]}`;\n }\n if (input?.[\"-B\"] !== undefined) {\n label += ` -B ${input[\"-B\"]}`;\n }\n if (input?.[\"-C\"] !== undefined) {\n label += ` -C ${input[\"-C\"]}`;\n }\n\n if (input?.output_mode) {\n switch (input.output_mode) {\n case \"files_with_matches\":\n label += \" -l\";\n break;\n case \"count\":\n label += \" -c\";\n break;\n default:\n break;\n }\n }\n\n if (input?.head_limit !== undefined) {\n label += ` | head -${input.head_limit}`;\n }\n\n if (input?.glob) {\n label += ` --include=\"${String(input.glob)}\"`;\n }\n\n if (input?.type) {\n label += ` --type=${String(input.type)}`;\n }\n\n if (input?.multiline) {\n label += \" -P\";\n }\n\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n\n if (input?.path) {\n label += ` ${String(input.path)}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: \"Fetch\",\n kind: \"fetch\",\n content: input?.url\n ? [\n {\n type: \"content\",\n content: resourceLink(String(input.url), String(input.url), {\n description: input?.prompt ? String(input.prompt) : undefined,\n }),\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input?.query ? String(input.query) : \"\"}\"`;\n const allowedDomains = input?.allowed_domains as string[] | undefined;\n const blockedDomains = input?.blocked_domains as string[] | undefined;\n\n if (allowedDomains && allowedDomains.length > 0) {\n label += ` (allowed: ${allowedDomains.join(\", \")})`;\n }\n\n if (blockedDomains && blockedDomains.length > 0) {\n label += ` (blocked: ${blockedDomains.join(\", \")})`;\n }\n\n return {\n title: label,\n kind: \"fetch\",\n content: [],\n };\n }\n\n case \"TodoWrite\":\n return {\n title: Array.isArray(input?.todos)\n ? `Update TODOs: ${input.todos.map((todo: { content?: string }) => todo.content).join(\", \")}`\n : \"Update TODOs\",\n kind: \"think\",\n content: [],\n };\n\n case \"ExitPlanMode\":\n return {\n title: \"Ready to code?\",\n kind: \"switch_mode\",\n content: input?.plan\n ? toolContent().text(String(input.plan)).build()\n : [],\n };\n\n case \"AskUserQuestion\": {\n const questions = input?.questions as\n | Array<{ question?: string }>\n | undefined;\n return {\n title: questions?.[0]?.question || \"Question\",\n kind: \"other\" as ToolKind,\n content: questions\n ? toolContent()\n .text(JSON.stringify(questions, null, 2))\n .build()\n : [],\n };\n }\n\n case \"Other\": {\n let output: string;\n try {\n output = JSON.stringify(input, null, 2);\n } catch {\n output = typeof input === \"string\" ? input : \"{}\";\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: toolContent().text(`\\`\\`\\`json\\n${output}\\`\\`\\``).build(),\n };\n }\n\n default: {\n if (name?.startsWith(\"mcp__\")) {\n return mcpToolInfo(name, input);\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\n }\n}\n\nfunction mcpToolInfo(\n name: string,\n _input: Record<string, unknown> | undefined,\n): ToolInfo {\n const metadata = getMcpToolMetadata(name);\n // Fallback: parse tool name from mcp__<server>__<tool> prefix\n const title =\n metadata?.name ?? (name.split(\"__\").slice(2).join(\"__\") || name);\n\n return {\n title,\n kind: \"other\",\n content: [],\n };\n}\n\ninterface StructuredPatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface StructuredPatch {\n oldFileName: string;\n newFileName: string;\n hunks: StructuredPatchHunk[];\n}\n\nexport function toolUpdateFromEditToolResponse(\n toolResponse: unknown,\n): { content: ToolCallContent[]; locations: ToolCallLocation[] } | null {\n if (!toolResponse || typeof toolResponse !== \"object\") return null;\n const response = toolResponse as Record<string, unknown>;\n\n const patches = response.structuredPatch as StructuredPatch[] | undefined;\n if (!Array.isArray(patches) || patches.length === 0) return null;\n\n const content: ToolCallContent[] = [];\n const locations: ToolCallLocation[] = [];\n\n for (const patch of patches) {\n if (!patch.hunks || patch.hunks.length === 0) continue;\n\n const filePath = patch.newFileName || patch.oldFileName;\n\n const oldLines: string[] = [];\n const newLines: string[] = [];\n for (const hunk of patch.hunks) {\n for (const line of hunk.lines) {\n if (line.startsWith(\"-\")) {\n oldLines.push(line.slice(1));\n } else if (line.startsWith(\"+\")) {\n newLines.push(line.slice(1));\n } else if (line.startsWith(\" \")) {\n oldLines.push(line.slice(1));\n newLines.push(line.slice(1));\n }\n }\n }\n\n content.push({\n type: \"diff\",\n path: filePath,\n oldText: oldLines.join(\"\\n\"),\n newText: newLines.join(\"\\n\"),\n });\n\n const firstHunk = patch.hunks[0];\n locations.push({\n path: filePath,\n line: firstHunk.newStart,\n });\n }\n\n if (content.length === 0) return null;\n return { content, locations };\n}\n\nexport function toolUpdateFromToolResult(\n toolResult:\n | ToolResultBlockParam\n | BetaWebSearchToolResultBlockParam\n | BetaWebFetchToolResultBlockParam\n | WebSearchToolResultBlockParam\n | BetaCodeExecutionToolResultBlockParam\n | BetaBashCodeExecutionToolResultBlockParam\n | BetaTextEditorCodeExecutionToolResultBlockParam\n | BetaRequestMCPToolResultBlockParam\n | BetaToolSearchToolResultBlockParam,\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\"> | undefined,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n },\n): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\" | \"_meta\"> {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n (toolResult.content as unknown[]).length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n\n switch (toolUse?.name) {\n case \"Read\":\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((item) => {\n const itemObj = item as {\n type?: string;\n text?: string;\n source?: { data?: string; media_type?: string };\n };\n if (itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(\n markdownEscape(stripSystemReminders(itemObj.text ?? \"\")),\n ),\n };\n }\n if (itemObj.type === \"image\" && itemObj.source) {\n return {\n type: \"content\" as const,\n content: {\n type: \"image\" as const,\n data: itemObj.source.data ?? \"\",\n mimeType: itemObj.source.media_type ?? \"image/png\",\n },\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: toolContent()\n .text(markdownEscape(stripSystemReminders(toolResult.content)))\n .build(),\n };\n }\n return {};\n\n case \"Bash\": {\n const result = toolResult.content;\n const terminalId =\n \"tool_use_id\" in toolResult ? String(toolResult.tool_use_id) : \"\";\n const isError = \"is_error\" in toolResult && toolResult.is_error;\n\n let output = \"\";\n let exitCode = isError ? 1 : 0;\n\n if (\n result &&\n typeof result === \"object\" &&\n \"type\" in result &&\n (result as { type: string }).type === \"bash_code_execution_result\"\n ) {\n const bashResult = result as {\n stdout?: string;\n stderr?: string;\n return_code: number;\n };\n output = [bashResult.stdout, bashResult.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n exitCode = bashResult.return_code;\n } else if (typeof result === \"string\") {\n output = result;\n } else if (\n Array.isArray(result) &&\n result.length > 0 &&\n \"text\" in result[0] &&\n typeof result[0].text === \"string\"\n ) {\n output = result.map((c: { text?: string }) => c.text ?? \"\").join(\"\\n\");\n }\n\n if (options?.supportsTerminalOutput) {\n return {\n content: [{ type: \"terminal\" as const, terminalId }],\n _meta: {\n terminal_info: {\n terminal_id: terminalId,\n },\n terminal_output: {\n terminal_id: terminalId,\n data: output,\n },\n terminal_exit: {\n terminal_id: terminalId,\n exit_code: exitCode,\n signal: null,\n },\n },\n };\n }\n if (output.trim()) {\n return {\n content: toolContent()\n .text(`\\`\\`\\`console\\n${output.trimEnd()}\\n\\`\\`\\``)\n .build(),\n };\n }\n return {};\n }\n case \"Edit\":\n case \"Write\":\n return {};\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\n }\n case \"AskUserQuestion\": {\n const content = toolResult.content;\n if (Array.isArray(content) && content.length > 0) {\n const firstItem = content[0];\n if (\n typeof firstItem === \"object\" &&\n firstItem !== null &&\n \"text\" in firstItem\n ) {\n return {\n title: \"Answer received\",\n content: toolContent().text(String(firstItem.text)).build(),\n };\n }\n }\n return { title: \"Question answered\" };\n }\n case \"WebFetch\": {\n const input = toolUse?.input as Record<string, unknown> | undefined;\n const url = input?.url ? String(input.url) : \"\";\n const prompt = input?.prompt ? String(input.prompt) : undefined;\n\n const resultContent = toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n\n const content: ToolCallContent[] = [];\n if (url) {\n content.push({\n type: \"content\",\n content: resourceLink(url, url, {\n description: prompt,\n }),\n });\n }\n if (resultContent.content) {\n content.push(...resultContent.content);\n }\n\n return { content };\n }\n default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n }\n}\n\nfunction itemToText(item: unknown): string | null {\n if (!item || typeof item !== \"object\") return null;\n const obj = item as Record<string, unknown>;\n // Standard text block\n if (obj.type === \"text\" && typeof obj.text === \"string\") {\n return stripSystemReminders(obj.text);\n }\n // Any other structured object — serialize it\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return null;\n }\n}\n\nfunction toAcpContentUpdate(\n content: unknown,\n isError: boolean = false,\n): Pick<ToolCallUpdate, \"content\"> {\n if (Array.isArray(content) && content.length > 0) {\n const texts: string[] = [];\n for (const item of content) {\n const t = itemToText(item);\n if (t) texts.push(t);\n }\n if (texts.length > 0) {\n const combined = texts.join(\"\\n\");\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${combined}\\n\\`\\`\\`` : combined)\n .build(),\n };\n }\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content)\n .build(),\n };\n } else if (content && typeof content === \"object\") {\n try {\n const json = JSON.stringify(content, null, 2);\n if (json && json !== \"{}\") {\n return {\n content: toolContent().text(json).build(),\n };\n }\n } catch {\n // ignore serialization errors\n }\n }\n return {};\n}\n\nexport type ClaudePlanEntry = {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n};\n\nexport function planEntries(input: { todos: ClaudePlanEntry[] }): PlanEntry[] {\n return input.todos.map((input) => ({\n content: input.content,\n status: input.status,\n priority: \"medium\",\n }));\n}\n\n/**\n * attempt to resolve full file contents for diff generation\n *\n * 1) check file content cache exists, and is valid (old_text in content)\n * 2) if missing or invalid, read file from disk\n * 3) if both fail, return null, we'll fall back to fragmented snippet diff\n */\nfunction resolveFileContent(\n filePath: string,\n oldText: string,\n cachedFileContent?: Record<string, string>,\n): string | null {\n if (cachedFileContent && filePath in cachedFileContent) {\n const cached = cachedFileContent[filePath];\n if (cached.includes(oldText)) {\n return cached;\n }\n }\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n if (content.includes(oldText)) {\n return content;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction markdownEscape(text: string): string {\n let escapedText = \"```\";\n for (const [m] of text.matchAll(/^```+/gm)) {\n while (m.length >= escapedText.length) {\n escapedText += \"`\";\n }\n }\n return `${escapedText}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${escapedText}`;\n}\n","import type { McpServerStatus, Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Logger } from \"../../../utils/logger\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n name: string;\n description?: string;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nconst PENDING_RETRY_INTERVAL_MS = 1_000;\nconst PENDING_MAX_RETRIES = 10;\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function fetchMcpToolMetadata(\n q: Query,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n let retries = 0;\n\n while (retries <= PENDING_MAX_RETRIES) {\n let statuses: McpServerStatus[];\n try {\n statuses = await q.mcpServerStatus();\n } catch (error) {\n logger.error(\"Failed to fetch MCP server status\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n\n const pendingServers = statuses.filter((s) => s.status === \"pending\");\n\n for (const server of statuses) {\n if (server.status !== \"connected\" || !server.tools) {\n continue;\n }\n\n let readOnlyCount = 0;\n for (const tool of server.tools) {\n const toolKey = buildToolKey(server.name, tool.name);\n const readOnly = tool.annotations?.readOnly === true;\n\n mcpToolMetadataCache.set(toolKey, {\n readOnly,\n name: tool.name,\n description: tool.description,\n });\n if (readOnly) readOnlyCount++;\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName: server.name,\n toolCount: server.tools.length,\n readOnlyCount,\n });\n }\n\n if (pendingServers.length === 0) {\n return;\n }\n\n retries++;\n if (retries > PENDING_MAX_RETRIES) {\n logger.warn(\"Gave up waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n });\n return;\n }\n\n logger.info(\"Waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n retry: retries,\n });\n await delay(PENDING_RETRY_INTERVAL_MS);\n }\n}\n\nexport function getMcpToolMetadata(\n toolName: string,\n): McpToolMetadata | undefined {\n return mcpToolMetadataCache.get(toolName);\n}\n\nexport function isMcpToolReadOnly(toolName: string): boolean {\n const metadata = mcpToolMetadataCache.get(toolName);\n return metadata?.readOnly === true;\n}\n\nexport function getConnectedMcpServerNames(): string[] {\n const names = new Set<string>();\n for (const key of mcpToolMetadataCache.keys()) {\n const parts = key.split(\"__\");\n if (parts.length >= 3) names.add(parts[1]);\n }\n return [...names];\n}\n\nexport function clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\n\nfunction getClaudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n}\n\nexport function getClaudePlansDir(): string {\n return path.join(getClaudeConfigDir(), \"plans\");\n}\n\nexport function isClaudePlanFilePath(filePath: string | undefined): boolean {\n if (!filePath) return false;\n const resolved = path.resolve(filePath);\n const plansDir = path.resolve(getClaudePlansDir());\n return resolved === plansDir || resolved.startsWith(plansDir + path.sep);\n}\n\nexport function isPlanReady(plan: string | undefined): boolean {\n if (!plan) return false;\n const trimmed = plan.trim();\n if (trimmed.length < 40) return false;\n return /(^|\\n)#{1,6}\\s+\\S/.test(trimmed);\n}\n\nexport function getLatestAssistantText(\n notifications: SessionNotification[],\n): string | null {\n const chunks: string[] = [];\n let started = false;\n\n for (let i = notifications.length - 1; i >= 0; i -= 1) {\n const update = notifications[i]?.update;\n if (!update) continue;\n\n if (update.sessionUpdate === \"agent_message_chunk\") {\n started = true;\n const content = update.content as {\n type?: string;\n text?: string;\n } | null;\n if (content?.type === \"text\" && content.text) {\n chunks.push(content.text);\n }\n continue;\n }\n\n if (started) {\n break;\n }\n }\n\n if (chunks.length === 0) return null;\n return chunks.reverse().join(\"\");\n}\n","import type { ToolCallContent, ToolKind } from \"@agentclientprotocol/sdk\";\nimport { z } from \"zod\";\nimport type { PermissionOption } from \"../permissions/permission-options\";\n\nexport const OPTION_PREFIX = \"option_\";\n\nexport const QuestionOptionSchema = z.object({\n label: z.string(),\n description: z.string().optional(),\n});\n\nexport const QuestionItemSchema = z.object({\n question: z.string(),\n header: z.string().optional(),\n options: z.array(QuestionOptionSchema),\n multiSelect: z.boolean().optional(),\n completed: z.boolean().optional(),\n});\n\nexport const QuestionMetaSchema = z.object({\n questions: z.array(QuestionItemSchema),\n});\n\nexport type QuestionOption = z.infer<typeof QuestionOptionSchema>;\nexport type QuestionItem = z.infer<typeof QuestionItemSchema>;\nexport type QuestionMeta = z.infer<typeof QuestionMetaSchema>;\n\nexport interface AskUserQuestionInput {\n questions?: QuestionItem[];\n question?: string;\n header?: string;\n options?: QuestionOption[];\n multiSelect?: boolean;\n}\n\nexport function normalizeAskUserQuestionInput(\n input: AskUserQuestionInput,\n): QuestionItem[] | null {\n if (input.questions && input.questions.length > 0) {\n return input.questions;\n }\n\n if (input.question) {\n return [\n {\n question: input.question,\n header: input.header,\n options: input.options || [],\n multiSelect: input.multiSelect,\n },\n ];\n }\n\n return null;\n}\n\ninterface QuestionToolCallData {\n toolCallId: string;\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n _meta: {\n codeToolKind: \"question\";\n questions: QuestionItem[];\n };\n}\n\nexport function buildQuestionToolCallData(\n questions: QuestionItem[],\n): QuestionToolCallData {\n return {\n toolCallId: `question-${Date.now()}`,\n title: questions[0]?.question ?? \"Question\",\n kind: \"other\",\n content: [],\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n };\n}\n\nexport function buildQuestionOptions(\n question: QuestionItem,\n): PermissionOption[] {\n return question.options.map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n","import { IS_ROOT } from \"./utils/common\";\n\nexport interface ModeInfo {\n id: CodeExecutionMode;\n name: string;\n description: string;\n}\n\n// Helper constant that can easily be toggled for env/feature flag/etc\nconst ALLOW_BYPASS = !IS_ROOT;\n\nconst availableModes: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Default\",\n description: \"Standard behavior, prompts for dangerous operations\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Auto-accept file edit operations\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Planning mode, no actual tool execution\",\n },\n // {\n // id: \"dontAsk\",\n // name: \"Don't Ask\",\n // description: \"Don't prompt for permissions, deny if not pre-approved\",\n // },\n];\n\nif (ALLOW_BYPASS) {\n availableModes.push({\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Bypass all permission checks\",\n });\n}\n\n// Expose execution mode IDs in type-safe order for type checks\nexport const CODE_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n // \"dontAsk\",\n \"bypassPermissions\",\n] as const;\n\nexport type CodeExecutionMode = (typeof CODE_EXECUTION_MODES)[number];\n\nexport function getAvailableModes(): ModeInfo[] {\n // When IS_ROOT, do not allow bypassPermissions\n return IS_ROOT\n ? availableModes.filter((m) => m.id !== \"bypassPermissions\")\n : availableModes;\n}\n","export {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n type ModeInfo,\n} from \"../../execution-mode\";\n\nimport type { CodeExecutionMode } from \"../../execution-mode\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata\";\n\nexport const READ_TOOLS: Set<string> = new Set([\"Read\", \"NotebookRead\"]);\n\nexport const WRITE_TOOLS: Set<string> = new Set([\n \"Edit\",\n \"Write\",\n \"NotebookEdit\",\n]);\n\nexport const BASH_TOOLS: Set<string> = new Set([\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n]);\n\nexport const SEARCH_TOOLS: Set<string> = new Set([\"Glob\", \"Grep\", \"LS\"]);\n\nexport const WEB_TOOLS: Set<string> = new Set([\"WebSearch\", \"WebFetch\"]);\n\nexport const AGENT_TOOLS: Set<string> = new Set([\n \"Task\",\n \"Agent\",\n \"TodoWrite\",\n \"Skill\",\n]);\n\nconst BASE_ALLOWED_TOOLS = [\n ...READ_TOOLS,\n ...SEARCH_TOOLS,\n ...WEB_TOOLS,\n ...AGENT_TOOLS,\n];\n\nconst AUTO_ALLOWED_TOOLS: Record<string, Set<string>> = {\n default: new Set(BASE_ALLOWED_TOOLS),\n acceptEdits: new Set([...BASE_ALLOWED_TOOLS, ...WRITE_TOOLS]),\n plan: new Set(BASE_ALLOWED_TOOLS),\n // dontAsk: new Set(BASE_ALLOWED_TOOLS),\n};\n\nexport function isToolAllowedForMode(\n toolName: string,\n mode: CodeExecutionMode,\n): boolean {\n if (mode === \"bypassPermissions\") {\n return true;\n }\n if (AUTO_ALLOWED_TOOLS[mode]?.has(toolName) === true) {\n return true;\n }\n if (isMcpToolReadOnly(toolName)) {\n return true;\n }\n return false;\n}\n","import type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools\";\n\nexport interface PermissionOption {\n kind: \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n name: string;\n optionId: string;\n _meta?: { description?: string; customInput?: boolean };\n}\n\nfunction permissionOptions(allowAlwaysLabel: string): PermissionOption[] {\n return [\n { kind: \"allow_once\", name: \"Yes\", optionId: \"allow\" },\n { kind: \"allow_always\", name: allowAlwaysLabel, optionId: \"allow_always\" },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject\",\n _meta: { customInput: true },\n },\n ];\n}\n\nexport function buildPermissionOptions(\n toolName: string,\n toolInput: Record<string, unknown>,\n cwd?: string,\n suggestions?: PermissionUpdate[],\n): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const rawRuleContent = suggestions\n ?.flatMap((s) => (\"rules\" in s ? s.rules : []))\n .find((r) => r.toolName === \"Bash\" && r.ruleContent)?.ruleContent;\n const ruleContent = rawRuleContent?.replace(/:?\\*$/, \"\");\n\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n const label = ruleContent ?? `\\`${cmdName}\\` commands`;\n\n return permissionOptions(\n `Yes, and don't ask again for ${label}${cwdLabel}`,\n );\n }\n\n if (toolName === \"BashOutput\") {\n return permissionOptions(\"Yes, allow all background process reads\");\n }\n\n if (toolName === \"KillShell\") {\n return permissionOptions(\"Yes, allow killing processes\");\n }\n\n if (WRITE_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all edits during this session\");\n }\n\n if (READ_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all reads during this session\");\n }\n\n if (SEARCH_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all searches during this session\");\n }\n\n if (toolName === \"WebFetch\") {\n const url = toolInput?.url as string | undefined;\n let domain = \"\";\n try {\n domain = url ? new URL(url).hostname : \"\";\n } catch {}\n return permissionOptions(\n domain\n ? `Yes, allow all fetches from ${domain}`\n : \"Yes, allow all fetches\",\n );\n }\n\n if (toolName === \"WebSearch\") {\n return permissionOptions(\"Yes, allow all web searches\");\n }\n\n if (toolName === \"Task\") {\n return permissionOptions(\"Yes, allow all sub-tasks\");\n }\n\n if (toolName === \"TodoWrite\") {\n return permissionOptions(\"Yes, allow all todo updates\");\n }\n\n return permissionOptions(\"Yes, always allow\");\n}\n\nconst ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;\n\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n const options: PermissionOption[] = [];\n\n if (ALLOW_BYPASS) {\n options.push({\n kind: \"allow_always\",\n name: \"Yes, bypass all permissions\",\n optionId: \"bypassPermissions\",\n });\n }\n\n options.push(\n {\n kind: \"allow_always\",\n name: \"Yes, and auto-accept edits\",\n optionId: \"acceptEdits\",\n },\n {\n kind: \"allow_once\",\n name: \"Yes, and manually approve edits\",\n optionId: \"default\",\n },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject_with_feedback\",\n _meta: { customInput: true },\n },\n );\n\n return options;\n}\n","import type {\n AgentSideConnection,\n RequestPermissionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { text } from \"../../../utils/acp-content\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools\";\nimport type { Session } from \"../types\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options\";\n\nexport type ToolPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput: Record<string, unknown>;\n updatedPermissions?: PermissionUpdate[];\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n };\n\ninterface ToolHandlerContext {\n session: Session;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseID: string;\n suggestions?: PermissionUpdate[];\n signal?: AbortSignal;\n client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n updateConfigOption: (configId: string, value: string) => Promise<void>;\n allowedDomains?: string[];\n}\n\nasync function emitToolDenial(\n context: ToolHandlerContext,\n message: string,\n): Promise<void> {\n context.logger.info(`[canUseTool] Tool denied: ${context.toolName}`, {\n message,\n });\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: context.toolUseID,\n status: \"failed\",\n content: [{ type: \"content\", content: text(message) }],\n },\n });\n}\n\nfunction getPlanFromFile(\n session: Session,\n fileContentCache: { [key: string]: string },\n): string | undefined {\n return (\n session.lastPlanContent ||\n (session.lastPlanFilePath\n ? fileContentCache[session.lastPlanFilePath]\n : undefined)\n );\n}\n\nfunction ensurePlanInInput(\n toolInput: Record<string, unknown>,\n fallbackPlan: string | undefined,\n): Record<string, unknown> {\n const hasPlan = typeof (toolInput as { plan?: unknown })?.plan === \"string\";\n if (hasPlan || !fallbackPlan) {\n return toolInput;\n }\n return { ...toolInput, plan: fallbackPlan };\n}\n\nfunction extractPlanText(input: Record<string, unknown>): string | undefined {\n const plan = (input as { plan?: unknown })?.plan;\n return typeof plan === \"string\" ? plan : undefined;\n}\n\nasync function createPlanValidationError(\n message: string,\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n}\n\nasync function validatePlanContent(\n planText: string | undefined,\n context: ToolHandlerContext,\n): Promise<{ valid: true } | { valid: false; error: ToolPermissionResult }> {\n if (!planText) {\n const message = `Plan not ready. Provide the full markdown plan in ExitPlanMode or write it to ${getClaudePlansDir()} before requesting approval.`;\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n if (!isPlanReady(planText)) {\n const message =\n \"Plan not ready. Provide the full markdown plan in ExitPlanMode before requesting approval.\";\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n return { valid: true };\n}\n\nasync function requestPlanApproval(\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<RequestPermissionResponse> {\n const { client, sessionId, toolUseID } = context;\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: updatedInput,\n });\n\n return await client.requestPermission({\n options: buildExitPlanModePermissionOptions(),\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...updatedInput, toolName: context.toolName },\n },\n });\n}\n\nasync function applyPlanApproval(\n response: RequestPermissionResponse,\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<ToolPermissionResult> {\n const { session } = context;\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"default\" ||\n response.outcome.optionId === \"acceptEdits\" ||\n response.outcome.optionId === \"bypassPermissions\")\n ) {\n session.permissionMode = response.outcome\n .optionId as typeof session.permissionMode;\n await session.query.setPermissionMode(response.outcome.optionId);\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: response.outcome.optionId,\n },\n });\n await context.updateConfigOption(\"mode\", response.outcome.optionId);\n\n return {\n behavior: \"allow\",\n updatedInput,\n updatedPermissions: context.suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"localSettings\",\n },\n ],\n };\n }\n\n const customInput = (response._meta as Record<string, unknown> | undefined)\n ?.customInput as string | undefined;\n const feedback = customInput?.trim();\n\n const message = feedback\n ? `User rejected the plan with feedback: ${feedback}`\n : \"User rejected the plan. Wait for the user to provide direction.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: !feedback };\n}\n\nasync function handleEnterPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.updateConfigOption(\"mode\", \"plan\");\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nasync function handleExitPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput, fileContentCache } = context;\n\n const planFromFile = getPlanFromFile(session, fileContentCache);\n const latestText = getLatestAssistantText(session.notificationHistory);\n const fallbackPlan = planFromFile || (latestText ?? undefined);\n const updatedInput = ensurePlanInInput(toolInput, fallbackPlan);\n const planText = extractPlanText(updatedInput);\n\n const validationResult = await validatePlanContent(planText, context);\n if (!validationResult.valid) {\n return validationResult.error;\n }\n\n const response = await requestPlanApproval(context, updatedInput);\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n return await applyPlanApproval(response, context, updatedInput);\n}\n\nfunction buildQuestionOptions(question: QuestionItem) {\n return (question.options || []).map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n\nasync function handleAskUserQuestionTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const input = context.toolInput as AskUserQuestionInput;\n context.logger.info(\"[AskUserQuestion] Received input\", { input });\n const questions = normalizeAskUserQuestionInput(input);\n context.logger.info(\"[AskUserQuestion] Normalized questions\", { questions });\n\n if (!questions || questions.length === 0) {\n context.logger.warn(\"[AskUserQuestion] No questions found in input\");\n return {\n behavior: \"deny\",\n message: \"No questions provided\",\n };\n }\n\n const { client, sessionId, toolUseID, toolInput } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: toolInput,\n });\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: firstQuestion.question,\n kind: \"other\",\n content: toolInfo.content,\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (response.outcome?.outcome !== \"selected\") {\n const customMessage = (\n response._meta as Record<string, unknown> | undefined\n )?.message;\n return {\n behavior: \"deny\",\n message:\n typeof customMessage === \"string\"\n ? customMessage\n : \"User cancelled the questions\",\n };\n }\n\n const answers = response._meta?.answers as Record<string, string> | undefined;\n if (!answers || Object.keys(answers).length === 0) {\n return {\n behavior: \"deny\",\n message: \"User did not provide answers\",\n };\n }\n\n return {\n behavior: \"allow\",\n updatedInput: {\n ...(context.toolInput as Record<string, unknown>),\n answers,\n },\n };\n}\n\nasync function handleDefaultPermissionFlow(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const {\n session,\n toolName,\n toolInput,\n toolUseID,\n client,\n sessionId,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse({ name: toolName, input: toolInput });\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\n suggestions,\n );\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...(toolInput as Record<string, unknown>), toolName },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"localSettings\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n } else {\n const message = \"User refused permission to run tool\";\n await emitToolDenial(context, message);\n return {\n behavior: \"deny\",\n message,\n };\n }\n}\n\nfunction handlePlanFileException(\n context: ToolHandlerContext,\n): ToolPermissionResult | null {\n const { session, toolName, toolInput } = context;\n\n if (session.permissionMode !== \"plan\" || !WRITE_TOOLS.has(toolName)) {\n return null;\n }\n\n const filePath = (toolInput as { file_path?: string })?.file_path;\n if (!isClaudePlanFilePath(filePath)) {\n return null;\n }\n\n session.lastPlanFilePath = filePath;\n const content = (toolInput as { content?: string })?.content;\n if (typeof content === \"string\") {\n session.lastPlanContent = content;\n }\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nfunction extractDomainFromUrl(url: string): string | null {\n try {\n return new URL(url).hostname;\n } catch {\n return null;\n }\n}\n\nfunction isDomainAllowed(hostname: string, allowedDomains: string[]): boolean {\n return allowedDomains.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".example.com\"\n return hostname === pattern.slice(2) || hostname.endsWith(suffix);\n }\n return hostname === pattern;\n });\n}\n\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session, allowedDomains } = context;\n\n // Enforce domain allowlist for web tools\n if (allowedDomains && allowedDomains.length > 0) {\n if (toolName === \"WebFetch\" || toolName === \"WebSearch\") {\n const url = toolInput.url as string | undefined;\n if (url) {\n const hostname = extractDomainFromUrl(url);\n if (hostname && !isDomainAllowed(hostname, allowedDomains)) {\n const message = `Domain \"${hostname}\" is not in the allowed list: ${allowedDomains.join(\", \")}`;\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n }\n }\n }\n }\n\n if (isToolAllowedForMode(toolName, session.permissionMode)) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n }\n\n if (toolName === \"EnterPlanMode\") {\n return handleEnterPlanModeTool(context);\n }\n\n if (toolName === \"ExitPlanMode\") {\n return handleExitPlanModeTool(context);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return handleAskUserQuestionTool(context);\n }\n\n const planFileResult = handlePlanFileException(context);\n if (planFileResult) {\n return planFileResult;\n }\n\n // if (session.permissionMode === \"dontAsk\") {\n // const message = \"Tool not pre-approved. Denied by dontAsk mode.\";\n // await emitToolDenial(context, message);\n // return { behavior: \"deny\", message, interrupt: false };\n // }\n\n return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { SlashCommand } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"keybindings-help\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport function getAvailableSlashCommands(\n commands: SlashCommand[],\n): AvailableCommand[] {\n return commands\n .map((command) => {\n const input =\n command.argumentHint != null\n ? {\n hint: Array.isArray(command.argumentHint)\n ? command.argumentHint.join(\" \")\n : command.argumentHint,\n }\n : null;\n let name = command.name;\n if (command.name.endsWith(\" (MCP)\")) {\n name = `mcp:${name.replace(\" (MCP)\", \"\")}`;\n }\n return {\n name,\n description: command.description || \"\",\n input,\n };\n })\n .filter(\n (command: AvailableCommand) =>\n !UNSUPPORTED_COMMANDS.includes(command.name),\n );\n}\n","import type { NewSessionRequest } from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: Pick<NewSessionRequest, \"mcpServers\">,\n): Record<string, McpServerConfig> {\n const mcpServers: Record<string, McpServerConfig> = {};\n if (!Array.isArray(params.mcpServers)) {\n return mcpServers;\n }\n\n for (const server of params.mcpServers) {\n if (\"type\" in server) {\n mcpServers[server.name] = {\n type: server.type,\n url: server.url,\n headers: server.headers\n ? Object.fromEntries(server.headers.map((e) => [e.name, e.value]))\n : undefined,\n };\n } else {\n mcpServers[server.name] = {\n type: \"stdio\",\n command: server.command,\n args: server.args,\n env: server.env\n ? Object.fromEntries(server.env.map((e) => [e.name, e.value]))\n : undefined,\n };\n }\n }\n\n return mcpServers;\n}\n","export const DEFAULT_MODEL = \"opus\";\n\nconst GATEWAY_TO_SDK_MODEL: Record<string, string> = {\n \"claude-opus-4-5\": \"opus\",\n \"claude-opus-4-6\": \"opus\",\n \"claude-sonnet-4-5\": \"sonnet\",\n \"claude-sonnet-4-6\": \"sonnet\",\n \"claude-haiku-4-5\": \"haiku\",\n};\n\nexport function toSdkModelId(modelId: string): string {\n return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;\n}\n\nconst MODELS_WITH_1M_CONTEXT = new Set([\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nexport function supports1MContext(modelId: string): boolean {\n return MODELS_WITH_1M_CONTEXT.has(modelId);\n}\n\nconst MODELS_WITH_EFFORT = new Set([\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_MAX_EFFORT = new Set([\"claude-opus-4-6\"]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsMaxEffort(modelId: string): boolean {\n return MODELS_WITH_MAX_EFFORT.has(modelId);\n}\n\ninterface EffortOption {\n value: string;\n name: string;\n}\n\nexport function getEffortOptions(modelId: string): EffortOption[] | null {\n if (!supportsEffort(modelId)) return null;\n\n const options: EffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n ];\n\n if (supportsMaxEffort(modelId)) {\n options.push({ value: \"max\", name: \"Max\" });\n }\n\n return options;\n}\n\n// Model alias resolution — lets callers use human-friendly aliases like\n// \"opus\" or \"sonnet\" instead of full model IDs like \"claude-opus-4-6\".\n\nconst MODEL_CONTEXT_HINT_PATTERN = /\\[(\\d+m)\\]$/i;\n\nfunction tokenizeModelPreference(model: string): {\n tokens: string[];\n contextHint?: string;\n} {\n const lower = model.trim().toLowerCase();\n const contextHint = lower\n .match(MODEL_CONTEXT_HINT_PATTERN)?.[1]\n ?.toLowerCase();\n\n const normalized = lower.replace(MODEL_CONTEXT_HINT_PATTERN, \" $1 \");\n const rawTokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const tokens = rawTokens\n .map((token) => {\n if (token === \"opusplan\") return \"opus\";\n if (token === \"best\" || token === \"default\") return \"\";\n return token;\n })\n .filter((token) => token && token !== \"claude\")\n .filter((token) => /[a-z]/.test(token) || token.endsWith(\"m\"));\n\n return { tokens, contextHint };\n}\n\ninterface ModelOption {\n value: string;\n name?: string;\n description?: string;\n}\n\nfunction scoreModelMatch(\n model: ModelOption,\n tokens: string[],\n contextHint?: string,\n): number {\n const haystack = `${model.value} ${model.name ?? \"\"}`.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) {\n score += token === contextHint ? 3 : 1;\n }\n }\n return score;\n}\n\nexport function resolveModelPreference(\n preference: string,\n options: ModelOption[],\n): string | null {\n const trimmed = preference.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n\n // Exact match on value or display name\n const directMatch = options.find(\n (o) =>\n o.value === trimmed ||\n o.value.toLowerCase() === lower ||\n (o.name && o.name.toLowerCase() === lower),\n );\n if (directMatch) return directMatch.value;\n\n // Substring match\n const includesMatch = options.find((o) => {\n const value = o.value.toLowerCase();\n const display = (o.name ?? \"\").toLowerCase();\n return (\n value.includes(lower) || display.includes(lower) || lower.includes(value)\n );\n });\n if (includesMatch) return includesMatch.value;\n\n // Tokenized matching for aliases like \"opus[1m]\"\n const { tokens, contextHint } = tokenizeModelPreference(trimmed);\n if (tokens.length === 0) return null;\n\n let bestMatch: ModelOption | null = null;\n let bestScore = 0;\n for (const model of options) {\n const score = scoreModelMatch(model, tokens, contextHint);\n if (0 < score && (!bestMatch || bestScore < score)) {\n bestMatch = model;\n bestScore = score;\n }\n }\n\n return bestMatch?.value ?? null;\n}\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type {\n CanUseTool,\n McpServerConfig,\n Options,\n SpawnedProcess,\n SpawnOptions,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport {\n createPostToolUseHook,\n createPreToolUseHook,\n type OnModeChange,\n} from \"../hooks\";\nimport type { CodeExecutionMode } from \"../tools\";\nimport type { EffortLevel } from \"../types\";\nimport { APPENDED_INSTRUCTIONS } from \"./instructions\";\nimport { DEFAULT_MODEL } from \"./models\";\nimport type { SettingsManager } from \"./settings\";\n\nexport interface ProcessSpawnedInfo {\n pid: number;\n command: string;\n sessionId: string;\n}\n\nexport interface BuildOptionsParams {\n cwd: string;\n mcpServers: Record<string, McpServerConfig>;\n permissionMode: CodeExecutionMode;\n canUseTool: CanUseTool;\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId: string;\n isResume: boolean;\n forkSession?: boolean;\n additionalDirectories?: string[];\n disableBuiltInTools?: boolean;\n settingsManager: SettingsManager;\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n effort?: EffortLevel;\n}\n\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: APPENDED_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + APPENDED_INSTRUCTIONS;\n }\n\n if (\n typeof customPrompt === \"object\" &&\n customPrompt !== null &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n return {\n ...defaultPrompt,\n append: customPrompt.append + APPENDED_INSTRUCTIONS,\n };\n }\n\n return defaultPrompt;\n}\n\nfunction buildMcpServers(\n userServers: Record<string, McpServerConfig> | undefined,\n acpServers: Record<string, McpServerConfig>,\n): Record<string, McpServerConfig> {\n return {\n ...(userServers || {}),\n ...acpServers,\n };\n}\n\nfunction buildEnvironment(): Record<string, string> {\n return {\n ...process.env,\n ELECTRON_RUN_AS_NODE: \"1\",\n CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL: \"true\",\n // Offload all MCP tools by default\n ENABLE_TOOL_SEARCH: \"auto:0\",\n };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange: OnModeChange | undefined,\n settingsManager: SettingsManager,\n logger: Logger,\n): Options[\"hooks\"] {\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook({ onModeChange, logger })],\n },\n ],\n PreToolUse: [\n ...(userHooks?.PreToolUse || []),\n {\n hooks: [createPreToolUseHook(settingsManager, logger)],\n },\n ],\n };\n}\n\nfunction getAbortController(\n userProvidedController: AbortController | undefined,\n): AbortController {\n const controller = userProvidedController ?? new AbortController();\n if (controller.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n return controller;\n}\n\nfunction buildSpawnWrapper(\n sessionId: string,\n onProcessSpawned: (info: ProcessSpawnedInfo) => void,\n onProcessExited?: (pid: number) => void,\n logger?: Logger,\n): (options: SpawnOptions) => SpawnedProcess {\n return (spawnOpts: SpawnOptions): SpawnedProcess => {\n const child = spawn(spawnOpts.command, spawnOpts.args, {\n cwd: spawnOpts.cwd,\n env: spawnOpts.env as NodeJS.ProcessEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.pid) {\n onProcessSpawned({\n pid: child.pid,\n command: `${spawnOpts.command} ${spawnOpts.args.join(\" \")}`,\n sessionId,\n });\n }\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && logger) {\n logger.debug(`[claude-code:${child.pid}] stderr: ${msg}`);\n }\n });\n\n if (onProcessExited) {\n child.on(\"exit\", () => {\n if (child.pid) {\n onProcessExited(child.pid);\n }\n });\n }\n\n // Listen for abort signal\n if (spawnOpts.signal) {\n spawnOpts.signal.addEventListener(\"abort\", () => {\n child.kill(\"SIGTERM\");\n });\n }\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\n `Failed to get stdio streams for spawned process (pid=${child.pid})`,\n );\n }\n\n return {\n stdin: child.stdin,\n stdout: child.stdout,\n get killed() {\n return child.killed;\n },\n get exitCode() {\n return child.exitCode;\n },\n kill(signal: NodeJS.Signals) {\n return child.kill(signal);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nfunction ensureLocalSettings(cwd: string): void {\n const claudeDir = path.join(cwd, \".claude\");\n const localSettingsPath = path.join(claudeDir, \"settings.local.json\");\n try {\n if (!fs.existsSync(localSettingsPath)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n fs.writeFileSync(localSettingsPath, \"{}\\n\", { flag: \"wx\" });\n }\n } catch {\n // Best-effort — don't fail session creation if we can't write\n }\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\n ensureLocalSettings(params.cwd);\n\n // Resolve which built-in tools to expose.\n // Explicit tools array from userProvidedOptions takes precedence.\n // disableBuiltInTools is a legacy shorthand for tools: [] — kept for\n // backward compatibility but callers should prefer the tools array.\n const tools: Options[\"tools\"] =\n params.userProvidedOptions?.tools ??\n (params.disableBuiltInTools\n ? []\n : { type: \"preset\", preset: \"claude_code\" });\n\n const options: Options = {\n ...params.userProvidedOptions,\n betas: [\"context-1m-2025-08-07\"],\n systemPrompt: params.systemPrompt ?? buildSystemPrompt(),\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => params.logger.error(err),\n cwd: params.cwd,\n includePartialMessages: true,\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode: params.permissionMode,\n canUseTool: params.canUseTool,\n executable: \"node\",\n tools,\n extraArgs: {\n ...params.userProvidedOptions?.extraArgs,\n \"replay-user-messages\": \"\",\n },\n mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(\n params.userProvidedOptions?.hooks,\n params.onModeChange,\n params.settingsManager,\n params.logger,\n ),\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId,\n params.onProcessSpawned,\n params.onProcessExited,\n params.logger,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.isResume) {\n options.resume = params.sessionId;\n options.forkSession = params.forkSession ?? false;\n } else {\n options.sessionId = params.sessionId;\n options.model = DEFAULT_MODEL;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\n }\n\n if (params.effort) {\n options.effort = params.effort;\n }\n\n clearStatsigCache();\n return options;\n}\n\nfunction clearStatsigCache(): void {\n const statsigPath = path.join(\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\"),\n \"statsig\",\n );\n fs.rm(statsigPath, { recursive: true, force: true }, () => {\n // Best-effort, ignore errors\n });\n}\n","const BRANCH_NAMING = `\n# Branch Naming\n\nWhen working in a detached HEAD state, create a descriptive branch name based on the work being done before committing. Do this automatically without asking the user.\n`;\n\nconst PLAN_MODE = `\n# Plan Mode\n\nOnly enter plan mode (EnterPlanMode) when the user is requesting a significant change in approach or direction mid-task. Do NOT enter plan mode for:\n- Confirmations or approvals (\"yes\", \"looks good\", \"continue\", \"go ahead\")\n- Minor clarifications or small adjustments\n- Answers to questions you asked (unless you are still in the initial planning phase and have not yet started executing)\n- Feedback that does not require replanning\n\nWhen in doubt, continue executing and incorporate the feedback inline.\n`;\n\nexport const APPENDED_INSTRUCTIONS = BRANCH_NAMING + PLAN_MODE;\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { minimatch } from \"minimatch\";\n\nconst ACP_TOOL_NAME_PREFIX = \"mcp__acp__\";\n\nconst acpToolNames = {\n read: `${ACP_TOOL_NAME_PREFIX}Read`,\n edit: `${ACP_TOOL_NAME_PREFIX}Edit`,\n write: `${ACP_TOOL_NAME_PREFIX}Write`,\n bash: `${ACP_TOOL_NAME_PREFIX}Bash`,\n};\n\nconst SHELL_OPERATORS = [\"&&\", \"||\", \";\", \"|\", \"$(\", \"`\", \"\\n\"];\n\nfunction containsShellOperator(str: string): boolean {\n return SHELL_OPERATORS.some((op) => str.includes(op));\n}\n\nconst FILE_EDITING_TOOLS = [acpToolNames.edit, acpToolNames.write];\n\nconst FILE_READING_TOOLS = [acpToolNames.read];\n\nconst TOOL_ARG_ACCESSORS: Record<\n string,\n (input: Record<string, unknown>) => string | undefined\n> = {\n [acpToolNames.read]: (input) => input?.file_path as string | undefined,\n [acpToolNames.edit]: (input) => input?.file_path as string | undefined,\n [acpToolNames.write]: (input) => input?.file_path as string | undefined,\n [acpToolNames.bash]: (input) => input?.command as string | undefined,\n};\n\ninterface ParsedRule {\n toolName: string;\n argument?: string;\n isWildcard?: boolean;\n}\n\nfunction parseRule(rule: string): ParsedRule {\n const match = rule.match(/^(\\w+)(?:\\((.+)\\))?$/);\n if (!match) {\n return { toolName: rule };\n }\n const toolName = match[1] ?? rule;\n const argument = match[2];\n if (argument?.endsWith(\":*\")) {\n return {\n toolName,\n argument: argument.slice(0, -2),\n isWildcard: true,\n };\n }\n return { toolName, argument };\n}\n\nfunction normalizePath(filePath: string, cwd: string): string {\n let resolved = filePath;\n if (resolved.startsWith(\"~/\")) {\n resolved = path.join(os.homedir(), resolved.slice(2));\n } else if (resolved.startsWith(\"./\")) {\n resolved = path.join(cwd, resolved.slice(2));\n } else if (!path.isAbsolute(resolved)) {\n resolved = path.join(cwd, resolved);\n }\n return path.normalize(resolved).replace(/\\\\/g, \"/\");\n}\n\nfunction matchesGlob(pattern: string, filePath: string, cwd: string): boolean {\n const normalizedPattern = normalizePath(pattern, cwd);\n const normalizedPath = normalizePath(filePath, cwd);\n return minimatch(normalizedPath, normalizedPattern, {\n dot: true,\n matchBase: false,\n nocase: process.platform === \"win32\",\n });\n}\n\nfunction matchesRule(\n rule: ParsedRule,\n toolName: string,\n toolInput: unknown,\n cwd: string,\n): boolean {\n const ruleAppliesToTool =\n (rule.toolName === \"Bash\" && toolName === acpToolNames.bash) ||\n (rule.toolName === \"Edit\" && FILE_EDITING_TOOLS.includes(toolName)) ||\n (rule.toolName === \"Read\" && FILE_READING_TOOLS.includes(toolName));\n\n if (!ruleAppliesToTool) {\n return false;\n }\n\n if (!rule.argument) {\n return true;\n }\n\n const argAccessor = TOOL_ARG_ACCESSORS[toolName];\n if (!argAccessor) {\n return true;\n }\n\n const actualArg = argAccessor(toolInput as Record<string, unknown>);\n if (!actualArg) {\n return false;\n }\n\n if (toolName === acpToolNames.bash) {\n if (rule.isWildcard) {\n if (!actualArg.startsWith(rule.argument)) {\n return false;\n }\n const remainder = actualArg.slice(rule.argument.length);\n if (containsShellOperator(remainder)) {\n return false;\n }\n return true;\n }\n return actualArg === rule.argument;\n }\n\n return matchesGlob(rule.argument, actualArg, cwd);\n}\n\nasync function loadSettingsFile(\n filePath: string | undefined,\n): Promise<ClaudeCodeSettings> {\n if (!filePath) {\n return {};\n }\n try {\n const content = await fs.promises.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as ClaudeCodeSettings;\n } catch {\n return {};\n }\n}\n\nexport interface PermissionSettings {\n allow?: string[];\n deny?: string[];\n ask?: string[];\n additionalDirectories?: string[];\n defaultMode?: string;\n}\n\nexport interface ClaudeCodeSettings {\n permissions?: PermissionSettings;\n env?: Record<string, string>;\n model?: string;\n}\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PermissionCheckResult {\n decision: PermissionDecision;\n rule?: string;\n source?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport function getManagedSettingsPath(): string {\n switch (process.platform) {\n case \"darwin\":\n return \"/Library/Application Support/ClaudeCode/managed-settings.json\";\n case \"linux\":\n return \"/etc/claude-code/managed-settings.json\";\n case \"win32\":\n return \"C:\\\\Program Files\\\\ClaudeCode\\\\managed-settings.json\";\n default:\n return \"/etc/claude-code/managed-settings.json\";\n }\n}\nexport class SettingsManager {\n private cwd: string;\n private userSettings: ClaudeCodeSettings = {};\n private projectSettings: ClaudeCodeSettings = {};\n private localSettings: ClaudeCodeSettings = {};\n private enterpriseSettings: ClaudeCodeSettings = {};\n private mergedSettings: ClaudeCodeSettings = {};\n private initialized = false;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n await this.loadAllSettings();\n this.initialized = true;\n }\n\n private getUserSettingsPath(): string {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n return path.join(configDir, \"settings.json\");\n }\n\n private getProjectSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.json\");\n }\n\n private getLocalSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.local.json\");\n }\n\n private async loadAllSettings(): Promise<void> {\n const [userSettings, projectSettings, localSettings, enterpriseSettings] =\n await Promise.all([\n loadSettingsFile(this.getUserSettingsPath()),\n loadSettingsFile(this.getProjectSettingsPath()),\n loadSettingsFile(this.getLocalSettingsPath()),\n loadSettingsFile(getManagedSettingsPath()),\n ]);\n this.userSettings = userSettings;\n this.projectSettings = projectSettings;\n this.localSettings = localSettings;\n this.enterpriseSettings = enterpriseSettings;\n this.mergeAllSettings();\n }\n\n private mergeAllSettings(): void {\n const allSettings = [\n this.userSettings,\n this.projectSettings,\n this.localSettings,\n this.enterpriseSettings,\n ];\n\n const permissions: PermissionSettings = {\n allow: [],\n deny: [],\n ask: [],\n };\n const merged: ClaudeCodeSettings = { permissions };\n\n for (const settings of allSettings) {\n if (settings.permissions) {\n if (settings.permissions.allow) {\n permissions.allow?.push(...settings.permissions.allow);\n }\n if (settings.permissions.deny) {\n permissions.deny?.push(...settings.permissions.deny);\n }\n if (settings.permissions.ask) {\n permissions.ask?.push(...settings.permissions.ask);\n }\n if (settings.permissions.additionalDirectories) {\n permissions.additionalDirectories = [\n ...(permissions.additionalDirectories || []),\n ...settings.permissions.additionalDirectories,\n ];\n }\n if (settings.permissions.defaultMode) {\n permissions.defaultMode = settings.permissions.defaultMode;\n }\n }\n if (settings.env) {\n merged.env = { ...merged.env, ...settings.env };\n }\n if (settings.model) {\n merged.model = settings.model;\n }\n }\n\n this.mergedSettings = merged;\n }\n\n checkPermission(toolName: string, toolInput: unknown): PermissionCheckResult {\n if (!toolName.startsWith(ACP_TOOL_NAME_PREFIX)) {\n return { decision: \"ask\" };\n }\n\n const permissions = this.mergedSettings.permissions;\n if (!permissions) {\n return { decision: \"ask\" };\n }\n\n for (const rule of permissions.deny || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"deny\", rule, source: \"deny\" };\n }\n }\n\n for (const rule of permissions.allow || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"allow\", rule, source: \"allow\" };\n }\n }\n\n for (const rule of permissions.ask || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"ask\", rule, source: \"ask\" };\n }\n }\n\n return { decision: \"ask\" };\n }\n\n getSettings(): ClaudeCodeSettings {\n return this.mergedSettings;\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n async setCwd(cwd: string): Promise<void> {\n if (this.cwd === cwd) {\n return;\n }\n this.dispose();\n this.cwd = cwd;\n this.initialized = false;\n await this.initialize();\n }\n\n dispose(): void {\n this.initialized = false;\n }\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { delimiter, dirname } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { ProcessSpawnedCallback } from \"../../types\";\nimport { Logger } from \"../../utils/logger\";\n\nexport interface CodexProcessOptions {\n cwd?: string;\n apiBaseUrl?: string;\n apiKey?: string;\n model?: string;\n binaryPath?: string;\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n}\n\nexport interface CodexProcess {\n process: ChildProcess;\n stdin: Writable;\n stdout: Readable;\n kill: () => void;\n}\n\nfunction buildConfigArgs(options: CodexProcessOptions): string[] {\n const args: string[] = [];\n\n args.push(\"-c\", `features.remote_models=false`);\n\n if (options.apiBaseUrl) {\n args.push(\"-c\", `model_provider=\"posthog\"`);\n args.push(\"-c\", `model_providers.posthog.name=\"PostHog Gateway\"`);\n args.push(\"-c\", `model_providers.posthog.base_url=\"${options.apiBaseUrl}\"`);\n args.push(\"-c\", `model_providers.posthog.wire_api=\"responses\"`);\n args.push(\n \"-c\",\n `model_providers.posthog.env_key=\"POSTHOG_GATEWAY_API_KEY\"`,\n );\n }\n\n if (options.model) {\n args.push(\"-c\", `model=\"${options.model}\"`);\n }\n\n return args;\n}\n\nfunction findCodexBinary(options: CodexProcessOptions): {\n command: string;\n args: string[];\n} {\n const configArgs = buildConfigArgs(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n return { command: options.binaryPath, args: configArgs };\n }\n\n if (options.binaryPath) {\n throw new Error(\n `codex-acp binary not found at ${options.binaryPath}. Run \"node apps/code/scripts/download-binaries.mjs\" to download it.`,\n );\n }\n\n return { command: \"npx\", args: [\"@zed-industries/codex-acp\", ...configArgs] };\n}\n\nexport function spawnCodexProcess(options: CodexProcessOptions): CodexProcess {\n const logger =\n options.logger ?? new Logger({ debug: true, prefix: \"[CodexSpawn]\" });\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n\n delete env.ELECTRON_RUN_AS_NODE;\n delete env.ELECTRON_NO_ASAR;\n\n if (options.apiKey) {\n env.POSTHOG_GATEWAY_API_KEY = options.apiKey;\n }\n\n const { command, args } = findCodexBinary(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n const binDir = dirname(options.binaryPath);\n env.PATH = `${binDir}${delimiter}${env.PATH ?? \"\"}`;\n }\n\n logger.info(\"Spawning codex-acp process\", {\n command,\n args,\n cwd: options.cwd,\n hasApiBaseUrl: !!options.apiBaseUrl,\n hasApiKey: !!options.apiKey,\n binaryPath: options.binaryPath,\n });\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n logger.warn(\"codex-acp stderr:\", data.toString());\n });\n\n child.on(\"error\", (err) => {\n logger.error(\"codex-acp process error:\", err);\n });\n\n child.on(\"exit\", (code, signal) => {\n logger.info(\"codex-acp process exited\", { code, signal });\n if (child.pid && options.processCallbacks?.onProcessExited) {\n options.processCallbacks.onProcessExited(child.pid);\n }\n });\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\"Failed to get stdio streams from codex-acp process\");\n }\n\n if (child.pid && options.processCallbacks?.onProcessSpawned) {\n options.processCallbacks.onProcessSpawned({\n pid: child.pid,\n command,\n });\n }\n\n return {\n process: child,\n stdin: child.stdin,\n stdout: child.stdout,\n kill: () => {\n logger.info(\"Killing codex-acp process\", { pid: child.pid });\n child.stdin?.destroy();\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.kill(\"SIGTERM\");\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport type { PostHogAPIClient } from \"../../../posthog-api\";\nimport type { StoredEntry } from \"../../../types\";\nimport { supports1MContext } from \"./models\";\n\ninterface ConversationTurn {\n role: \"user\" | \"assistant\";\n content: ContentBlock[];\n toolCalls?: ToolCallInfo[];\n}\n\ninterface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n input: unknown;\n result?: unknown;\n}\n\ninterface JsonlConfig {\n sessionId: string;\n cwd: string;\n model?: string;\n version?: string;\n gitBranch?: string;\n slug?: string;\n permissionMode?: string;\n}\n\ninterface ClaudeCodeMeta {\n toolCallId?: string;\n toolName?: string;\n toolInput?: unknown;\n toolResponse?: unknown;\n}\n\ninterface SessionUpdate {\n sessionUpdate: string;\n content?: ContentBlock | ContentBlock[];\n _meta?: { claudeCode?: ClaudeCodeMeta };\n}\n\nconst MAX_PROJECT_KEY_LENGTH = 200;\n\nfunction hashString(s: string): string {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = (hash << 5) - hash + s.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash).toString(36);\n}\n\nexport function getSessionJsonlPath(sessionId: string, cwd: string): string {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n let projectKey = cwd.replace(/[^a-zA-Z0-9]/g, \"-\");\n if (projectKey.length > MAX_PROJECT_KEY_LENGTH) {\n projectKey = `${projectKey.slice(0, MAX_PROJECT_KEY_LENGTH)}-${hashString(cwd)}`;\n }\n return path.join(configDir, \"projects\", projectKey, `${sessionId}.jsonl`);\n}\n\nexport function rebuildConversation(\n entries: StoredEntry[],\n): ConversationTurn[] {\n const turns: ConversationTurn[] = [];\n let currentAssistantContent: ContentBlock[] = [];\n let currentToolCalls: ToolCallInfo[] = [];\n\n for (const entry of entries) {\n const method = entry.notification?.method;\n const params = entry.notification?.params as Record<string, unknown>;\n\n if (method === \"session/update\" && params?.update) {\n const update = params.update as SessionUpdate;\n\n switch (update.sessionUpdate) {\n case \"user_message\":\n case \"user_message_chunk\": {\n if (\n currentAssistantContent.length > 0 ||\n currentToolCalls.length > 0\n ) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls:\n currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n currentAssistantContent = [];\n currentToolCalls = [];\n }\n\n const content = update.content;\n const contentArray = Array.isArray(content)\n ? content\n : content\n ? [content]\n : [];\n\n const lastTurn = turns[turns.length - 1];\n if (lastTurn?.role === \"user\") {\n lastTurn.content.push(...contentArray);\n } else {\n turns.push({ role: \"user\", content: contentArray });\n }\n break;\n }\n\n case \"agent_message\":\n case \"agent_message_chunk\":\n case \"agent_thought_chunk\": {\n const content = update.content;\n if (content && !Array.isArray(content)) {\n if (\n content.type === \"text\" &&\n currentAssistantContent.length > 0 &&\n currentAssistantContent[currentAssistantContent.length - 1]\n .type === \"text\"\n ) {\n const lastBlock = currentAssistantContent[\n currentAssistantContent.length - 1\n ] as { type: \"text\"; text: string };\n lastBlock.text += (\n content as { type: \"text\"; text: string }\n ).text;\n } else {\n currentAssistantContent.push(content);\n }\n }\n break;\n }\n\n case \"tool_call\":\n case \"tool_call_update\": {\n const meta = update._meta?.claudeCode;\n if (meta) {\n const { toolCallId, toolName, toolInput, toolResponse } = meta;\n\n if (toolCallId && toolName) {\n let toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (!toolCall) {\n toolCall = { toolCallId, toolName, input: toolInput };\n currentToolCalls.push(toolCall);\n }\n if (toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n\n case \"tool_result\": {\n const meta = update._meta?.claudeCode;\n if (meta) {\n const { toolCallId, toolResponse } = meta;\n if (toolCallId) {\n const toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (toolCall && toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n }\n }\n }\n\n if (currentAssistantContent.length > 0 || currentToolCalls.length > 0) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls: currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n }\n\n return turns;\n}\n\nconst CHARS_PER_TOKEN = 4;\nconst DEFAULT_MAX_TOKENS = 150_000;\nconst LARGE_CONTEXT_MAX_TOKENS = 800_000;\n\nfunction estimateTurnTokens(turn: ConversationTurn): number {\n let chars = 0;\n for (const block of turn.content) {\n if (\"text\" in block && typeof block.text === \"string\") {\n chars += block.text.length;\n }\n }\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n chars += JSON.stringify(tc.input ?? \"\").length;\n if (tc.result !== undefined) {\n chars +=\n typeof tc.result === \"string\"\n ? tc.result.length\n : JSON.stringify(tc.result).length;\n }\n }\n }\n return Math.ceil(chars / CHARS_PER_TOKEN);\n}\n\nexport function selectRecentTurns(\n turns: ConversationTurn[],\n maxTokens = DEFAULT_MAX_TOKENS,\n): ConversationTurn[] {\n let budget = maxTokens;\n let startIndex = turns.length;\n\n for (let i = turns.length - 1; i >= 0; i--) {\n const cost = estimateTurnTokens(turns[i]);\n if (cost > budget) break;\n budget -= cost;\n startIndex = i;\n }\n\n // Ensure we start on a user turn so the conversation is well-formed\n while (startIndex < turns.length && turns[startIndex].role !== \"user\") {\n startIndex++;\n }\n\n return turns.slice(startIndex);\n}\n\nconst BASE62 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\nfunction generateMessageId(): string {\n const bytes = new Uint8Array(24);\n crypto.getRandomValues(bytes);\n let id = \"msg_01\";\n for (const b of bytes) {\n id += BASE62[b % 62];\n }\n return id;\n}\n\nconst ADJECTIVES = [\n \"bright\",\n \"calm\",\n \"daring\",\n \"eager\",\n \"fair\",\n \"gentle\",\n \"happy\",\n \"keen\",\n \"lively\",\n \"merry\",\n \"noble\",\n \"polite\",\n \"quick\",\n \"sharp\",\n \"warm\",\n \"witty\",\n];\nconst VERBS = [\n \"blazing\",\n \"crafting\",\n \"dashing\",\n \"flowing\",\n \"gliding\",\n \"humming\",\n \"jumping\",\n \"linking\",\n \"melting\",\n \"nesting\",\n \"pacing\",\n \"roaming\",\n \"sailing\",\n \"turning\",\n \"waving\",\n \"zoning\",\n];\nconst NOUNS = [\n \"aurora\",\n \"breeze\",\n \"cedar\",\n \"delta\",\n \"ember\",\n \"frost\",\n \"grove\",\n \"haven\",\n \"inlet\",\n \"jewel\",\n \"knoll\",\n \"lotus\",\n \"maple\",\n \"nexus\",\n \"oasis\",\n \"prism\",\n];\n\nfunction generateSlug(): string {\n const pick = (arr: string[]) => arr[Math.floor(Math.random() * arr.length)];\n return `${pick(ADJECTIVES)}-${pick(VERBS)}-${pick(NOUNS)}`;\n}\n\nexport function conversationTurnsToJsonlEntries(\n turns: ConversationTurn[],\n config: JsonlConfig,\n): string[] {\n const lines: string[] = [];\n let parentUuid: string | null = null;\n const model = config.model ?? \"claude-opus-4-6\";\n const version = config.version ?? \"2.1.63\";\n const gitBranch = config.gitBranch ?? \"\";\n const slug = config.slug ?? generateSlug();\n const permissionMode = config.permissionMode ?? \"default\";\n const baseTime = Date.now() - turns.length * 3000;\n let turnIndex = 0;\n\n for (const turn of turns) {\n const timestamp = new Date(baseTime + turnIndex * 3000).toISOString();\n turnIndex++;\n if (turn.role === \"user\") {\n lines.push(\n JSON.stringify({\n type: \"queue-operation\",\n operation: \"enqueue\",\n timestamp,\n sessionId: config.sessionId,\n }),\n );\n lines.push(\n JSON.stringify({\n type: \"queue-operation\",\n operation: \"dequeue\",\n timestamp,\n sessionId: config.sessionId,\n }),\n );\n\n const uuid = randomUUID();\n const textParts = turn.content\n .filter(\n (block) =>\n \"text\" in block && typeof block.text === \"string\" && block.text,\n )\n .map((block) => (block as { text: string }).text);\n\n const userText = textParts.length > 0 ? textParts.join(\"\") : \" \";\n\n lines.push(\n JSON.stringify({\n parentUuid,\n isSidechain: false,\n userType: \"external\",\n cwd: config.cwd,\n sessionId: config.sessionId,\n version,\n gitBranch,\n slug,\n type: \"user\",\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: userText }],\n },\n uuid,\n timestamp,\n permissionMode,\n }),\n );\n parentUuid = uuid;\n } else {\n const allBlocks: unknown[] = [];\n\n for (const block of turn.content) {\n const blockType = (block as { type: string }).type;\n if (blockType === \"thinking\" || blockType === \"text\") {\n allBlocks.push(block);\n }\n }\n\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n allBlocks.push({\n type: \"tool_use\",\n id: tc.toolCallId,\n name: tc.toolName,\n input: tc.input,\n });\n }\n }\n\n const msgId = generateMessageId();\n const hasToolUse = allBlocks.some(\n (b) => (b as { type: string }).type === \"tool_use\",\n );\n const lastStopReason = hasToolUse ? \"tool_use\" : \"end_turn\";\n\n for (let i = 0; i < allBlocks.length; i++) {\n const block = allBlocks[i];\n const isLast = i === allBlocks.length - 1;\n const uuid = randomUUID();\n\n lines.push(\n JSON.stringify({\n parentUuid,\n isSidechain: false,\n userType: \"external\",\n cwd: config.cwd,\n sessionId: config.sessionId,\n version,\n gitBranch,\n slug,\n type: \"assistant\",\n message: {\n model,\n id: msgId,\n type: \"message\",\n role: \"assistant\",\n content: [block],\n stop_reason: isLast ? lastStopReason : null,\n stop_sequence: null,\n usage: {\n input_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n output_tokens: 0,\n },\n },\n uuid,\n timestamp,\n }),\n );\n parentUuid = uuid;\n }\n\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n if (tc.result === undefined) continue;\n\n const uuid = randomUUID();\n const resultText =\n typeof tc.result === \"string\"\n ? tc.result\n : JSON.stringify(tc.result);\n\n lines.push(\n JSON.stringify({\n parentUuid,\n isSidechain: false,\n userType: \"external\",\n cwd: config.cwd,\n sessionId: config.sessionId,\n version,\n gitBranch,\n slug,\n type: \"user\",\n message: {\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: tc.toolCallId,\n content: resultText,\n },\n ],\n },\n uuid,\n timestamp,\n }),\n );\n parentUuid = uuid;\n }\n }\n }\n }\n\n return lines;\n}\n\ninterface HydrationLog {\n info: (msg: string, data?: unknown) => void;\n warn: (msg: string, data?: unknown) => void;\n}\n\nexport async function hydrateSessionJsonl(params: {\n sessionId: string;\n cwd: string;\n taskId: string;\n runId: string;\n model?: string;\n gitBranch?: string;\n permissionMode?: string;\n posthogAPI: PostHogAPIClient;\n log: HydrationLog;\n}): Promise<void> {\n const { posthogAPI, log } = params;\n\n try {\n const jsonlPath = getSessionJsonlPath(params.sessionId, params.cwd);\n try {\n await fs.access(jsonlPath);\n log.info(\"Local JSONL exists, skipping S3 hydration\", {\n sessionId: params.sessionId,\n });\n return;\n } catch {\n // File doesn't exist, proceed with hydration\n }\n\n const taskRun = await posthogAPI.getTaskRun(params.taskId, params.runId);\n if (!taskRun.log_url) {\n log.info(\"No log URL, skipping JSONL hydration\");\n return;\n }\n\n const entries = await posthogAPI.fetchTaskRunLogs(taskRun);\n if (entries.length === 0) {\n log.info(\"No S3 log entries, skipping JSONL hydration\");\n return;\n }\n\n const entryCounts: Record<string, number> = {};\n for (const entry of entries) {\n const method = entry.notification?.method ?? \"unknown\";\n const entryParams = entry.notification?.params as\n | Record<string, unknown>\n | undefined;\n const update = entryParams?.update as\n | { sessionUpdate?: string }\n | undefined;\n const key = update?.sessionUpdate\n ? `${method}:${update.sessionUpdate}`\n : method;\n entryCounts[key] = (entryCounts[key] ?? 0) + 1;\n }\n log.info(\"S3 log entry breakdown\", {\n totalEntries: entries.length,\n types: entryCounts,\n });\n\n const allTurns = rebuildConversation(entries);\n if (allTurns.length === 0) {\n log.info(\"No conversation in S3 logs, skipping JSONL hydration\");\n return;\n }\n\n const maxTokens = supports1MContext(params.model ?? \"\")\n ? LARGE_CONTEXT_MAX_TOKENS\n : DEFAULT_MAX_TOKENS;\n const conversation = selectRecentTurns(allTurns, maxTokens);\n log.info(\"Selected recent turns for hydration\", {\n totalTurns: allTurns.length,\n selectedTurns: conversation.length,\n turnRoles: conversation.map((t) => t.role),\n });\n\n const jsonlLines = conversationTurnsToJsonlEntries(conversation, {\n sessionId: params.sessionId,\n cwd: params.cwd,\n model: params.model,\n gitBranch: params.gitBranch,\n permissionMode: params.permissionMode,\n });\n\n await fs.mkdir(path.dirname(jsonlPath), { recursive: true });\n\n const tmpPath = `${jsonlPath}.tmp.${Date.now()}`;\n await fs.writeFile(tmpPath, `${jsonlLines.join(\"\\n\")}\\n`);\n await fs.rename(tmpPath, jsonlPath);\n\n log.info(\"Hydrated session JSONL from S3\", {\n sessionId: params.sessionId,\n turns: conversation.length,\n lines: jsonlLines.length,\n });\n } catch (err) {\n log.warn(\"Failed to hydrate session JSONL, continuing\", {\n sessionId: params.sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n","export type GatewayProduct = \"posthog_code\" | \"background_agents\";\n\nexport function getLlmGatewayUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n // Local development (normalize 127.0.0.1 to localhost)\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308/${product}`;\n }\n\n // Docker containers accessing host\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308/${product}`;\n }\n\n // Production - extract region from hostname, default to US\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com/${product}`;\n}\n","import packageJson from \"../package.json\" with { type: \"json\" };\nimport type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types\";\nimport { getLlmGatewayUrl } from \"./utils/gateway\";\n\nexport { getLlmGatewayUrl };\n\nconst DEFAULT_USER_AGENT = `posthog/agent.hog.dev; version: ${packageJson.version}`;\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n>;\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private isAuthFailure(status: number): boolean {\n return status === 401 || status === 403;\n }\n\n private async resolveApiKey(forceRefresh = false): Promise<string> {\n if (forceRefresh && this.config.refreshApiKey) {\n return this.config.refreshApiKey();\n }\n\n return this.config.getApiKey();\n }\n\n private async buildHeaders(\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Headers> {\n const headers = new Headers(options.headers);\n headers.set(\n \"Authorization\",\n `Bearer ${await this.resolveApiKey(forceRefresh)}`,\n );\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"User-Agent\", this.config.userAgent ?? DEFAULT_USER_AGENT);\n return headers;\n }\n\n private async performRequest(\n endpoint: string,\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Response> {\n const url = `${this.baseUrl}${endpoint}`;\n\n return fetch(url, {\n ...options,\n headers: await this.buildHeaders(options, forceRefresh),\n });\n }\n\n private async performRequestWithRetry(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<Response> {\n let response = await this.performRequest(endpoint, options);\n\n if (!response.ok && this.isAuthFailure(response.status)) {\n response = await this.performRequest(endpoint, options, true);\n }\n\n return response;\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const response = await this.performRequestWithRetry(endpoint, options);\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n async getApiKey(forceRefresh = false): Promise<string> {\n return this.resolveApiKey(forceRefresh);\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async relayMessage(\n taskId: string,\n runId: string,\n text: string,\n ): Promise<void> {\n const teamId = this.getTeamId();\n await this.apiRequest<{ status: string }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/relay_message/`,\n {\n method: \"POST\",\n body: JSON.stringify({ text }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n return response.artifacts ?? [];\n }\n\n async getArtifactPresignedUrl(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<string | null> {\n const teamId = this.getTeamId();\n try {\n const response = await this.apiRequest<{\n url: string;\n expires_in: number;\n }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/presign/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n return response.url;\n } catch {\n return null;\n }\n }\n\n /**\n * Download artifact content by storage path\n * Gets a presigned URL and fetches the content\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const url = await this.getArtifactPresignedUrl(taskId, runId, storagePath);\n if (!url) {\n return null;\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n const endpoint = `/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`;\n\n try {\n const response = await this.performRequestWithRetry(endpoint);\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","/**\n * Configuration for a single saga step\n */\nexport interface SagaStep<T> {\n /** Unique name for this step (used in logging) */\n name: string;\n /** The forward action to execute */\n execute: () => Promise<T>;\n /** The rollback action to undo this step (receives the execute result) */\n rollback: (result: T) => Promise<void>;\n}\n\n/**\n * Result of a saga execution\n */\nexport type SagaResult<T, TFailedStep extends string = string> =\n | { success: true; data: T }\n | { success: false; error: string; failedStep: TFailedStep };\n\nexport interface SagaLogger {\n info(message: string, data?: Record<string, unknown>): void;\n debug(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n warn(message: string, data?: Record<string, unknown>): void;\n}\n\nconst consoleLogger: SagaLogger = {\n info: (_message, _data) => {},\n debug: (_message, _data) => {},\n error: (_message, _data) => {},\n warn: (_message, _data) => {},\n};\n\n/**\n * Abstract base class for implementing our Saga pattern.\n *\n * Subclasses implement the `execute` method, using `this.step()` to define\n * each step with its compensating action. If any step throws, all completed\n * steps are automatically rolled back in reverse order.\n *\n * The failed step name is automatically tracked from the step's `name` property.\n *\n * @template TInput - The input type for the saga\n * @template TOutput - The successful output type\n */\nexport abstract class Saga<TInput, TOutput> {\n abstract readonly sagaName: string;\n\n private completedSteps: Array<{\n name: string;\n rollback: () => Promise<void>;\n }> = [];\n private currentStepName = \"unknown\";\n private stepTimings: Array<{ name: string; durationMs: number }> = [];\n protected readonly log: SagaLogger;\n\n constructor(logger?: SagaLogger) {\n this.log = logger ?? consoleLogger;\n }\n\n /**\n * Run the saga with the given input.\n * Returns a discriminated union result - either success with data or failure with error details.\n */\n async run(input: TInput): Promise<SagaResult<TOutput>> {\n this.completedSteps = [];\n this.currentStepName = \"unknown\";\n this.stepTimings = [];\n\n const sagaStart = performance.now();\n this.log.info(\"Starting saga\", { sagaName: this.sagaName });\n\n try {\n const result = await this.execute(input);\n\n const totalDuration = performance.now() - sagaStart;\n this.log.debug(\"Saga completed successfully\", {\n sagaName: this.sagaName,\n stepsCompleted: this.completedSteps.length,\n totalDurationMs: Math.round(totalDuration),\n stepTimings: this.stepTimings,\n });\n\n return { success: true, data: result };\n } catch (error) {\n this.log.error(\"Saga failed, initiating rollback\", {\n sagaName: this.sagaName,\n failedStep: this.currentStepName,\n error: error instanceof Error ? error.message : String(error),\n });\n\n await this.rollback();\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n failedStep: this.currentStepName,\n };\n }\n }\n\n /**\n * Implement this method to define the saga's steps.\n * Use `this.step()` to execute each step with its compensating action.\n */\n protected abstract execute(input: TInput): Promise<TOutput>;\n\n /**\n * Execute a step with its rollback action.\n * If the step succeeds, its rollback action is stored for potential rollback.\n * The step name is automatically tracked for error reporting.\n *\n * @param config - Step configuration with name, execute, and rollback functions\n * @returns The result of the execute function\n * @throws Re-throws any error from the execute function (triggers rollback)\n */\n protected async step<T>(config: SagaStep<T>): Promise<T> {\n this.currentStepName = config.name;\n this.log.debug(`Executing step: ${config.name}`);\n\n const stepStart = performance.now();\n const result = await config.execute();\n const durationMs = Math.round(performance.now() - stepStart);\n\n this.stepTimings.push({ name: config.name, durationMs });\n this.log.debug(`Step completed: ${config.name}`, { durationMs });\n\n // Store rollback action with the result bound\n this.completedSteps.push({\n name: config.name,\n rollback: () => config.rollback(result),\n });\n\n return result;\n }\n\n /**\n * Execute a step that doesn't need rollback.\n * Useful for read-only operations or operations that are idempotent.\n * The step name is automatically tracked for error reporting.\n *\n * @param name - Step name for logging and error tracking\n * @param execute - The action to execute\n * @returns The result of the execute function\n */\n protected async readOnlyStep<T>(\n name: string,\n execute: () => Promise<T>,\n ): Promise<T> {\n this.currentStepName = name;\n this.log.debug(`Executing read-only step: ${name}`);\n\n const stepStart = performance.now();\n const result = await execute();\n const durationMs = Math.round(performance.now() - stepStart);\n\n this.stepTimings.push({ name, durationMs });\n this.log.debug(`Read-only step completed: ${name}`, { durationMs });\n return result;\n }\n\n /**\n * Roll back all completed steps in reverse order.\n * Rollback errors are logged but don't stop the rollback of other steps.\n */\n private async rollback(): Promise<void> {\n this.log.info(\"Rolling back saga\", {\n stepsToRollback: this.completedSteps.length,\n });\n\n const stepsReversed = [...this.completedSteps].reverse();\n\n for (const step of stepsReversed) {\n try {\n this.log.debug(`Rolling back step: ${step.name}`);\n await step.rollback();\n this.log.debug(`Step rolled back: ${step.name}`);\n } catch (error) {\n // Log but continue - we want to attempt all rollbacks\n this.log.error(`Failed to rollback step: ${step.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n this.log.info(\"Rollback completed\", {\n stepsAttempted: this.completedSteps.length,\n });\n }\n\n /**\n * Get the number of completed steps (useful for testing)\n */\n protected getCompletedStepCount(): number {\n return this.completedSteps.length;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { CreateGitClientOptions } from \"./client\";\nimport { getGitOperationManager } from \"./operation-manager\";\n\nexport interface WorktreeListEntry {\n path: string;\n head: string;\n branch: string | null;\n}\n\nexport interface AheadBehind {\n aheadOfRemote: number;\n behind: number;\n}\n\nexport interface GitStatus {\n isClean: boolean;\n staged: string[];\n modified: string[];\n deleted: string[];\n untracked: string[];\n}\n\ntype GitLike = {\n raw: (args: string[]) => Promise<string>;\n revparse: (args: string[]) => Promise<string>;\n};\n\nexport async function detectDefaultBranch(git: GitLike): Promise<string> {\n try {\n const remoteBranch = await git.raw([\n \"symbolic-ref\",\n \"refs/remotes/origin/HEAD\",\n ]);\n return remoteBranch.trim().replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // Check common default branch names\n for (const candidate of [\"main\", \"master\"]) {\n try {\n await git.revparse([\"--verify\", candidate]);\n return candidate;\n } catch {}\n }\n\n // Check git config init.defaultBranch (user's configured default)\n try {\n const configured = await git.raw([\"config\", \"init.defaultBranch\"]);\n const branch = configured.trim();\n if (branch) {\n try {\n await git.revparse([\"--verify\", branch]);\n return branch;\n } catch {}\n }\n } catch {}\n\n // Fall back to current branch (HEAD)\n try {\n const head = await git.raw([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const branch = head.trim();\n if (branch && branch !== \"HEAD\") {\n return branch;\n }\n } catch {}\n\n throw new Error(\"Cannot determine default branch\");\n }\n}\n\nasync function detectDefaultBranchWithFallback(git: GitLike): Promise<string> {\n try {\n return await detectDefaultBranch(git);\n } catch {\n // Last resort: use current branch or \"main\"\n try {\n const head = await git.raw([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const branch = head.trim();\n if (branch && branch !== \"HEAD\") {\n return branch;\n }\n } catch {}\n return \"main\";\n }\n}\n\nexport async function getCurrentBranch(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const branch = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n return branch === \"HEAD\" ? null : branch;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getDefaultBranch(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, detectDefaultBranch, {\n signal: options?.abortSignal,\n });\n}\n\nexport async function getRemoteUrl(\n baseDir: string,\n remote = \"origin\",\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const url = await git.remote([\"get-url\", remote]);\n return url || null;\n } catch {\n if (remote === \"origin\") {\n const remotes = await git.getRemotes(true);\n if (remotes.length > 0 && remotes[0].refs.fetch) {\n return remotes[0].refs.fetch;\n }\n }\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getStatus(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<GitStatus> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const status = await git.status([\"--untracked-files=normal\"]);\n return {\n isClean: status.isClean(),\n staged: status.staged,\n modified: status.modified,\n deleted: status.deleted,\n untracked: status.not_added,\n };\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function hasChanges(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const status = await git.status([\"--untracked-files=normal\"]);\n return !status.isClean();\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getAheadBehind(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<AheadBehind | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const branchOutput = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n const branch = branchOutput === \"HEAD\" ? null : branchOutput;\n if (!branch) return null;\n\n try {\n await git.raw([\"rev-parse\", \"--abbrev-ref\", `${branch}@{upstream}`]);\n } catch {\n return null;\n }\n\n const status = await git.status([\"--untracked-files=no\"]);\n return {\n aheadOfRemote: status.ahead,\n behind: status.behind,\n };\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function branchExists(\n baseDir: string,\n branchName: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n await git.revparse([\"--verify\", branchName]);\n return true;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listWorktrees(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<WorktreeListEntry[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\"worktree\", \"list\", \"--porcelain\"]);\n const worktrees: WorktreeListEntry[] = [];\n let current: Partial<WorktreeListEntry> = {};\n\n for (const line of output.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n if (current.path) {\n worktrees.push(current as WorktreeListEntry);\n }\n current = { path: line.slice(9), branch: null };\n } else if (line.startsWith(\"HEAD \")) {\n current.head = line.slice(5);\n } else if (line.startsWith(\"branch \")) {\n current.branch = line.slice(7).replace(\"refs/heads/\", \"\");\n } else if (line === \"detached\") {\n current.branch = null;\n }\n }\n\n if (current.path) {\n worktrees.push(current as WorktreeListEntry);\n }\n\n return worktrees;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getFileAtHead(\n baseDir: string,\n filePath: string,\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n return await git.show([`HEAD:${filePath}`]);\n } catch {\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getHeadSha(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.revparse([\"HEAD\"]), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function isDetachedHead(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const branch = await getCurrentBranch(baseDir, options);\n return branch === null;\n}\n\nexport async function isGitRepository(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n await git.revparse([\"--is-inside-work-tree\"]);\n return true;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getChangedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<Set<string>> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const changedFiles = new Set<string>();\n\n try {\n const defaultBranch = await detectDefaultBranchWithFallback(git);\n const branchOutput = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n const currentBranch = branchOutput === \"HEAD\" ? null : branchOutput;\n\n if (currentBranch && currentBranch !== defaultBranch) {\n try {\n const diffOutput = await git.diff([\n \"--name-only\",\n `${defaultBranch}...HEAD`,\n ]);\n for (const file of diffOutput.split(\"\\n\").filter(Boolean)) {\n changedFiles.add(file);\n }\n } catch {}\n }\n\n const status = await git.status([\"--untracked-files=normal\"]);\n for (const file of [\n ...status.modified,\n ...status.created,\n ...status.deleted,\n ...status.renamed.map((r) => r.to),\n ...status.not_added,\n ]) {\n changedFiles.add(file);\n }\n } catch {}\n\n return changedFiles;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getAllBranches(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const summary = await git.branchLocal();\n return summary.all;\n } catch {\n return [];\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport type GitFileStatus =\n | \"modified\"\n | \"added\"\n | \"deleted\"\n | \"renamed\"\n | \"untracked\";\n\nexport interface ChangedFileInfo {\n path: string;\n status: GitFileStatus;\n originalPath?: string;\n linesAdded?: number;\n linesRemoved?: number;\n}\n\nexport interface GetChangedFilesDetailedOptions extends CreateGitClientOptions {\n excludePatterns?: string[];\n}\n\nfunction matchesExcludePattern(filePath: string, patterns: string[]): boolean {\n return patterns.some((pattern) => {\n if (pattern.startsWith(\"/\")) {\n return (\n filePath === pattern.slice(1) ||\n filePath.startsWith(`${pattern.slice(1)}/`)\n );\n }\n return filePath === pattern || filePath.startsWith(`${pattern}/`);\n });\n}\n\nasync function countFileLines(filePath: string): Promise<number> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n if (!content) return 0;\n return content.split(\"\\n\").length - (content.endsWith(\"\\n\") ? 1 : 0);\n } catch {\n return 0;\n }\n}\n\nexport async function getChangedFilesDetailed(\n baseDir: string,\n options?: GetChangedFilesDetailedOptions,\n): Promise<ChangedFileInfo[]> {\n const { excludePatterns, ...gitOptions } = options ?? {};\n const manager = getGitOperationManager();\n\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const [diffSummary, status] = await Promise.all([\n git.diffSummary([\"-M\", \"HEAD\"]),\n git.status([\"--untracked-files=normal\"]),\n ]);\n\n const seenPaths = new Set<string>();\n const files: ChangedFileInfo[] = [];\n\n for (const file of diffSummary.files) {\n if (\n excludePatterns &&\n matchesExcludePattern(file.file, excludePatterns)\n ) {\n seenPaths.add(file.file);\n continue;\n }\n\n const hasFrom = \"from\" in file && file.from;\n const isBinary = file.binary;\n files.push({\n path: file.file,\n status: hasFrom\n ? \"renamed\"\n : status.deleted.includes(file.file)\n ? \"deleted\"\n : status.created.includes(file.file)\n ? \"added\"\n : \"modified\",\n originalPath: hasFrom ? (file.from as string) : undefined,\n linesAdded: isBinary\n ? undefined\n : (file as { insertions: number }).insertions,\n linesRemoved: isBinary\n ? undefined\n : (file as { deletions: number }).deletions,\n });\n seenPaths.add(file.file);\n if (hasFrom) seenPaths.add(file.from as string);\n }\n\n const MAX_UNTRACKED_FILES = 10_000;\n let untrackedProcessed = 0;\n for (const file of status.not_added) {\n if (untrackedProcessed >= MAX_UNTRACKED_FILES) break;\n if (!seenPaths.has(file)) {\n if (\n excludePatterns &&\n matchesExcludePattern(file, excludePatterns)\n ) {\n continue;\n }\n const lineCount = await countFileLines(path.join(baseDir, file));\n files.push({\n path: file,\n status: \"untracked\",\n linesAdded: lineCount,\n linesRemoved: 0,\n });\n untrackedProcessed++;\n }\n }\n\n for (const file of status.modified) {\n if (!seenPaths.has(file)) {\n if (\n excludePatterns &&\n matchesExcludePattern(file, excludePatterns)\n ) {\n continue;\n }\n try {\n const unstaged = await git.diff([file]);\n const lines = unstaged.split(\"\\n\");\n const linesAdded = lines.filter(\n (l) => l.startsWith(\"+\") && !l.startsWith(\"+++\"),\n ).length;\n const linesRemoved = lines.filter(\n (l) => l.startsWith(\"-\") && !l.startsWith(\"---\"),\n ).length;\n files.push({\n path: file,\n status: \"modified\",\n linesAdded,\n linesRemoved,\n });\n } catch {}\n }\n }\n\n for (const file of status.deleted) {\n if (!seenPaths.has(file)) {\n if (\n excludePatterns &&\n matchesExcludePattern(file, excludePatterns)\n ) {\n continue;\n }\n files.push({\n path: file,\n status: \"deleted\",\n linesAdded: 0,\n linesRemoved: 0,\n });\n }\n }\n\n return files;\n } catch {\n return [];\n }\n },\n { signal: gitOptions?.abortSignal },\n );\n}\n\nexport async function getChangedFilesBetweenBranches(\n baseDir: string,\n baseBranch: string,\n headBranch?: string,\n options?: GetChangedFilesDetailedOptions,\n): Promise<ChangedFileInfo[]> {\n const { excludePatterns, ...gitOptions } = options ?? {};\n const manager = getGitOperationManager();\n\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const from = `origin/${baseBranch}`;\n const to = headBranch ?? \"HEAD\";\n\n const [diffSummary, nameStatusOutput] = await Promise.all([\n git.diffSummary([\"-M\", `${from}...${to}`]),\n git.raw([\"diff\", \"--name-status\", \"-M\", `${from}...${to}`]),\n ]);\n\n const statusMap = new Map<string, GitFileStatus>();\n for (const line of nameStatusOutput.split(\"\\n\").filter(Boolean)) {\n const parts = line.split(\"\\t\");\n const code = parts[0];\n const filePath = parts.length === 3 ? parts[2] : parts[1];\n if (!filePath) continue;\n\n if (code?.startsWith(\"R\")) {\n statusMap.set(filePath, \"renamed\");\n } else if (code === \"A\") {\n statusMap.set(filePath, \"added\");\n } else if (code === \"D\") {\n statusMap.set(filePath, \"deleted\");\n } else {\n statusMap.set(filePath, \"modified\");\n }\n }\n\n const files: ChangedFileInfo[] = [];\n for (const file of diffSummary.files) {\n if (\n excludePatterns &&\n matchesExcludePattern(file.file, excludePatterns)\n ) {\n continue;\n }\n\n const hasFrom = \"from\" in file && file.from;\n const isBinary = file.binary;\n\n files.push({\n path: file.file,\n status: statusMap.get(file.file) ?? \"modified\",\n originalPath: hasFrom ? (file.from as string) : undefined,\n linesAdded: isBinary\n ? undefined\n : (file as { insertions: number }).insertions,\n linesRemoved: isBinary\n ? undefined\n : (file as { deletions: number }).deletions,\n });\n }\n\n return files;\n } catch {\n return [];\n }\n },\n { signal: gitOptions?.abortSignal },\n );\n}\n\nexport interface DiffStats {\n filesChanged: number;\n linesAdded: number;\n linesRemoved: number;\n}\n\nexport interface GetDiffStatsOptions extends CreateGitClientOptions {\n excludePatterns?: string[];\n}\n\nexport function computeDiffStatsFromFiles(files: ChangedFileInfo[]): DiffStats {\n let linesAdded = 0;\n let linesRemoved = 0;\n\n for (const file of files) {\n linesAdded += file.linesAdded ?? 0;\n linesRemoved += file.linesRemoved ?? 0;\n }\n\n return {\n filesChanged: files.length,\n linesAdded,\n linesRemoved,\n };\n}\n\nexport async function getDiffStats(\n baseDir: string,\n options?: GetDiffStatsOptions,\n): Promise<DiffStats> {\n const files = await getChangedFilesDetailed(baseDir, options);\n return computeDiffStatsFromFiles(files);\n}\n\nexport interface SyncStatus {\n aheadOfRemote: number;\n behind: number;\n aheadOfDefault: number;\n hasRemote: boolean;\n currentBranch: string | null;\n isFeatureBranch: boolean;\n}\n\nexport async function getSyncStatus(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<SyncStatus> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const status = await git.status([\"--untracked-files=no\"]);\n const isDetached = status.detached || status.current === \"HEAD\";\n const currentBranch = isDetached ? null : status.current || null;\n\n if (!currentBranch) {\n return {\n aheadOfRemote: 0,\n behind: 0,\n aheadOfDefault: 0,\n hasRemote: false,\n currentBranch: null,\n isFeatureBranch: false,\n };\n }\n\n const defaultBranch = await detectDefaultBranchWithFallback(git);\n const hasRemote = status.tracking !== null;\n const isFeatureBranch = currentBranch !== defaultBranch;\n\n let aheadOfDefault = 0;\n if (isFeatureBranch) {\n try {\n const log = await git.log({\n from: `origin/${defaultBranch}`,\n to: currentBranch,\n });\n aheadOfDefault = log.total;\n } catch {}\n }\n\n return {\n aheadOfRemote: status.ahead,\n behind: status.behind,\n aheadOfDefault,\n hasRemote,\n currentBranch,\n isFeatureBranch,\n };\n } catch {\n return {\n aheadOfRemote: 0,\n behind: 0,\n aheadOfDefault: 0,\n hasRemote: false,\n currentBranch: null,\n isFeatureBranch: false,\n };\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport interface CommitInfo {\n sha: string;\n shortSha: string;\n message: string;\n author: string;\n date: string;\n}\n\nexport async function getLatestCommit(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<CommitInfo | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const log = await git.log({ maxCount: 1 });\n const latest = log.latest;\n if (!latest) return null;\n\n return {\n sha: latest.hash,\n shortSha: latest.hash.slice(0, 7),\n message: latest.message,\n author: latest.author_name,\n date: latest.date,\n };\n } catch {\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getCommitsBetweenBranches(\n baseDir: string,\n baseBranch: string,\n headBranch?: string,\n maxCount = 50,\n options?: CreateGitClientOptions,\n): Promise<CommitInfo[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const log = await git.log({\n from: `origin/${baseBranch}`,\n to: headBranch ?? \"HEAD\",\n maxCount,\n });\n return log.all.map((c) => ({\n sha: c.hash,\n shortSha: c.hash.slice(0, 7),\n message: c.message,\n author: c.author_name,\n date: c.date,\n }));\n } catch {\n return [];\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport interface CommitConventions {\n conventionalCommits: boolean;\n commonPrefixes: string[];\n sampleMessages: string[];\n}\n\nexport async function getCommitConventions(\n baseDir: string,\n sampleSize = 20,\n options?: CreateGitClientOptions,\n): Promise<CommitConventions> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const log = await git.log({ maxCount: sampleSize });\n const messages = log.all.map((c) => c.message);\n\n const conventionalPattern =\n /^(feat|fix|docs|style|refactor|test|chore|build|ci|perf|revert)(\\(.+\\))?:/;\n const conventionalCount = messages.filter((m) =>\n conventionalPattern.test(m),\n ).length;\n const conventionalCommits = conventionalCount > messages.length * 0.5;\n\n const prefixes = messages\n .map((m) => m.match(/^([a-z]+)(\\(.+\\))?:/)?.[1])\n .filter((p): p is string => Boolean(p));\n const prefixCounts = prefixes.reduce(\n (acc, p) => {\n acc[p] = (acc[p] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>,\n );\n const commonPrefixes = Object.entries(prefixCounts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([prefix]) => prefix);\n\n return {\n conventionalCommits,\n commonPrefixes,\n sampleMessages: messages.slice(0, 5),\n };\n } catch {\n return {\n conventionalCommits: false,\n commonPrefixes: [],\n sampleMessages: [],\n };\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function fetch(\n baseDir: string,\n remote = \"origin\",\n options?: CreateGitClientOptions,\n): Promise<void> {\n const manager = getGitOperationManager();\n await manager.executeWrite(\n baseDir,\n async (git) => {\n await git.fetch(remote);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\"ls-files\"]);\n return output.split(\"\\n\").filter(Boolean);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listUntrackedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\n \"ls-files\",\n \"--others\",\n \"--exclude-standard\",\n ]);\n return output.split(\"\\n\").filter(Boolean);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listAllFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const [tracked, untracked] = await Promise.all([\n listFiles(baseDir, options),\n listUntrackedFiles(baseDir, options),\n ]);\n return [...tracked, ...untracked];\n}\n\nexport async function hasTrackedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const files = await listFiles(baseDir, options);\n return files.length > 0;\n}\n\nexport async function getStagedDiff(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.diff([\"--cached\", \"HEAD\"]), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function getUnstagedDiff(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.diff(), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function getDiffAgainstRemote(\n baseDir: string,\n baseBranch: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n (git) => git.diff([`origin/${baseBranch}...HEAD`]),\n { signal: options?.abortSignal },\n );\n}\n\nexport async function isCommitOnRemote(\n baseDir: string,\n commit: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const output = await git.branch([\"-r\", \"--contains\", commit]);\n return output.all.length > 0;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function resolveGitDir(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const gitDir = await git.revparse([\"--git-dir\"]);\n return path.resolve(baseDir, gitDir);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function addToLocalExclude(\n baseDir: string,\n pattern: string,\n options?: CreateGitClientOptions,\n): Promise<void> {\n const manager = getGitOperationManager();\n const excludePath = await manager.executeRead(\n baseDir,\n async (git) => {\n // --git-path resolves to the correct location for both regular repos\n // and worktrees (where info/exclude is shared via the common dir)\n const rel = await git.revparse([\"--git-path\", \"info/exclude\"]);\n return path.resolve(baseDir, rel);\n },\n { signal: options?.abortSignal },\n );\n\n let content = \"\";\n try {\n content = await fs.readFile(excludePath, \"utf-8\");\n } catch {}\n\n const normalizedPattern = pattern.startsWith(\"/\") ? pattern : `/${pattern}`;\n const patternWithoutSlash = pattern.replace(/^\\//, \"\");\n if (\n content.includes(normalizedPattern) ||\n content.includes(patternWithoutSlash)\n ) {\n return;\n }\n\n const infoDir = path.dirname(excludePath);\n await fs.mkdir(infoDir, { recursive: true });\n\n const newContent = content.trimEnd()\n ? `${content.trimEnd()}\\n${pattern}\\n`\n : `${pattern}\\n`;\n await fs.writeFile(excludePath, newContent);\n}\n","const cache = new WeakMap<String, string[]>();\n\nexport function pathspec(...paths: string[]) {\n const key = new String(paths);\n cache.set(key, paths);\n\n return key as string;\n}\n\nexport function isPathSpec(path: string | unknown): path is string {\n return path instanceof String && cache.has(path);\n}\n\nexport function toPaths(pathSpec: string): string[] {\n return cache.get(pathSpec) || [];\n}\n","import type { SimpleGitTask } from '../types';\n\n/**\n * The `GitError` is thrown when the underlying `git` process throws a\n * fatal exception (eg an `ENOENT` exception when attempting to use a\n * non-writable directory as the root for your repo), and acts as the\n * base class for more specific errors thrown by the parsing of the\n * git response or errors in the configuration of the task about to\n * be run.\n *\n * When an exception is thrown, pending tasks in the same instance will\n * not be executed. The recommended way to run a series of tasks that\n * can independently fail without needing to prevent future tasks from\n * running is to catch them individually:\n *\n * ```typescript\n import { gitP, SimpleGit, GitError, PullResult } from 'simple-git';\n\n function catchTask (e: GitError) {\n return e.\n }\n\n const git = gitP(repoWorkingDir);\n const pulled: PullResult | GitError = await git.pull().catch(catchTask);\n const pushed: string | GitError = await git.pushTags().catch(catchTask);\n ```\n */\nexport class GitError extends Error {\n constructor(\n public task?: SimpleGitTask<any>,\n message?: string\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { GitError } from './git-error';\n\n/**\n * The `GitResponseError` is the wrapper for a parsed response that is treated as\n * a fatal error, for example attempting a `merge` can leave the repo in a corrupted\n * state when there are conflicts so the task will reject rather than resolve.\n *\n * For example, catching the merge conflict exception:\n *\n * ```typescript\n import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git';\n\n const git = gitP(repoRoot);\n const mergeOptions: string[] = ['--no-ff', 'other-branch'];\n const mergeSummary: MergeSummary = await git.merge(mergeOptions)\n .catch((e: GitResponseError<MergeSummary>) => e.git);\n\n if (mergeSummary.failed) {\n // deal with the error\n }\n ```\n */\nexport class GitResponseError<T = any> extends GitError {\n constructor(\n /**\n * `.git` access the parsed response that is treated as being an error\n */\n public readonly git: T,\n message?: string\n ) {\n super(undefined, message || String(git));\n }\n}\n","import { GitError } from './git-error';\n\n/**\n * The `TaskConfigurationError` is thrown when a command was incorrectly\n * configured. An error of this kind means that no attempt was made to\n * run your command through the underlying `git` binary.\n *\n * Check the `.message` property for more detail on why your configuration\n * resulted in an error.\n */\nexport class TaskConfigurationError extends GitError {\n constructor(message?: string) {\n super(undefined, message);\n }\n}\n","import { Buffer } from 'node:buffer';\nimport { exists, FOLDER } from '@kwsites/file-exists';\nimport type { Maybe } from '../types';\nimport { filterHasLength } from './argument-filters';\n\ntype Callable = (...args: unknown[]) => unknown;\n\nexport const NULL = '\\0';\n\nexport const NOOP: Callable = () => {};\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function asFunction<T>(source: T | unknown): Callable {\n if (typeof source !== 'function') {\n return NOOP;\n }\n return source as Callable;\n}\n\n/**\n * Determines whether the supplied argument is both a function, and is not\n * the `NOOP` function.\n */\nexport function isUserFunction<T extends Function>(source: T | unknown): source is T {\n return typeof source === 'function' && source !== NOOP;\n}\n\nexport function splitOn(input: string, char: string): [string, string] {\n const index = input.indexOf(char);\n if (index <= 0) {\n return [input, ''];\n }\n\n return [input.substr(0, index), input.substr(index + 1)];\n}\n\nexport function first<T extends unknown[]>(input: T, offset?: number): Maybe<T[number]>;\nexport function first<T extends IArguments>(input: T, offset?: number): Maybe<unknown>;\nexport function first(input: unknown[] | IArguments, offset = 0): Maybe<unknown> {\n return isArrayLike(input) && input.length > offset ? input[offset] : undefined;\n}\n\nexport function last<T extends unknown[]>(input: T, offset?: number): Maybe<T[number]>;\nexport function last<T extends IArguments>(input: T, offset?: number): Maybe<unknown>;\nexport function last<T>(input: T, offset?: number): Maybe<unknown>;\nexport function last(input: unknown, offset = 0) {\n if (isArrayLike(input) && input.length > offset) {\n return input[input.length - 1 - offset];\n }\n}\n\ntype ArrayLike<T> = T[] | IArguments | { [index: number]: T; length: number };\n\nfunction isArrayLike(input: unknown): input is ArrayLike<unknown> {\n return filterHasLength(input);\n}\n\nexport function toLinesWithContent(input = '', trimmed = true, separator = '\\n'): string[] {\n return input.split(separator).reduce((output, line) => {\n const lineContent = trimmed ? line.trim() : line;\n if (lineContent) {\n output.push(lineContent);\n }\n return output;\n }, [] as string[]);\n}\n\ntype LineWithContentCallback<T = void> = (line: string) => T;\n\nexport function forEachLineWithContent<T>(\n input: string,\n callback: LineWithContentCallback<T>\n): T[] {\n return toLinesWithContent(input, true).map((line) => callback(line));\n}\n\nexport function folderExists(path: string): boolean {\n return exists(path, FOLDER);\n}\n\n/**\n * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`.\n */\nexport function append<T>(target: T[] | Set<T>, item: T): typeof item {\n if (Array.isArray(target)) {\n if (!target.includes(item)) {\n target.push(item);\n }\n } else {\n target.add(item);\n }\n return item;\n}\n\n/**\n * Adds `item` into the `target` `Array` when it is not already present and returns the `target`.\n */\nexport function including<T>(target: T[], item: T): typeof target {\n if (Array.isArray(target) && !target.includes(item)) {\n target.push(item);\n }\n\n return target;\n}\n\nexport function remove<T>(target: Set<T> | T[], item: T): T {\n if (Array.isArray(target)) {\n const index = target.indexOf(item);\n if (index >= 0) {\n target.splice(index, 1);\n }\n } else {\n target.delete(item);\n }\n return item;\n}\n\nexport const objectToString = Object.prototype.toString.call.bind(Object.prototype.toString) as (\n input: unknown\n) => string;\n\nexport function asArray<T>(source: T | T[]): T[] {\n return Array.isArray(source) ? source : [source];\n}\n\nexport function asCamelCase(str: string) {\n return str.replace(/[\\s-]+(.)/g, (_all, chr) => {\n return chr.toUpperCase();\n });\n}\n\nexport function asStringArray<T>(source: T | T[]): string[] {\n return asArray(source).map((item) => {\n return item instanceof String ? (item as string) : String(item);\n });\n}\n\nexport function asNumber(source: string | null | undefined, onNaN = 0) {\n if (source == null) {\n return onNaN;\n }\n\n const num = parseInt(source, 10);\n return Number.isNaN(num) ? onNaN : num;\n}\n\nexport function prefixedArray<T>(input: T[], prefix: T): T[] {\n const output: T[] = [];\n for (let i = 0, max = input.length; i < max; i++) {\n output.push(prefix, input[i]);\n }\n return output;\n}\n\nexport function bufferToString(input: Buffer | Buffer[]): string {\n return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8');\n}\n\n/**\n * Get a new object from a source object with only the listed properties.\n */\nexport function pick<T, K extends keyof T>(source: T, properties: readonly K[]) {\n const out: Partial<Pick<T, K>> = {};\n\n properties.forEach((key) => {\n if (source[key] !== undefined) {\n out[key] = source[key];\n }\n });\n\n return out;\n}\n\nexport function delay(duration = 0): Promise<void> {\n return new Promise((done) => setTimeout(done, duration));\n}\n\nexport function orVoid<T>(input: T | false) {\n if (input === false) {\n return undefined;\n }\n return input;\n}\n","import { isPathSpec } from '../args/pathspec';\nimport type { Maybe, Options, Primitives } from '../types';\nimport { objectToString } from './util';\n\nexport type ArgumentFilterPredicate<T> = (input: T | unknown) => input is T;\n\nexport function filterType<T, K>(\n input: K,\n filter: ArgumentFilterPredicate<T>\n): K extends T ? T : undefined;\nexport function filterType<T, K>(input: K, filter: ArgumentFilterPredicate<T>, def: T): T;\nexport function filterType<T, K>(input: K, filter: ArgumentFilterPredicate<T>, def?: T): Maybe<T> {\n if (filter(input)) {\n return input;\n }\n return arguments.length > 2 ? def : undefined;\n}\n\nexport const filterArray: ArgumentFilterPredicate<Array<unknown>> = (\n input\n): input is Array<unknown> => {\n return Array.isArray(input);\n};\n\nexport function filterPrimitives(\n input: unknown,\n omit?: Array<'boolean' | 'string' | 'number'>\n): input is Primitives {\n const type = isPathSpec(input) ? 'string' : typeof input;\n\n return (\n /number|string|boolean/.test(type) &&\n (!omit || !omit.includes(type as 'boolean' | 'string' | 'number'))\n );\n}\n\nexport const filterNumber: ArgumentFilterPredicate<number> = (input: unknown): input is number => {\n return typeof input === 'number';\n};\n\nexport const filterString: ArgumentFilterPredicate<string> = (input: unknown): input is string => {\n return typeof input === 'string';\n};\n\nexport const filterStringOrStringArray: ArgumentFilterPredicate<string | string[]> = (\n input\n): input is string | string[] => {\n return filterString(input) || (Array.isArray(input) && input.every(filterString));\n};\n\nexport function filterPlainObject<T extends Options>(input: T | unknown): input is T;\nexport function filterPlainObject<T extends Record<string, unknown>>(\n input: T | unknown\n): input is T {\n return !!input && objectToString(input) === '[object Object]';\n}\n\nexport function filterFunction(input: unknown): input is (...args: unknown[]) => unknown {\n return typeof input === 'function';\n}\n\nexport const filterHasLength: ArgumentFilterPredicate<{ length: number }> = (\n input\n): input is { length: number } => {\n if (input == null || 'number|boolean|function'.includes(typeof input)) {\n return false;\n }\n\n return typeof (input as { length?: number }).length === 'number';\n};\n","/**\n * Known process exit codes used by the task parsers to determine whether an error\n * was one they can automatically handle\n */\nexport enum ExitCodes {\n SUCCESS,\n ERROR,\n NOT_FOUND = -2,\n UNCLEAN = 128,\n}\n","import { TaskResponseFormat } from '../types';\n\nexport class GitOutputStreams<T extends TaskResponseFormat = Buffer> {\n constructor(\n public readonly stdOut: T,\n public readonly stdErr: T\n ) {}\n\n asStrings(): GitOutputStreams<string> {\n return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8'));\n }\n}\n","function useMatchesDefault() {\n throw new Error(`LineParser:useMatches not implemented`);\n}\n\nexport class LineParser<T> {\n protected matches: string[] = [];\n protected useMatches: (target: T, match: string[]) => boolean | void = useMatchesDefault;\n\n private _regExp: RegExp[];\n\n constructor(\n regExp: RegExp | RegExp[],\n useMatches?: (target: T, match: string[]) => boolean | void\n ) {\n this._regExp = Array.isArray(regExp) ? regExp : [regExp];\n if (useMatches) {\n this.useMatches = useMatches;\n }\n }\n\n parse = (line: (offset: number) => string | undefined, target: T): boolean => {\n this.resetMatches();\n\n if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) {\n return false;\n }\n\n return this.useMatches(target, this.prepareMatches()) !== false;\n };\n\n protected resetMatches() {\n this.matches.length = 0;\n }\n\n protected prepareMatches() {\n return this.matches;\n }\n\n protected addMatch(reg: RegExp, index: number, line?: string) {\n const matched = line && reg.exec(line);\n if (matched) {\n this.pushMatch(index, matched);\n }\n\n return !!matched;\n }\n\n protected pushMatch(_index: number, matched: string[]) {\n this.matches.push(...matched.slice(1));\n }\n}\n\nexport class RemoteLineParser<T> extends LineParser<T> {\n protected addMatch(reg: RegExp, index: number, line?: string): boolean {\n return /^remote:\\s/.test(String(line)) && super.addMatch(reg, index, line);\n }\n\n protected pushMatch(index: number, matched: string[]) {\n if (index > 0 || matched.length > 1) {\n super.pushMatch(index, matched);\n }\n }\n}\n","import { SimpleGitOptions } from '../types';\n\nconst defaultOptions: Omit<SimpleGitOptions, 'baseDir'> = {\n binary: 'git',\n maxConcurrentProcesses: 5,\n config: [],\n trimmed: false,\n};\n\nexport function createInstanceConfig(\n ...options: Array<Partial<SimpleGitOptions> | undefined>\n): SimpleGitOptions {\n const baseDir = process.cwd();\n const config: SimpleGitOptions = Object.assign(\n { baseDir, ...defaultOptions },\n ...options.filter((o) => typeof o === 'object' && o)\n );\n\n config.baseDir = config.baseDir || baseDir;\n config.trimmed = config.trimmed === true;\n\n return config;\n}\n","import {\n filterArray,\n filterFunction,\n filterPlainObject,\n filterPrimitives,\n filterType,\n} from './argument-filters';\nimport { asFunction, asStringArray, isUserFunction, last } from './util';\nimport { Maybe, Options } from '../types';\nimport { isPathSpec } from '../args/pathspec';\n\nexport function appendTaskOptions<T extends Options = Options>(\n options: Maybe<T>,\n commands: string[] = []\n): string[] {\n if (!filterPlainObject<Options>(options)) {\n return commands;\n }\n\n return Object.keys(options).reduce((commands: string[], key: string) => {\n const value = options[key];\n\n if (isPathSpec(value)) {\n commands.push(value);\n } else if (filterPrimitives(value, ['boolean'])) {\n commands.push(key + '=' + value);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n if (!filterPrimitives(v, ['string', 'number'])) {\n commands.push(key + '=' + v);\n }\n }\n } else {\n commands.push(key);\n }\n\n return commands;\n }, commands);\n}\n\nexport function getTrailingOptions(\n args: IArguments,\n initialPrimitive = 0,\n objectOnly = false\n): string[] {\n const command: string[] = [];\n\n for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) {\n if ('string|number'.includes(typeof args[i])) {\n command.push(String(args[i]));\n }\n }\n\n appendTaskOptions(trailingOptionsArgument(args), command);\n if (!objectOnly) {\n command.push(...trailingArrayArgument(args));\n }\n\n return command;\n}\n\nfunction trailingArrayArgument(args: IArguments) {\n const hasTrailingCallback = typeof last(args) === 'function';\n return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []));\n}\n\n/**\n * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument\n * if there is one. When not found, the return value is null.\n */\nexport function trailingOptionsArgument(args: IArguments): Maybe<Options> {\n const hasTrailingCallback = filterFunction(last(args));\n return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject);\n}\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function trailingFunctionArgument(\n args: unknown[] | IArguments | unknown,\n includeNoop = true\n): Maybe<(...args: unknown[]) => unknown> {\n const callback = asFunction(last(args));\n return includeNoop || isUserFunction(callback) ? callback : undefined;\n}\n","import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types';\nimport { GitOutputStreams } from './git-output-streams';\nimport { LineParser } from './line-parser';\nimport { asArray, toLinesWithContent } from './util';\n\nexport function callTaskParser<INPUT extends TaskResponseFormat, RESPONSE>(\n parser: TaskParser<INPUT, RESPONSE>,\n streams: GitOutputStreams<INPUT>\n) {\n return parser(streams.stdOut, streams.stdErr);\n}\n\nexport function parseStringResponse<T>(\n result: T,\n parsers: LineParser<T>[],\n texts: MaybeArray<string>,\n trim = true\n): T {\n asArray(texts).forEach((text) => {\n for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) {\n const line = (offset = 0) => {\n if (i + offset >= max) {\n return;\n }\n return lines[i + offset];\n };\n\n parsers.some(({ parse }) => parse(line, result));\n }\n });\n\n return result;\n}\n","export * from './argument-filters';\nexport * from './exit-codes';\nexport * from './git-output-streams';\nexport * from './line-parser';\nexport * from './simple-git-options';\nexport * from './task-options';\nexport * from './task-parser';\nexport * from './util';\n","import { ExitCodes } from '../utils';\nimport { Maybe, StringTask } from '../types';\n\nexport enum CheckRepoActions {\n BARE = 'bare',\n IN_TREE = 'tree',\n IS_REPO_ROOT = 'root',\n}\n\nconst onError: StringTask<boolean>['onError'] = ({ exitCode }, error, done, fail) => {\n if (exitCode === ExitCodes.UNCLEAN && isNotRepoMessage(error)) {\n return done(Buffer.from('false'));\n }\n\n fail(error);\n};\n\nconst parser: StringTask<boolean>['parser'] = (text) => {\n return text.trim() === 'true';\n};\n\nexport function checkIsRepoTask(action: Maybe<CheckRepoActions>): StringTask<boolean> {\n switch (action) {\n case CheckRepoActions.BARE:\n return checkIsBareRepoTask();\n case CheckRepoActions.IS_REPO_ROOT:\n return checkIsRepoRootTask();\n }\n\n const commands = ['rev-parse', '--is-inside-work-tree'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nexport function checkIsRepoRootTask(): StringTask<boolean> {\n const commands = ['rev-parse', '--git-dir'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser(path) {\n return /^\\.(git)?$/.test(path.trim());\n },\n };\n}\n\nexport function checkIsBareRepoTask(): StringTask<boolean> {\n const commands = ['rev-parse', '--is-bare-repository'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nfunction isNotRepoMessage(error: Error): boolean {\n return /(Not a git repository|Kein Git-Repository)/i.test(String(error));\n}\n","import { CleanSummary } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\n\nexport class CleanResponse implements CleanSummary {\n public paths: string[] = [];\n public files: string[] = [];\n public folders: string[] = [];\n\n constructor(public readonly dryRun: boolean) {}\n}\n\nconst removalRegexp = /^[a-z]+\\s*/i;\nconst dryRunRemovalRegexp = /^[a-z]+\\s+[a-z]+\\s*/i;\nconst isFolderRegexp = /\\/$/;\n\nexport function cleanSummaryParser(dryRun: boolean, text: string): CleanSummary {\n const summary = new CleanResponse(dryRun);\n const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp;\n\n toLinesWithContent(text).forEach((line) => {\n const removed = line.replace(regexp, '');\n\n summary.paths.push(removed);\n (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed);\n });\n\n return summary;\n}\n","import { TaskConfigurationError } from '../errors/task-configuration-error';\nimport type { BufferTask, EmptyTaskParser, SimpleGitTask, StringTask } from '../types';\n\nexport const EMPTY_COMMANDS: [] = [];\n\nexport type EmptyTask = {\n commands: typeof EMPTY_COMMANDS;\n format: 'empty';\n parser: EmptyTaskParser;\n onError?: undefined;\n};\n\nexport function adhocExecTask(parser: EmptyTaskParser): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser,\n };\n}\n\nexport function configurationErrorTask(error: Error | string): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser() {\n throw typeof error === 'string' ? new TaskConfigurationError(error) : error;\n },\n };\n}\n\nexport function straightThroughStringTask(commands: string[], trimmed = false): StringTask<string> {\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return trimmed ? String(text).trim() : text;\n },\n };\n}\n\nexport function straightThroughBufferTask(commands: string[]): BufferTask<Buffer> {\n return {\n commands,\n format: 'buffer',\n parser(buffer) {\n return buffer;\n },\n };\n}\n\nexport function isBufferTask<R>(task: SimpleGitTask<R>): task is BufferTask<R> {\n return task.format === 'buffer';\n}\n\nexport function isEmptyTask<R>(task: SimpleGitTask<R>): task is EmptyTask {\n return task.format === 'empty' || !task.commands.length;\n}\n","import { CleanSummary } from '../../../typings';\nimport { cleanSummaryParser } from '../responses/CleanSummary';\nimport { Maybe, StringTask } from '../types';\nimport { asStringArray } from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport const CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported';\nexport const CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter (\"n\" or \"f\") is required';\nexport const CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: ';\n\n/**\n * All supported option switches available for use in a `git.clean` operation\n */\nexport enum CleanOptions {\n DRY_RUN = 'n',\n FORCE = 'f',\n IGNORED_INCLUDED = 'x',\n IGNORED_ONLY = 'X',\n EXCLUDING = 'e',\n QUIET = 'q',\n RECURSIVE = 'd',\n}\n\n/**\n * The two modes `git.clean` can run in - one of these must be supplied in order\n * for the command to not throw a `TaskConfigurationError`\n */\nexport type CleanMode = CleanOptions.FORCE | CleanOptions.DRY_RUN;\n\nconst CleanOptionValues: Set<string> = new Set([\n 'i',\n ...asStringArray(Object.values(CleanOptions as any)),\n]);\n\nexport function cleanWithOptionsTask(mode: CleanMode | string, customArgs: string[]) {\n const { cleanMode, options, valid } = getCleanOptions(mode);\n\n if (!cleanMode) {\n return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED);\n }\n\n if (!valid.options) {\n return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode));\n }\n\n options.push(...customArgs);\n\n if (options.some(isInteractiveMode)) {\n return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE);\n }\n\n return cleanTask(cleanMode, options);\n}\n\nexport function cleanTask(mode: CleanMode, customArgs: string[]): StringTask<CleanSummary> {\n const commands: string[] = ['clean', `-${mode}`, ...customArgs];\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): CleanSummary {\n return cleanSummaryParser(mode === CleanOptions.DRY_RUN, text);\n },\n };\n}\n\nexport function isCleanOptionsArray(input: string[]): input is CleanOptions[] {\n return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test));\n}\n\nfunction getCleanOptions(input: string) {\n let cleanMode: Maybe<CleanMode>;\n let options: string[] = [];\n let valid = { cleanMode: false, options: true };\n\n input\n .replace(/[^a-z]i/g, '')\n .split('')\n .forEach((char) => {\n if (isCleanMode(char)) {\n cleanMode = char;\n valid.cleanMode = true;\n } else {\n valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`));\n }\n });\n\n return {\n cleanMode,\n options,\n valid,\n };\n}\n\nfunction isCleanMode(cleanMode?: string): cleanMode is CleanMode {\n return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN;\n}\n\nfunction isKnownOption(option: string): boolean {\n return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1));\n}\n\nfunction isInteractiveMode(option: string): boolean {\n if (/^-[^\\-]/.test(option)) {\n return option.indexOf('i') > 0;\n }\n\n return option === '--interactive';\n}\n","import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings';\nimport { last, splitOn } from '../utils';\n\nexport class ConfigList implements ConfigListSummary {\n public files: string[] = [];\n public values: { [fileName: string]: ConfigValues } = Object.create(null);\n\n private _all: ConfigValues | undefined;\n\n public get all(): ConfigValues {\n if (!this._all) {\n this._all = this.files.reduce((all: ConfigValues, file: string) => {\n return Object.assign(all, this.values[file]);\n }, {});\n }\n\n return this._all;\n }\n\n public addFile(file: string): ConfigValues {\n if (!(file in this.values)) {\n const latest = last(this.files);\n this.values[file] = latest ? Object.create(this.values[latest]) : {};\n\n this.files.push(file);\n }\n\n return this.values[file];\n }\n\n public addValue(file: string, key: string, value: string) {\n const values = this.addFile(file);\n\n if (!Object.hasOwn(values, key)) {\n values[key] = value;\n } else if (Array.isArray(values[key])) {\n (values[key] as string[]).push(value);\n } else {\n values[key] = [values[key] as string, value];\n }\n\n this._all = undefined;\n }\n}\n\nexport function configListParser(text: string): ConfigList {\n const config = new ConfigList();\n\n for (const item of configParser(text)) {\n config.addValue(item.file, String(item.key), item.value);\n }\n\n return config;\n}\n\nexport function configGetParser(text: string, key: string): ConfigGetResult {\n let value: string | null = null;\n const values: string[] = [];\n const scopes: Map<string, string[]> = new Map();\n\n for (const item of configParser(text, key)) {\n if (item.key !== key) {\n continue;\n }\n\n values.push((value = item.value));\n\n if (!scopes.has(item.file)) {\n scopes.set(item.file, []);\n }\n\n scopes.get(item.file)!.push(value);\n }\n\n return {\n key,\n paths: Array.from(scopes.keys()),\n scopes,\n value,\n values,\n };\n}\n\nfunction configFilePath(filePath: string): string {\n return filePath.replace(/^(file):/, '');\n}\n\nfunction* configParser(text: string, requestedKey: string | null = null) {\n const lines = text.split('\\0');\n\n for (let i = 0, max = lines.length - 1; i < max; ) {\n const file = configFilePath(lines[i++]);\n\n let value = lines[i++];\n let key = requestedKey;\n\n if (value.includes('\\n')) {\n const line = splitOn(value, '\\n');\n key = line[0];\n value = line[1];\n }\n\n yield { file, key, value };\n }\n}\n","import type { ConfigGetResult, ConfigListSummary, SimpleGit } from '../../../typings';\nimport { configGetParser, configListParser } from '../responses/ConfigList';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { trailingFunctionArgument } from '../utils';\n\nexport enum GitConfigScope {\n system = 'system',\n global = 'global',\n local = 'local',\n worktree = 'worktree',\n}\n\nfunction asConfigScope<T extends GitConfigScope | undefined>(\n scope: GitConfigScope | unknown,\n fallback: T\n): GitConfigScope | T {\n if (typeof scope === 'string' && Object.hasOwn(GitConfigScope, scope)) {\n return scope as GitConfigScope;\n }\n return fallback;\n}\n\nfunction addConfigTask(\n key: string,\n value: string,\n append: boolean,\n scope: GitConfigScope\n): StringTask<string> {\n const commands: string[] = ['config', `--${scope}`];\n\n if (append) {\n commands.push('--add');\n }\n\n commands.push(key, value);\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): string {\n return text;\n },\n };\n}\n\nfunction getConfigTask(key: string, scope?: GitConfigScope): StringTask<ConfigGetResult> {\n const commands: string[] = ['config', '--null', '--show-origin', '--get-all', key];\n\n if (scope) {\n commands.splice(1, 0, `--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return configGetParser(text, key);\n },\n };\n}\n\nfunction listConfigTask(scope?: GitConfigScope): StringTask<ConfigListSummary> {\n const commands = ['config', '--list', '--show-origin', '--null'];\n\n if (scope) {\n commands.push(`--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string) {\n return configListParser(text);\n },\n };\n}\n\nexport default function (): Pick<SimpleGit, 'addConfig' | 'getConfig' | 'listConfig'> {\n return {\n addConfig(this: SimpleGitApi, key: string, value: string, ...rest: unknown[]) {\n return this._runTask(\n addConfigTask(\n key,\n value,\n rest[0] === true,\n asConfigScope(rest[1], GitConfigScope.local)\n ),\n trailingFunctionArgument(arguments)\n );\n },\n\n getConfig(this: SimpleGitApi, key: string, scope?: GitConfigScope) {\n return this._runTask(\n getConfigTask(key, asConfigScope(scope, undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n\n listConfig(this: SimpleGitApi, ...rest: unknown[]) {\n return this._runTask(\n listConfigTask(asConfigScope(rest[0], undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","export enum DiffNameStatus {\n ADDED = 'A',\n COPIED = 'C',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n CHANGED = 'T',\n UNMERGED = 'U',\n UNKNOWN = 'X',\n BROKEN = 'B',\n}\n\nconst diffNameStatus = new Set(Object.values(DiffNameStatus));\n\nexport function isDiffNameStatus(input: string): input is DiffNameStatus {\n return diffNameStatus.has(input as DiffNameStatus);\n}\n","import { GrepResult, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport {\n asNumber,\n forEachLineWithContent,\n getTrailingOptions,\n NULL,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\n\nimport { configurationErrorTask } from './task';\n\nconst disallowedOptions = ['-h'];\n\nconst Query = Symbol('grepQuery');\n\nexport interface GitGrepQuery extends Iterable<string> {\n /** Adds one or more terms to be grouped as an \"and\" to any other terms */\n and(...and: string[]): this;\n\n /** Adds one or more search terms - git.grep will \"or\" this to other terms */\n param(...param: string[]): this;\n}\n\nclass GrepQuery implements GitGrepQuery {\n private [Query]: string[] = [];\n\n *[Symbol.iterator]() {\n for (const query of this[Query]) {\n yield query;\n }\n }\n\n and(...and: string[]) {\n and.length && this[Query].push('--and', '(', ...prefixedArray(and, '-e'), ')');\n return this;\n }\n\n param(...param: string[]) {\n this[Query].push(...prefixedArray(param, '-e'));\n return this;\n }\n}\n\n/**\n * Creates a new builder for a `git.grep` query with optional params\n */\nexport function grepQueryBuilder(...params: string[]): GitGrepQuery {\n return new GrepQuery().param(...params);\n}\n\nfunction parseGrep(grep: string): GrepResult {\n const paths: GrepResult['paths'] = new Set<string>();\n const results: GrepResult['results'] = {};\n\n forEachLineWithContent(grep, (input) => {\n const [path, line, preview] = input.split(NULL);\n paths.add(path);\n (results[path] = results[path] || []).push({\n line: asNumber(line),\n path,\n preview,\n });\n });\n\n return {\n paths,\n results,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'grep'> {\n return {\n grep(this: SimpleGitApi, searchTerm: string | GitGrepQuery) {\n const then = trailingFunctionArgument(arguments);\n const options = getTrailingOptions(arguments);\n\n for (const option of disallowedOptions) {\n if (options.includes(option)) {\n return this._runTask(\n configurationErrorTask(`git.grep: use of \"${option}\" is not supported.`),\n then\n );\n }\n }\n\n if (typeof searchTerm === 'string') {\n searchTerm = grepQueryBuilder().param(searchTerm);\n }\n\n const commands = ['grep', '--null', '-n', '--full-name', ...options, ...searchTerm];\n\n return this._runTask(\n {\n commands,\n format: 'utf-8',\n parser(stdOut) {\n return parseGrep(stdOut);\n },\n },\n then\n );\n },\n };\n}\n","import type { Maybe, OptionFlags, Options } from '../types';\nimport { asStringArray } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport enum ResetMode {\n MIXED = 'mixed',\n SOFT = 'soft',\n HARD = 'hard',\n MERGE = 'merge',\n KEEP = 'keep',\n}\n\nconst validResetModes = asStringArray(Object.values(ResetMode));\n\nexport type ResetOptions = Options &\n OptionFlags<'-q' | '--quiet' | '--no-quiet' | '--pathspec-from-nul'> &\n OptionFlags<'--pathspec-from-file', string>;\n\nexport function resetTask(mode: Maybe<ResetMode>, customArgs: string[]) {\n const commands: string[] = ['reset'];\n if (isValidResetMode(mode)) {\n commands.push(`--${mode}`);\n }\n commands.push(...customArgs);\n\n return straightThroughStringTask(commands);\n}\n\nexport function getResetMode(mode: ResetMode | unknown): Maybe<ResetMode> {\n if (isValidResetMode(mode)) {\n return mode;\n }\n\n switch (typeof mode) {\n case 'string':\n case 'undefined':\n return ResetMode.SOFT;\n }\n\n return;\n}\n\nfunction isValidResetMode(mode: ResetMode | unknown): mode is ResetMode {\n return typeof mode === 'string' && validResetModes.includes(mode);\n}\n","import debug, { Debugger } from 'debug';\nimport {\n append,\n filterHasLength,\n filterString,\n filterType,\n NOOP,\n objectToString,\n remove,\n} from './utils';\nimport { Maybe } from './types';\n\ndebug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-');\ndebug.formatters.B = (value: Buffer) => {\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8');\n }\n return objectToString(value);\n};\n\ntype OutputLoggingHandler = (message: string, ...args: any[]) => void;\n\nfunction createLog() {\n return debug('simple-git');\n}\n\nexport interface OutputLogger extends OutputLoggingHandler {\n readonly label: string;\n\n info: OutputLoggingHandler;\n step(nextStep?: string): OutputLogger;\n sibling(name: string): OutputLogger;\n}\n\nfunction prefixedLogger(\n to: Debugger,\n prefix: string,\n forward?: OutputLoggingHandler\n): OutputLoggingHandler {\n if (!prefix || !String(prefix).replace(/\\s*/, '')) {\n return !forward\n ? to\n : (message, ...args) => {\n to(message, ...args);\n forward(message, ...args);\n };\n }\n\n return (message, ...args) => {\n to(`%s ${message}`, prefix, ...args);\n if (forward) {\n forward(message, ...args);\n }\n };\n}\n\nfunction childLoggerName(\n name: Maybe<string>,\n childDebugger: Maybe<Debugger>,\n { namespace: parentNamespace }: Debugger\n): string {\n if (typeof name === 'string') {\n return name;\n }\n const childNamespace = (childDebugger && childDebugger.namespace) || '';\n\n if (childNamespace.startsWith(parentNamespace)) {\n return childNamespace.substr(parentNamespace.length + 1);\n }\n\n return childNamespace || parentNamespace;\n}\n\nexport function createLogger(\n label: string,\n verbose?: string | Debugger,\n initialStep?: string,\n infoDebugger = createLog()\n): OutputLogger {\n const labelPrefix = (label && `[${label}]`) || '';\n\n const spawned: OutputLogger[] = [];\n const debugDebugger: Maybe<Debugger> =\n typeof verbose === 'string' ? infoDebugger.extend(verbose) : verbose;\n const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger);\n\n return step(initialStep);\n\n function sibling(name: string, initial?: string) {\n return append(\n spawned,\n createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)\n );\n }\n\n function step(phase?: string) {\n const stepPrefix = (phase && `[${phase}]`) || '';\n const debug = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP;\n const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug);\n\n return Object.assign(debugDebugger ? debug : info, {\n label,\n sibling,\n info,\n step,\n });\n }\n}\n\n/**\n * The `GitLogger` is used by the main `SimpleGit` runner to handle logging\n * any warnings or errors.\n */\nexport class GitLogger {\n public error: OutputLoggingHandler;\n\n public warn: OutputLoggingHandler;\n\n constructor(private _out: Debugger = createLog()) {\n this.error = prefixedLogger(_out, '[ERROR]');\n this.warn = prefixedLogger(_out, '[WARN]');\n }\n\n silent(silence = false) {\n if (silence !== this._out.enabled) {\n return;\n }\n\n const { namespace } = this._out;\n const env = (process.env.DEBUG || '').split(',').filter((s) => !!s);\n const hasOn = env.includes(namespace);\n const hasOff = env.includes(`-${namespace}`);\n\n // enabling the log\n if (!silence) {\n if (hasOff) {\n remove(env, `-${namespace}`);\n } else {\n env.push(namespace);\n }\n } else {\n if (hasOn) {\n remove(env, namespace);\n } else {\n env.push(`-${namespace}`);\n }\n }\n\n debug.enable(env.join(','));\n }\n}\n","import { SimpleGitTask } from '../types';\nimport { GitError } from '../errors/git-error';\nimport { createLogger, OutputLogger } from '../git-logger';\n\ntype AnySimpleGitTask = SimpleGitTask<any>;\n\ntype TaskInProgress = {\n name: string;\n logger: OutputLogger;\n task: AnySimpleGitTask;\n};\n\nexport class TasksPendingQueue {\n private _queue: Map<AnySimpleGitTask, TaskInProgress> = new Map();\n\n constructor(private logLabel = 'GitExecutor') {}\n\n private withProgress(task: AnySimpleGitTask) {\n return this._queue.get(task);\n }\n\n private createProgress(task: AnySimpleGitTask): TaskInProgress {\n const name = TasksPendingQueue.getName(task.commands[0]);\n const logger = createLogger(this.logLabel, name);\n\n return {\n task,\n logger,\n name,\n };\n }\n\n push(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.createProgress(task);\n progress.logger('Adding task to the queue, commands = %o', task.commands);\n\n this._queue.set(task, progress);\n\n return progress;\n }\n\n fatal(err: GitError) {\n for (const [task, { logger }] of Array.from(this._queue.entries())) {\n if (task === err.task) {\n logger.info(`Failed %o`, err);\n logger(\n `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`\n );\n } else {\n logger.info(\n `A fatal exception occurred in a previous task, the queue has been purged: %o`,\n err.message\n );\n }\n\n this.complete(task);\n }\n\n if (this._queue.size !== 0) {\n throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`);\n }\n }\n\n complete(task: AnySimpleGitTask) {\n const progress = this.withProgress(task);\n if (progress) {\n this._queue.delete(task);\n }\n }\n\n attempt(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.withProgress(task);\n if (!progress) {\n throw new GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task');\n }\n progress.logger('Starting task');\n\n return progress;\n }\n\n static getName(name = 'empty') {\n return `task:${name}:${++TasksPendingQueue.counter}`;\n }\n\n private static counter = 0;\n}\n","import { spawn, SpawnOptions } from 'child_process';\nimport { GitError } from '../errors/git-error';\nimport { OutputLogger } from '../git-logger';\nimport { PluginStore } from '../plugins';\nimport { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task';\nimport {\n GitExecutorResult,\n Maybe,\n outputHandler,\n RunnableTask,\n SimpleGitExecutor,\n SimpleGitTask,\n} from '../types';\nimport { callTaskParser, first, GitOutputStreams, objectToString } from '../utils';\nimport { Scheduler } from './scheduler';\nimport { TasksPendingQueue } from './tasks-pending-queue';\n\nexport class GitExecutorChain implements SimpleGitExecutor {\n private _chain: Promise<any> = Promise.resolve();\n private _queue = new TasksPendingQueue();\n private _cwd: string | undefined;\n\n public get cwd() {\n return this._cwd || this._executor.cwd;\n }\n\n public set cwd(cwd: string) {\n this._cwd = cwd;\n }\n\n public get env() {\n return this._executor.env;\n }\n\n public get outputHandler() {\n return this._executor.outputHandler;\n }\n\n constructor(\n private _executor: SimpleGitExecutor,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n public chain() {\n return this;\n }\n\n public push<R>(task: SimpleGitTask<R>): Promise<R> {\n this._queue.push(task);\n\n return (this._chain = this._chain.then(() => this.attemptTask(task)));\n }\n\n private async attemptTask<R>(task: SimpleGitTask<R>): Promise<void | R> {\n const onScheduleComplete = await this._scheduler.next();\n const onQueueComplete = () => this._queue.complete(task);\n\n try {\n const { logger } = this._queue.attempt(task);\n return (await (isEmptyTask(task)\n ? this.attemptEmptyTask(task, logger)\n : this.attemptRemoteTask(task, logger))) as R;\n } catch (e) {\n throw this.onFatalException(task, e as Error);\n } finally {\n onQueueComplete();\n onScheduleComplete();\n }\n }\n\n private onFatalException<R>(task: SimpleGitTask<R>, e: Error) {\n const gitError =\n e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e));\n\n this._chain = Promise.resolve();\n this._queue.fatal(gitError);\n\n return gitError;\n }\n\n private async attemptRemoteTask<R>(task: RunnableTask<R>, logger: OutputLogger) {\n const binary = this._plugins.exec('spawn.binary', '', pluginContext(task, task.commands));\n const args = this._plugins.exec(\n 'spawn.args',\n [...task.commands],\n pluginContext(task, task.commands)\n );\n\n const raw = await this.gitResponse(\n task,\n binary,\n args,\n this.outputHandler,\n logger.step('SPAWN')\n );\n const outputStreams = await this.handleTaskData(task, args, raw, logger.step('HANDLE'));\n\n logger(`passing response to task's parser as a %s`, task.format);\n\n if (isBufferTask(task)) {\n return callTaskParser(task.parser, outputStreams);\n }\n\n return callTaskParser(task.parser, outputStreams.asStrings());\n }\n\n private async attemptEmptyTask(task: EmptyTask, logger: OutputLogger) {\n logger(`empty task bypassing child process to call to task's parser`);\n return task.parser(this);\n }\n\n private handleTaskData<R>(\n task: SimpleGitTask<R>,\n args: string[],\n result: GitExecutorResult,\n logger: OutputLogger\n ): Promise<GitOutputStreams> {\n const { exitCode, rejection, stdOut, stdErr } = result;\n\n return new Promise((done, fail) => {\n logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode);\n\n const { error } = this._plugins.exec(\n 'task.error',\n { error: rejection },\n {\n ...pluginContext(task, args),\n ...result,\n }\n );\n\n if (error && task.onError) {\n logger.info(`exitCode=%s handling with custom error handler`);\n\n return task.onError(\n result,\n error,\n (newStdOut) => {\n logger.info(`custom error handler treated as success`);\n logger(`custom error returned a %s`, objectToString(newStdOut));\n\n done(\n new GitOutputStreams(\n Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut,\n Buffer.concat(stdErr)\n )\n );\n },\n fail\n );\n }\n\n if (error) {\n logger.info(\n `handling as error: exitCode=%s stdErr=%s rejection=%o`,\n exitCode,\n stdErr.length,\n rejection\n );\n return fail(error);\n }\n\n logger.info(`retrieving task output complete`);\n done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr)));\n });\n }\n\n private async gitResponse<R>(\n task: SimpleGitTask<R>,\n command: string,\n args: string[],\n outputHandler: Maybe<outputHandler>,\n logger: OutputLogger\n ): Promise<GitExecutorResult> {\n const outputLogger = logger.sibling('output');\n const spawnOptions: SpawnOptions = this._plugins.exec(\n 'spawn.options',\n {\n cwd: this.cwd,\n env: this.env,\n windowsHide: true,\n },\n pluginContext(task, task.commands)\n );\n\n return new Promise((done) => {\n const stdOut: Buffer[] = [];\n const stdErr: Buffer[] = [];\n\n logger.info(`%s %o`, command, args);\n logger('%O', spawnOptions);\n\n let rejection = this._beforeSpawn(task, args);\n if (rejection) {\n return done({\n stdOut,\n stdErr,\n exitCode: 9901,\n rejection,\n });\n }\n\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n const spawned = spawn(command, args, spawnOptions);\n\n spawned.stdout!.on(\n 'data',\n onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))\n );\n spawned.stderr!.on(\n 'data',\n onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))\n );\n\n spawned.on('error', onErrorReceived(stdErr, logger));\n\n if (outputHandler) {\n logger(`Passing child process stdOut/stdErr to custom outputHandler`);\n outputHandler(command, spawned.stdout!, spawned.stderr!, [...args]);\n }\n\n this._plugins.exec('spawn.after', undefined, {\n ...pluginContext(task, args),\n spawned,\n close(exitCode: number, reason?: Error) {\n done({\n stdOut,\n stdErr,\n exitCode,\n rejection: rejection || reason,\n });\n },\n kill(reason: Error) {\n if (spawned.killed) {\n return;\n }\n\n rejection = reason;\n spawned.kill('SIGINT');\n },\n });\n });\n }\n\n private _beforeSpawn<R>(task: SimpleGitTask<R>, args: string[]) {\n let rejection: Maybe<Error>;\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n return rejection;\n }\n}\n\nfunction pluginContext<R>(task: SimpleGitTask<R>, commands: string[]) {\n return {\n method: first(task.commands) || '',\n commands,\n };\n}\n\nfunction onErrorReceived(target: Buffer[], logger: OutputLogger) {\n return (err: Error) => {\n logger(`[ERROR] child process exception %o`, err);\n target.push(Buffer.from(String(err.stack), 'ascii'));\n };\n}\n\nfunction onDataReceived(\n target: Buffer[],\n name: string,\n logger: OutputLogger,\n output: OutputLogger\n) {\n return (buffer: Buffer) => {\n logger(`%s received %L bytes`, name, buffer);\n output(`%B`, buffer);\n target.push(buffer);\n };\n}\n","import type { PluginStore } from '../plugins';\nimport type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types';\n\nimport { GitExecutorChain } from './git-executor-chain';\nimport { Scheduler } from './scheduler';\n\nexport class GitExecutor implements SimpleGitExecutor {\n private _chain = new GitExecutorChain(this, this._scheduler, this._plugins);\n\n public env: GitExecutorEnv;\n public outputHandler?: outputHandler;\n\n constructor(\n public cwd: string,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n chain(): SimpleGitExecutor {\n return new GitExecutorChain(this, this._scheduler, this._plugins);\n }\n\n push<R>(task: SimpleGitTask<R>): Promise<R> {\n return this._chain.push(task);\n }\n}\n","import { GitError } from './errors/git-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport { NOOP } from './utils';\n\nexport function taskCallback<R>(\n task: SimpleGitTask<R>,\n response: Promise<R>,\n callback: SimpleGitTaskCallback<R> = NOOP\n) {\n const onSuccess = (data: R) => {\n callback(null, data);\n };\n\n const onError = (err: GitError | GitResponseError) => {\n if (err?.task === task) {\n callback(\n err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err,\n undefined as any\n );\n }\n };\n\n response.then(onSuccess, onError);\n}\n\nfunction addDeprecationNoticeToError(err: GitResponseError) {\n let log = (name: string) => {\n console.warn(\n `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`\n );\n log = NOOP;\n };\n\n return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {}));\n\n function descriptorReducer(all: PropertyDescriptorMap, name: string): typeof all {\n if (name in err) {\n return all;\n }\n\n all[name] = {\n enumerable: false,\n configurable: false,\n get() {\n log(name);\n return err.git[name];\n },\n };\n\n return all;\n }\n}\n","import { folderExists } from '../utils';\nimport { SimpleGitExecutor } from '../types';\nimport { adhocExecTask } from './task';\n\nexport function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) {\n return adhocExecTask((instance: SimpleGitExecutor) => {\n if (!folderExists(directory)) {\n throw new Error(`Git.cwd: cannot change to non-directory \"${directory}\"`);\n }\n\n return ((root || instance).cwd = directory);\n });\n}\n","import type { SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, remove, trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nfunction checkoutTask(args: string[]) {\n const commands = ['checkout', ...args];\n if (commands[1] === '-b' && commands.includes('-B')) {\n commands[1] = remove(commands, '-B');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport default function (): Pick<SimpleGit, 'checkout' | 'checkoutBranch' | 'checkoutLocalBranch'> {\n return {\n checkout(this: SimpleGitApi) {\n return this._runTask(\n checkoutTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutBranch(this: SimpleGitApi, branchName, startPoint) {\n return this._runTask(\n checkoutTask(['-b', branchName, startPoint, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutLocalBranch(this: SimpleGitApi, branchName) {\n return this._runTask(\n checkoutTask(['-b', branchName, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils';\n\nexport interface CountObjectsResult {\n count: number;\n size: number;\n inPack: number;\n packs: number;\n sizePack: number;\n prunePackable: number;\n garbage: number;\n sizeGarbage: number;\n}\n\nfunction countObjectsResponse(): CountObjectsResult {\n return {\n count: 0,\n garbage: 0,\n inPack: 0,\n packs: 0,\n prunePackable: 0,\n size: 0,\n sizeGarbage: 0,\n sizePack: 0,\n };\n}\n\nconst parser: LineParser<CountObjectsResult> = new LineParser(\n /([a-z-]+): (\\d+)$/,\n (result, [key, value]) => {\n const property = asCamelCase(key);\n if (Object.hasOwn(result, property)) {\n result[property as keyof typeof result] = asNumber(value);\n }\n }\n);\n\nexport default function (): Pick<SimpleGit, 'countObjects'> {\n return {\n countObjects(this: SimpleGitApi) {\n return this._runTask({\n commands: ['count-objects', '--verbose'],\n format: 'utf-8',\n parser(stdOut: string) {\n return parseStringResponse(countObjectsResponse(), [parser], stdOut);\n },\n });\n },\n };\n}\n","import { CommitResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<CommitResult>[] = [\n new LineParser(/^\\[([^\\s]+)( \\([^)]+\\))? ([^\\]]+)/, (result, [branch, root, commit]) => {\n result.branch = branch;\n result.commit = commit;\n result.root = !!root;\n }),\n new LineParser(/\\s*Author:\\s(.+)/i, (result, [author]) => {\n const parts = author.split('<');\n const email = parts.pop();\n\n if (!email || !email.includes('@')) {\n return;\n }\n\n result.author = {\n email: email.substr(0, email.length - 1),\n name: parts.join('<').trim(),\n };\n }),\n new LineParser(\n /(\\d+)[^,]*(?:,\\s*(\\d+)[^,]*)(?:,\\s*(\\d+))/g,\n (result, [changes, insertions, deletions]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n result.summary.insertions = parseInt(insertions, 10) || 0;\n result.summary.deletions = parseInt(deletions, 10) || 0;\n }\n ),\n new LineParser(\n /^(\\d+)[^,]*(?:,\\s*(\\d+)[^(]+\\(([+-]))?/,\n (result, [changes, lines, direction]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n const count = parseInt(lines, 10) || 0;\n if (direction === '-') {\n result.summary.deletions = count;\n } else if (direction === '+') {\n result.summary.insertions = count;\n }\n }\n ),\n];\n\nexport function parseCommitResult(stdOut: string): CommitResult {\n const result: CommitResult = {\n author: null,\n branch: '',\n commit: '',\n root: false,\n summary: {\n changes: 0,\n insertions: 0,\n deletions: 0,\n },\n };\n return parseStringResponse(result, parsers, stdOut);\n}\n","import type { CommitResult, SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { parseCommitResult } from '../parsers/parse-commit';\nimport {\n asArray,\n asStringArray,\n filterArray,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport function commitTask(\n message: string[],\n files: string[],\n customArgs: string[]\n): StringTask<CommitResult> {\n const commands: string[] = [\n '-c',\n 'core.abbrev=40',\n 'commit',\n ...prefixedArray(message, '-m'),\n ...files,\n ...customArgs,\n ];\n\n return {\n commands,\n format: 'utf-8',\n parser: parseCommitResult,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'commit'> {\n return {\n commit(this: SimpleGitApi, message: string | string[], ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const task =\n rejectDeprecatedSignatures(message) ||\n commitTask(\n asArray(message),\n asArray(filterType(rest[0], filterStringOrStringArray, [])),\n [\n ...asStringArray(filterType(rest[1], filterArray, [])),\n ...getTrailingOptions(arguments, 0, true),\n ]\n );\n\n return this._runTask(task, next);\n },\n };\n\n function rejectDeprecatedSignatures(message?: unknown) {\n return (\n !filterStringOrStringArray(message) &&\n configurationErrorTask(\n `git.commit: requires the commit message to be supplied as a string/string[]`\n )\n );\n }\n}\n","import { Response, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport default function (): Pick<SimpleGit, 'firstCommit'> {\n return {\n firstCommit(this: SimpleGitApi): Response<string> {\n return this._runTask(\n straightThroughStringTask(['rev-list', '--max-parents=0', 'HEAD'], true),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import { straightThroughStringTask } from './task';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.hashObject`\n */\nexport function hashObjectTask(filePath: string, write: boolean): StringTask<string> {\n const commands = ['hash-object', filePath];\n if (write) {\n commands.push('-w');\n }\n\n return straightThroughStringTask(commands, true);\n}\n","import { InitResult } from '../../../typings';\n\nexport class InitSummary implements InitResult {\n constructor(\n public readonly bare: boolean,\n public readonly path: string,\n public readonly existing: boolean,\n public readonly gitDir: string\n ) {}\n}\n\nconst initResponseRegex = /^Init.+ repository in (.+)$/;\nconst reInitResponseRegex = /^Rein.+ in (.+)$/;\n\nexport function parseInit(bare: boolean, path: string, text: string) {\n const response = String(text).trim();\n let result;\n\n if ((result = initResponseRegex.exec(response))) {\n return new InitSummary(bare, path, false, result[1]);\n }\n\n if ((result = reInitResponseRegex.exec(response))) {\n return new InitSummary(bare, path, true, result[1]);\n }\n\n let gitDir = '';\n const tokens = response.split(' ');\n while (tokens.length) {\n const token = tokens.shift();\n if (token === 'in') {\n gitDir = tokens.join(' ');\n break;\n }\n }\n\n return new InitSummary(bare, path, /^re/i.test(response), gitDir);\n}\n","import { InitResult } from '../../../typings';\nimport { parseInit } from '../responses/InitSummary';\nimport { StringTask } from '../types';\n\nconst bareCommand = '--bare';\n\nfunction hasBareCommand(command: string[]) {\n return command.includes(bareCommand);\n}\n\nexport function initTask(bare = false, path: string, customArgs: string[]): StringTask<InitResult> {\n const commands = ['init', ...customArgs];\n if (bare && !hasBareCommand(commands)) {\n commands.splice(1, 0, bareCommand);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): InitResult {\n return parseInit(commands.includes('--bare'), path, text);\n },\n };\n}\n","export enum LogFormat {\n NONE = '',\n STAT = '--stat',\n NUM_STAT = '--numstat',\n NAME_ONLY = '--name-only',\n NAME_STATUS = '--name-status',\n}\n\nconst logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/;\n\nexport function logFormatFromCommand(customArgs: string[]) {\n for (let i = 0; i < customArgs.length; i++) {\n const format = logFormatRegex.exec(customArgs[i]);\n if (format) {\n return `--${format[1]}` as LogFormat;\n }\n }\n\n return LogFormat.NONE;\n}\n\nexport function isLogFormat(customArg: string | unknown) {\n return logFormatRegex.test(customArg as string);\n}\n","import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings';\n\n/***\n * The DiffSummary is returned as a response to getting `git().status()`\n */\nexport class DiffSummary implements DiffResult {\n changed = 0;\n deletions = 0;\n insertions = 0;\n\n files: Array<DiffResultTextFile | DiffResultBinaryFile> = [];\n}\n","import { DiffResult } from '../../../typings';\nimport { LogFormat } from '../args/log-format';\nimport { DiffSummary } from '../responses/DiffSummary';\nimport { isDiffNameStatus } from '../tasks/diff-name-status';\nimport { asNumber, LineParser, orVoid, parseStringResponse } from '../utils';\n\nconst statParser = [\n new LineParser<DiffResult>(\n /^(.+)\\s+\\|\\s+(\\d+)(\\s+[+\\-]+)?$/,\n (result, [file, changes, alterations = '']) => {\n result.files.push({\n file: file.trim(),\n changes: asNumber(changes),\n insertions: alterations.replace(/[^+]/g, '').length,\n deletions: alterations.replace(/[^-]/g, '').length,\n binary: false,\n });\n }\n ),\n new LineParser<DiffResult>(\n /^(.+) \\|\\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,\n (result, [file, before, after]) => {\n result.files.push({\n file: file.trim(),\n before: asNumber(before),\n after: asNumber(after),\n binary: true,\n });\n }\n ),\n new LineParser<DiffResult>(\n /(\\d+) files? changed\\s*((?:, \\d+ [^,]+){0,2})/,\n (result, [changed, summary]) => {\n const inserted = /(\\d+) i/.exec(summary);\n const deleted = /(\\d+) d/.exec(summary);\n\n result.changed = asNumber(changed);\n result.insertions = asNumber(inserted?.[1]);\n result.deletions = asNumber(deleted?.[1]);\n }\n ),\n];\n\nconst numStatParser = [\n new LineParser<DiffResult>(\n /(\\d+)\\t(\\d+)\\t(.+)$/,\n (result, [changesInsert, changesDelete, file]) => {\n const insertions = asNumber(changesInsert);\n const deletions = asNumber(changesDelete);\n\n result.changed++;\n result.insertions += insertions;\n result.deletions += deletions;\n\n result.files.push({\n file,\n changes: insertions + deletions,\n insertions,\n deletions,\n binary: false,\n });\n }\n ),\n new LineParser<DiffResult>(/-\\t-\\t(.+)$/, (result, [file]) => {\n result.changed++;\n\n result.files.push({\n file,\n after: 0,\n before: 0,\n binary: true,\n });\n }),\n];\n\nconst nameOnlyParser = [\n new LineParser<DiffResult>(/(.+)$/, (result, [file]) => {\n result.changed++;\n result.files.push({\n file,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n });\n }),\n];\n\nconst nameStatusParser = [\n new LineParser<DiffResult>(\n /([ACDMRTUXB])([0-9]{0,3})\\t(.[^\\t]*)(\\t(.[^\\t]*))?$/,\n (result, [status, similarity, from, _to, to]) => {\n result.changed++;\n result.files.push({\n file: to ?? from,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n status: orVoid(isDiffNameStatus(status) && status),\n from: orVoid(!!to && from !== to && from),\n similarity: asNumber(similarity),\n });\n }\n ),\n];\n\nconst diffSummaryParsers: Record<LogFormat, LineParser<DiffResult>[]> = {\n [LogFormat.NONE]: statParser,\n [LogFormat.STAT]: statParser,\n [LogFormat.NUM_STAT]: numStatParser,\n [LogFormat.NAME_STATUS]: nameStatusParser,\n [LogFormat.NAME_ONLY]: nameOnlyParser,\n};\n\nexport function getDiffParser(format = LogFormat.NONE) {\n const parser = diffSummaryParsers[format];\n\n return (stdOut: string) => parseStringResponse(new DiffSummary(), parser, stdOut, false);\n}\n","import { ListLogLine, LogResult } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\nimport { getDiffParser } from './parse-diff-summary';\nimport { LogFormat } from '../args/log-format';\n\nexport const START_BOUNDARY = 'òòòòòò ';\n\nexport const COMMIT_BOUNDARY = ' òò';\n\nexport const SPLITTER = ' ò ';\n\nconst defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email'];\n\nfunction lineBuilder(tokens: string[], fields: string[]): any {\n return fields.reduce(\n (line, field, index) => {\n line[field] = tokens[index] || '';\n return line;\n },\n Object.create({ diff: null }) as any\n );\n}\n\nexport function createListLogSummaryParser<T = any>(\n splitter = SPLITTER,\n fields = defaultFieldNames,\n logFormat = LogFormat.NONE\n) {\n const parseDiffResult = getDiffParser(logFormat);\n\n return function (stdOut: string): LogResult<T> {\n const all: ReadonlyArray<T & ListLogLine> = toLinesWithContent(\n stdOut.trim(),\n false,\n START_BOUNDARY\n ).map(function (item) {\n const lineDetail = item.split(COMMIT_BOUNDARY);\n const listLogLine: T & ListLogLine = lineBuilder(lineDetail[0].split(splitter), fields);\n\n if (lineDetail.length > 1 && !!lineDetail[1].trim()) {\n listLogLine.diff = parseDiffResult(lineDetail[1]);\n }\n\n return listLogLine;\n });\n\n return {\n all,\n latest: (all.length && all[0]) || null,\n total: all.length,\n };\n };\n}\n","import { StringTask } from '../types';\nimport { DiffResult } from '../../../typings';\nimport { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format';\nimport { getDiffParser } from '../parsers/parse-diff-summary';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function diffSummaryTask(customArgs: string[]): StringTask<DiffResult> | EmptyTask {\n let logFormat = logFormatFromCommand(customArgs);\n\n const commands = ['diff'];\n\n if (logFormat === LogFormat.NONE) {\n logFormat = LogFormat.STAT;\n commands.push('--stat=4096');\n }\n\n commands.push(...customArgs);\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser: getDiffParser(logFormat),\n }\n );\n}\n\nexport function validateLogFormatConfig(customArgs: unknown[]): EmptyTask | void {\n const flags = customArgs.filter(isLogFormat);\n\n if (flags.length > 1) {\n return configurationErrorTask(\n `Summary flags are mutually exclusive - pick one of ${flags.join(',')}`\n );\n }\n\n if (flags.length && customArgs.includes('-z')) {\n return configurationErrorTask(\n `Summary flag ${flags} parsing is not compatible with null termination option '-z'`\n );\n }\n}\n","import type { LogResult, Options, SimpleGit } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { pathspec } from '../args/pathspec';\nimport {\n COMMIT_BOUNDARY,\n createListLogSummaryParser,\n SPLITTER,\n START_BOUNDARY,\n} from '../parsers/parse-list-log-summary';\nimport {\n appendTaskOptions,\n asStringArray,\n filterArray,\n filterPlainObject,\n filterString,\n filterType,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} from '../utils';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { configurationErrorTask } from './task';\nimport { validateLogFormatConfig } from './diff';\nimport { StringTask } from '../types';\n\nenum excludeOptions {\n '--pretty',\n 'max-count',\n 'maxCount',\n 'n',\n 'file',\n 'format',\n 'from',\n 'to',\n 'splitter',\n 'symmetric',\n 'mailMap',\n 'multiLine',\n 'strictDate',\n}\n\nexport interface DefaultLogFields {\n hash: string;\n date: string;\n message: string;\n refs: string;\n body: string;\n author_name: string;\n author_email: string;\n}\n\nexport type LogOptions<T = DefaultLogFields> = {\n file?: string;\n format?: T;\n from?: string;\n mailMap?: boolean;\n maxCount?: number;\n multiLine?: boolean;\n splitter?: string;\n strictDate?: boolean;\n symmetric?: boolean;\n to?: string;\n};\n\ninterface ParsedLogOptions {\n fields: string[];\n splitter: string;\n commands: string[];\n}\n\nfunction prettyFormat(\n format: Record<string, string | unknown>,\n splitter: string\n): [string[], string] {\n const fields: string[] = [];\n const formatStr: string[] = [];\n\n Object.keys(format).forEach((field) => {\n fields.push(field);\n formatStr.push(String(format[field]));\n });\n\n return [fields, formatStr.join(splitter)];\n}\n\nfunction userOptions<T extends Options>(input: T): Options {\n return Object.keys(input).reduce((out, key) => {\n if (!(key in excludeOptions)) {\n out[key] = input[key];\n }\n return out;\n }, {} as Options);\n}\n\nexport function parseLogOptions<T extends Options>(\n opt: Options | LogOptions<T> = {},\n customArgs: string[] = []\n): ParsedLogOptions {\n const splitter = filterType(opt.splitter, filterString, SPLITTER);\n const format = filterPlainObject(opt.format)\n ? opt.format\n : {\n hash: '%H',\n date: opt.strictDate === false ? '%ai' : '%aI',\n message: '%s',\n refs: '%D',\n body: opt.multiLine ? '%B' : '%b',\n author_name: opt.mailMap !== false ? '%aN' : '%an',\n author_email: opt.mailMap !== false ? '%aE' : '%ae',\n };\n\n const [fields, formatStr] = prettyFormat(format, splitter);\n\n const suffix: string[] = [];\n const command: string[] = [\n `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`,\n ...customArgs,\n ];\n\n const maxCount: number | undefined = (opt as any).n || (opt as any)['max-count'] || opt.maxCount;\n if (maxCount) {\n command.push(`--max-count=${maxCount}`);\n }\n\n if (opt.from || opt.to) {\n const rangeOperator = opt.symmetric !== false ? '...' : '..';\n suffix.push(`${opt.from || ''}${rangeOperator}${opt.to || ''}`);\n }\n\n if (filterString(opt.file)) {\n command.push('--follow', pathspec(opt.file));\n }\n\n appendTaskOptions(userOptions(opt as Options), command);\n\n return {\n fields,\n splitter,\n commands: [...command, ...suffix],\n };\n}\n\nexport function logTask<T>(\n splitter: string,\n fields: string[],\n customArgs: string[]\n): StringTask<LogResult<T>> {\n const parser = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs));\n\n return {\n commands: ['log', ...customArgs],\n format: 'utf-8',\n parser,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'log'> {\n return {\n log<T extends Options>(this: SimpleGitApi, ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const options = parseLogOptions<T>(\n trailingOptionsArgument(arguments),\n asStringArray(filterType(arguments[0], filterArray, []))\n );\n const task =\n rejectDeprecatedSignatures(...rest) ||\n validateLogFormatConfig(options.commands) ||\n createLogTask(options);\n\n return this._runTask(task, next);\n },\n };\n\n function createLogTask(options: ParsedLogOptions) {\n return logTask(options.splitter, options.fields, options.commands);\n }\n\n function rejectDeprecatedSignatures(from?: unknown, to?: unknown) {\n return (\n filterString(from) &&\n filterString(to) &&\n configurationErrorTask(\n `git.log(string, string) should be replaced with git.log({ from: string, to: string })`\n )\n );\n }\n}\n","import {\n MergeConflict,\n MergeConflictDeletion,\n MergeDetail,\n MergeResultStatus,\n} from '../../../typings';\n\nexport class MergeSummaryConflict implements MergeConflict {\n constructor(\n public readonly reason: string,\n public readonly file: string | null = null,\n public readonly meta?: MergeConflictDeletion\n ) {}\n\n toString() {\n return `${this.file}:${this.reason}`;\n }\n}\n\nexport class MergeSummaryDetail implements MergeDetail {\n public conflicts: MergeConflict[] = [];\n public merges: string[] = [];\n public result: MergeResultStatus = 'success';\n\n get failed() {\n return this.conflicts.length > 0;\n }\n\n get reason() {\n return this.result;\n }\n\n toString() {\n if (this.conflicts.length) {\n return `CONFLICTS: ${this.conflicts.join(', ')}`;\n }\n\n return 'OK';\n }\n}\n","import {\n PullDetailFileChanges,\n PullDetailSummary,\n PullFailedResult,\n PullResult,\n} from '../../../typings';\n\nexport class PullSummary implements PullResult {\n public remoteMessages = {\n all: [],\n };\n public created = [];\n public deleted: string[] = [];\n public files: string[] = [];\n public deletions: PullDetailFileChanges = {};\n public insertions: PullDetailFileChanges = {};\n public summary: PullDetailSummary = {\n changes: 0,\n deletions: 0,\n insertions: 0,\n };\n}\n\nexport class PullFailedSummary implements PullFailedResult {\n remote = '';\n hash = {\n local: '',\n remote: '',\n };\n branch = {\n local: '',\n remote: '',\n };\n message = '';\n\n toString() {\n return this.message;\n }\n}\n","import {\n RemoteMessageResult,\n RemoteMessages,\n RemoteMessagesObjectEnumeration,\n} from '../../../typings';\nimport { asNumber, RemoteLineParser } from '../utils';\n\nfunction objectEnumerationResult<T extends RemoteMessages = RemoteMessages>(\n remoteMessages: T\n): RemoteMessagesObjectEnumeration {\n return (remoteMessages.objects = remoteMessages.objects || {\n compressing: 0,\n counting: 0,\n enumerating: 0,\n packReused: 0,\n reused: { count: 0, delta: 0 },\n total: { count: 0, delta: 0 },\n });\n}\n\nfunction asObjectCount(source: string) {\n const count = /^\\s*(\\d+)/.exec(source);\n const delta = /delta (\\d+)/i.exec(source);\n\n return {\n count: asNumber((count && count[1]) || '0'),\n delta: asNumber((delta && delta[1]) || '0'),\n };\n}\n\nexport const remoteMessagesObjectParsers: RemoteLineParser<RemoteMessageResult<RemoteMessages>>[] =\n [\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: (\\d+),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: \\d+% \\(\\d+\\/(\\d+)\\),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /total ([^,]+), reused ([^,]+), pack-reused (\\d+)/i,\n (result, [total, reused, packReused]) => {\n const objects = objectEnumerationResult(result.remoteMessages);\n objects.total = asObjectCount(total);\n objects.reused = asObjectCount(reused);\n objects.packReused = asNumber(packReused);\n }\n ),\n ];\n","import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings';\nimport { asNumber, parseStringResponse, RemoteLineParser } from '../utils';\nimport { remoteMessagesObjectParsers } from './parse-remote-objects';\n\nconst parsers: RemoteLineParser<RemoteMessageResult<PushResultRemoteMessages | RemoteMessages>>[] =\n [\n new RemoteLineParser(/^remote:\\s*(.+)$/, (result, [text]) => {\n result.remoteMessages.all.push(text.trim());\n return false;\n }),\n ...remoteMessagesObjectParsers,\n new RemoteLineParser(\n [/create a (?:pull|merge) request/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [pullRequestUrl]) => {\n (result.remoteMessages as PushResultRemoteMessages).pullRequestUrl = pullRequestUrl;\n }\n ),\n new RemoteLineParser(\n [/found (\\d+) vulnerabilities.+\\(([^)]+)\\)/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [count, summary, url]) => {\n (result.remoteMessages as PushResultRemoteMessages).vulnerabilities = {\n count: asNumber(count),\n summary,\n url,\n };\n }\n ),\n ];\n\nexport function parseRemoteMessages<T extends RemoteMessages = RemoteMessages>(\n _stdOut: string,\n stdErr: string\n): RemoteMessageResult {\n return parseStringResponse({ remoteMessages: new RemoteMessageSummary() as T }, parsers, stdErr);\n}\n\nexport class RemoteMessageSummary implements RemoteMessages {\n public readonly all: string[] = [];\n}\n","import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings';\nimport { PullFailedSummary, PullSummary } from '../responses/PullSummary';\nimport { TaskParser } from '../types';\nimport { append, LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nconst FILE_UPDATE_REGEX = /^\\s*(.+?)\\s+\\|\\s+\\d+\\s*(\\+*)(-*)/;\nconst SUMMARY_REGEX = /(\\d+)\\D+((\\d+)\\D+\\(\\+\\))?(\\D+(\\d+)\\D+\\(-\\))?/;\nconst ACTION_REGEX = /^(create|delete) mode \\d+ (.+)/;\n\nconst parsers: LineParser<PullResult>[] = [\n new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => {\n result.files.push(file);\n\n if (insertions) {\n result.insertions[file] = insertions.length;\n }\n\n if (deletions) {\n result.deletions[file] = deletions.length;\n }\n }),\n new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => {\n if (insertions !== undefined || deletions !== undefined) {\n result.summary.changes = +changes || 0;\n result.summary.insertions = +insertions || 0;\n result.summary.deletions = +deletions || 0;\n return true;\n }\n return false;\n }),\n new LineParser(ACTION_REGEX, (result, [action, file]) => {\n append(result.files, file);\n append(action === 'create' ? result.created : result.deleted, file);\n }),\n];\n\nconst errorParsers: LineParser<PullFailedResult>[] = [\n new LineParser(/^from\\s(.+)$/i, (result, [remote]) => void (result.remote = remote)),\n new LineParser(/^fatal:\\s(.+)$/, (result, [message]) => void (result.message = message)),\n new LineParser(\n /([a-z0-9]+)\\.\\.([a-z0-9]+)\\s+(\\S+)\\s+->\\s+(\\S+)$/,\n (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => {\n result.branch.local = branchLocal;\n result.hash.local = hashLocal;\n result.branch.remote = branchRemote;\n result.hash.remote = hashRemote;\n }\n ),\n];\n\nexport const parsePullDetail: TaskParser<string, PullDetail> = (stdOut, stdErr) => {\n return parseStringResponse(new PullSummary(), parsers, [stdOut, stdErr]);\n};\n\nexport const parsePullResult: TaskParser<string, PullResult> = (stdOut, stdErr) => {\n return Object.assign(\n new PullSummary(),\n parsePullDetail(stdOut, stdErr),\n parseRemoteMessages<RemoteMessages>(stdOut, stdErr)\n );\n};\n\nexport function parsePullErrorResult(stdOut: string, stdErr: string) {\n const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]);\n\n return pullError.message && pullError;\n}\n","import { MergeDetail, MergeResult } from '../../../typings';\nimport { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parsePullResult } from './parse-pull';\n\nconst parsers: LineParser<MergeDetail>[] = [\n new LineParser(/^Auto-merging\\s+(.+)$/, (summary, [autoMerge]) => {\n summary.merges.push(autoMerge);\n }),\n new LineParser(/^CONFLICT\\s+\\((.+)\\): Merge conflict in (.+)$/, (summary, [reason, file]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file));\n }),\n new LineParser(\n /^CONFLICT\\s+\\((.+\\/delete)\\): (.+) deleted in (.+) and/,\n (summary, [reason, file, deleteRef]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef }));\n }\n ),\n new LineParser(/^CONFLICT\\s+\\((.+)\\):/, (summary, [reason]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, null));\n }),\n new LineParser(/^Automatic merge failed;\\s+(.+)$/, (summary, [result]) => {\n summary.result = result;\n }),\n];\n\n/**\n * Parse the complete response from `git.merge`\n */\nexport const parseMergeResult: TaskParser<string, MergeResult> = (stdOut, stdErr) => {\n return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr));\n};\n\n/**\n * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge`\n * @param stdOut\n */\nexport const parseMergeDetail: TaskParser<string, MergeDetail> = (stdOut) => {\n return parseStringResponse(new MergeSummaryDetail(), parsers, stdOut);\n};\n","import { MergeResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parseMergeResult } from '../parsers/parse-merge';\nimport { StringTask } from '../types';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function mergeTask(customArgs: string[]): EmptyTask | StringTask<MergeResult> {\n if (!customArgs.length) {\n return configurationErrorTask('Git.merge requires at least one option');\n }\n\n return {\n commands: ['merge', ...customArgs],\n format: 'utf-8',\n parser(stdOut, stdErr): MergeResult {\n const merge = parseMergeResult(stdOut, stdErr);\n if (merge.failed) {\n throw new GitResponseError(merge);\n }\n\n return merge;\n },\n };\n}\n","import {\n PushDetail,\n PushResult,\n PushResultPushedItem,\n PushResultRemoteMessages,\n} from '../../../typings';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nfunction pushResultPushedItem(local: string, remote: string, status: string): PushResultPushedItem {\n const deleted = status.includes('deleted');\n const tag = status.includes('tag') || /^refs\\/tags/.test(local);\n const alreadyUpdated = !status.includes('new');\n\n return {\n deleted,\n tag,\n branch: !tag,\n new: !alreadyUpdated,\n alreadyUpdated,\n local,\n remote,\n };\n}\n\nconst parsers: LineParser<PushDetail>[] = [\n new LineParser(/^Pushing to (.+)$/, (result, [repo]) => {\n result.repo = repo;\n }),\n new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => {\n result.ref = {\n ...(result.ref || {}),\n local,\n };\n }),\n new LineParser(/^[=*-]\\s+([^:]+):(\\S+)\\s+\\[(.+)]$/, (result, [local, remote, type]) => {\n result.pushed.push(pushResultPushedItem(local, remote, type));\n }),\n new LineParser(\n /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,\n (result, [local, remote, remoteName]) => {\n result.branch = {\n ...(result.branch || {}),\n local,\n remote,\n remoteName,\n };\n }\n ),\n new LineParser(\n /^([^:]+):(\\S+)\\s+([a-z0-9]+)\\.\\.([a-z0-9]+)$/,\n (result, [local, remote, from, to]) => {\n result.update = {\n head: {\n local,\n remote,\n },\n hash: {\n from,\n to,\n },\n };\n }\n ),\n];\n\nexport const parsePushResult: TaskParser<string, PushResult> = (stdOut, stdErr) => {\n const pushDetail = parsePushDetail(stdOut, stdErr);\n const responseDetail = parseRemoteMessages<PushResultRemoteMessages>(stdOut, stdErr);\n\n return {\n ...pushDetail,\n ...responseDetail,\n };\n};\n\nexport const parsePushDetail: TaskParser<string, PushDetail> = (stdOut, stdErr) => {\n return parseStringResponse({ pushed: [] }, parsers, [stdOut, stdErr]);\n};\n","import { PushResult } from '../../../typings';\nimport { parsePushResult as parser } from '../parsers/parse-push';\nimport { StringTask } from '../types';\nimport { append, remove } from '../utils';\n\ntype PushRef = { remote?: string; branch?: string };\n\nexport function pushTagsTask(ref: PushRef = {}, customArgs: string[]): StringTask<PushResult> {\n append(customArgs, '--tags');\n return pushTask(ref, customArgs);\n}\n\nexport function pushTask(ref: PushRef = {}, customArgs: string[]): StringTask<PushResult> {\n const commands = ['push', ...customArgs];\n if (ref.branch) {\n commands.splice(1, 0, ref.branch);\n }\n if (ref.remote) {\n commands.splice(1, 0, ref.remote);\n }\n\n remove(commands, '-v');\n append(commands, '--verbose');\n append(commands, '--porcelain');\n\n return {\n commands,\n format: 'utf-8',\n parser,\n };\n}\n","import { SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, trailingFunctionArgument } from '../utils';\nimport { straightThroughBufferTask, straightThroughStringTask } from './task';\n\nexport default function (): Pick<SimpleGit, 'showBuffer' | 'show'> {\n return {\n showBuffer(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n if (!commands.includes('--binary')) {\n commands.splice(1, 0, '--binary');\n }\n\n return this._runTask(\n straightThroughBufferTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n\n show(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n return this._runTask(\n straightThroughStringTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import { FileStatusResult } from '../../../typings';\n\nexport const fromPathRegex = /^(.+)\\0(.+)$/;\n\nexport class FileStatusSummary implements FileStatusResult {\n public readonly from: string | undefined;\n\n constructor(\n public path: string,\n public index: string,\n public working_dir: string\n ) {\n if (index === 'R' || working_dir === 'R') {\n const detail = fromPathRegex.exec(path) || [null, path, path];\n this.from = detail[2] || '';\n this.path = detail[1] || '';\n }\n }\n}\n","import { StatusResult } from '../../../typings';\nimport { append, filterString, filterType, NULL } from '../utils';\nimport { FileStatusSummary } from './FileStatusSummary';\n\ntype StatusLineParser = (result: StatusResult, file: string) => void;\n\nexport class StatusSummary implements StatusResult {\n public not_added = [];\n public conflicted = [];\n public created = [];\n public deleted = [];\n public ignored = undefined;\n public modified = [];\n public renamed = [];\n public files = [];\n public staged = [];\n public ahead = 0;\n public behind = 0;\n public current = null;\n public tracking = null;\n public detached = false;\n\n public isClean = () => {\n return !this.files.length;\n };\n}\n\nenum PorcelainFileStatus {\n ADDED = 'A',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n COPIED = 'C',\n UNMERGED = 'U',\n UNTRACKED = '?',\n IGNORED = '!',\n NONE = ' ',\n}\n\nfunction renamedFile(line: string) {\n const [to, from] = line.split(NULL);\n\n return {\n from: from || to,\n to,\n };\n}\n\nfunction parser(\n indexX: PorcelainFileStatus,\n indexY: PorcelainFileStatus,\n handler: StatusLineParser\n): [string, StatusLineParser] {\n return [`${indexX}${indexY}`, handler];\n}\n\nfunction conflicts(indexX: PorcelainFileStatus, ...indexY: PorcelainFileStatus[]) {\n return indexY.map((y) => parser(indexX, y, (result, file) => append(result.conflicted, file)));\n}\n\nconst parsers: Map<string, StatusLineParser> = new Map([\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) =>\n append(result.created, file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) =>\n append(result.deleted, file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) =>\n append(result.modified, file)\n ),\n\n parser(\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.created, file) && append(result.staged, file)\n ),\n parser(\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.MODIFIED,\n (result, file) =>\n append(result.created, file) &&\n append(result.staged, file) &&\n append(result.modified, file)\n ),\n\n parser(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.deleted, file) && append(result.staged, file)\n ),\n\n parser(\n PorcelainFileStatus.MODIFIED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.modified, file) && append(result.staged, file)\n ),\n parser(\n PorcelainFileStatus.MODIFIED,\n PorcelainFileStatus.MODIFIED,\n (result, file) => append(result.modified, file) && append(result.staged, file)\n ),\n\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => {\n append(result.renamed, renamedFile(file));\n }),\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => {\n const renamed = renamedFile(file);\n append(result.renamed, renamed);\n append(result.modified, renamed.to);\n }),\n parser(PorcelainFileStatus.IGNORED, PorcelainFileStatus.IGNORED, (_result, _file) => {\n append((_result.ignored = _result.ignored || []), _file);\n }),\n\n parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) =>\n append(result.not_added, file)\n ),\n\n ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED),\n ...conflicts(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n ...conflicts(\n PorcelainFileStatus.UNMERGED,\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n\n [\n '##',\n (result, line) => {\n const aheadReg = /ahead (\\d+)/;\n const behindReg = /behind (\\d+)/;\n const currentReg = /^(.+?(?=(?:\\.{3}|\\s|$)))/;\n const trackingReg = /\\.{3}(\\S*)/;\n const onEmptyBranchReg = /\\son\\s(\\S+?)(?=\\.{3}|$)/;\n\n let regexResult = aheadReg.exec(line);\n result.ahead = (regexResult && +regexResult[1]) || 0;\n\n regexResult = behindReg.exec(line);\n result.behind = (regexResult && +regexResult[1]) || 0;\n\n regexResult = currentReg.exec(line);\n result.current = filterType(regexResult?.[1], filterString, null);\n\n regexResult = trackingReg.exec(line);\n result.tracking = filterType(regexResult?.[1], filterString, null);\n\n regexResult = onEmptyBranchReg.exec(line);\n if (regexResult) {\n result.current = filterType(regexResult?.[1], filterString, result.current);\n }\n\n result.detached = /\\(no branch\\)/.test(line);\n },\n ],\n]);\n\nexport const parseStatusSummary = function (text: string): StatusResult {\n const lines = text.split(NULL);\n const status = new StatusSummary();\n\n for (let i = 0, l = lines.length; i < l; ) {\n let line = lines[i++].trim();\n\n if (!line) {\n continue;\n }\n\n if (line.charAt(0) === PorcelainFileStatus.RENAMED) {\n line += NULL + (lines[i++] || '');\n }\n\n splitLine(status, line);\n }\n\n return status;\n};\n\nfunction splitLine(result: StatusResult, lineStr: string) {\n const trimmed = lineStr.trim();\n switch (' ') {\n case trimmed.charAt(2):\n return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.substr(3));\n case trimmed.charAt(1):\n return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.substr(2));\n default:\n return;\n }\n\n function data(index: string, workingDir: string, path: string) {\n const raw = `${index}${workingDir}`;\n const handler = parsers.get(raw);\n\n if (handler) {\n handler(result, path);\n }\n\n if (raw !== '##' && raw !== '!!') {\n result.files.push(new FileStatusSummary(path, index, workingDir));\n }\n }\n}\n","import { StatusResult } from '../../../typings';\nimport { parseStatusSummary } from '../responses/StatusSummary';\nimport { StringTask } from '../types';\n\nconst ignoredOptions = ['--null', '-z'];\n\nexport function statusTask(customArgs: string[]): StringTask<StatusResult> {\n const commands = [\n 'status',\n '--porcelain',\n '-b',\n '-u',\n '--null',\n ...customArgs.filter((arg) => !ignoredOptions.includes(arg)),\n ];\n\n return {\n format: 'utf-8',\n commands,\n parser(text: string) {\n return parseStatusSummary(text);\n },\n };\n}\n","import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nexport interface VersionResult {\n major: number;\n minor: number;\n patch: number | string;\n agent: string;\n installed: boolean;\n}\n\nconst NOT_INSTALLED = 'installed=false';\n\nfunction versionResponse(\n major = 0,\n minor = 0,\n patch: string | number = 0,\n agent = '',\n installed = true\n): VersionResult {\n return Object.defineProperty(\n {\n major,\n minor,\n patch,\n agent,\n installed,\n },\n 'toString',\n {\n value() {\n return `${this.major}.${this.minor}.${this.patch}`;\n },\n configurable: false,\n enumerable: false,\n }\n );\n}\n\nfunction notInstalledResponse() {\n return versionResponse(0, 0, 0, '', false);\n}\n\nexport default function (): Pick<SimpleGit, 'version'> {\n return {\n version(this: SimpleGitApi) {\n return this._runTask({\n commands: ['--version'],\n format: 'utf-8',\n parser: versionParser,\n onError(result, error, done, fail) {\n if (result.exitCode === ExitCodes.NOT_FOUND) {\n return done(Buffer.from(NOT_INSTALLED));\n }\n\n fail(error);\n },\n });\n },\n };\n}\n\nconst parsers: LineParser<VersionResult>[] = [\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*\\((.+)\\))?/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(\n result,\n versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)\n );\n }\n ),\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\D+)(.+)?$/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent));\n }\n ),\n];\n\nfunction versionParser(stdOut: string) {\n if (stdOut === NOT_INSTALLED) {\n return notInstalledResponse();\n }\n\n return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers, stdOut);\n}\n","import { SimpleGitBase } from '../../typings';\nimport { taskCallback } from './task-callback';\nimport { changeWorkingDirectoryTask } from './tasks/change-working-directory';\nimport checkout from './tasks/checkout';\nimport countObjects from './tasks/count-objects';\nimport commit from './tasks/commit';\nimport config from './tasks/config';\nimport firstCommit from './tasks/first-commit';\nimport grep from './tasks/grep';\nimport { hashObjectTask } from './tasks/hash-object';\nimport { initTask } from './tasks/init';\nimport log from './tasks/log';\nimport { mergeTask } from './tasks/merge';\nimport { pushTask } from './tasks/push';\nimport show from './tasks/show';\nimport { statusTask } from './tasks/status';\nimport { configurationErrorTask, straightThroughStringTask } from './tasks/task';\nimport version from './tasks/version';\nimport { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport {\n asArray,\n filterString,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n} from './utils';\n\nexport class SimpleGitApi implements SimpleGitBase {\n constructor(private _executor: SimpleGitExecutor) {}\n\n protected _runTask<T>(task: SimpleGitTask<T>, then?: SimpleGitTaskCallback<T>) {\n const chain = this._executor.chain();\n const promise = chain.push(task);\n\n if (then) {\n taskCallback(task, promise, then);\n }\n\n return Object.create(this, {\n then: { value: promise.then.bind(promise) },\n catch: { value: promise.catch.bind(promise) },\n _executor: { value: chain },\n });\n }\n\n add(files: string | string[]) {\n return this._runTask(\n straightThroughStringTask(['add', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n cwd(directory: string | { path: string; root?: boolean }) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof directory === 'string') {\n return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next);\n }\n\n if (typeof directory?.path === 'string') {\n return this._runTask(\n changeWorkingDirectoryTask(\n directory.path,\n (directory.root && this._executor) || undefined\n ),\n next\n );\n }\n\n return this._runTask(\n configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string'),\n next\n );\n }\n\n hashObject(path: string, write: boolean | unknown) {\n return this._runTask(\n hashObjectTask(path, write === true),\n trailingFunctionArgument(arguments)\n );\n }\n\n init(bare?: boolean | unknown) {\n return this._runTask(\n initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n merge() {\n return this._runTask(\n mergeTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n mergeFromTo(remote: string, branch: string) {\n if (!(filterString(remote) && filterString(branch))) {\n return this._runTask(\n configurationErrorTask(\n `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`\n )\n );\n }\n\n return this._runTask(\n mergeTask([remote, branch, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments, false)\n );\n }\n\n outputHandler(handler: outputHandler) {\n this._executor.outputHandler = handler;\n return this;\n }\n\n push() {\n const task = pushTask(\n {\n remote: filterType(arguments[0], filterString),\n branch: filterType(arguments[1], filterString),\n },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n }\n\n stash() {\n return this._runTask(\n straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n status() {\n return this._runTask(\n statusTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n}\n\nObject.assign(\n SimpleGitApi.prototype,\n checkout(),\n commit(),\n config(),\n countObjects(),\n firstCommit(),\n grep(),\n log(),\n show(),\n version()\n);\n","import { append, remove } from '../utils';\nimport { createDeferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { createLogger } from '../git-logger';\n\ntype ScheduleCompleteCallback = () => void;\ntype ScheduledTask = Pick<DeferredPromise<ScheduleCompleteCallback>, 'promise' | 'done'> & {\n id: number;\n};\n\nconst createScheduledTask: () => ScheduledTask = (() => {\n let id = 0;\n return () => {\n id++;\n const { promise, done } = createDeferred<ScheduleCompleteCallback>();\n\n return {\n promise,\n done,\n id,\n };\n };\n})();\n\nexport class Scheduler {\n private logger = createLogger('', 'scheduler');\n private pending: ScheduledTask[] = [];\n private running: ScheduledTask[] = [];\n\n constructor(private concurrency = 2) {\n this.logger(`Constructed, concurrency=%s`, concurrency);\n }\n\n private schedule() {\n if (!this.pending.length || this.running.length >= this.concurrency) {\n this.logger(\n `Schedule attempt ignored, pending=%s running=%s concurrency=%s`,\n this.pending.length,\n this.running.length,\n this.concurrency\n );\n return;\n }\n\n const task = append(this.running, this.pending.shift()!);\n this.logger(`Attempting id=%s`, task.id);\n task.done(() => {\n this.logger(`Completing id=`, task.id);\n remove(this.running, task);\n this.schedule();\n });\n }\n\n next(): Promise<ScheduleCompleteCallback> {\n const { promise, id } = append(this.pending, createScheduledTask());\n this.logger(`Scheduling id=%s`, id);\n\n this.schedule();\n\n return promise;\n }\n}\n","import { straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\n\nexport type ApplyOptions = Options &\n OptionFlags<\n | '--stat'\n | '--numstat'\n | '--summary'\n | '--check'\n | '--index'\n | '--intent-to-add'\n | '--3way'\n | '--apply'\n | '--no-add'\n | '-R'\n | '--reverse'\n | '--allow-binary-replacement'\n | '--binary'\n | '--reject'\n | '-z'\n | '--inaccurate-eof'\n | '--recount'\n | '--cached'\n | '--ignore-space-change'\n | '--ignore-whitespace'\n | '--verbose'\n | '--unsafe-paths'\n > &\n OptionFlags<'--whitespace', 'nowarn' | 'warn' | 'fix' | 'error' | 'error-all'> &\n OptionFlags<'--build-fake-ancestor' | '--exclude' | '--include' | '--directory', string> &\n OptionFlags<'-p' | '-C', number>;\n\nexport function applyPatchTask(patches: string[], customArgs: string[]): StringTask<string> {\n return straightThroughStringTask(['apply', ...customArgs, ...patches]);\n}\n","import {\n BranchMultiDeleteResult,\n BranchSingleDeleteFailure,\n BranchSingleDeleteResult,\n BranchSingleDeleteSuccess,\n} from '../../../typings';\n\nexport class BranchDeletionBatch implements BranchMultiDeleteResult {\n all: BranchSingleDeleteResult[] = [];\n branches: { [branchName: string]: BranchSingleDeleteResult } = {};\n errors: BranchSingleDeleteResult[] = [];\n\n get success(): boolean {\n return !this.errors.length;\n }\n}\n\nexport function branchDeletionSuccess(branch: string, hash: string): BranchSingleDeleteSuccess {\n return {\n branch,\n hash,\n success: true,\n };\n}\n\nexport function branchDeletionFailure(branch: string): BranchSingleDeleteFailure {\n return {\n branch,\n hash: null,\n success: false,\n };\n}\n\nexport function isSingleBranchDeleteFailure(\n test: BranchSingleDeleteResult\n): test is BranchSingleDeleteSuccess {\n return test.success;\n}\n","import { BranchMultiDeleteResult } from '../../../typings';\nimport {\n BranchDeletionBatch,\n branchDeletionFailure,\n branchDeletionSuccess,\n} from '../responses/BranchDeleteSummary';\nimport { TaskParser } from '../types';\nimport { ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nconst deleteSuccessRegex = /(\\S+)\\s+\\(\\S+\\s([^)]+)\\)/;\nconst deleteErrorRegex = /^error[^']+'([^']+)'/m;\n\nconst parsers: LineParser<BranchMultiDeleteResult>[] = [\n new LineParser(deleteSuccessRegex, (result, [branch, hash]) => {\n const deletion = branchDeletionSuccess(branch, hash);\n\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n new LineParser(deleteErrorRegex, (result, [branch]) => {\n const deletion = branchDeletionFailure(branch);\n\n result.errors.push(deletion);\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n];\n\nexport const parseBranchDeletions: TaskParser<string, BranchMultiDeleteResult> = (\n stdOut,\n stdErr\n) => {\n return parseStringResponse(new BranchDeletionBatch(), parsers, [stdOut, stdErr]);\n};\n\nexport function hasBranchDeletionError(data: string, processExitCode: ExitCodes): boolean {\n return processExitCode === ExitCodes.ERROR && deleteErrorRegex.test(data);\n}\n","import type { BranchSummary, BranchSummaryBranch } from '../../../typings';\n\nexport enum BranchStatusIdentifier {\n CURRENT = '*',\n LINKED = '+',\n}\n\nexport class BranchSummaryResult implements BranchSummary {\n public all: string[] = [];\n public branches: { [p: string]: BranchSummaryBranch } = {};\n public current: string = '';\n public detached: boolean = false;\n\n push(\n status: BranchStatusIdentifier | unknown,\n detached: boolean,\n name: string,\n commit: string,\n label: string\n ) {\n if (status === BranchStatusIdentifier.CURRENT) {\n this.detached = detached;\n this.current = name;\n }\n\n this.all.push(name);\n this.branches[name] = {\n current: status === BranchStatusIdentifier.CURRENT,\n linkedWorkTree: status === BranchStatusIdentifier.LINKED,\n name,\n commit,\n label,\n };\n }\n}\n","import type { BranchSummary } from '../../../typings';\nimport { BranchStatusIdentifier, BranchSummaryResult } from '../responses/BranchSummary';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<BranchSummaryResult>[] = [\n new LineParser(\n /^([*+]\\s)?\\((?:HEAD )?detached (?:from|at) (\\S+)\\)\\s+([a-z0-9]+)\\s(.*)$/,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), true, name, commit, label);\n }\n ),\n new LineParser(\n /^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$/s,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), false, name, commit, label);\n }\n ),\n];\n\nconst currentBranchParser = new LineParser<BranchSummaryResult>(/^(\\S+)$/s, (result, [name]) => {\n result.push(BranchStatusIdentifier.CURRENT, false, name, '', '');\n});\n\nfunction branchStatus(input?: string) {\n return input ? input.charAt(0) : '';\n}\n\nexport function parseBranchSummary(stdOut: string, currentOnly = false): BranchSummary {\n return parseStringResponse(\n new BranchSummaryResult(),\n currentOnly ? [currentBranchParser] : parsers,\n stdOut\n );\n}\n","import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings';\nimport { StringTask } from '../types';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete';\nimport { parseBranchSummary } from '../parsers/parse-branch';\nimport { bufferToString } from '../utils';\n\nexport function containsDeleteBranchCommand(commands: string[]) {\n const deleteCommands = ['-d', '-D', '--delete'];\n return commands.some((command) => deleteCommands.includes(command));\n}\n\nexport function branchTask(\n customArgs: string[]\n): StringTask<BranchSummary | BranchSingleDeleteResult> {\n const isDelete = containsDeleteBranchCommand(customArgs);\n const isCurrentOnly = customArgs.includes('--show-current');\n\n const commands = ['branch', ...customArgs];\n\n if (commands.length === 1) {\n commands.push('-a');\n }\n\n if (!commands.includes('-v')) {\n commands.splice(1, 0, '-v');\n }\n\n return {\n format: 'utf-8',\n commands,\n parser(stdOut, stdErr) {\n if (isDelete) {\n return parseBranchDeletions(stdOut, stdErr).all[0];\n }\n\n return parseBranchSummary(stdOut, isCurrentOnly);\n },\n };\n}\n\nexport function branchLocalTask(): StringTask<BranchSummary> {\n return {\n format: 'utf-8',\n commands: ['branch', '-v'],\n parser(stdOut) {\n return parseBranchSummary(stdOut);\n },\n };\n}\n\nexport function deleteBranchesTask(\n branches: string[],\n forceDelete = false\n): StringTask<BranchMultiDeleteResult> {\n return {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr);\n },\n onError({ exitCode, stdOut }, error, done, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n done(stdOut);\n },\n };\n}\n\nexport function deleteBranchTask(\n branch: string,\n forceDelete = false\n): StringTask<BranchSingleDeleteResult> {\n const task: StringTask<BranchSingleDeleteResult> = {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr).branches[branch]!;\n },\n onError({ exitCode, stdErr, stdOut }, error, _, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n throw new GitResponseError(\n task.parser(bufferToString(stdOut), bufferToString(stdErr)),\n String(error)\n );\n },\n };\n\n return task;\n}\n","import { normalize } from 'node:path';\n\n/**\n * Parser for the `check-ignore` command - returns each file as a string array\n */\nexport const parseCheckIgnore = (text: string): string[] => {\n return text.split(/\\n/g).map(toPath).filter(Boolean);\n};\n\nfunction toPath(input: string) {\n const path = input.trim().replace(/^[\"']|[\"']$/g, '');\n return path && normalize(path);\n}\n","import { StringTask } from '../types';\nimport { parseCheckIgnore } from '../responses/CheckIgnore';\n\nexport function checkIgnoreTask(paths: string[]): StringTask<string[]> {\n return {\n commands: ['check-ignore', ...paths],\n format: 'utf-8',\n parser: parseCheckIgnore,\n };\n}\n","import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\nimport { append, filterString } from '../utils';\n\nexport type CloneOptions = Options &\n OptionFlags<\n | '--bare'\n | '--dissociate'\n | '--mirror'\n | '--no-checkout'\n | '--no-remote-submodules'\n | '--no-shallow-submodules'\n | '--no-single-branch'\n | '--no-tags'\n | '--remote-submodules'\n | '--single-branch'\n | '--shallow-submodules'\n | '--verbose'\n > &\n OptionFlags<'--depth' | '-j' | '--jobs', number> &\n OptionFlags<\n | '--branch'\n | '--origin'\n | '--recurse-submodules'\n | '--separate-git-dir'\n | '--shallow-exclude'\n | '--shallow-since'\n | '--template',\n string\n >;\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function cloneTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n): StringTask<string> | EmptyTask {\n const commands = ['clone', ...customArgs];\n\n filterString(repo) && commands.push(repo);\n filterString(directory) && commands.push(directory);\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function cloneMirrorTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n) {\n append(customArgs, '--mirror');\n\n return cloneTask(repo, directory, customArgs);\n}\n","import { FetchResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<FetchResult>[] = [\n new LineParser(/From (.+)$/, (result, [remote]) => {\n result.remote = remote;\n }),\n new LineParser(/\\* \\[new branch]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.branches.push({\n name,\n tracking,\n });\n }),\n new LineParser(/\\* \\[new tag]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.tags.push({\n name,\n tracking,\n });\n }),\n new LineParser(/- \\[deleted]\\s+\\S+\\s*-> (.+)$/, (result, [tracking]) => {\n result.deleted.push({\n tracking,\n });\n }),\n new LineParser(\n /\\s*([^.]+)\\.\\.(\\S+)\\s+(\\S+)\\s*-> (.+)$/,\n (result, [from, to, name, tracking]) => {\n result.updated.push({\n name,\n tracking,\n to,\n from,\n });\n }\n ),\n];\n\nexport function parseFetchResult(stdOut: string, stdErr: string): FetchResult {\n const result: FetchResult = {\n raw: stdOut,\n remote: null,\n branches: [],\n tags: [],\n updated: [],\n deleted: [],\n };\n return parseStringResponse(result, parsers, [stdOut, stdErr]);\n}\n","import { FetchResult } from '../../../typings';\nimport { parseFetchResult } from '../parsers/parse-fetch';\nimport { StringTask } from '../types';\n\nimport { configurationErrorTask, EmptyTask } from './task';\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function fetchTask(\n remote: string,\n branch: string,\n customArgs: string[]\n): StringTask<FetchResult> | EmptyTask {\n const commands = ['fetch', ...customArgs];\n if (remote && branch) {\n commands.push(remote, branch);\n }\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: parseFetchResult,\n };\n}\n","import { MoveResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<MoveResult>[] = [\n new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => {\n result.moves.push({ from, to });\n }),\n];\n\nexport function parseMoveResult(stdOut: string): MoveResult {\n return parseStringResponse({ moves: [] }, parsers, stdOut);\n}\n","import { MoveResult } from '../../../typings';\nimport { parseMoveResult } from '../parsers/parse-move';\nimport { StringTask } from '../types';\nimport { asArray } from '../utils';\n\nexport function moveTask(from: string | string[], to: string): StringTask<MoveResult> {\n return {\n commands: ['mv', '-v', ...asArray(from), to],\n format: 'utf-8',\n parser: parseMoveResult,\n };\n}\n","import { PullResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull';\nimport { Maybe, StringTask } from '../types';\nimport { bufferToString } from '../utils';\n\nexport function pullTask(\n remote: Maybe<string>,\n branch: Maybe<string>,\n customArgs: string[]\n): StringTask<PullResult> {\n const commands: string[] = ['pull', ...customArgs];\n if (remote && branch) {\n commands.splice(1, 0, remote, branch);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(stdOut, stdErr): PullResult {\n return parsePullResult(stdOut, stdErr);\n },\n onError(result, _error, _done, fail) {\n const pullError = parsePullErrorResult(\n bufferToString(result.stdOut),\n bufferToString(result.stdErr)\n );\n if (pullError) {\n return fail(new GitResponseError(pullError));\n }\n\n fail(_error);\n },\n };\n}\n","import { forEachLineWithContent } from '../utils';\n\nexport interface RemoteWithoutRefs {\n name: string;\n}\n\nexport interface RemoteWithRefs extends RemoteWithoutRefs {\n refs: {\n fetch: string;\n push: string;\n };\n}\n\nexport function parseGetRemotes(text: string): RemoteWithoutRefs[] {\n const remotes: { [name: string]: RemoteWithoutRefs } = {};\n\n forEach(text, ([name]) => (remotes[name] = { name }));\n\n return Object.values(remotes);\n}\n\nexport function parseGetRemotesVerbose(text: string): RemoteWithRefs[] {\n const remotes: { [name: string]: RemoteWithRefs } = {};\n\n forEach(text, ([name, url, purpose]) => {\n if (!Object.hasOwn(remotes, name)) {\n remotes[name] = {\n name: name,\n refs: { fetch: '', push: '' },\n };\n }\n\n if (purpose && url) {\n remotes[name].refs[purpose.replace(/[^a-z]/g, '') as keyof RemoteWithRefs['refs']] = url;\n }\n });\n\n return Object.values(remotes);\n}\n\nfunction forEach(text: string, handler: (line: string[]) => void) {\n forEachLineWithContent(text, (line) => handler(line.split(/\\s+/)));\n}\n","import {\n parseGetRemotes,\n parseGetRemotesVerbose,\n type RemoteWithoutRefs,\n type RemoteWithRefs,\n} from '../responses/GetRemoteSummary';\nimport type { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addRemoteTask(\n remoteName: string,\n remoteRepo: string,\n customArgs: string[]\n): StringTask<string> {\n return straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]);\n}\n\nexport function getRemotesTask(verbose: true): StringTask<RemoteWithRefs[]>;\nexport function getRemotesTask(verbose: false): StringTask<RemoteWithoutRefs[]>;\nexport function getRemotesTask(\n verbose: boolean\n): StringTask<RemoteWithRefs[] | RemoteWithoutRefs[]> {\n const commands = ['remote'];\n if (verbose) {\n commands.push('-v');\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: verbose ? parseGetRemotesVerbose : parseGetRemotes,\n };\n}\n\nexport function listRemotesTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'ls-remote') {\n commands.unshift('ls-remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function remoteTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'remote') {\n commands.unshift('remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function removeRemoteTask(remoteName: string) {\n return straightThroughStringTask(['remote', 'remove', remoteName]);\n}\n","import { LogOptions, LogResult } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { createListLogSummaryParser } from '../parsers/parse-list-log-summary';\nimport type { StringTask } from '../types';\nimport { validateLogFormatConfig } from './diff';\nimport { parseLogOptions } from './log';\nimport type { EmptyTask } from './task';\n\nexport function stashListTask(\n opt: LogOptions = {},\n customArgs: string[]\n): EmptyTask | StringTask<LogResult> {\n const options = parseLogOptions<any>(opt);\n const commands = ['stash', 'list', ...options.commands, ...customArgs];\n const parser = createListLogSummaryParser(\n options.splitter,\n options.fields,\n logFormatFromCommand(commands)\n );\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser,\n }\n );\n}\n","import { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addSubModuleTask(repo: string, path: string): StringTask<string> {\n return subModuleTask(['add', repo, path]);\n}\n\nexport function initSubModuleTask(customArgs: string[]): StringTask<string> {\n return subModuleTask(['init', ...customArgs]);\n}\n\nexport function subModuleTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'submodule') {\n commands.unshift('submodule');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function updateSubModuleTask(customArgs: string[]): StringTask<string> {\n return subModuleTask(['update', ...customArgs]);\n}\n","import { TagResult } from '../../../typings';\n\nexport class TagList implements TagResult {\n constructor(\n public readonly all: string[],\n public readonly latest: string | undefined\n ) {}\n}\n\nexport const parseTagList = function (data: string, customSort = false) {\n const tags = data.split('\\n').map(trimmed).filter(Boolean);\n\n if (!customSort) {\n tags.sort(function (tagA, tagB) {\n const partsA = tagA.split('.');\n const partsB = tagB.split('.');\n\n if (partsA.length === 1 || partsB.length === 1) {\n return singleSorted(toNumber(partsA[0]), toNumber(partsB[0]));\n }\n\n for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) {\n const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i]));\n\n if (diff) {\n return diff;\n }\n }\n\n return 0;\n });\n }\n\n const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0);\n\n return new TagList(tags, latest);\n};\n\nfunction singleSorted(a: number, b: number): number {\n const aIsNum = Number.isNaN(a);\n const bIsNum = Number.isNaN(b);\n\n if (aIsNum !== bIsNum) {\n return aIsNum ? 1 : -1;\n }\n\n return aIsNum ? sorted(a, b) : 0;\n}\n\nfunction sorted(a: number, b: number) {\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction trimmed(input: string) {\n return input.trim();\n}\n\nfunction toNumber(input: string | undefined) {\n if (typeof input === 'string') {\n return parseInt(input.replace(/^\\D+/g, ''), 10) || 0;\n }\n\n return 0;\n}\n","import { TagResult } from '../../../typings';\nimport { parseTagList } from '../responses/TagList';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.tags`\n */\nexport function tagListTask(customArgs: string[] = []): StringTask<TagResult> {\n const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option));\n\n return {\n format: 'utf-8',\n commands: ['tag', '-l', ...customArgs],\n parser(text: string) {\n return parseTagList(text, hasCustomSort);\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addTagTask(name: string): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', name],\n parser() {\n return { name };\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addAnnotatedTagTask(\n name: string,\n tagMessage: string\n): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', '-a', '-m', tagMessage, name],\n parser() {\n return { name };\n },\n };\n}\n","const { GitExecutor } = require('./lib/runners/git-executor');\nconst { SimpleGitApi } = require('./lib/simple-git-api');\n\nconst { Scheduler } = require('./lib/runners/scheduler');\nconst { configurationErrorTask } = require('./lib/tasks/task');\nconst {\n asArray,\n filterArray,\n filterPrimitives,\n filterString,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} = require('./lib/utils');\nconst { applyPatchTask } = require('./lib/tasks/apply-patch');\nconst {\n branchTask,\n branchLocalTask,\n deleteBranchesTask,\n deleteBranchTask,\n} = require('./lib/tasks/branch');\nconst { checkIgnoreTask } = require('./lib/tasks/check-ignore');\nconst { checkIsRepoTask } = require('./lib/tasks/check-is-repo');\nconst { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone');\nconst { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean');\nconst { diffSummaryTask } = require('./lib/tasks/diff');\nconst { fetchTask } = require('./lib/tasks/fetch');\nconst { moveTask } = require('./lib/tasks/move');\nconst { pullTask } = require('./lib/tasks/pull');\nconst { pushTagsTask } = require('./lib/tasks/push');\nconst {\n addRemoteTask,\n getRemotesTask,\n listRemotesTask,\n remoteTask,\n removeRemoteTask,\n} = require('./lib/tasks/remote');\nconst { getResetMode, resetTask } = require('./lib/tasks/reset');\nconst { stashListTask } = require('./lib/tasks/stash-list');\nconst {\n addSubModuleTask,\n initSubModuleTask,\n subModuleTask,\n updateSubModuleTask,\n} = require('./lib/tasks/sub-module');\nconst { addAnnotatedTagTask, addTagTask, tagListTask } = require('./lib/tasks/tag');\nconst { straightThroughBufferTask, straightThroughStringTask } = require('./lib/tasks/task');\n\nfunction Git(options, plugins) {\n this._plugins = plugins;\n this._executor = new GitExecutor(\n options.baseDir,\n new Scheduler(options.maxConcurrentProcesses),\n plugins\n );\n\n this._trimmed = options.trimmed;\n}\n\n(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git;\n\n/**\n * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on\n * the system path, or a fully qualified path to the executable.\n */\nGit.prototype.customBinary = function (command) {\n this._plugins.reconfigure('binary', command);\n return this;\n};\n\n/**\n * Sets an environment variable for the spawned child process, either supply both a name and value as strings or\n * a single object to entirely replace the current environment variables.\n *\n * @param {string|Object} name\n * @param {string} [value]\n * @returns {Git}\n */\nGit.prototype.env = function (name, value) {\n if (arguments.length === 1 && typeof name === 'object') {\n this._executor.env = name;\n } else {\n (this._executor.env = this._executor.env || {})[name] = value;\n }\n\n return this;\n};\n\n/**\n * List the stash(s) of the local repo\n */\nGit.prototype.stashList = function (options) {\n return this._runTask(\n stashListTask(\n trailingOptionsArgument(arguments) || {},\n (filterArray(options) && options) || []\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\nfunction createCloneTask(api, task, repoPath, localPath) {\n if (typeof repoPath !== 'string') {\n return configurationErrorTask(`git.${api}() requires a string 'repoPath'`);\n }\n\n return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments));\n}\n\n/**\n * Clone a git repo\n */\nGit.prototype.clone = function () {\n return this._runTask(\n createCloneTask('clone', cloneTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Mirror a git repo\n */\nGit.prototype.mirror = function () {\n return this._runTask(\n createCloneTask('mirror', cloneMirrorTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Moves one or more files to a new destination.\n *\n * @see https://git-scm.com/docs/git-mv\n *\n * @param {string|string[]} from\n * @param {string} to\n */\nGit.prototype.mv = function (from, to) {\n return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments));\n};\n\n/**\n * Internally uses pull and tags to get the list of tags then checks out the latest tag.\n *\n * @param {Function} [then]\n */\nGit.prototype.checkoutLatestTag = function (then) {\n var git = this;\n return this.pull(function () {\n git.tags(function (err, tags) {\n git.checkout(tags.latest, then);\n });\n });\n};\n\n/**\n * Pull the updated contents of the current repo\n */\nGit.prototype.pull = function (remote, branch, options, then) {\n return this._runTask(\n pullTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Fetch the updated contents of the current repo.\n *\n * @example\n * .fetch('upstream', 'master') // fetches from master on remote named upstream\n * .fetch(function () {}) // runs fetch against default remote and branch and calls function\n *\n * @param {string} [remote]\n * @param {string} [branch]\n */\nGit.prototype.fetch = function (remote, branch) {\n return this._runTask(\n fetchTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in\n * a production environment.\n *\n * @param {boolean} silence\n * @returns {Git}\n */\nGit.prototype.silent = function (silence) {\n console.warn(\n 'simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'\n );\n return this;\n};\n\n/**\n * List all tags. When using git 2.7.0 or above, include an options object with `\"--sort\": \"property-name\"` to\n * sort the tags by that property instead of using the default semantic versioning sort.\n *\n * Note, supplying this option when it is not supported by your Git version will cause the operation to fail.\n *\n * @param {Object} [options]\n * @param {Function} [then]\n */\nGit.prototype.tags = function (options, then) {\n return this._runTask(\n tagListTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Rebases the current working copy. Options can be supplied either as an array of string parameters\n * to be sent to the `git rebase` command, or a standard options object.\n */\nGit.prototype.rebase = function () {\n return this._runTask(\n straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Reset a repo\n */\nGit.prototype.reset = function (mode) {\n return this._runTask(\n resetTask(getResetMode(mode), getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Revert one or more commits in the local working copy\n */\nGit.prototype.revert = function (commit) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof commit !== 'string') {\n return this._runTask(configurationErrorTask('Commit must be a string'), next);\n }\n\n return this._runTask(\n straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]),\n next\n );\n};\n\n/**\n * Add a lightweight tag to the head of the current branch\n */\nGit.prototype.addTag = function (name) {\n const task =\n typeof name === 'string'\n ? addTagTask(name)\n : configurationErrorTask('Git.addTag requires a tag name');\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Add an annotated tag to the head of the current branch\n */\nGit.prototype.addAnnotatedTag = function (tagName, tagMessage) {\n return this._runTask(\n addAnnotatedTagTask(tagName, tagMessage),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete a local branch\n */\nGit.prototype.deleteLocalBranch = function (branchName, forceDelete, then) {\n return this._runTask(\n deleteBranchTask(branchName, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete one or more local branches\n */\nGit.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) {\n return this._runTask(\n deleteBranchesTask(branchNames, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * List all branches\n *\n * @param {Object | string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.branch = function (options, then) {\n return this._runTask(\n branchTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Return list of local branches\n *\n * @param {Function} [then]\n */\nGit.prototype.branchLocal = function (then) {\n return this._runTask(branchLocalTask(), trailingFunctionArgument(arguments));\n};\n\n/**\n * Executes any command against the git binary.\n */\nGit.prototype.raw = function (commands) {\n const createRestCommands = !Array.isArray(commands);\n const command = [].slice.call(createRestCommands ? arguments : commands, 0);\n\n for (let i = 0; i < command.length && createRestCommands; i++) {\n if (!filterPrimitives(command[i])) {\n command.splice(i, command.length - i);\n break;\n }\n }\n\n command.push(...getTrailingOptions(arguments, 0, true));\n\n var next = trailingFunctionArgument(arguments);\n\n if (!command.length) {\n return this._runTask(\n configurationErrorTask('Raw: must supply one or more command to execute'),\n next\n );\n }\n\n return this._runTask(straightThroughStringTask(command, this._trimmed), next);\n};\n\nGit.prototype.submoduleAdd = function (repo, path, then) {\n return this._runTask(addSubModuleTask(repo, path), trailingFunctionArgument(arguments));\n};\n\nGit.prototype.submoduleUpdate = function (args, then) {\n return this._runTask(\n updateSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.submoduleInit = function (args, then) {\n return this._runTask(\n initSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.subModule = function (options, then) {\n return this._runTask(\n subModuleTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.listRemote = function () {\n return this._runTask(\n listRemotesTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Adds a remote to the list of remotes.\n */\nGit.prototype.addRemote = function (remoteName, remoteRepo, then) {\n return this._runTask(\n addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes an entry by name from the list of remotes.\n */\nGit.prototype.removeRemote = function (remoteName, then) {\n return this._runTask(removeRemoteTask(remoteName), trailingFunctionArgument(arguments));\n};\n\n/**\n * Gets the currently available remotes, setting the optional verbose argument to true includes additional\n * detail on the remotes themselves.\n */\nGit.prototype.getRemotes = function (verbose, then) {\n return this._runTask(getRemotesTask(verbose === true), trailingFunctionArgument(arguments));\n};\n\n/**\n * Call any `git remote` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.remote = function (options, then) {\n return this._runTask(\n remoteTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Call any `git tag` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.tag = function (options, then) {\n const command = getTrailingOptions(arguments);\n\n if (command[0] !== 'tag') {\n command.unshift('tag');\n }\n\n return this._runTask(straightThroughStringTask(command), trailingFunctionArgument(arguments));\n};\n\n/**\n * Updates repository server info\n *\n * @param {Function} [then]\n */\nGit.prototype.updateServerInfo = function (then) {\n return this._runTask(\n straightThroughStringTask(['update-server-info']),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the\n * default configured remote spec.\n *\n * @param {string} [remote]\n * @param {Function} [then]\n */\nGit.prototype.pushTags = function (remote, then) {\n const task = pushTagsTask(\n { remote: filterType(remote, filterString) },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Removes the named files from source control.\n */\nGit.prototype.rm = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '-f', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To\n * completely remove the files, use `rm`.\n *\n * @param {string|string[]} files\n */\nGit.prototype.rmKeepLocal = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '--cached', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content,\n * size, and type.\n *\n * Passing \"-p\" will instruct cat-file to determine the object type, and display its formatted contents.\n *\n * @param {string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.catFile = function (options, then) {\n return this._catFile('utf-8', arguments);\n};\n\nGit.prototype.binaryCatFile = function () {\n return this._catFile('buffer', arguments);\n};\n\nGit.prototype._catFile = function (format, args) {\n var handler = trailingFunctionArgument(args);\n var command = ['cat-file'];\n var options = args[0];\n\n if (typeof options === 'string') {\n return this._runTask(\n configurationErrorTask('Git.catFile: options must be supplied as an array of strings'),\n handler\n );\n }\n\n if (Array.isArray(options)) {\n command.push.apply(command, options);\n }\n\n const task =\n format === 'buffer' ? straightThroughBufferTask(command) : straightThroughStringTask(command);\n\n return this._runTask(task, handler);\n};\n\nGit.prototype.diff = function (options, then) {\n const task = filterString(options)\n ? configurationErrorTask(\n 'git.diff: supplying options as a single string is no longer supported, switch to an array of strings'\n )\n : straightThroughStringTask(['diff', ...getTrailingOptions(arguments)]);\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.diffSummary = function () {\n return this._runTask(\n diffSummaryTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.applyPatch = function (patches) {\n const task = !filterStringOrStringArray(patches)\n ? configurationErrorTask(\n `git.applyPatch requires one or more string patches as the first argument`\n )\n : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1)));\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.revparse = function () {\n const commands = ['rev-parse', ...getTrailingOptions(arguments, true)];\n return this._runTask(\n straightThroughStringTask(commands, true),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n */\nGit.prototype.clean = function (mode, options, then) {\n const usingCleanOptionsArray = isCleanOptionsArray(mode);\n const cleanMode =\n (usingCleanOptionsArray && mode.join('')) || filterType(mode, filterString) || '';\n const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0));\n\n return this._runTask(\n cleanWithOptionsTask(cleanMode, customArgs),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.exec = function (then) {\n const task = {\n commands: [],\n format: 'utf-8',\n parser() {\n if (typeof then === 'function') {\n then();\n }\n },\n };\n\n return this._runTask(task);\n};\n\n/**\n * Clears the queue of pending commands and returns the wrapper instance for chaining.\n *\n * @returns {Git}\n */\nGit.prototype.clearQueue = function () {\n // TODO:\n // this._executor.clear();\n return this;\n};\n\n/**\n * Check if a pathname or pathnames are excluded by .gitignore\n *\n * @param {string|string[]} pathnames\n * @param {Function} [then]\n */\nGit.prototype.checkIgnore = function (pathnames, then) {\n return this._runTask(\n checkIgnoreTask(asArray(filterType(pathnames, filterStringOrStringArray, []))),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.checkIsRepo = function (checkType, then) {\n return this._runTask(\n checkIsRepoTask(filterType(checkType, filterString)),\n trailingFunctionArgument(arguments)\n );\n};\n\nmodule.exports = Git;\n","import { pathspec } from './args/pathspec';\nimport { GitConstructError } from './errors/git-construct-error';\nimport { GitError } from './errors/git-error';\nimport { GitPluginError } from './errors/git-plugin-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { TaskConfigurationError } from './errors/task-configuration-error';\nimport { CheckRepoActions } from './tasks/check-is-repo';\nimport { CleanOptions } from './tasks/clean';\nimport { GitConfigScope } from './tasks/config';\nimport { DiffNameStatus } from './tasks/diff-name-status';\nimport { grepQueryBuilder } from './tasks/grep';\nimport { ResetMode } from './tasks/reset';\n\nexport {\n CheckRepoActions,\n CleanOptions,\n DiffNameStatus,\n GitConfigScope,\n GitConstructError,\n GitError,\n GitPluginError,\n GitResponseError,\n ResetMode,\n TaskConfigurationError,\n grepQueryBuilder,\n pathspec,\n};\n","import { GitError } from './git-error';\nimport { SimpleGitOptions } from '../types';\n\n/**\n * The `GitConstructError` is thrown when an error occurs in the constructor\n * of the `simple-git` instance itself. Most commonly as a result of using\n * a `baseDir` option that points to a folder that either does not exist,\n * or cannot be read by the user the node script is running as.\n *\n * Check the `.message` property for more detail including the properties\n * passed to the constructor.\n */\nexport class GitConstructError extends GitError {\n constructor(\n public readonly config: SimpleGitOptions,\n message: string\n ) {\n super(undefined, message);\n }\n}\n","import { SimpleGitOptions, SimpleGitTask } from '../types';\nimport { GitError } from './git-error';\n\nexport class GitPluginError extends GitError {\n constructor(\n public task?: SimpleGitTask<any>,\n public readonly plugin?: keyof SimpleGitOptions,\n message?: string\n ) {\n super(task, message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { SimpleGitOptions } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function abortPlugin(signal: SimpleGitOptions['abort']) {\n if (!signal) {\n return;\n }\n\n const onSpawnAfter: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n function kill() {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort signal received'));\n }\n\n signal.addEventListener('abort', kill);\n\n context.spawned.on('close', () => signal.removeEventListener('abort', kill));\n },\n };\n\n const onSpawnBefore: SimpleGitPlugin<'spawn.before'> = {\n type: 'spawn.before',\n action(_data, context) {\n if (signal.aborted) {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort already signaled'));\n }\n },\n };\n\n return [onSpawnBefore, onSpawnAfter];\n}\n","import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport type { SimpleGitPluginConfig } from '../types';\n\nfunction isConfigSwitch(arg: string | unknown) {\n return typeof arg === 'string' && arg.trim().toLowerCase() === '-c';\n}\n\nfunction preventProtocolOverride(arg: string, next: string) {\n if (!isConfigSwitch(arg)) {\n return;\n }\n\n if (!/^\\s*protocol(.[a-z]+)?.allow/.test(next)) {\n return;\n }\n\n throw new GitPluginError(\n undefined,\n 'unsafe',\n 'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol'\n );\n}\n\nfunction preventUploadPack(arg: string, method: string) {\n if (/^\\s*--(upload|receive)-pack/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'clone' && /^\\s*-u\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of clone with option -u is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'push' && /^\\s*--exec\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of push with option --exec is not permitted without enabling allowUnsafePack`\n );\n }\n}\n\nexport function blockUnsafeOperationsPlugin({\n allowUnsafeProtocolOverride = false,\n allowUnsafePack = false,\n}: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(args, context) {\n args.forEach((current, index) => {\n const next = index < args.length ? args[index + 1] : '';\n\n allowUnsafeProtocolOverride || preventProtocolOverride(current, next);\n allowUnsafePack || preventUploadPack(current, context.method);\n });\n\n return args;\n },\n };\n}\n","import { prefixedArray } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function commandConfigPrefixingPlugin(\n configuration: string[]\n): SimpleGitPlugin<'spawn.args'> {\n const prefix = prefixedArray(configuration, '-c');\n\n return {\n type: 'spawn.args',\n action(data) {\n return [...prefix, ...data];\n },\n };\n}\n","import { deferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { SimpleGitPluginConfig } from '../types';\nimport { delay } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nconst never = deferred().promise;\n\nexport function completionDetectionPlugin({\n onClose = true,\n onExit = 50,\n}: SimpleGitPluginConfig['completion'] = {}): SimpleGitPlugin<'spawn.after'> {\n function createEvents() {\n let exitCode = -1;\n const events = {\n close: deferred(),\n closeTimeout: deferred(),\n exit: deferred(),\n exitTimeout: deferred(),\n };\n\n const result = Promise.race([\n onClose === false ? never : events.closeTimeout.promise,\n onExit === false ? never : events.exitTimeout.promise,\n ]);\n\n configureTimeout(onClose, events.close, events.closeTimeout);\n configureTimeout(onExit, events.exit, events.exitTimeout);\n\n return {\n close(code: number) {\n exitCode = code;\n events.close.done();\n },\n exit(code: number) {\n exitCode = code;\n events.exit.done();\n },\n get exitCode() {\n return exitCode;\n },\n result,\n };\n }\n\n function configureTimeout(\n flag: boolean | number,\n event: DeferredPromise<void>,\n timeout: DeferredPromise<void>\n ) {\n if (flag === false) {\n return;\n }\n\n (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done);\n }\n\n return {\n type: 'spawn.after',\n async action(_data, { spawned, close }) {\n const events = createEvents();\n\n let deferClose = true;\n let quickClose = () => void (deferClose = false);\n\n spawned.stdout?.on('data', quickClose);\n spawned.stderr?.on('data', quickClose);\n spawned.on('error', quickClose);\n\n spawned.on('close', (code: number) => events.close(code));\n spawned.on('exit', (code: number) => events.exit(code));\n\n try {\n await events.result;\n if (deferClose) {\n await delay(50);\n }\n close(events.exitCode);\n } catch (err) {\n close(events.exitCode, err as Error);\n }\n },\n };\n}\n","import type { SimpleGitOptions } from '../types';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport { asArray } from '../utils';\nimport { PluginStore } from './plugin-store';\n\nconst WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`;\nconst WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`;\n\nfunction isBadArgument(arg: string) {\n return !arg || !/^([a-z]:)?([a-z0-9/.\\\\_-]+)$/i.test(arg);\n}\n\nfunction toBinaryConfig(\n input: string[],\n allowUnsafe: boolean\n): { binary: string; prefix?: string } {\n if (input.length < 1 || input.length > 2) {\n throw new GitPluginError(undefined, 'binary', WRONG_NUMBER_ERR);\n }\n\n const isBad = input.some(isBadArgument);\n if (isBad) {\n if (allowUnsafe) {\n console.warn(WRONG_CHARS_ERR);\n } else {\n throw new GitPluginError(undefined, 'binary', WRONG_CHARS_ERR);\n }\n }\n\n const [binary, prefix] = input;\n return {\n binary,\n prefix,\n };\n}\n\nexport function customBinaryPlugin(\n plugins: PluginStore,\n input: SimpleGitOptions['binary'] = ['git'],\n allowUnsafe = false\n) {\n let config = toBinaryConfig(asArray(input), allowUnsafe);\n\n plugins.on('binary', (input) => {\n config = toBinaryConfig(asArray(input), allowUnsafe);\n });\n\n plugins.append('spawn.binary', () => {\n return config.binary;\n });\n\n plugins.append('spawn.args', (data) => {\n return config.prefix ? [config.prefix, ...data] : data;\n });\n}\n","import { GitError } from '../errors/git-error';\nimport { GitExecutorResult, SimpleGitPluginConfig } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\ntype TaskResult = Omit<GitExecutorResult, 'rejection'>;\n\nfunction isTaskError(result: TaskResult) {\n return !!(result.exitCode && result.stdErr.length);\n}\n\nfunction getErrorMessage(result: TaskResult) {\n return Buffer.concat([...result.stdOut, ...result.stdErr]);\n}\n\nexport function errorDetectionHandler(\n overwrite = false,\n isError = isTaskError,\n errorMessage: (result: TaskResult) => Buffer | Error = getErrorMessage\n) {\n return (error: Buffer | Error | undefined, result: TaskResult) => {\n if ((!overwrite && error) || !isError(result)) {\n return error;\n }\n\n return errorMessage(result);\n };\n}\n\nexport function errorDetectionPlugin(\n config: SimpleGitPluginConfig['errors']\n): SimpleGitPlugin<'task.error'> {\n return {\n type: 'task.error',\n action(data, context) {\n const error = config(data.error, {\n stdErr: context.stdErr,\n stdOut: context.stdOut,\n exitCode: context.exitCode,\n });\n\n if (Buffer.isBuffer(error)) {\n return { error: new GitError(undefined, error.toString('utf-8')) };\n }\n\n return {\n error,\n };\n },\n };\n}\n","import { EventEmitter } from 'node:events';\n\nimport type {\n SimpleGitPlugin,\n SimpleGitPluginType,\n SimpleGitPluginTypes,\n} from './simple-git-plugin';\nimport { append, asArray } from '../utils';\nimport type { SimpleGitPluginConfig } from '../types';\n\nexport class PluginStore {\n private plugins: Set<SimpleGitPlugin<SimpleGitPluginType>> = new Set();\n private events = new EventEmitter();\n\n on<K extends keyof SimpleGitPluginConfig>(\n type: K,\n listener: (data: SimpleGitPluginConfig[K]) => void\n ) {\n this.events.on(type, listener);\n }\n\n reconfigure<K extends keyof SimpleGitPluginConfig>(type: K, data: SimpleGitPluginConfig[K]) {\n this.events.emit(type, data);\n }\n\n public append<T extends SimpleGitPluginType>(type: T, action: SimpleGitPlugin<T>['action']) {\n const plugin = append(this.plugins, { type, action });\n\n return () => this.plugins.delete(plugin);\n }\n\n public add<T extends SimpleGitPluginType>(\n plugin: void | SimpleGitPlugin<T> | SimpleGitPlugin<T>[]\n ) {\n const plugins: SimpleGitPlugin<T>[] = [];\n\n asArray(plugin).forEach((plugin) => plugin && this.plugins.add(append(plugins, plugin)));\n\n return () => {\n plugins.forEach((plugin) => this.plugins.delete(plugin));\n };\n }\n\n public exec<T extends SimpleGitPluginType>(\n type: T,\n data: SimpleGitPluginTypes[T]['data'],\n context: SimpleGitPluginTypes[T]['context']\n ): typeof data {\n let output = data;\n const contextual = Object.freeze(Object.create(context));\n\n for (const plugin of this.plugins) {\n if (plugin.type === type) {\n output = plugin.action(output, contextual);\n }\n }\n\n return output;\n }\n}\n","import { SimpleGitOptions } from '../types';\nimport { asNumber, including } from '../utils';\n\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function progressMonitorPlugin(progress: Exclude<SimpleGitOptions['progress'], void>) {\n const progressCommand = '--progress';\n const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push'];\n\n const onProgress: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n if (!context.commands.includes(progressCommand)) {\n return;\n }\n\n context.spawned.stderr?.on('data', (chunk: Buffer) => {\n const message = /^([\\s\\S]+?):\\s*(\\d+)% \\((\\d+)\\/(\\d+)\\)/.exec(chunk.toString('utf8'));\n if (!message) {\n return;\n }\n\n progress({\n method: context.method,\n stage: progressEventStage(message[1]),\n progress: asNumber(message[2]),\n processed: asNumber(message[3]),\n total: asNumber(message[4]),\n });\n });\n },\n };\n\n const onArgs: SimpleGitPlugin<'spawn.args'> = {\n type: 'spawn.args',\n action(args, context) {\n if (!progressMethods.includes(context.method)) {\n return args;\n }\n\n return including(args, progressCommand);\n },\n };\n\n return [onArgs, onProgress];\n}\n\nfunction progressEventStage(input: string) {\n return String(input.toLowerCase().split(' ', 1)) || 'unknown';\n}\n","import { SpawnOptions } from 'child_process';\nimport { pick } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function spawnOptionsPlugin(\n spawnOptions: Partial<SpawnOptions>\n): SimpleGitPlugin<'spawn.options'> {\n const options = pick(spawnOptions, ['uid', 'gid']);\n\n return {\n type: 'spawn.options',\n action(data) {\n return { ...options, ...data };\n },\n };\n}\n","import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport type { SimpleGitOptions } from '../types';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function timeoutPlugin({\n block,\n stdErr = true,\n stdOut = true,\n}: Exclude<SimpleGitOptions['timeout'], undefined>): SimpleGitPlugin<'spawn.after'> | void {\n if (block > 0) {\n return {\n type: 'spawn.after',\n action(_data, context) {\n let timeout: NodeJS.Timeout;\n\n function wait() {\n timeout && clearTimeout(timeout);\n timeout = setTimeout(kill, block);\n }\n\n function stop() {\n context.spawned.stdout?.off('data', wait);\n context.spawned.stderr?.off('data', wait);\n context.spawned.off('exit', stop);\n context.spawned.off('close', stop);\n timeout && clearTimeout(timeout);\n }\n\n function kill() {\n stop();\n context.kill(new GitPluginError(undefined, 'timeout', `block timeout reached`));\n }\n\n stdOut && context.spawned.stdout?.on('data', wait);\n stdErr && context.spawned.stderr?.on('data', wait);\n context.spawned.on('exit', stop);\n context.spawned.on('close', stop);\n\n wait();\n },\n };\n }\n}\n","import { SimpleGitPlugin } from './simple-git-plugin';\nimport { isPathSpec, toPaths } from '../args/pathspec';\n\nexport function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(data) {\n const prefix: string[] = [];\n let suffix: undefined | string[];\n function append(args: string[]) {\n (suffix = suffix || []).push(...args);\n }\n\n for (let i = 0; i < data.length; i++) {\n const param = data[i];\n\n if (isPathSpec(param)) {\n append(toPaths(param));\n continue;\n }\n\n if (param === '--') {\n append(\n data.slice(i + 1).flatMap((item) => (isPathSpec(item) && toPaths(item)) || item)\n );\n break;\n }\n\n prefix.push(param);\n }\n\n return !suffix ? prefix : [...prefix, '--', ...suffix.map(String)];\n },\n };\n}\n","import { SimpleGitFactory } from '../../typings';\n\nimport * as api from './api';\nimport {\n abortPlugin,\n blockUnsafeOperationsPlugin,\n commandConfigPrefixingPlugin,\n completionDetectionPlugin,\n customBinaryPlugin,\n errorDetectionHandler,\n errorDetectionPlugin,\n PluginStore,\n progressMonitorPlugin,\n spawnOptionsPlugin,\n timeoutPlugin,\n} from './plugins';\nimport { suffixPathsPlugin } from './plugins/suffix-paths.plugin';\nimport { createInstanceConfig, folderExists } from './utils';\nimport { SimpleGitOptions } from './types';\n\nconst Git = require('../git');\n\n/**\n * Adds the necessary properties to the supplied object to enable it for use as\n * the default export of a module.\n *\n * Eg: `module.exports = esModuleFactory({ something () {} })`\n */\nexport function esModuleFactory<T>(defaultExport: T) {\n return Object.defineProperties(defaultExport, {\n __esModule: { value: true },\n default: { value: defaultExport },\n }) as T & { __esModule: true; default: T };\n}\n\nexport function gitExportFactory(factory: SimpleGitFactory) {\n return Object.assign(factory.bind(null), api);\n}\n\nexport function gitInstanceFactory(\n baseDir?: string | Partial<SimpleGitOptions>,\n options?: Partial<SimpleGitOptions>\n) {\n const plugins = new PluginStore();\n const config = createInstanceConfig(\n (baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir)) || {},\n options\n );\n\n if (!folderExists(config.baseDir)) {\n throw new api.GitConstructError(\n config,\n `Cannot use simple-git on a directory that does not exist`\n );\n }\n\n if (Array.isArray(config.config)) {\n plugins.add(commandConfigPrefixingPlugin(config.config));\n }\n\n plugins.add(blockUnsafeOperationsPlugin(config.unsafe));\n plugins.add(suffixPathsPlugin());\n plugins.add(completionDetectionPlugin(config.completion));\n config.abort && plugins.add(abortPlugin(config.abort));\n config.progress && plugins.add(progressMonitorPlugin(config.progress));\n config.timeout && plugins.add(timeoutPlugin(config.timeout));\n config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions));\n\n plugins.add(errorDetectionPlugin(errorDetectionHandler(true)));\n config.errors && plugins.add(errorDetectionPlugin(config.errors));\n\n customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary);\n\n return new Git(config, plugins);\n}\n","import { SimpleGit, SimpleGitOptions } from '../../../typings';\n\nimport { GitResponseError } from '../errors/git-response-error';\nimport { gitInstanceFactory } from '../git-factory';\nimport { SimpleGitTaskCallback } from '../types';\n\nconst functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent'];\n\nconst functionNamesPromiseApi = [\n 'add',\n 'addAnnotatedTag',\n 'addConfig',\n 'addRemote',\n 'addTag',\n 'applyPatch',\n 'binaryCatFile',\n 'branch',\n 'branchLocal',\n 'catFile',\n 'checkIgnore',\n 'checkIsRepo',\n 'checkout',\n 'checkoutBranch',\n 'checkoutLatestTag',\n 'checkoutLocalBranch',\n 'clean',\n 'clone',\n 'commit',\n 'cwd',\n 'deleteLocalBranch',\n 'deleteLocalBranches',\n 'diff',\n 'diffSummary',\n 'exec',\n 'fetch',\n 'getRemotes',\n 'init',\n 'listConfig',\n 'listRemote',\n 'log',\n 'merge',\n 'mergeFromTo',\n 'mirror',\n 'mv',\n 'pull',\n 'push',\n 'pushTags',\n 'raw',\n 'rebase',\n 'remote',\n 'removeRemote',\n 'reset',\n 'revert',\n 'revparse',\n 'rm',\n 'rmKeepLocal',\n 'show',\n 'stash',\n 'stashList',\n 'status',\n 'subModule',\n 'submoduleAdd',\n 'submoduleInit',\n 'submoduleUpdate',\n 'tag',\n 'tags',\n 'updateServerInfo',\n];\n\nexport function gitP(\n ...args: [] | [string] | [Partial<SimpleGitOptions>] | [string, Partial<SimpleGitOptions>]\n): SimpleGit {\n let git: any;\n\n let chain = Promise.resolve();\n\n try {\n git = gitInstanceFactory(...args);\n } catch (e) {\n chain = Promise.reject(e);\n }\n\n function builderReturn() {\n return promiseApi;\n }\n\n function chainReturn() {\n return chain;\n }\n\n const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce(\n (api: any, name: string) => {\n const isAsync = functionNamesPromiseApi.includes(name);\n\n const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api);\n const alternative = isAsync ? chainReturn : builderReturn;\n\n Object.defineProperty(api, name, {\n enumerable: false,\n configurable: false,\n value: git ? valid : alternative,\n });\n\n return api;\n },\n {}\n );\n\n return promiseApi as SimpleGit;\n\n function asyncWrapper(fn: string, git: any): (...args: any[]) => Promise<any> {\n return function (...args: any[]) {\n if (typeof args[args.length] === 'function') {\n throw new TypeError(\n 'Promise interface requires that handlers are not supplied inline, ' +\n 'trailing function not allowed in call to ' +\n fn\n );\n }\n\n return chain.then(function () {\n return new Promise(function (resolve, reject) {\n const callback: SimpleGitTaskCallback = (err: Error | null, result?: any) => {\n if (err) {\n return reject(toError(err));\n }\n\n resolve(result);\n };\n args.push(callback);\n\n git[fn].apply(git, args);\n });\n });\n };\n }\n\n function syncWrapper(fn: string, git: any, api: SimpleGit) {\n return (...args: any[]) => {\n git[fn](...args);\n\n return api;\n };\n }\n}\n\nfunction toError(error: Error | string | any): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new GitResponseError(error);\n}\n","import { gitInstanceFactory } from './lib/git-factory';\n\nexport { gitP } from './lib/runners/promise-wrapped';\nexport * from './lib/api';\n\nexport const simpleGit = gitInstanceFactory;\n\nexport default gitInstanceFactory;\n","import { type SimpleGit, type SimpleGitOptions, simpleGit } from \"simple-git\";\n\nexport type GitClient = SimpleGit;\n\nexport interface CreateGitClientOptions extends Partial<SimpleGitOptions> {\n abortSignal?: AbortSignal;\n}\n\nexport function createGitClient(\n baseDir?: string,\n options?: CreateGitClientOptions,\n): GitClient {\n const { abortSignal: signal, ...rest } = options ?? {};\n return simpleGit({\n baseDir,\n maxConcurrentProcesses: 6,\n trimmed: true,\n abort: signal,\n ...rest,\n });\n}\n","import { execFile } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface LockInfo {\n path: string;\n ageMs: number;\n}\n\nexport async function getIndexLockPath(repoPath: string): Promise<string> {\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"rev-parse\", \"--git-path\", \"index.lock\"],\n { cwd: repoPath },\n );\n return path.resolve(repoPath, stdout.trim());\n } catch {\n return path.join(repoPath, \".git\", \"index.lock\");\n }\n}\n\nexport async function getLockInfo(repoPath: string): Promise<LockInfo | null> {\n const lockPath = await getIndexLockPath(repoPath);\n try {\n const stat = await fs.stat(lockPath);\n return {\n path: lockPath,\n ageMs: Date.now() - stat.mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nexport async function removeLock(repoPath: string): Promise<void> {\n const lockPath = await getIndexLockPath(repoPath);\n await fs.rm(lockPath, { force: true });\n}\n\nexport async function isLocked(repoPath: string): Promise<boolean> {\n return (await getLockInfo(repoPath)) !== null;\n}\n\nexport async function waitForUnlock(\n repoPath: string,\n timeoutMs = 10000,\n intervalMs = 100,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (!(await isLocked(repoPath))) return true;\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n return false;\n}\n","export class AsyncReaderWriterLock {\n private readers = 0;\n private writer = false;\n private writerWaiting = false;\n private readQueue: Array<() => void> = [];\n private writeQueue: Array<() => void> = [];\n\n async acquireRead(): Promise<void> {\n if (!this.writer && !this.writerWaiting) {\n this.readers++;\n return;\n }\n return new Promise((resolve) => {\n this.readQueue.push(() => {\n this.readers++;\n resolve();\n });\n });\n }\n\n releaseRead(): void {\n this.readers--;\n this.processQueue();\n }\n\n async acquireWrite(): Promise<void> {\n if (!this.writer && this.readers === 0) {\n this.writer = true;\n return;\n }\n this.writerWaiting = true;\n return new Promise((resolve) => {\n this.writeQueue.push(() => {\n this.writerWaiting = this.writeQueue.length > 0;\n this.writer = true;\n resolve();\n });\n });\n }\n\n releaseWrite(): void {\n this.writer = false;\n this.processQueue();\n }\n\n private processQueue(): void {\n if (this.writer || this.readers > 0) return;\n\n if (this.writeQueue.length > 0) {\n const next = this.writeQueue.shift();\n if (next) next();\n } else {\n while (this.readQueue.length > 0 && !this.writerWaiting) {\n const next = this.readQueue.shift();\n if (next) next();\n }\n }\n }\n}\n","import { createGitClient, type GitClient } from \"./client\";\nimport { removeLock, waitForUnlock } from \"./lock-detector\";\nimport { AsyncReaderWriterLock } from \"./rw-lock\";\n\n/**\n * Returns process.env with Electron/Chromium variables cleaned so that\n * child processes spawned by git hooks (e.g. biome via lint-staged) don't\n * crash trying to initialise GPU subsystems.\n *\n * The agent service symlinks `node → Electron binary` and prepends it to\n * PATH. If ELECTRON_RUN_AS_NODE is missing, that binary starts as a full\n * Chromium browser (GPU init → SIGTRAP crash). We strip most ELECTRON_/\n * CHROME_ vars but explicitly keep ELECTRON_RUN_AS_NODE=1 so any such\n * shim still behaves as plain Node.js.\n */\nfunction getCleanEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value === undefined) continue;\n if (key === \"ELECTRON_RUN_AS_NODE\") continue;\n if (key.startsWith(\"ELECTRON_\") || key.startsWith(\"CHROME_\")) continue;\n env[key] = value;\n }\n env.ELECTRON_RUN_AS_NODE = \"1\";\n return env;\n}\n\ninterface RepoState {\n lock: AsyncReaderWriterLock;\n client: GitClient;\n lastAccess: number;\n}\n\nexport interface ExecuteOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n waitForExternalLock?: boolean;\n}\n\nclass GitOperationManagerImpl {\n private repoStates = new Map<string, RepoState>();\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n private static readonly CLEANUP_INTERVAL_MS = 60000;\n private static readonly IDLE_TIMEOUT_MS = 300000;\n\n constructor() {\n this.cleanupInterval = setInterval(\n () => this.cleanupIdleRepos(),\n GitOperationManagerImpl.CLEANUP_INTERVAL_MS,\n );\n }\n\n private getRepoState(repoPath: string): RepoState {\n let state = this.repoStates.get(repoPath);\n if (!state) {\n state = {\n lock: new AsyncReaderWriterLock(),\n client: createGitClient(repoPath),\n lastAccess: Date.now(),\n };\n this.repoStates.set(repoPath, state);\n }\n state.lastAccess = Date.now();\n return state;\n }\n\n private cleanupIdleRepos(): void {\n const now = Date.now();\n for (const [repoPath, state] of this.repoStates) {\n if (now - state.lastAccess > GitOperationManagerImpl.IDLE_TIMEOUT_MS) {\n this.repoStates.delete(repoPath);\n }\n }\n }\n\n async executeRead<T>(\n repoPath: string,\n operation: (git: GitClient) => Promise<T>,\n options?: ExecuteOptions,\n ): Promise<T> {\n const state = this.getRepoState(repoPath);\n\n if (options?.signal) {\n const scopedGit = createGitClient(repoPath, {\n abortSignal: options.signal,\n });\n return operation(\n scopedGit.env({ ...getCleanEnv(), GIT_OPTIONAL_LOCKS: \"0\" }),\n );\n }\n\n const git = state.client.env({ ...getCleanEnv(), GIT_OPTIONAL_LOCKS: \"0\" });\n return operation(git);\n }\n\n async executeWrite<T>(\n repoPath: string,\n operation: (git: GitClient) => Promise<T>,\n options?: ExecuteOptions,\n ): Promise<T> {\n const state = this.getRepoState(repoPath);\n\n if (options?.waitForExternalLock !== false) {\n const unlocked = await waitForUnlock(\n repoPath,\n options?.timeoutMs ?? 10000,\n );\n if (!unlocked) {\n throw new Error(`Git repository is locked: ${repoPath}`);\n }\n }\n\n await state.lock.acquireWrite();\n try {\n if (options?.signal) {\n const scopedGit = createGitClient(repoPath, {\n abortSignal: options.signal,\n });\n return await operation(scopedGit.env(getCleanEnv()));\n }\n\n return await operation(state.client.env(getCleanEnv()));\n } catch (error) {\n if (options?.signal?.aborted) {\n await removeLock(repoPath).catch(() => {});\n }\n throw error;\n } finally {\n state.lock.releaseWrite();\n }\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.repoStates.clear();\n }\n}\n\nlet instance: GitOperationManagerImpl | null = null;\n\nexport function getGitOperationManager(): GitOperationManagerImpl {\n if (!instance) {\n instance = new GitOperationManagerImpl();\n }\n return instance;\n}\n\nexport function resetGitOperationManager(): void {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n}\n\nexport type GitOperationManager = GitOperationManagerImpl;\n","import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ApplyTreeSaga as GitApplyTreeSaga } from \"@posthog/git/sagas/tree\";\nimport { Saga } from \"@posthog/shared\";\nimport type { PostHogAPIClient } from \"../posthog-api\";\nimport type { TreeSnapshot } from \"../types\";\n\nexport interface ApplySnapshotInput {\n snapshot: TreeSnapshot;\n repositoryPath: string;\n apiClient: PostHogAPIClient;\n taskId: string;\n runId: string;\n}\n\nexport interface ApplySnapshotOutput {\n treeHash: string;\n}\n\nexport class ApplySnapshotSaga extends Saga<\n ApplySnapshotInput,\n ApplySnapshotOutput\n> {\n readonly sagaName = \"ApplySnapshotSaga\";\n\n private archivePath: string | null = null;\n\n protected async execute(\n input: ApplySnapshotInput,\n ): Promise<ApplySnapshotOutput> {\n const { snapshot, repositoryPath, apiClient, taskId, runId } = input;\n const tmpDir = join(repositoryPath, \".posthog\", \"tmp\");\n\n if (!snapshot.archiveUrl) {\n throw new Error(\"Cannot apply snapshot: no archive URL\");\n }\n\n const archiveUrl = snapshot.archiveUrl;\n\n await this.step({\n name: \"create_tmp_dir\",\n execute: () => mkdir(tmpDir, { recursive: true }),\n rollback: async () => {},\n });\n\n const archivePath = join(tmpDir, `${snapshot.treeHash}.tar.gz`);\n this.archivePath = archivePath;\n await this.step({\n name: \"download_archive\",\n execute: async () => {\n const arrayBuffer = await apiClient.downloadArtifact(\n taskId,\n runId,\n archiveUrl,\n );\n if (!arrayBuffer) {\n throw new Error(\"Failed to download archive\");\n }\n const base64Content = Buffer.from(arrayBuffer).toString(\"utf-8\");\n const binaryContent = Buffer.from(base64Content, \"base64\");\n await writeFile(archivePath, binaryContent);\n },\n rollback: async () => {\n if (this.archivePath) {\n await rm(this.archivePath, { force: true }).catch(() => {});\n }\n },\n });\n\n const gitApplySaga = new GitApplyTreeSaga(this.log);\n const applyResult = await gitApplySaga.run({\n baseDir: repositoryPath,\n treeHash: snapshot.treeHash,\n baseCommit: snapshot.baseCommit,\n changes: snapshot.changes,\n archivePath: this.archivePath,\n });\n\n if (!applyResult.success) {\n throw new Error(`Failed to apply tree: ${applyResult.error}`);\n }\n\n await rm(this.archivePath, { force: true }).catch(() => {});\n\n this.log.info(\"Tree snapshot applied\", {\n treeHash: snapshot.treeHash,\n totalChanges: snapshot.changes.length,\n deletedFiles: snapshot.changes.filter((c) => c.status === \"D\").length,\n });\n\n return { treeHash: snapshot.treeHash };\n }\n}\n","import { existsSync } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as tar from \"tar\";\nimport type { GitClient } from \"../client\";\nimport { GitSaga, type GitSagaInput } from \"../git-saga\";\nimport { getHeadSha } from \"../queries\";\n\nexport type FileStatus = \"A\" | \"M\" | \"D\";\n\nexport interface FileChange {\n path: string;\n status: FileStatus;\n}\n\nexport interface TreeSnapshot {\n treeHash: string;\n baseCommit: string | null;\n changes: FileChange[];\n timestamp: string;\n}\n\nexport interface CaptureTreeInput extends GitSagaInput {\n lastTreeHash?: string | null;\n archivePath?: string;\n}\n\nexport interface CaptureTreeOutput {\n snapshot: TreeSnapshot | null;\n archivePath?: string;\n changed: boolean;\n}\n\nexport class CaptureTreeSaga extends GitSaga<\n CaptureTreeInput,\n CaptureTreeOutput\n> {\n readonly sagaName = \"CaptureTreeSaga\";\n private tempIndexPath: string | null = null;\n\n protected async executeGitOperations(\n input: CaptureTreeInput,\n ): Promise<CaptureTreeOutput> {\n const { baseDir, lastTreeHash, archivePath, signal } = input;\n const tmpDir = path.join(baseDir, \".git\", \"posthog-code-tmp\");\n\n await this.step({\n name: \"create_tmp_dir\",\n execute: () => fs.mkdir(tmpDir, { recursive: true }),\n rollback: async () => {},\n });\n\n this.tempIndexPath = path.join(tmpDir, `index-${Date.now()}`);\n const tempIndexGit = this.git.env({\n ...process.env,\n GIT_INDEX_FILE: this.tempIndexPath,\n });\n\n await this.step({\n name: \"init_temp_index\",\n execute: () => tempIndexGit.raw([\"read-tree\", \"HEAD\"]),\n rollback: async () => {\n if (this.tempIndexPath) {\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n }\n },\n });\n\n await this.readOnlyStep(\"stage_files\", () =>\n tempIndexGit.raw([\"add\", \"-A\"]),\n );\n\n const treeHash = await this.readOnlyStep(\"write_tree\", () =>\n tempIndexGit.raw([\"write-tree\"]),\n );\n\n if (lastTreeHash && treeHash === lastTreeHash) {\n this.log.debug(\"No changes since last capture\", { treeHash });\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n return { snapshot: null, changed: false };\n }\n\n const baseCommit = await this.readOnlyStep(\"get_base_commit\", async () => {\n try {\n return await getHeadSha(baseDir, { abortSignal: signal });\n } catch {\n return null;\n }\n });\n\n const changes = await this.readOnlyStep(\"get_changes\", () =>\n this.getChanges(this.git, baseCommit, treeHash),\n );\n\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n\n const snapshot: TreeSnapshot = {\n treeHash,\n baseCommit,\n changes,\n timestamp: new Date().toISOString(),\n };\n\n let createdArchivePath: string | undefined;\n if (archivePath) {\n createdArchivePath = await this.createArchive(\n baseDir,\n archivePath,\n changes,\n );\n }\n\n this.log.info(\"Tree captured\", {\n treeHash,\n changes: changes.length,\n archived: !!createdArchivePath,\n });\n\n return { snapshot, archivePath: createdArchivePath, changed: true };\n }\n\n private async createArchive(\n baseDir: string,\n archivePath: string,\n changes: FileChange[],\n ): Promise<string | undefined> {\n const filesToArchive = changes\n .filter((c) => c.status !== \"D\")\n .map((c) => c.path);\n\n if (filesToArchive.length === 0) {\n return undefined;\n }\n\n const existingFiles = filesToArchive.filter((f) =>\n existsSync(path.join(baseDir, f)),\n );\n\n if (existingFiles.length === 0) {\n return undefined;\n }\n\n await this.step({\n name: \"create_archive\",\n execute: async () => {\n const archiveDir = path.dirname(archivePath);\n await fs.mkdir(archiveDir, { recursive: true });\n await tar.create(\n {\n gzip: true,\n file: archivePath,\n cwd: baseDir,\n },\n existingFiles,\n );\n },\n rollback: async () => {\n await fs.rm(archivePath, { force: true }).catch(() => {});\n },\n });\n\n return archivePath;\n }\n\n private async getChanges(\n git: GitClient,\n fromRef: string | null,\n toRef: string,\n ): Promise<FileChange[]> {\n if (!fromRef) {\n const stdout = await git.raw([\"ls-tree\", \"-r\", \"--name-only\", toRef]);\n return stdout\n .split(\"\\n\")\n .filter((p) => p.trim())\n .map((p) => ({ path: p, status: \"A\" as FileStatus }));\n }\n\n const stdout = await git.raw([\n \"diff-tree\",\n \"-r\",\n \"--name-status\",\n fromRef,\n toRef,\n ]);\n\n const changes: FileChange[] = [];\n for (const line of stdout.split(\"\\n\")) {\n if (!line.trim()) continue;\n const [status, filePath] = line.split(\"\\t\");\n if (!filePath) continue;\n\n let normalizedStatus: FileStatus;\n if (status === \"D\") {\n normalizedStatus = \"D\";\n } else if (status === \"A\") {\n normalizedStatus = \"A\";\n } else {\n normalizedStatus = \"M\";\n }\n\n changes.push({ path: filePath, status: normalizedStatus });\n }\n\n return changes;\n }\n}\n\nexport interface ApplyTreeInput extends GitSagaInput {\n treeHash: string;\n baseCommit?: string | null;\n changes: FileChange[];\n archivePath?: string;\n}\n\nexport interface ApplyTreeOutput {\n treeHash: string;\n checkoutPerformed: boolean;\n}\n\nexport class ApplyTreeSaga extends GitSaga<ApplyTreeInput, ApplyTreeOutput> {\n readonly sagaName = \"ApplyTreeSaga\";\n private originalHead: string | null = null;\n private originalBranch: string | null = null;\n private extractedFiles: string[] = [];\n private fileBackups: Map<string, Buffer> = new Map();\n\n protected async executeGitOperations(\n input: ApplyTreeInput,\n ): Promise<ApplyTreeOutput> {\n const { baseDir, treeHash, baseCommit, changes, archivePath } = input;\n\n const headInfo = await this.readOnlyStep(\"get_current_head\", async () => {\n let head: string | null = null;\n let branch: string | null = null;\n\n try {\n head = await this.git.revparse([\"HEAD\"]);\n } catch {\n head = null;\n }\n\n try {\n branch = await this.git.raw([\"symbolic-ref\", \"--short\", \"HEAD\"]);\n } catch {\n branch = null;\n }\n\n return { head, branch };\n });\n this.originalHead = headInfo.head;\n this.originalBranch = headInfo.branch;\n\n let checkoutPerformed = false;\n\n if (baseCommit && baseCommit !== this.originalHead) {\n await this.readOnlyStep(\"check_working_tree\", async () => {\n const status = await this.git.status();\n if (!status.isClean()) {\n const changedFiles =\n status.modified.length +\n status.staged.length +\n status.deleted.length;\n throw new Error(\n `Cannot apply tree: ${changedFiles} uncommitted change(s) exist. ` +\n `Commit or stash your changes first.`,\n );\n }\n });\n\n await this.step({\n name: \"checkout_base\",\n execute: async () => {\n await this.git.checkout(baseCommit);\n checkoutPerformed = true;\n this.log.warn(\n \"Applied tree from different commit - now in detached HEAD state\",\n {\n originalHead: this.originalHead,\n originalBranch: this.originalBranch,\n baseCommit,\n },\n );\n },\n rollback: async () => {\n try {\n if (this.originalBranch) {\n await this.git.checkout(this.originalBranch);\n } else if (this.originalHead) {\n await this.git.checkout(this.originalHead);\n }\n } catch (error) {\n this.log.warn(\"Failed to rollback checkout\", { error });\n }\n },\n });\n }\n\n if (archivePath) {\n const filesToExtract = changes\n .filter((c) => c.status !== \"D\")\n .map((c) => c.path);\n\n await this.readOnlyStep(\"backup_existing_files\", async () => {\n for (const filePath of filesToExtract) {\n const fullPath = path.join(baseDir, filePath);\n try {\n const content = await fs.readFile(fullPath);\n this.fileBackups.set(filePath, content);\n } catch {}\n }\n });\n\n await this.step({\n name: \"extract_archive\",\n execute: async () => {\n await tar.extract({\n file: archivePath,\n cwd: baseDir,\n });\n this.extractedFiles = filesToExtract;\n },\n rollback: async () => {\n for (const filePath of this.extractedFiles) {\n const fullPath = path.join(baseDir, filePath);\n const backup = this.fileBackups.get(filePath);\n if (backup) {\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n await fs.writeFile(fullPath, backup).catch(() => {});\n } else {\n await fs.rm(fullPath, { force: true }).catch(() => {});\n }\n }\n },\n });\n }\n\n for (const change of changes.filter((c) => c.status === \"D\")) {\n const fullPath = path.join(baseDir, change.path);\n\n const backupContent = await this.readOnlyStep(\n `backup_${change.path}`,\n async () => {\n try {\n return await fs.readFile(fullPath);\n } catch {\n return null;\n }\n },\n );\n\n await this.step({\n name: `delete_${change.path}`,\n execute: async () => {\n await fs.rm(fullPath, { force: true });\n this.log.debug(`Deleted file: ${change.path}`);\n },\n rollback: async () => {\n if (backupContent) {\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n await fs.writeFile(fullPath, backupContent).catch(() => {});\n }\n },\n });\n }\n\n const deletedCount = changes.filter((c) => c.status === \"D\").length;\n this.log.info(\"Tree applied\", {\n treeHash,\n totalChanges: changes.length,\n deletedFiles: deletedCount,\n checkoutPerformed,\n });\n\n return { treeHash, checkoutPerformed };\n }\n}\n\nexport interface ReadTreeInput extends GitSagaInput {\n treeHash: string;\n}\n\nexport interface ReadTreeOutput {\n files: string[];\n}\n\nexport class ReadTreeSaga extends GitSaga<ReadTreeInput, ReadTreeOutput> {\n readonly sagaName = \"ReadTreeSaga\";\n\n protected async executeGitOperations(\n input: ReadTreeInput,\n ): Promise<ReadTreeOutput> {\n const { treeHash } = input;\n\n const stdout = await this.readOnlyStep(\"ls_tree\", () =>\n this.git.raw([\"ls-tree\", \"-r\", \"--name-only\", treeHash]),\n );\n\n const files = stdout.split(\"\\n\").filter((f) => f.trim());\n return { files };\n }\n}\n","import { Saga } from \"@posthog/shared\";\nimport type { GitClient } from \"./client\";\nimport { getGitOperationManager } from \"./operation-manager\";\n\nexport interface GitSagaInput {\n baseDir: string;\n signal?: AbortSignal;\n}\n\nexport abstract class GitSaga<\n TInput extends GitSagaInput,\n TOutput,\n> extends Saga<TInput, TOutput> {\n private _git: GitClient | null = null;\n\n protected get git(): GitClient {\n if (!this._git) {\n throw new Error(\"git client accessed before execute() was called\");\n }\n return this._git;\n }\n\n protected async execute(input: TInput): Promise<TOutput> {\n const manager = getGitOperationManager();\n\n return manager.executeWrite(\n input.baseDir,\n async (git) => {\n this._git = git;\n return this.executeGitOperations(input);\n },\n { signal: input.signal },\n );\n }\n\n protected abstract executeGitOperations(input: TInput): Promise<TOutput>;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { CaptureTreeSaga as GitCaptureTreeSaga } from \"@posthog/git/sagas/tree\";\nimport { Saga } from \"@posthog/shared\";\nimport type { PostHogAPIClient } from \"../posthog-api\";\nimport type { TreeSnapshot } from \"../types\";\n\nexport interface CaptureTreeInput {\n repositoryPath: string;\n taskId: string;\n runId: string;\n apiClient?: PostHogAPIClient;\n lastTreeHash: string | null;\n interrupted?: boolean;\n}\n\nexport interface CaptureTreeOutput {\n snapshot: TreeSnapshot | null;\n newTreeHash: string | null;\n}\n\nexport class CaptureTreeSaga extends Saga<CaptureTreeInput, CaptureTreeOutput> {\n readonly sagaName = \"CaptureTreeSaga\";\n\n protected async execute(input: CaptureTreeInput): Promise<CaptureTreeOutput> {\n const {\n repositoryPath,\n lastTreeHash,\n interrupted,\n apiClient,\n taskId,\n runId,\n } = input;\n const tmpDir = join(repositoryPath, \".posthog\", \"tmp\");\n\n if (existsSync(join(repositoryPath, \".gitmodules\"))) {\n this.log.warn(\n \"Repository has submodules - snapshot may not capture submodule state\",\n );\n }\n\n const shouldArchive = !!apiClient;\n const archivePath = shouldArchive\n ? join(tmpDir, `tree-${Date.now()}.tar.gz`)\n : undefined;\n\n const gitCaptureSaga = new GitCaptureTreeSaga(this.log);\n const captureResult = await gitCaptureSaga.run({\n baseDir: repositoryPath,\n lastTreeHash,\n archivePath,\n });\n\n if (!captureResult.success) {\n throw new Error(`Failed to capture tree: ${captureResult.error}`);\n }\n\n const {\n snapshot: gitSnapshot,\n archivePath: createdArchivePath,\n changed,\n } = captureResult.data;\n\n if (!changed || !gitSnapshot) {\n this.log.debug(\"No changes since last capture\", { lastTreeHash });\n return { snapshot: null, newTreeHash: lastTreeHash };\n }\n\n let archiveUrl: string | undefined;\n if (apiClient && createdArchivePath) {\n try {\n archiveUrl = await this.uploadArchive(\n createdArchivePath,\n gitSnapshot.treeHash,\n apiClient,\n taskId,\n runId,\n );\n } finally {\n await rm(createdArchivePath, { force: true }).catch(() => {});\n }\n }\n\n const snapshot: TreeSnapshot = {\n treeHash: gitSnapshot.treeHash,\n baseCommit: gitSnapshot.baseCommit,\n changes: gitSnapshot.changes,\n timestamp: gitSnapshot.timestamp,\n interrupted,\n archiveUrl,\n };\n\n this.log.info(\"Tree captured\", {\n treeHash: snapshot.treeHash,\n changes: snapshot.changes.length,\n interrupted,\n archiveUrl,\n });\n\n return { snapshot, newTreeHash: snapshot.treeHash };\n }\n\n private async uploadArchive(\n archivePath: string,\n treeHash: string,\n apiClient: PostHogAPIClient,\n taskId: string,\n runId: string,\n ): Promise<string | undefined> {\n const archiveUrl = await this.step({\n name: \"upload_archive\",\n execute: async () => {\n const archiveContent = await readFile(archivePath);\n const base64Content = archiveContent.toString(\"base64\");\n\n const artifacts = await apiClient.uploadTaskArtifacts(taskId, runId, [\n {\n name: `trees/${treeHash}.tar.gz`,\n type: \"tree_snapshot\",\n content: base64Content,\n content_type: \"application/gzip\",\n },\n ]);\n\n if (artifacts.length > 0 && artifacts[0].storage_path) {\n this.log.info(\"Tree archive uploaded\", {\n storagePath: artifacts[0].storage_path,\n treeHash,\n });\n return artifacts[0].storage_path;\n }\n\n return undefined;\n },\n rollback: async () => {\n await rm(archivePath, { force: true }).catch(() => {});\n },\n });\n\n return archiveUrl;\n }\n}\n","/**\n * TreeTracker - Git tree-based state capture for cloud/local sync\n *\n * Captures the entire working state as a git tree hash + archive:\n * - Atomic state snapshots (no partial syncs)\n * - Efficient delta detection using git's diffing\n * - Simpler resume logic (restore tree, continue)\n *\n * Uses Saga pattern for atomic operations with automatic rollback on failure.\n * Uses a temporary git index to avoid modifying the user's staging area.\n */\n\nimport { isCommitOnRemote as gitIsCommitOnRemote } from \"@posthog/git/queries\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport { ApplySnapshotSaga } from \"./sagas/apply-snapshot-saga\";\nimport { CaptureTreeSaga } from \"./sagas/capture-tree-saga\";\nimport type { TreeSnapshot } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport type { TreeSnapshot };\n\nexport interface TreeTrackerConfig {\n repositoryPath: string;\n taskId: string;\n runId: string;\n apiClient?: PostHogAPIClient;\n logger?: Logger;\n}\n\nexport class TreeTracker {\n private repositoryPath: string;\n private taskId: string;\n private runId: string;\n private apiClient?: PostHogAPIClient;\n private logger: Logger;\n private lastTreeHash: string | null = null;\n\n constructor(config: TreeTrackerConfig) {\n this.repositoryPath = config.repositoryPath;\n this.taskId = config.taskId;\n this.runId = config.runId;\n this.apiClient = config.apiClient;\n this.logger =\n config.logger || new Logger({ debug: false, prefix: \"[TreeTracker]\" });\n }\n\n /**\n * Capture current working tree state as a snapshot.\n * Uses a temporary index to avoid modifying user's staging area.\n * Uses Saga pattern for atomic operation with automatic cleanup on failure.\n */\n async captureTree(options?: {\n interrupted?: boolean;\n }): Promise<TreeSnapshot | null> {\n const saga = new CaptureTreeSaga(this.logger);\n\n const result = await saga.run({\n repositoryPath: this.repositoryPath,\n taskId: this.taskId,\n runId: this.runId,\n apiClient: this.apiClient,\n lastTreeHash: this.lastTreeHash,\n interrupted: options?.interrupted,\n });\n\n if (!result.success) {\n this.logger.error(\"Failed to capture tree\", {\n error: result.error,\n failedStep: result.failedStep,\n });\n throw new Error(\n `Failed to capture tree at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n // Only update lastTreeHash on success\n if (result.data.newTreeHash !== null) {\n this.lastTreeHash = result.data.newTreeHash;\n }\n\n return result.data.snapshot;\n }\n\n /**\n * Download and apply a tree snapshot.\n * Uses Saga pattern for atomic operation with rollback on failure.\n */\n async applyTreeSnapshot(snapshot: TreeSnapshot): Promise<void> {\n if (!this.apiClient) {\n throw new Error(\"Cannot apply snapshot: API client not configured\");\n }\n\n if (!snapshot.archiveUrl) {\n this.logger.warn(\"Cannot apply snapshot: no archive URL\", {\n treeHash: snapshot.treeHash,\n changes: snapshot.changes.length,\n });\n throw new Error(\"Cannot apply snapshot: no archive URL\");\n }\n\n const saga = new ApplySnapshotSaga(this.logger);\n\n const result = await saga.run({\n snapshot,\n repositoryPath: this.repositoryPath,\n apiClient: this.apiClient,\n taskId: this.taskId,\n runId: this.runId,\n });\n\n if (!result.success) {\n this.logger.error(\"Failed to apply tree snapshot\", {\n error: result.error,\n failedStep: result.failedStep,\n treeHash: snapshot.treeHash,\n });\n throw new Error(\n `Failed to apply snapshot at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n // Only update lastTreeHash on success\n this.lastTreeHash = result.data.treeHash;\n }\n\n /**\n * Get the last captured tree hash.\n */\n getLastTreeHash(): string | null {\n return this.lastTreeHash;\n }\n\n /**\n * Set the last tree hash (used when resuming).\n */\n setLastTreeHash(hash: string | null): void {\n this.lastTreeHash = hash;\n }\n}\n\n/**\n * Check if a commit is available on any remote branch.\n * Used to validate that cloud can fetch the base commit during handoff.\n */\nexport async function isCommitOnRemote(\n commit: string,\n cwd: string,\n): Promise<boolean> {\n return gitIsCommitOnRemote(cwd, commit);\n}\n\n/**\n * Validate that a snapshot can be handed off to cloud execution.\n * Cloud needs to be able to fetch the baseCommit from a remote.\n *\n * @throws Error if the snapshot cannot be restored on cloud\n */\nexport async function validateForCloudHandoff(\n snapshot: TreeSnapshot,\n repositoryPath: string,\n): Promise<void> {\n if (!snapshot.baseCommit) {\n throw new Error(\"Cannot hand off to cloud: no base commit\");\n }\n\n const onRemote = await isCommitOnRemote(snapshot.baseCommit, repositoryPath);\n if (!onRemote) {\n throw new Error(\n `Cannot hand off to cloud: commit ${snapshot.baseCommit.slice(0, 7)} is not pushed. ` +\n `Run 'git push' to push your branch first.`,\n );\n }\n}\n","import type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport { Saga } from \"@posthog/shared\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions\";\nimport type { PostHogAPIClient } from \"../posthog-api\";\nimport { TreeTracker } from \"../tree-tracker\";\nimport type {\n DeviceInfo,\n StoredNotification,\n TreeSnapshotEvent,\n} from \"../types\";\nimport { Logger } from \"../utils/logger\";\n\nexport interface ConversationTurn {\n role: \"user\" | \"assistant\";\n content: ContentBlock[];\n toolCalls?: ToolCallInfo[];\n}\n\nexport interface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n input: unknown;\n result?: unknown;\n}\n\nexport interface ResumeInput {\n taskId: string;\n runId: string;\n repositoryPath?: string;\n apiClient: PostHogAPIClient;\n logger?: Logger;\n}\n\nexport interface ResumeOutput {\n conversation: ConversationTurn[];\n latestSnapshot: TreeSnapshotEvent | null;\n snapshotApplied: boolean;\n interrupted: boolean;\n lastDevice?: DeviceInfo;\n logEntryCount: number;\n}\n\nexport class ResumeSaga extends Saga<ResumeInput, ResumeOutput> {\n readonly sagaName = \"ResumeSaga\";\n\n protected async execute(input: ResumeInput): Promise<ResumeOutput> {\n const { taskId, runId, repositoryPath, apiClient } = input;\n const logger =\n input.logger || new Logger({ debug: false, prefix: \"[Resume]\" });\n\n // Step 1: Fetch task run (read-only)\n const taskRun = await this.readOnlyStep(\"fetch_task_run\", () =>\n apiClient.getTaskRun(taskId, runId),\n );\n\n if (!taskRun.log_url) {\n this.log.info(\"No log URL found, starting fresh\");\n return this.emptyResult();\n }\n\n // Step 2: Fetch log entries (read-only)\n const entries = await this.readOnlyStep(\"fetch_logs\", () =>\n apiClient.fetchTaskRunLogs(taskRun),\n );\n\n if (entries.length === 0) {\n this.log.info(\"No log entries found, starting fresh\");\n return this.emptyResult();\n }\n\n this.log.info(\"Fetched log entries\", { count: entries.length });\n\n // Step 3: Find latest snapshot (read-only, pure computation)\n const latestSnapshot = await this.readOnlyStep(\"find_snapshot\", () =>\n Promise.resolve(this.findLatestTreeSnapshot(entries)),\n );\n\n // Step 4: Apply snapshot if present (wrapped in step for consistent logging)\n // Note: We use a try/catch inside the step because snapshot failure should NOT fail the saga\n let snapshotApplied = false;\n if (latestSnapshot?.archiveUrl && repositoryPath) {\n this.log.info(\"Found tree snapshot\", {\n treeHash: latestSnapshot.treeHash,\n hasArchiveUrl: true,\n changes: latestSnapshot.changes?.length ?? 0,\n interrupted: latestSnapshot.interrupted,\n });\n\n await this.step({\n name: \"apply_snapshot\",\n execute: async () => {\n const treeTracker = new TreeTracker({\n repositoryPath,\n taskId,\n runId,\n apiClient,\n logger: logger.child(\"TreeTracker\"),\n });\n\n try {\n await treeTracker.applyTreeSnapshot(latestSnapshot);\n treeTracker.setLastTreeHash(latestSnapshot.treeHash);\n snapshotApplied = true;\n this.log.info(\"Tree snapshot applied successfully\", {\n treeHash: latestSnapshot.treeHash,\n });\n } catch (error) {\n // Log but don't fail - continue with conversation rebuild\n // ApplySnapshotSaga handles its own rollback internally\n this.log.warn(\n \"Failed to apply tree snapshot, continuing without it\",\n {\n error: error instanceof Error ? error.message : String(error),\n treeHash: latestSnapshot.treeHash,\n },\n );\n }\n },\n rollback: async () => {\n // Inner ApplySnapshotSaga handles its own rollback\n },\n });\n } else if (latestSnapshot?.archiveUrl && !repositoryPath) {\n this.log.warn(\n \"Snapshot found but no repositoryPath configured - files cannot be restored\",\n {\n treeHash: latestSnapshot.treeHash,\n changes: latestSnapshot.changes?.length ?? 0,\n },\n );\n } else if (latestSnapshot) {\n this.log.warn(\n \"Snapshot found but has no archive URL - files cannot be restored\",\n {\n treeHash: latestSnapshot.treeHash,\n changes: latestSnapshot.changes?.length ?? 0,\n },\n );\n }\n\n // Step 5: Rebuild conversation (read-only, pure computation)\n const conversation = await this.readOnlyStep(\"rebuild_conversation\", () =>\n Promise.resolve(this.rebuildConversation(entries)),\n );\n\n // Step 6: Find device info (read-only, pure computation)\n const lastDevice = await this.readOnlyStep(\"find_device\", () =>\n Promise.resolve(this.findLastDeviceInfo(entries)),\n );\n\n this.log.info(\"Resume state rebuilt\", {\n turns: conversation.length,\n hasSnapshot: !!latestSnapshot,\n snapshotApplied,\n interrupted: latestSnapshot?.interrupted ?? false,\n });\n\n return {\n conversation,\n latestSnapshot,\n snapshotApplied,\n interrupted: latestSnapshot?.interrupted ?? false,\n lastDevice,\n logEntryCount: entries.length,\n };\n }\n\n private emptyResult(): ResumeOutput {\n return {\n conversation: [],\n latestSnapshot: null,\n snapshotApplied: false,\n interrupted: false,\n logEntryCount: 0,\n };\n }\n\n private findLatestTreeSnapshot(\n entries: StoredNotification[],\n ): TreeSnapshotEvent | null {\n const sdkPrefixedMethod = `_${POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT}`;\n\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n const method = entry.notification?.method;\n if (\n method === sdkPrefixedMethod ||\n method === POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT\n ) {\n const params = entry.notification.params as\n | TreeSnapshotEvent\n | undefined;\n if (params?.treeHash) {\n return params;\n }\n }\n }\n return null;\n }\n\n private findLastDeviceInfo(\n entries: StoredNotification[],\n ): DeviceInfo | undefined {\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n const params = entry.notification?.params as\n | { device?: DeviceInfo }\n | undefined;\n if (params?.device) {\n return params.device;\n }\n }\n return undefined;\n }\n\n private rebuildConversation(\n entries: StoredNotification[],\n ): ConversationTurn[] {\n const turns: ConversationTurn[] = [];\n let currentAssistantContent: ContentBlock[] = [];\n let currentToolCalls: ToolCallInfo[] = [];\n\n for (const entry of entries) {\n const method = entry.notification?.method;\n const params = entry.notification?.params as Record<string, unknown>;\n\n if (method === \"session/update\" && params?.update) {\n const update = params.update as Record<string, unknown>;\n const sessionUpdate = update.sessionUpdate as string;\n\n switch (sessionUpdate) {\n case \"user_message\":\n case \"user_message_chunk\": {\n if (\n currentAssistantContent.length > 0 ||\n currentToolCalls.length > 0\n ) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls:\n currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n currentAssistantContent = [];\n currentToolCalls = [];\n }\n\n const content = update.content as ContentBlock | ContentBlock[];\n const contentArray = Array.isArray(content) ? content : [content];\n turns.push({\n role: \"user\",\n content: contentArray,\n });\n break;\n }\n\n case \"agent_message\": {\n const content = update.content as ContentBlock | undefined;\n if (content) {\n if (\n content.type === \"text\" &&\n currentAssistantContent.length > 0 &&\n currentAssistantContent[currentAssistantContent.length - 1]\n .type === \"text\"\n ) {\n const lastBlock = currentAssistantContent[\n currentAssistantContent.length - 1\n ] as { type: \"text\"; text: string };\n lastBlock.text += (\n content as { type: \"text\"; text: string }\n ).text;\n } else {\n currentAssistantContent.push(content);\n }\n }\n break;\n }\n\n case \"agent_message_chunk\": {\n // Backward compatibility with older logs that have individual chunks\n const content = update.content as ContentBlock | undefined;\n if (content) {\n if (\n content.type === \"text\" &&\n currentAssistantContent.length > 0 &&\n currentAssistantContent[currentAssistantContent.length - 1]\n .type === \"text\"\n ) {\n const lastBlock = currentAssistantContent[\n currentAssistantContent.length - 1\n ] as { type: \"text\"; text: string };\n lastBlock.text += (\n content as { type: \"text\"; text: string }\n ).text;\n } else {\n currentAssistantContent.push(content);\n }\n }\n break;\n }\n\n case \"tool_call\":\n case \"tool_call_update\": {\n const meta = (update._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n if (meta) {\n const toolCallId = meta.toolCallId as string | undefined;\n const toolName = meta.toolName as string | undefined;\n const toolInput = meta.toolInput;\n const toolResponse = meta.toolResponse;\n\n if (toolCallId && toolName) {\n let toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (!toolCall) {\n toolCall = {\n toolCallId,\n toolName,\n input: toolInput,\n };\n currentToolCalls.push(toolCall);\n }\n\n if (toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n\n case \"tool_result\": {\n const meta = (update._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n if (meta) {\n const toolCallId = meta.toolCallId as string | undefined;\n const toolResponse = meta.toolResponse;\n\n if (toolCallId) {\n const toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (toolCall && toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n }\n }\n }\n\n if (currentAssistantContent.length > 0 || currentToolCalls.length > 0) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls: currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n }\n\n return turns;\n }\n}\n","/**\n * Resume - Restore agent state from persisted log\n *\n * Handles resuming a task from any point:\n * - Fetches log via the PostHog API\n * - Finds latest tree_snapshot event\n * - Rebuilds conversation from log events\n * - Restores working tree from snapshot\n *\n * Uses Saga pattern for atomic operations with clear success/failure tracking.\n *\n * The log is the single source of truth for:\n * - Conversation history (user_message, agent_message_chunk, tool_call, tool_result)\n * - Working tree state (tree_snapshot events)\n * - Session metadata (device info, mode changes)\n */\n\nimport type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport { ResumeSaga } from \"./sagas/resume-saga\";\nimport type { DeviceInfo, TreeSnapshotEvent } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport interface ResumeState {\n conversation: ConversationTurn[];\n latestSnapshot: TreeSnapshotEvent | null;\n /** Whether the tree snapshot was successfully applied (files restored) */\n snapshotApplied: boolean;\n interrupted: boolean;\n lastDevice?: DeviceInfo;\n logEntryCount: number;\n}\n\nexport interface ConversationTurn {\n role: \"user\" | \"assistant\";\n content: ContentBlock[];\n toolCalls?: ToolCallInfo[];\n}\n\nexport interface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n input: unknown;\n result?: unknown;\n}\n\nexport interface ResumeConfig {\n taskId: string;\n runId: string;\n repositoryPath?: string;\n apiClient: PostHogAPIClient;\n logger?: Logger;\n}\n\n/**\n * Resume a task from its persisted log.\n * Returns the rebuilt state for the agent to continue from.\n *\n * Uses Saga pattern internally for atomic operations.\n * Note: snapshotApplied field indicates if files were actually restored -\n * even if latestSnapshot is non-null, files may not have been restored if\n * the snapshot had no archive URL or download/extraction failed.\n */\nexport async function resumeFromLog(\n config: ResumeConfig,\n): Promise<ResumeState> {\n const logger =\n config.logger || new Logger({ debug: false, prefix: \"[Resume]\" });\n\n logger.info(\"Resuming from log\", {\n taskId: config.taskId,\n runId: config.runId,\n });\n\n const saga = new ResumeSaga(logger);\n\n const result = await saga.run({\n taskId: config.taskId,\n runId: config.runId,\n repositoryPath: config.repositoryPath,\n apiClient: config.apiClient,\n logger,\n });\n\n if (!result.success) {\n logger.error(\"Failed to resume from log\", {\n error: result.error,\n failedStep: result.failedStep,\n });\n throw new Error(\n `Failed to resume at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n return {\n conversation: result.data.conversation as ConversationTurn[],\n latestSnapshot: result.data.latestSnapshot,\n snapshotApplied: result.data.snapshotApplied,\n interrupted: result.data.interrupted,\n lastDevice: result.data.lastDevice,\n logEntryCount: result.data.logEntryCount,\n };\n}\n\n/**\n * Convert resumed conversation back to API format for continuation.\n */\nexport function conversationToPromptHistory(\n conversation: ConversationTurn[],\n): Array<{ role: \"user\" | \"assistant\"; content: ContentBlock[] }> {\n return conversation.map((turn) => ({\n role: turn.role,\n content: turn.content,\n }));\n}\n","import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SessionContext } from \"./otel-log-writer\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport type { StoredNotification } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport interface SessionLogWriterOptions {\n /** PostHog API client for log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n /** Local cache path for instant log loading (e.g., ~/.posthog-code) */\n localCachePath?: string;\n}\n\ninterface ChunkBuffer {\n text: string;\n firstTimestamp: string;\n}\n\ninterface SessionState {\n context: SessionContext;\n chunkBuffer?: ChunkBuffer;\n lastAgentMessage?: string;\n currentTurnMessages: string[];\n}\n\nexport class SessionLogWriter {\n private static readonly FLUSH_DEBOUNCE_MS = 500;\n private static readonly FLUSH_MAX_INTERVAL_MS = 5000;\n private static readonly MAX_FLUSH_RETRIES = 10;\n private static readonly MAX_RETRY_DELAY_MS = 30_000;\n private static readonly SESSIONS_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\n\n private posthogAPI?: PostHogAPIClient;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private lastFlushAttemptTime: Map<string, number> = new Map();\n private retryCounts: Map<string, number> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n private flushQueues: Map<string, Promise<void>> = new Map();\n\n private logger: Logger;\n private localCachePath?: string;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.localCachePath = options.localCachePath;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n const sessionIds = [...this.sessions.keys()];\n const flushPromises: Promise<void>[] = [];\n for (const sessionId of sessionIds) {\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n }\n\n register(sessionId: string, context: SessionContext): void {\n if (this.sessions.has(sessionId)) {\n return;\n }\n\n this.logger.info(\"Session registered\", {\n taskId: context.taskId,\n runId: context.runId,\n });\n this.sessions.set(sessionId, { context, currentTurnMessages: [] });\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n if (this.localCachePath) {\n const sessionDir = path.join(\n this.localCachePath,\n \"sessions\",\n context.runId,\n );\n try {\n fs.mkdirSync(sessionDir, { recursive: true });\n } catch (error) {\n this.logger.warn(\"Failed to create local cache directory\", {\n sessionDir,\n error,\n });\n }\n }\n }\n\n isRegistered(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n appendRawLine(sessionId: string, line: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"appendRawLine called for unregistered session\", {\n sessionId,\n });\n return;\n }\n\n try {\n const message = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n // Check if this is an agent_message_chunk event\n if (this.isAgentMessageChunk(message)) {\n const text = this.extractChunkText(message);\n if (text) {\n if (!session.chunkBuffer) {\n session.chunkBuffer = { text, firstTimestamp: timestamp };\n } else {\n session.chunkBuffer.text += text;\n }\n }\n // Don't emit chunk events\n return;\n }\n\n // Non-chunk event: flush any buffered chunks first\n this.emitCoalescedMessage(sessionId, session);\n\n const nonChunkAgentText = this.extractAgentMessageText(message);\n if (nonChunkAgentText) {\n session.lastAgentMessage = nonChunkAgentText;\n session.currentTurnMessages.push(nonChunkAgentText);\n }\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp,\n notification: message,\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n lineLength: line.length,\n });\n }\n }\n\n async flush(sessionId: string): Promise<void> {\n // Serialize flushes per session\n const prev = this.flushQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.catch(() => {}).then(() => this._doFlush(sessionId));\n this.flushQueues.set(sessionId, next);\n next.finally(() => {\n if (this.flushQueues.get(sessionId) === next) {\n this.flushQueues.delete(sessionId);\n }\n });\n return next;\n }\n\n private async _doFlush(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"flush: no session found\", { sessionId });\n return;\n }\n\n // Emit any buffered chunks before flushing\n this.emitCoalescedMessage(sessionId, session);\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) {\n return;\n }\n\n this.pendingEntries.delete(sessionId);\n const timeout = this.flushTimeouts.get(sessionId);\n if (timeout) {\n clearTimeout(timeout);\n this.flushTimeouts.delete(sessionId);\n }\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n this.retryCounts.set(sessionId, 0);\n } catch (error) {\n const retryCount = (this.retryCounts.get(sessionId) ?? 0) + 1;\n this.retryCounts.set(sessionId, retryCount);\n\n if (retryCount >= SessionLogWriter.MAX_FLUSH_RETRIES) {\n this.logger.error(\n `Dropping ${pending.length} session log entries after ${retryCount} failed flush attempts`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error,\n },\n );\n this.retryCounts.set(sessionId, 0);\n } else {\n if (retryCount === 1) {\n this.logger.warn(\n `Failed to persist session logs, will retry (up to ${SessionLogWriter.MAX_FLUSH_RETRIES} attempts)`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n const currentPending = this.pendingEntries.get(sessionId) ?? [];\n this.pendingEntries.set(sessionId, [...pending, ...currentPending]);\n this.scheduleFlush(sessionId);\n }\n }\n }\n\n private isAgentMessageChunk(message: Record<string, unknown>): boolean {\n if (message.method !== \"session/update\") return false;\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n return update?.sessionUpdate === \"agent_message_chunk\";\n }\n\n private extractChunkText(message: Record<string, unknown>): string {\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n const content = update?.content as\n | { type: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && content.text) {\n return content.text;\n }\n return \"\";\n }\n\n private emitCoalescedMessage(sessionId: string, session: SessionState): void {\n if (!session.chunkBuffer) return;\n\n const { text, firstTimestamp } = session.chunkBuffer;\n session.chunkBuffer = undefined;\n session.lastAgentMessage = text;\n session.currentTurnMessages.push(text);\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp: firstTimestamp,\n notification: {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: {\n update: {\n sessionUpdate: \"agent_message\",\n content: { type: \"text\", text },\n },\n },\n },\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n }\n\n getLastAgentMessage(sessionId: string): string | undefined {\n return this.sessions.get(sessionId)?.lastAgentMessage;\n }\n\n getFullAgentResponse(sessionId: string): string | undefined {\n const session = this.sessions.get(sessionId);\n if (!session || session.currentTurnMessages.length === 0) return undefined;\n return session.currentTurnMessages.join(\"\\n\\n\");\n }\n\n resetTurnMessages(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.currentTurnMessages = [];\n }\n }\n\n private extractAgentMessageText(\n message: Record<string, unknown>,\n ): string | null {\n if (message.method !== \"session/update\") {\n return null;\n }\n\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n if (update?.sessionUpdate !== \"agent_message\") {\n return null;\n }\n\n const content = update.content as\n | { type?: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && typeof content.text === \"string\") {\n const trimmed = content.text.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (typeof update.message === \"string\") {\n const trimmed = update.message.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n return null;\n }\n\n private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n\n const retryCount = this.retryCounts.get(sessionId) ?? 0;\n const lastAttempt = this.lastFlushAttemptTime.get(sessionId) ?? 0;\n const elapsed = Date.now() - lastAttempt;\n\n let delay: number;\n if (retryCount > 0) {\n // Exponential backoff on retries: FLUSH_DEBOUNCE_MS * 2^retryCount, capped\n delay = Math.min(\n SessionLogWriter.FLUSH_DEBOUNCE_MS * 2 ** retryCount,\n SessionLogWriter.MAX_RETRY_DELAY_MS,\n );\n } else if (elapsed >= SessionLogWriter.FLUSH_MAX_INTERVAL_MS) {\n // If we've been accumulating for longer than the max interval, flush immediately\n delay = 0;\n } else {\n delay = SessionLogWriter.FLUSH_DEBOUNCE_MS;\n }\n\n const timeout = setTimeout(() => this.flush(sessionId), delay);\n this.flushTimeouts.set(sessionId, timeout);\n }\n\n private writeToLocalCache(\n sessionId: string,\n entry: StoredNotification,\n ): void {\n if (!this.localCachePath) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n const logPath = path.join(\n this.localCachePath,\n \"sessions\",\n session.context.runId,\n \"logs.ndjson\",\n );\n\n try {\n fs.appendFileSync(logPath, `${JSON.stringify(entry)}\\n`);\n } catch (error) {\n this.logger.warn(\"Failed to write to local cache\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n logPath,\n error,\n });\n }\n }\n\n static async cleanupOldSessions(localCachePath: string): Promise<number> {\n const sessionsDir = path.join(localCachePath, \"sessions\");\n let deleted = 0;\n try {\n const entries = await fsp.readdir(sessionsDir);\n const now = Date.now();\n for (const entry of entries) {\n const entryPath = path.join(sessionsDir, entry);\n try {\n const stats = await fsp.stat(entryPath);\n if (\n stats.isDirectory() &&\n now - stats.birthtimeMs > SessionLogWriter.SESSIONS_MAX_AGE_MS\n ) {\n await fsp.rm(entryPath, { recursive: true, force: true });\n deleted++;\n }\n } catch {\n // Skip entries we can't stat\n }\n }\n } catch {\n // Sessions dir may not exist yet\n }\n return deleted;\n }\n}\n","export class AsyncMutex {\n private locked = false;\n private queue: Array<() => void> = [];\n\n async acquire(): Promise<void> {\n if (!this.locked) {\n this.locked = true;\n return;\n }\n return new Promise((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.locked = false;\n }\n }\n\n isLocked(): boolean {\n return this.locked;\n }\n\n get queueLength(): number {\n return this.queue.length;\n }\n}\n","import jwt from \"jsonwebtoken\";\nimport { z } from \"zod\";\n\nexport const SANDBOX_CONNECTION_AUDIENCE = \"posthog:sandbox_connection\";\n\nexport const userDataSchema = z.object({\n run_id: z.string(),\n task_id: z.string(),\n team_id: z.number(),\n user_id: z.number(),\n distinct_id: z.string(),\n mode: z.enum([\"interactive\", \"background\"]).optional().default(\"interactive\"),\n});\n\nconst jwtPayloadSchema = userDataSchema.extend({\n exp: z.number(),\n iat: z.number().optional(),\n aud: z.string().optional(),\n});\n\nexport type JwtPayload = z.infer<typeof userDataSchema>;\n\nexport class JwtValidationError extends Error {\n constructor(\n message: string,\n public code:\n | \"invalid_token\"\n | \"expired\"\n | \"invalid_signature\"\n | \"server_error\",\n ) {\n super(message);\n this.name = \"JwtValidationError\";\n }\n}\n\nexport function validateJwt(token: string, publicKey: string): JwtPayload {\n try {\n const decoded = jwt.verify(token, publicKey, {\n algorithms: [\"RS256\"],\n audience: SANDBOX_CONNECTION_AUDIENCE,\n });\n\n const result = jwtPayloadSchema.safeParse(decoded);\n if (!result.success) {\n throw new JwtValidationError(\n `Missing required fields: ${result.error.message}`,\n \"invalid_token\",\n );\n }\n\n return result.data;\n } catch (error) {\n if (error instanceof JwtValidationError) {\n throw error;\n }\n if (error instanceof jwt.TokenExpiredError) {\n throw new JwtValidationError(\"Token expired\", \"expired\");\n }\n if (error instanceof jwt.JsonWebTokenError) {\n throw new JwtValidationError(\"Invalid signature\", \"invalid_signature\");\n }\n throw new JwtValidationError(\"Invalid token\", \"invalid_token\");\n }\n}\n","import { z } from \"zod\";\n\nconst httpHeaderSchema = z.object({\n name: z.string(),\n value: z.string(),\n});\n\nconst remoteMcpServerSchema = z.object({\n type: z.enum([\"http\", \"sse\"]),\n name: z.string().min(1, \"MCP server name is required\"),\n url: z.string().url(\"MCP server url must be a valid URL\"),\n headers: z.array(httpHeaderSchema).default([]),\n});\n\nexport const mcpServersSchema = z.array(remoteMcpServerSchema);\n\nexport type RemoteMcpServer = z.infer<typeof remoteMcpServerSchema>;\n\nexport const claudeCodeConfigSchema = z.object({\n systemPrompt: z\n .union([\n z.string(),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n append: z.string().optional(),\n }),\n ])\n .optional(),\n plugins: z\n .array(z.object({ type: z.literal(\"local\"), path: z.string() }))\n .optional(),\n});\n\nexport const jsonRpcRequestSchema = z.object({\n jsonrpc: z.literal(\"2.0\"),\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n id: z.union([z.string(), z.number()]).optional(),\n});\n\nexport type JsonRpcRequest = z.infer<typeof jsonRpcRequestSchema>;\n\nexport const userMessageParamsSchema = z.object({\n content: z.string().min(1, \"Content is required\"),\n});\n\nexport const commandParamsSchemas = {\n user_message: userMessageParamsSchema,\n \"posthog/user_message\": userMessageParamsSchema,\n cancel: z.object({}).optional(),\n \"posthog/cancel\": z.object({}).optional(),\n close: z.object({}).optional(),\n \"posthog/close\": z.object({}).optional(),\n} as const;\n\nexport type CommandMethod = keyof typeof commandParamsSchemas;\n\nexport function validateCommandParams(\n method: string,\n params: unknown,\n): { success: true; data: unknown } | { success: false; error: string } {\n const schema =\n commandParamsSchemas[method as CommandMethod] ??\n commandParamsSchemas[\n method.replace(\"posthog/\", \"\") as keyof typeof commandParamsSchemas\n ];\n\n if (!schema) {\n return { success: false, error: `Unknown method: ${method}` };\n }\n\n const result = schema.safeParse(params);\n if (!result.success) {\n return { success: false, error: result.error.message };\n }\n\n return { success: true, data: result.data };\n}\n"],"mappings":"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","names":["debug","delimiter","os","useColors","debug","path","exists","__export","deferred","ndJsonStream","ReadableStream","WritableStream","resolve","fs","os","path","RequestError","resolve","text","path","path","resolve","path","input","text","text","path","trimmed","ALLOW_BYPASS","trimmed","fs","os","path","fs","os","path","text","RequestError","resolve","availableModes","spawn","existsSync","existsSync","spawn","filteredOptions","currentAllowed","nextCurrent","trimmed","sessionId","text","writer","taskRunId","randomUUID","fs","os","path","text","fs","path","import_promise_deferred","Buffer","spawn","normalize","path","trimmed","delay","ExitCodes","commands","parser","parsers","text","CheckRepoActions","CleanOptions","append","GitConfigScope","DiffNameStatus","query","ResetMode","debug","onError","instance","excludeOptions","disallowedCommand","__commonJS","GitExecutor","SimpleGitApi","Scheduler","configurationErrorTask","asArray","filterArray","filterPrimitives","filterString","filterStringOrStringArray","filterType","getTrailingOptions","trailingFunctionArgument","trailingOptionsArgument","applyPatchTask","branchTask","branchLocalTask","deleteBranchesTask","deleteBranchTask","checkIgnoreTask","checkIsRepoTask","cloneTask","cloneMirrorTask","cleanWithOptionsTask","isCleanOptionsArray","diffSummaryTask","fetchTask","moveTask","pullTask","pushTagsTask","addRemoteTask","getRemotesTask","listRemotesTask","remoteTask","removeRemoteTask","getResetMode","resetTask","stashListTask","addSubModuleTask","initSubModuleTask","subModuleTask","updateSubModuleTask","addAnnotatedTagTask","addTagTask","tagListTask","straightThroughBufferTask","straightThroughStringTask","Git","input","plugin","fs","path","resolve","mkdir","rm","writeFile","join","existsSync","fs","path","existsSync","stdout","join","mkdir","writeFile","rm","existsSync","readFile","rm","join","CaptureTreeSaga","join","existsSync","rm","readFile","CaptureTreeSaga","fs","path","path","fs","text","trimmed","delay","resolve","z","z","createTappedWritableStream","resolve","ndJsonStream","trimmed","toolMeta"]}
1
+ {"version":3,"sources":["../../../../node_modules/ms/index.js","../../../../node_modules/debug/src/common.js","../../../../node_modules/debug/src/browser.js","../../../../node_modules/has-flag/index.js","../../../../node_modules/supports-color/index.js","../../../../node_modules/debug/src/node.js","../../../../node_modules/debug/src/index.js","../../../../node_modules/@kwsites/file-exists/src/index.ts","../../../../node_modules/@kwsites/file-exists/index.ts","../../../../node_modules/@kwsites/promise-deferred/src/index.ts","../../src/server/agent-server.ts","../../package.json","../../src/acp-extensions.ts","../../src/adapters/acp-connection.ts","../../src/gateway-models.ts","../../src/utils/logger.ts","../../src/utils/streams.ts","../../src/adapters/claude/claude-agent.ts","../../src/utils/common.ts","../../src/adapters/base-acp-agent.ts","../../src/adapters/claude/conversion/acp-to-sdk.ts","../../src/adapters/claude/conversion/sdk-to-acp.ts","../../src/utils/acp-content.ts","../../src/adapters/claude/hooks.ts","../../src/adapters/claude/conversion/tool-use-to-acp.ts","../../src/adapters/claude/mcp/tool-metadata.ts","../../src/adapters/claude/plan/utils.ts","../../src/adapters/claude/questions/utils.ts","../../src/execution-mode.ts","../../src/adapters/claude/tools.ts","../../src/adapters/claude/permissions/permission-options.ts","../../src/adapters/claude/permissions/permission-handlers.ts","../../src/adapters/claude/session/commands.ts","../../src/adapters/claude/session/mcp-config.ts","../../src/adapters/claude/session/models.ts","../../src/adapters/claude/session/options.ts","../../src/adapters/claude/session/instructions.ts","../../src/adapters/claude/session/settings.ts","../../src/adapters/codex/spawn.ts","../../src/adapters/claude/session/jsonl-hydration.ts","../../src/utils/gateway.ts","../../src/posthog-api.ts","../../../shared/src/saga.ts","../../../git/src/queries.ts","../../../../node_modules/simple-git/src/lib/args/pathspec.ts","../../../../node_modules/simple-git/src/lib/errors/git-error.ts","../../../../node_modules/simple-git/src/lib/errors/git-response-error.ts","../../../../node_modules/simple-git/src/lib/errors/task-configuration-error.ts","../../../../node_modules/simple-git/src/lib/utils/util.ts","../../../../node_modules/simple-git/src/lib/utils/argument-filters.ts","../../../../node_modules/simple-git/src/lib/utils/exit-codes.ts","../../../../node_modules/simple-git/src/lib/utils/git-output-streams.ts","../../../../node_modules/simple-git/src/lib/utils/line-parser.ts","../../../../node_modules/simple-git/src/lib/utils/simple-git-options.ts","../../../../node_modules/simple-git/src/lib/utils/task-options.ts","../../../../node_modules/simple-git/src/lib/utils/task-parser.ts","../../../../node_modules/simple-git/src/lib/utils/index.ts","../../../../node_modules/simple-git/src/lib/tasks/check-is-repo.ts","../../../../node_modules/simple-git/src/lib/responses/CleanSummary.ts","../../../../node_modules/simple-git/src/lib/tasks/task.ts","../../../../node_modules/simple-git/src/lib/tasks/clean.ts","../../../../node_modules/simple-git/src/lib/responses/ConfigList.ts","../../../../node_modules/simple-git/src/lib/tasks/config.ts","../../../../node_modules/simple-git/src/lib/tasks/diff-name-status.ts","../../../../node_modules/simple-git/src/lib/tasks/grep.ts","../../../../node_modules/simple-git/src/lib/tasks/reset.ts","../../../../node_modules/simple-git/src/lib/git-logger.ts","../../../../node_modules/simple-git/src/lib/runners/tasks-pending-queue.ts","../../../../node_modules/simple-git/src/lib/runners/git-executor-chain.ts","../../../../node_modules/simple-git/src/lib/runners/git-executor.ts","../../../../node_modules/simple-git/src/lib/task-callback.ts","../../../../node_modules/simple-git/src/lib/tasks/change-working-directory.ts","../../../../node_modules/simple-git/src/lib/tasks/checkout.ts","../../../../node_modules/simple-git/src/lib/tasks/count-objects.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-commit.ts","../../../../node_modules/simple-git/src/lib/tasks/commit.ts","../../../../node_modules/simple-git/src/lib/tasks/first-commit.ts","../../../../node_modules/simple-git/src/lib/tasks/hash-object.ts","../../../../node_modules/simple-git/src/lib/responses/InitSummary.ts","../../../../node_modules/simple-git/src/lib/tasks/init.ts","../../../../node_modules/simple-git/src/lib/args/log-format.ts","../../../../node_modules/simple-git/src/lib/responses/DiffSummary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-diff-summary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-list-log-summary.ts","../../../../node_modules/simple-git/src/lib/tasks/diff.ts","../../../../node_modules/simple-git/src/lib/tasks/log.ts","../../../../node_modules/simple-git/src/lib/responses/MergeSummary.ts","../../../../node_modules/simple-git/src/lib/responses/PullSummary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-remote-objects.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-remote-messages.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-pull.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-merge.ts","../../../../node_modules/simple-git/src/lib/tasks/merge.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-push.ts","../../../../node_modules/simple-git/src/lib/tasks/push.ts","../../../../node_modules/simple-git/src/lib/tasks/show.ts","../../../../node_modules/simple-git/src/lib/responses/FileStatusSummary.ts","../../../../node_modules/simple-git/src/lib/responses/StatusSummary.ts","../../../../node_modules/simple-git/src/lib/tasks/status.ts","../../../../node_modules/simple-git/src/lib/tasks/version.ts","../../../../node_modules/simple-git/src/lib/simple-git-api.ts","../../../../node_modules/simple-git/src/lib/runners/scheduler.ts","../../../../node_modules/simple-git/src/lib/tasks/apply-patch.ts","../../../../node_modules/simple-git/src/lib/responses/BranchDeleteSummary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-branch-delete.ts","../../../../node_modules/simple-git/src/lib/responses/BranchSummary.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-branch.ts","../../../../node_modules/simple-git/src/lib/tasks/branch.ts","../../../../node_modules/simple-git/src/lib/responses/CheckIgnore.ts","../../../../node_modules/simple-git/src/lib/tasks/check-ignore.ts","../../../../node_modules/simple-git/src/lib/tasks/clone.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-fetch.ts","../../../../node_modules/simple-git/src/lib/tasks/fetch.ts","../../../../node_modules/simple-git/src/lib/parsers/parse-move.ts","../../../../node_modules/simple-git/src/lib/tasks/move.ts","../../../../node_modules/simple-git/src/lib/tasks/pull.ts","../../../../node_modules/simple-git/src/lib/responses/GetRemoteSummary.ts","../../../../node_modules/simple-git/src/lib/tasks/remote.ts","../../../../node_modules/simple-git/src/lib/tasks/stash-list.ts","../../../../node_modules/simple-git/src/lib/tasks/sub-module.ts","../../../../node_modules/simple-git/src/lib/responses/TagList.ts","../../../../node_modules/simple-git/src/lib/tasks/tag.ts","../../../../node_modules/simple-git/src/git.js","../../../../node_modules/simple-git/src/lib/api.ts","../../../../node_modules/simple-git/src/lib/errors/git-construct-error.ts","../../../../node_modules/simple-git/src/lib/errors/git-plugin-error.ts","../../../../node_modules/simple-git/src/lib/plugins/abort-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/completion-detection.plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/custom-binary.plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/error-detection.plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/plugin-store.ts","../../../../node_modules/simple-git/src/lib/plugins/progress-monitor-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/spawn-options-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/timout-plugin.ts","../../../../node_modules/simple-git/src/lib/plugins/suffix-paths.plugin.ts","../../../../node_modules/simple-git/src/lib/git-factory.ts","../../../../node_modules/simple-git/src/lib/runners/promise-wrapped.ts","../../../../node_modules/simple-git/src/esm.mjs","../../../git/src/client.ts","../../../git/src/lock-detector.ts","../../../git/src/rw-lock.ts","../../../git/src/operation-manager.ts","../../src/sagas/apply-snapshot-saga.ts","../../../git/src/sagas/tree.ts","../../../git/src/git-saga.ts","../../src/sagas/capture-tree-saga.ts","../../src/tree-tracker.ts","../../src/sagas/resume-saga.ts","../../src/resume.ts","../../src/session-log-writer.ts","../../src/utils/async-mutex.ts","../../src/server/jwt.ts","../../src/server/schemas.ts"],"sourcesContent":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n",null,null,null,"import {\n ClientSideConnection,\n ndJsonStream,\n PROTOCOL_VERSION,\n} from \"@agentclientprotocol/sdk\";\nimport { type ServerType, serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions\";\nimport {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"../adapters/acp-connection\";\nimport { selectRecentTurns } from \"../adapters/claude/session/jsonl-hydration\";\nimport { PostHogAPIClient } from \"../posthog-api\";\nimport {\n type ConversationTurn,\n type ResumeState,\n resumeFromLog,\n} from \"../resume\";\nimport { SessionLogWriter } from \"../session-log-writer\";\nimport { TreeTracker } from \"../tree-tracker\";\nimport type {\n AgentMode,\n DeviceInfo,\n LogLevel,\n TaskRun,\n TreeSnapshotEvent,\n} from \"../types\";\nimport { AsyncMutex } from \"../utils/async-mutex\";\nimport { getLlmGatewayUrl } from \"../utils/gateway\";\nimport { Logger } from \"../utils/logger\";\nimport { type JwtPayload, JwtValidationError, validateJwt } from \"./jwt\";\nimport { jsonRpcRequestSchema, validateCommandParams } from \"./schemas\";\nimport type { AgentServerConfig } from \"./types\";\n\ntype MessageCallback = (message: unknown) => void;\n\nclass NdJsonTap {\n private decoder = new TextDecoder();\n private buffer = \"\";\n\n constructor(private onMessage: MessageCallback) {}\n\n process(chunk: Uint8Array): void {\n this.buffer += this.decoder.decode(chunk, { stream: true });\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n this.onMessage(JSON.parse(line));\n } catch {\n // Not valid JSON, skip\n }\n }\n }\n}\n\nfunction createTappedReadableStream(\n underlying: ReadableStream<Uint8Array>,\n onMessage: MessageCallback,\n logger?: Logger,\n): ReadableStream<Uint8Array> {\n const reader = underlying.getReader();\n const tap = new NdJsonTap(onMessage);\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { value, done } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n tap.process(value);\n controller.enqueue(value);\n } catch (error) {\n logger?.debug(\"Read failed, closing stream\", error);\n controller.close();\n }\n },\n cancel() {\n reader.releaseLock();\n },\n });\n}\n\nfunction createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n onMessage: MessageCallback,\n logger?: Logger,\n): WritableStream<Uint8Array> {\n const tap = new NdJsonTap(onMessage);\n const mutex = new AsyncMutex();\n\n return new WritableStream<Uint8Array>({\n async write(chunk) {\n tap.process(chunk);\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Write failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n async close() {\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Close failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n async abort(reason) {\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Abort failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n });\n}\n\ninterface SseController {\n send: (data: unknown) => void;\n close: () => void;\n}\n\ninterface ActiveSession {\n payload: JwtPayload;\n acpSessionId: string;\n acpConnection: InProcessAcpConnection;\n clientConnection: ClientSideConnection;\n treeTracker: TreeTracker | null;\n sseController: SseController | null;\n deviceInfo: DeviceInfo;\n logWriter: SessionLogWriter;\n}\n\nexport class AgentServer {\n private config: AgentServerConfig;\n private logger: Logger;\n private server: ServerType | null = null;\n private session: ActiveSession | null = null;\n private app: Hono;\n private posthogAPI: PostHogAPIClient;\n private questionRelayedToSlack = false;\n private detectedPrUrl: string | null = null;\n private resumeState: ResumeState | null = null;\n // Guards against concurrent session initialization. autoInitializeSession() and\n // the GET /events SSE handler can both call initializeSession() — the SSE connection\n // often arrives while newSession() is still awaited (this.session is still null),\n // causing a second session to be created and duplicate Slack messages to be sent.\n private initializationPromise: Promise<void> | null = null;\n private pendingEvents: Record<string, unknown>[] = [];\n\n private emitConsoleLog = (\n level: LogLevel,\n _scope: string,\n message: string,\n data?: unknown,\n ): void => {\n if (!this.session) return;\n\n const formatted =\n data !== undefined ? `${message} ${JSON.stringify(data)}` : message;\n\n const notification = {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.CONSOLE,\n params: { level, message: formatted },\n };\n\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification,\n });\n\n this.session.logWriter.appendRawLine(\n this.session.payload.run_id,\n JSON.stringify(notification),\n );\n };\n\n constructor(config: AgentServerConfig) {\n this.config = config;\n this.logger = new Logger({ debug: true, prefix: \"[AgentServer]\" });\n this.posthogAPI = new PostHogAPIClient({\n apiUrl: config.apiUrl,\n projectId: config.projectId,\n getApiKey: () => config.apiKey,\n userAgent: `posthog/cloud.hog.dev; version: ${config.version ?? packageJson.version}`,\n });\n this.app = this.createApp();\n }\n\n private getEffectiveMode(payload: JwtPayload): AgentMode {\n return payload.mode ?? this.config.mode;\n }\n\n private createApp(): Hono {\n const app = new Hono();\n\n app.get(\"/health\", (c) => {\n return c.json({ status: \"ok\", hasSession: !!this.session });\n });\n\n app.get(\"/events\", async (c) => {\n let payload: JwtPayload;\n\n try {\n payload = this.authenticateRequest(c.req.header.bind(c.req));\n } catch (error) {\n return c.json(\n {\n error:\n error instanceof JwtValidationError\n ? error.message\n : \"Invalid token\",\n code:\n error instanceof JwtValidationError\n ? error.code\n : \"invalid_token\",\n },\n 401,\n );\n }\n\n const stream = new ReadableStream({\n start: async (controller) => {\n const sseController: SseController = {\n send: (data: unknown) => {\n try {\n controller.enqueue(\n new TextEncoder().encode(`data: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch (error) {\n this.logger.debug(\n \"SSE send failed (stream may be closed)\",\n error,\n );\n }\n },\n close: () => {\n try {\n controller.close();\n } catch (error) {\n this.logger.debug(\"SSE close failed (already closed)\", error);\n }\n },\n };\n\n if (!this.session || this.session.payload.run_id !== payload.run_id) {\n await this.initializeSession(payload, sseController);\n } else {\n this.session.sseController = sseController;\n this.replayPendingEvents();\n }\n\n this.sendSseEvent(sseController, {\n type: \"connected\",\n run_id: payload.run_id,\n });\n },\n cancel: () => {\n this.logger.info(\"SSE connection closed\");\n if (this.session?.sseController) {\n this.session.sseController = null;\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n });\n\n app.post(\"/command\", async (c) => {\n let payload: JwtPayload;\n\n try {\n payload = this.authenticateRequest(c.req.header.bind(c.req));\n } catch (error) {\n return c.json(\n {\n error:\n error instanceof JwtValidationError\n ? error.message\n : \"Invalid token\",\n },\n 401,\n );\n }\n\n if (!this.session || this.session.payload.run_id !== payload.run_id) {\n return c.json({ error: \"No active session for this run\" }, 400);\n }\n\n const rawBody = await c.req.json().catch(() => null);\n const parseResult = jsonRpcRequestSchema.safeParse(rawBody);\n\n if (!parseResult.success) {\n return c.json({ error: \"Invalid JSON-RPC request\" }, 400);\n }\n\n const command = parseResult.data;\n const paramsValidation = validateCommandParams(\n command.method,\n command.params ?? {},\n );\n\n if (!paramsValidation.success) {\n return c.json(\n {\n jsonrpc: \"2.0\",\n id: command.id,\n error: {\n code: -32602,\n message: paramsValidation.error,\n },\n },\n 200,\n );\n }\n\n try {\n const result = await this.executeCommand(\n command.method,\n (command.params as Record<string, unknown>) || {},\n );\n return c.json({\n jsonrpc: \"2.0\",\n id: command.id,\n result,\n });\n } catch (error) {\n return c.json({\n jsonrpc: \"2.0\",\n id: command.id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : \"Unknown error\",\n },\n });\n }\n });\n\n app.notFound((c) => {\n return c.json({ error: \"Not found\" }, 404);\n });\n\n return app;\n }\n\n async start(): Promise<void> {\n await new Promise<void>((resolve) => {\n this.server = serve(\n {\n fetch: this.app.fetch,\n port: this.config.port,\n },\n () => {\n this.logger.info(`HTTP server listening on port ${this.config.port}`);\n resolve();\n },\n );\n });\n\n await this.autoInitializeSession();\n }\n\n private async autoInitializeSession(): Promise<void> {\n const { taskId, runId, mode, projectId } = this.config;\n\n this.logger.info(\"Auto-initializing session\", { taskId, runId, mode });\n\n // Check if this is a resume from a previous run\n const resumeRunId = process.env.POSTHOG_RESUME_RUN_ID;\n if (resumeRunId) {\n this.logger.info(\"Resuming from previous run\", {\n resumeRunId,\n currentRunId: runId,\n });\n try {\n this.resumeState = await resumeFromLog({\n taskId,\n runId: resumeRunId,\n repositoryPath: this.config.repositoryPath,\n apiClient: this.posthogAPI,\n logger: new Logger({ debug: true, prefix: \"[Resume]\" }),\n });\n this.logger.info(\"Resume state loaded\", {\n conversationTurns: this.resumeState.conversation.length,\n snapshotApplied: this.resumeState.snapshotApplied,\n logEntries: this.resumeState.logEntryCount,\n });\n } catch (error) {\n this.logger.warn(\"Failed to load resume state, starting fresh\", {\n error,\n });\n this.resumeState = null;\n }\n }\n\n // Create a synthetic payload from config (no JWT needed for auto-init)\n const payload: JwtPayload = {\n task_id: taskId,\n run_id: runId,\n team_id: projectId,\n user_id: 0, // System-initiated\n distinct_id: \"agent-server\",\n mode,\n };\n\n await this.initializeSession(payload, null);\n }\n\n async stop(): Promise<void> {\n this.logger.info(\"Stopping agent server...\");\n\n if (this.session) {\n await this.cleanupSession();\n }\n\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n\n this.logger.info(\"Agent server stopped\");\n }\n\n private authenticateRequest(\n getHeader: (name: string) => string | undefined,\n ): JwtPayload {\n // Always require JWT validation - never trust unverified headers\n if (!this.config.jwtPublicKey) {\n throw new JwtValidationError(\n \"Server not configured with JWT public key\",\n \"server_error\",\n );\n }\n\n const authHeader = getHeader(\"authorization\");\n if (!authHeader?.startsWith(\"Bearer \")) {\n throw new JwtValidationError(\n \"Missing authorization header\",\n \"invalid_token\",\n );\n }\n\n const token = authHeader.slice(7);\n return validateJwt(token, this.config.jwtPublicKey);\n }\n\n private async executeCommand(\n method: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n if (!this.session) {\n throw new Error(\"No active session\");\n }\n\n switch (method) {\n case POSTHOG_NOTIFICATIONS.USER_MESSAGE:\n case \"user_message\": {\n const content = params.content as string;\n\n this.logger.info(\n `Processing user message (detectedPrUrl=${this.detectedPrUrl ?? \"none\"}): ${content.substring(0, 100)}...`,\n );\n\n this.session.logWriter.resetTurnMessages(this.session.payload.run_id);\n\n const result = await this.session.clientConnection.prompt({\n sessionId: this.session.acpSessionId,\n prompt: [{ type: \"text\", text: content }],\n ...(this.detectedPrUrl && {\n _meta: {\n prContext:\n `IMPORTANT — OVERRIDE PREVIOUS INSTRUCTIONS ABOUT CREATING BRANCHES/PRs.\\n` +\n `You already have an open pull request: ${this.detectedPrUrl}\\n` +\n `You MUST:\\n` +\n `1. Check out the existing PR branch with \\`gh pr checkout ${this.detectedPrUrl}\\`\\n` +\n `2. Make changes, commit, and push to that branch\\n` +\n `You MUST NOT create a new branch, close the existing PR, or create a new PR.`,\n },\n }),\n });\n\n this.broadcastTurnComplete(result.stopReason);\n\n if (result.stopReason === \"end_turn\") {\n // Relay the response to Slack. For follow-ups this is the primary\n // delivery path — the HTTP caller only handles reactions.\n this.relayAgentResponse(this.session.payload).catch((err) =>\n this.logger.warn(\"Failed to relay follow-up response\", err),\n );\n }\n\n // Flush logs and include the assistant's response text so callers\n // (e.g. Slack follow-up forwarding) can extract it without racing\n // against async log persistence to object storage.\n let assistantMessage: string | undefined;\n try {\n await this.session.logWriter.flush(this.session.payload.run_id, {\n coalesce: true,\n });\n assistantMessage = this.session.logWriter.getFullAgentResponse(\n this.session.payload.run_id,\n );\n } catch {\n this.logger.warn(\"Failed to extract assistant message from logs\");\n }\n\n return {\n stopReason: result.stopReason,\n ...(assistantMessage && { assistant_message: assistantMessage }),\n };\n }\n\n case POSTHOG_NOTIFICATIONS.CANCEL:\n case \"cancel\": {\n this.logger.info(\"Cancel requested\", {\n acpSessionId: this.session.acpSessionId,\n });\n await this.session.clientConnection.cancel({\n sessionId: this.session.acpSessionId,\n });\n return { cancelled: true };\n }\n\n case POSTHOG_NOTIFICATIONS.CLOSE:\n case \"close\": {\n this.logger.info(\"Close requested\");\n await this.cleanupSession();\n return { closed: true };\n }\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n }\n\n private async initializeSession(\n payload: JwtPayload,\n sseController: SseController | null,\n ): Promise<void> {\n // Race condition guard: autoInitializeSession() starts first, but while it awaits\n // newSession() (which takes ~1-2s for MCP metadata fetch), the Temporal relay connects\n // to GET /events. That handler sees this.session === null and calls initializeSession()\n // again, creating a duplicate session that sends the same prompt twice — resulting in\n // duplicate Slack messages. This lock ensures the second caller waits for the first\n // initialization to finish and reuses the session.\n if (this.initializationPromise) {\n this.logger.info(\"Waiting for in-progress initialization\", {\n runId: payload.run_id,\n });\n await this.initializationPromise;\n // After waiting, just attach the SSE controller if needed\n if (this.session && sseController) {\n this.session.sseController = sseController;\n this.replayPendingEvents();\n }\n return;\n }\n\n this.initializationPromise = this._doInitializeSession(\n payload,\n sseController,\n );\n try {\n await this.initializationPromise;\n } finally {\n this.initializationPromise = null;\n }\n }\n\n private async _doInitializeSession(\n payload: JwtPayload,\n sseController: SseController | null,\n ): Promise<void> {\n if (this.session) {\n await this.cleanupSession();\n }\n\n this.logger.info(\"Initializing session\", {\n runId: payload.run_id,\n taskId: payload.task_id,\n });\n\n const deviceInfo: DeviceInfo = {\n type: \"cloud\",\n name: process.env.HOSTNAME || \"cloud-sandbox\",\n };\n\n this.configureEnvironment();\n\n const posthogAPI = new PostHogAPIClient({\n apiUrl: this.config.apiUrl,\n projectId: this.config.projectId,\n getApiKey: () => this.config.apiKey,\n userAgent: `posthog/cloud.hog.dev; version: ${this.config.version ?? packageJson.version}`,\n });\n\n const treeTracker = this.config.repositoryPath\n ? new TreeTracker({\n repositoryPath: this.config.repositoryPath,\n taskId: payload.task_id,\n runId: payload.run_id,\n apiClient: posthogAPI,\n logger: new Logger({ debug: true, prefix: \"[TreeTracker]\" }),\n })\n : null;\n\n const logWriter = new SessionLogWriter({\n posthogAPI,\n logger: new Logger({ debug: true, prefix: \"[SessionLogWriter]\" }),\n });\n\n const acpConnection = createAcpConnection({\n taskRunId: payload.run_id,\n taskId: payload.task_id,\n deviceType: deviceInfo.type,\n logWriter,\n });\n\n // Tap both streams to broadcast all ACP messages via SSE (mimics local transport)\n const onAcpMessage = (message: unknown) => {\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification: message,\n });\n };\n\n const tappedReadable = createTappedReadableStream(\n acpConnection.clientStreams.readable as ReadableStream<Uint8Array>,\n onAcpMessage,\n this.logger,\n );\n\n const tappedWritable = createTappedWritableStream(\n acpConnection.clientStreams.writable as WritableStream<Uint8Array>,\n onAcpMessage,\n this.logger,\n );\n\n const clientStream = ndJsonStream(tappedWritable, tappedReadable);\n\n const clientConnection = new ClientSideConnection(\n () => this.createCloudClient(payload),\n clientStream,\n );\n\n await clientConnection.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {},\n });\n\n let preTaskRun: TaskRun | null = null;\n try {\n preTaskRun = await this.posthogAPI.getTaskRun(\n payload.task_id,\n payload.run_id,\n );\n } catch {\n this.logger.warn(\"Failed to fetch task run for session context\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n });\n }\n\n const prUrl =\n typeof (preTaskRun?.state as Record<string, unknown>)\n ?.slack_notified_pr_url === \"string\"\n ? ((preTaskRun?.state as Record<string, unknown>)\n .slack_notified_pr_url as string)\n : null;\n\n if (prUrl) {\n this.detectedPrUrl = prUrl;\n }\n\n const sessionResponse = await clientConnection.newSession({\n cwd: this.config.repositoryPath ?? \"/tmp/workspace\",\n mcpServers: this.config.mcpServers ?? [],\n _meta: {\n sessionId: payload.run_id,\n taskRunId: payload.run_id,\n systemPrompt: this.buildSessionSystemPrompt(prUrl),\n allowedDomains: this.config.allowedDomains,\n ...(this.config.claudeCode?.plugins?.length && {\n claudeCode: {\n options: {\n plugins: this.config.claudeCode.plugins,\n },\n },\n }),\n },\n });\n\n const acpSessionId = sessionResponse.sessionId;\n this.logger.info(\"ACP session created\", {\n acpSessionId,\n runId: payload.run_id,\n });\n\n this.session = {\n payload,\n acpSessionId,\n acpConnection,\n clientConnection,\n treeTracker,\n sseController,\n deviceInfo,\n logWriter,\n };\n\n this.logger = new Logger({\n debug: true,\n prefix: \"[AgentServer]\",\n onLog: (level, scope, message, data) => {\n // Preserve console output (onLog suppresses default console.*)\n const _formatted =\n data !== undefined ? `${message} ${JSON.stringify(data)}` : message;\n this.emitConsoleLog(level, scope, message, data);\n },\n });\n\n this.logger.info(\"Session initialized successfully\");\n this.logger.info(\n `Agent version: ${this.config.version ?? packageJson.version}`,\n );\n\n // Signal in_progress so the UI can start polling for updates\n this.posthogAPI\n .updateTaskRun(payload.task_id, payload.run_id, {\n status: \"in_progress\",\n })\n .catch((err) =>\n this.logger.warn(\"Failed to set task run to in_progress\", err),\n );\n\n await this.sendInitialTaskMessage(payload, preTaskRun);\n }\n\n private async sendInitialTaskMessage(\n payload: JwtPayload,\n prefetchedRun?: TaskRun | null,\n ): Promise<void> {\n if (!this.session) return;\n\n // Fetch TaskRun early — needed for both resume detection and initial prompt\n let taskRun = prefetchedRun ?? null;\n if (!taskRun) {\n try {\n taskRun = await this.posthogAPI.getTaskRun(\n payload.task_id,\n payload.run_id,\n );\n } catch (error) {\n this.logger.warn(\"Failed to fetch task run\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n error,\n });\n }\n }\n\n // Check for resume if not already loaded from env var in autoInitializeSession\n if (!this.resumeState) {\n const resumeRunId = this.getResumeRunId(taskRun);\n if (resumeRunId) {\n this.logger.info(\"Resuming from previous run (via TaskRun state)\", {\n resumeRunId,\n currentRunId: payload.run_id,\n });\n try {\n this.resumeState = await resumeFromLog({\n taskId: payload.task_id,\n runId: resumeRunId,\n repositoryPath: this.config.repositoryPath,\n apiClient: this.posthogAPI,\n logger: new Logger({ debug: true, prefix: \"[Resume]\" }),\n });\n this.logger.info(\"Resume state loaded (via TaskRun state)\", {\n conversationTurns: this.resumeState.conversation.length,\n snapshotApplied: this.resumeState.snapshotApplied,\n logEntries: this.resumeState.logEntryCount,\n });\n } catch (error) {\n this.logger.warn(\"Failed to load resume state, starting fresh\", {\n error,\n });\n this.resumeState = null;\n }\n }\n }\n\n // Resume flow: if we have resume state, format conversation history as context\n if (this.resumeState && this.resumeState.conversation.length > 0) {\n await this.sendResumeMessage(payload, taskRun);\n return;\n }\n\n try {\n const task = await this.posthogAPI.getTask(payload.task_id);\n\n const initialPromptOverride = taskRun\n ? this.getInitialPromptOverride(taskRun)\n : null;\n const initialPrompt = initialPromptOverride ?? task.description;\n\n if (!initialPrompt) {\n this.logger.warn(\"Task has no description, skipping initial message\");\n return;\n }\n\n this.logger.info(\"Sending initial task message\", {\n taskId: payload.task_id,\n descriptionLength: initialPrompt.length,\n usedInitialPromptOverride: !!initialPromptOverride,\n });\n\n this.session.logWriter.resetTurnMessages(payload.run_id);\n\n const result = await this.session.clientConnection.prompt({\n sessionId: this.session.acpSessionId,\n prompt: [{ type: \"text\", text: initialPrompt }],\n });\n\n this.logger.info(\"Initial task message completed\", {\n stopReason: result.stopReason,\n });\n\n this.broadcastTurnComplete(result.stopReason);\n\n if (result.stopReason === \"end_turn\") {\n await this.relayAgentResponse(payload);\n }\n } catch (error) {\n this.logger.error(\"Failed to send initial task message\", error);\n if (this.session) {\n await this.session.logWriter.flushAll();\n }\n await this.signalTaskComplete(payload, \"error\");\n }\n }\n\n private async sendResumeMessage(\n payload: JwtPayload,\n taskRun: TaskRun | null,\n ): Promise<void> {\n if (!this.session || !this.resumeState) return;\n\n try {\n const conversationSummary = this.formatConversationForResume(\n this.resumeState.conversation,\n );\n\n // Read the pending user message from TaskRun state (set by the workflow\n // when the user sends a follow-up message that triggers a resume).\n const pendingUserMessage = this.getPendingUserMessage(taskRun);\n\n const sandboxContext = this.resumeState.snapshotApplied\n ? `The workspace environment (all files, packages, and code changes) has been fully restored from where you left off.`\n : `The workspace files from the previous session were not restored (the file snapshot may have expired), so you are starting with a fresh environment. Your conversation history is fully preserved below.`;\n\n let resumePrompt: string;\n if (pendingUserMessage) {\n // Include the pending message as the user's new question so the agent\n // responds to it directly instead of the generic resume context.\n resumePrompt =\n `You are resuming a previous conversation. ${sandboxContext}\\n\\n` +\n `Here is the conversation history from the previous session:\\n\\n` +\n `${conversationSummary}\\n\\n` +\n `The user has sent a new message:\\n\\n` +\n `${pendingUserMessage}\\n\\n` +\n `Respond to the user's new message above. You have full context from the previous session.`;\n } else {\n resumePrompt =\n `You are resuming a previous conversation. ${sandboxContext}\\n\\n` +\n `Here is the conversation history from the previous session:\\n\\n` +\n `${conversationSummary}\\n\\n` +\n `Continue from where you left off. The user is waiting for your response.`;\n }\n\n this.logger.info(\"Sending resume message\", {\n taskId: payload.task_id,\n conversationTurns: this.resumeState.conversation.length,\n promptLength: resumePrompt.length,\n hasPendingUserMessage: !!pendingUserMessage,\n snapshotApplied: this.resumeState.snapshotApplied,\n });\n\n // Clear resume state so it's not reused\n this.resumeState = null;\n\n this.session.logWriter.resetTurnMessages(payload.run_id);\n\n const result = await this.session.clientConnection.prompt({\n sessionId: this.session.acpSessionId,\n prompt: [{ type: \"text\", text: resumePrompt }],\n });\n\n this.logger.info(\"Resume message completed\", {\n stopReason: result.stopReason,\n });\n\n this.broadcastTurnComplete(result.stopReason);\n\n if (result.stopReason === \"end_turn\") {\n await this.relayAgentResponse(payload);\n }\n } catch (error) {\n this.logger.error(\"Failed to send resume message\", error);\n if (this.session) {\n await this.session.logWriter.flushAll();\n }\n await this.signalTaskComplete(payload, \"error\");\n }\n }\n\n private static RESUME_HISTORY_TOKEN_BUDGET = 50_000;\n private static TOOL_RESULT_MAX_CHARS = 2000;\n\n private formatConversationForResume(\n conversation: ConversationTurn[],\n ): string {\n const selected = selectRecentTurns(\n conversation,\n AgentServer.RESUME_HISTORY_TOKEN_BUDGET,\n );\n const parts: string[] = [];\n\n if (selected.length < conversation.length) {\n parts.push(\n `*(${conversation.length - selected.length} earlier turns omitted)*`,\n );\n }\n\n for (const turn of selected) {\n const role = turn.role === \"user\" ? \"User\" : \"Assistant\";\n\n const textParts = turn.content\n .filter((block) => block.type === \"text\")\n .map((block) => (block as { type: \"text\"; text: string }).text);\n\n if (textParts.length > 0) {\n parts.push(`**${role}**: ${textParts.join(\"\\n\")}`);\n }\n\n if (turn.toolCalls?.length) {\n const toolSummary = turn.toolCalls\n .map((tc) => {\n let resultStr = \"\";\n if (tc.result !== undefined) {\n const raw =\n typeof tc.result === \"string\"\n ? tc.result\n : JSON.stringify(tc.result);\n resultStr =\n raw.length > AgentServer.TOOL_RESULT_MAX_CHARS\n ? ` → ${raw.substring(0, AgentServer.TOOL_RESULT_MAX_CHARS)}...(truncated)`\n : ` → ${raw}`;\n }\n return ` - ${tc.toolName}${resultStr}`;\n })\n .join(\"\\n\");\n parts.push(`**${role} (tools)**:\\n${toolSummary}`);\n }\n }\n\n return parts.join(\"\\n\\n\");\n }\n\n private getInitialPromptOverride(taskRun: TaskRun): string | null {\n const state = taskRun.state as Record<string, unknown> | undefined;\n const override = state?.initial_prompt_override;\n if (typeof override !== \"string\") {\n return null;\n }\n\n const trimmed = override.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n private getPendingUserMessage(taskRun: TaskRun | null): string | null {\n if (!taskRun) return null;\n const state = taskRun.state as Record<string, unknown> | undefined;\n const message = state?.pending_user_message;\n if (typeof message !== \"string\") {\n return null;\n }\n\n const trimmed = message.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n private getResumeRunId(taskRun: TaskRun | null): string | null {\n // Env var takes precedence (set by backend infra)\n const envRunId = process.env.POSTHOG_RESUME_RUN_ID;\n if (envRunId) return envRunId;\n\n // Fallback: read from TaskRun state (set by API when creating the run)\n if (!taskRun) return null;\n const state = taskRun.state as Record<string, unknown> | undefined;\n const stateRunId = state?.resume_from_run_id;\n return typeof stateRunId === \"string\" && stateRunId.trim().length > 0\n ? stateRunId.trim()\n : null;\n }\n\n private buildSessionSystemPrompt(\n prUrl?: string | null,\n ): string | { append: string } {\n const cloudAppend = this.buildCloudSystemPrompt(prUrl);\n const userPrompt = this.config.claudeCode?.systemPrompt;\n\n // String override: combine user prompt with cloud instructions\n if (typeof userPrompt === \"string\") {\n return [userPrompt, cloudAppend].join(\"\\n\\n\");\n }\n\n // Preset with append: merge user append with cloud instructions\n if (typeof userPrompt === \"object\") {\n return {\n append: [userPrompt.append, cloudAppend].filter(Boolean).join(\"\\n\\n\"),\n };\n }\n\n // Default: just cloud instructions\n return { append: cloudAppend };\n }\n\n private buildCloudSystemPrompt(prUrl?: string | null): string {\n if (prUrl) {\n return `\n# Cloud Task Execution\n\nThis task already has an open pull request: ${prUrl}\n\nAfter completing the requested changes:\n1. Check out the existing PR branch with \\`gh pr checkout ${prUrl}\\`\n2. Stage and commit all changes with a clear commit message\n3. Push to the existing PR branch\n\nImportant:\n- Do NOT create a new branch or a new pull request.\n- Do NOT add \"Co-Authored-By\" trailers to commit messages.\n- Do NOT add \"Generated with [Claude Code]\" or similar attribution lines to PR descriptions.\n`;\n }\n\n if (!this.config.repositoryPath) {\n return `\n# Cloud Task Execution — No Repository Mode\n\nYou are a helpful assistant with access to PostHog via MCP tools. You can help with both code tasks and data/analytics questions.\n\nWhen the user asks about analytics, data, metrics, events, funnels, dashboards, feature flags, experiments, or anything PostHog-related:\n- Use your PostHog MCP tools to query data, search insights, and provide real answers\n- Do NOT tell the user to check an external analytics platform — you ARE the analytics platform\n- Use tools like insight-query, query-run, event-definitions-list, and others to answer questions directly\n\nWhen the user asks for code changes or software engineering tasks:\n- Let them know you can help but don't have a repository connected for this session\n- Offer to write code snippets, scripts, or provide guidance\n\nImportant:\n- Do NOT create branches, commits, or pull requests in this mode.\n- Prefer using MCP tools to answer questions with real data over giving generic advice.\n`;\n }\n\n return `\n# Cloud Task Execution\n\nAfter completing the requested changes:\n1. Create a new branch with a descriptive name based on the work done\n2. Stage and commit all changes with a clear commit message\n3. Push the branch to origin\n4. Create a draft pull request using \\`gh pr create --draft${this.config.baseBranch ? ` --base ${this.config.baseBranch}` : \"\"}\\` with a descriptive title and body\n\nImportant:\n- Always create the PR as a draft. Do not ask for confirmation.\n- Do NOT add \"Co-Authored-By\" trailers to commit messages.\n- Do NOT add \"Generated with [Claude Code]\" or similar attribution lines to PR descriptions.\n`;\n }\n\n private async signalTaskComplete(\n payload: JwtPayload,\n stopReason: string,\n ): Promise<void> {\n if (this.session?.payload.run_id === payload.run_id) {\n try {\n await this.session.logWriter.flush(payload.run_id, {\n coalesce: true,\n });\n } catch (error) {\n this.logger.warn(\"Failed to flush session logs before completion\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n error,\n });\n }\n }\n\n if (stopReason !== \"error\") {\n this.logger.info(\"Skipping status update for non-error stop reason\", {\n stopReason,\n });\n return;\n }\n\n const status = \"failed\";\n\n try {\n await this.posthogAPI.updateTaskRun(payload.task_id, payload.run_id, {\n status,\n error_message: stopReason === \"error\" ? \"Agent error\" : undefined,\n });\n this.logger.info(\"Task completion signaled\", { status, stopReason });\n } catch (error) {\n this.logger.error(\"Failed to signal task completion\", error);\n }\n }\n\n private configureEnvironment(): void {\n const { apiKey, apiUrl, projectId } = this.config;\n const product =\n this.config.mode === \"background\" ? \"background_agents\" : \"posthog_code\";\n const gatewayUrl =\n process.env.LLM_GATEWAY_URL || getLlmGatewayUrl(apiUrl, product);\n const openaiBaseUrl = gatewayUrl.endsWith(\"/v1\")\n ? gatewayUrl\n : `${gatewayUrl}/v1`;\n\n Object.assign(process.env, {\n // PostHog\n POSTHOG_API_KEY: apiKey,\n POSTHOG_API_URL: apiUrl,\n POSTHOG_API_HOST: apiUrl,\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n POSTHOG_PROJECT_ID: String(projectId),\n // Anthropic\n ANTHROPIC_API_KEY: apiKey,\n ANTHROPIC_AUTH_TOKEN: apiKey,\n ANTHROPIC_BASE_URL: gatewayUrl,\n // OpenAI (for models like GPT-4, o1, etc.)\n OPENAI_API_KEY: apiKey,\n OPENAI_BASE_URL: openaiBaseUrl,\n // Generic gateway\n LLM_GATEWAY_URL: gatewayUrl,\n });\n }\n\n private createCloudClient(payload: JwtPayload) {\n const mode = this.getEffectiveMode(payload);\n const interactionOrigin =\n process.env.CODE_INTERACTION_ORIGIN ??\n process.env.TWIG_INTERACTION_ORIGIN;\n\n return {\n requestPermission: async (params: {\n options: Array<{ kind: string; optionId: string; name?: string }>;\n toolCall?: {\n _meta?: Record<string, unknown> | null;\n };\n }) => {\n // Background mode: always auto-approve permissions\n // Interactive mode: also auto-approve for now (user can monitor via SSE)\n // Future: interactive mode could pause and wait for user approval via SSE\n this.logger.debug(\"Permission request\", {\n mode,\n interactionOrigin,\n options: params.options,\n });\n\n const allowOption = params.options.find(\n (o) => o.kind === \"allow_once\" || o.kind === \"allow_always\",\n );\n const selectedOptionId =\n allowOption?.optionId ?? params.options[0].optionId;\n\n if (interactionOrigin === \"slack\") {\n const codeToolKind = params.toolCall?._meta?.codeToolKind;\n if (codeToolKind === \"question\") {\n this.relaySlackQuestion(payload, params.toolCall?._meta);\n return {\n outcome: { outcome: \"cancelled\" as const },\n _meta: {\n message:\n \"This question has been relayed to the Slack thread where this task originated. \" +\n \"The user will reply there. Do NOT re-ask the question or pick an answer yourself. \" +\n \"Simply let the user know you are waiting for their reply.\",\n },\n };\n }\n }\n\n return {\n outcome: {\n outcome: \"selected\" as const,\n optionId: selectedOptionId,\n },\n };\n },\n extNotification: async (\n method: string,\n params: Record<string, unknown>,\n ) => {\n this.logger.debug(\"Extension notification\", { method, params });\n },\n sessionUpdate: async (params: {\n sessionId: string;\n update?: Record<string, unknown>;\n }) => {\n // session/update notifications flow through the tapped stream (like local transport)\n // Only handle tree state capture for file changes here\n if (params.update?.sessionUpdate === \"tool_call_update\") {\n const meta = (params.update?._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n const toolName = meta?.toolName as string | undefined;\n const toolResponse = meta?.toolResponse as\n | Record<string, unknown>\n | undefined;\n\n if (\n (toolName === \"Write\" || toolName === \"Edit\") &&\n toolResponse?.filePath\n ) {\n await this.captureTreeState();\n }\n\n if (\n toolName &&\n (toolName.includes(\"Bash\") || toolName.includes(\"bash\"))\n ) {\n this.detectAndAttachPrUrl(payload, params.update);\n }\n }\n },\n };\n }\n\n private async relayAgentResponse(payload: JwtPayload): Promise<void> {\n if (!this.session) {\n return;\n }\n\n if (this.questionRelayedToSlack) {\n this.questionRelayedToSlack = false;\n return;\n }\n\n try {\n await this.session.logWriter.flush(payload.run_id, { coalesce: true });\n } catch (error) {\n this.logger.warn(\"Failed to flush logs before Slack relay\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n error,\n });\n }\n\n const message = this.session.logWriter.getFullAgentResponse(payload.run_id);\n if (!message) {\n this.logger.warn(\"No agent message found for Slack relay\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n sessionRegistered: this.session.logWriter.isRegistered(payload.run_id),\n });\n return;\n }\n\n try {\n await this.posthogAPI.relayMessage(\n payload.task_id,\n payload.run_id,\n message,\n );\n } catch (error) {\n this.logger.warn(\"Failed to relay initial agent response to Slack\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n error,\n });\n }\n }\n\n private relaySlackQuestion(\n payload: JwtPayload,\n toolMeta: Record<string, unknown> | null | undefined,\n ): void {\n const firstQuestion = this.getFirstQuestionMeta(toolMeta);\n if (!this.isQuestionMeta(firstQuestion)) {\n return;\n }\n\n let message = `*${firstQuestion.question}*\\n\\n`;\n if (firstQuestion.options?.length) {\n firstQuestion.options.forEach(\n (opt: { label: string; description?: string }, i: number) => {\n message += `${i + 1}. *${opt.label}*`;\n if (opt.description) message += ` — ${opt.description}`;\n message += \"\\n\";\n },\n );\n }\n message += \"\\nReply in this thread with your choice.\";\n\n this.questionRelayedToSlack = true;\n this.posthogAPI\n .relayMessage(payload.task_id, payload.run_id, message)\n .catch((err) =>\n this.logger.warn(\"Failed to relay question to Slack\", { err }),\n );\n }\n\n private getFirstQuestionMeta(\n toolMeta: Record<string, unknown> | null | undefined,\n ): unknown {\n if (!toolMeta) {\n return null;\n }\n\n const questionsValue = toolMeta.questions;\n if (!Array.isArray(questionsValue) || questionsValue.length === 0) {\n return null;\n }\n\n return questionsValue[0];\n }\n\n private isQuestionMeta(value: unknown): value is {\n question: string;\n options?: Array<{ label: string; description?: string }>;\n } {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as {\n question?: unknown;\n options?: unknown;\n };\n\n if (typeof candidate.question !== \"string\") {\n return false;\n }\n\n if (candidate.options === undefined) {\n return true;\n }\n\n if (!Array.isArray(candidate.options)) {\n return false;\n }\n\n return candidate.options.every(\n (option) =>\n !!option &&\n typeof option === \"object\" &&\n typeof (option as { label?: unknown }).label === \"string\",\n );\n }\n\n private detectAndAttachPrUrl(\n payload: JwtPayload,\n update: Record<string, unknown>,\n ): void {\n try {\n const meta = (update?._meta as Record<string, unknown>)?.claudeCode as\n | Record<string, unknown>\n | undefined;\n const toolResponse = meta?.toolResponse;\n\n // Extract text content from tool response\n let textToSearch = \"\";\n\n if (toolResponse) {\n if (typeof toolResponse === \"string\") {\n textToSearch = toolResponse;\n } else if (typeof toolResponse === \"object\" && toolResponse !== null) {\n const respObj = toolResponse as Record<string, unknown>;\n textToSearch =\n String(respObj.stdout || \"\") + String(respObj.stderr || \"\");\n if (!textToSearch && respObj.output) {\n textToSearch = String(respObj.output);\n }\n }\n }\n\n // Also check content array\n const content = update?.content;\n if (Array.isArray(content)) {\n for (const item of content) {\n if (item.type === \"text\" && item.text) {\n textToSearch += ` ${item.text}`;\n }\n }\n }\n\n if (!textToSearch) return;\n\n // Match GitHub PR URLs\n const prUrlMatch = textToSearch.match(\n /https:\\/\\/github\\.com\\/[^/]+\\/[^/]+\\/pull\\/\\d+/,\n );\n if (!prUrlMatch) return;\n\n const prUrl = prUrlMatch[0];\n this.detectedPrUrl = prUrl;\n this.logger.info(\"Detected PR URL in bash output\", {\n runId: payload.run_id,\n prUrl,\n });\n\n // Fire-and-forget: attach PR URL to the task run\n this.posthogAPI\n .updateTaskRun(payload.task_id, payload.run_id, {\n output: { pr_url: prUrl },\n })\n .then(() => {\n this.logger.info(\"PR URL attached to task run\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n prUrl,\n });\n })\n .catch((err) => {\n this.logger.error(\"Failed to attach PR URL to task run\", {\n taskId: payload.task_id,\n runId: payload.run_id,\n prUrl,\n error: err,\n });\n });\n } catch (err) {\n // Never let detection errors break message flow\n this.logger.debug(\"Error in PR URL detection\", {\n runId: payload.run_id,\n error: err,\n });\n }\n }\n\n private async cleanupSession(): Promise<void> {\n if (!this.session) return;\n\n this.logger.info(\"Cleaning up session\");\n\n try {\n await this.captureTreeState();\n } catch (error) {\n this.logger.error(\"Failed to capture final tree state\", error);\n }\n\n try {\n await this.session.logWriter.flush(this.session.payload.run_id, {\n coalesce: true,\n });\n } catch (error) {\n this.logger.error(\"Failed to flush session logs\", error);\n }\n\n try {\n await this.session.acpConnection.cleanup();\n } catch (error) {\n this.logger.error(\"Failed to cleanup ACP connection\", error);\n }\n\n if (this.session.sseController) {\n this.session.sseController.close();\n }\n\n this.pendingEvents = [];\n this.session = null;\n }\n\n private async captureTreeState(): Promise<void> {\n if (!this.session?.treeTracker) return;\n\n try {\n const snapshot = await this.session.treeTracker.captureTree({});\n if (snapshot) {\n const snapshotWithDevice: TreeSnapshotEvent = {\n ...snapshot,\n device: this.session.deviceInfo,\n };\n\n const notification = {\n jsonrpc: \"2.0\" as const,\n method: POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT,\n params: snapshotWithDevice,\n };\n\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification,\n });\n\n // Persist full snapshot (including archiveUrl) so resume can restore files.\n // archiveUrl is a pre-signed S3 URL that expires — if the user resumes\n // after expiry, ApplySnapshotSaga fails gracefully and the agent continues\n // with conversation context but a fresh sandbox (snapshotApplied=false).\n this.session.logWriter.appendRawLine(\n this.session.payload.run_id,\n JSON.stringify(notification),\n );\n }\n } catch (error) {\n this.logger.error(\"Failed to capture tree state\", error);\n }\n }\n\n private broadcastTurnComplete(stopReason: string): void {\n if (!this.session) return;\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification: {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.TURN_COMPLETE,\n params: {\n sessionId: this.session.acpSessionId,\n stopReason,\n },\n },\n });\n }\n\n private broadcastEvent(event: Record<string, unknown>): void {\n if (this.session?.sseController) {\n this.sendSseEvent(this.session.sseController, event);\n } else if (this.session) {\n // Buffer events during initialization (sseController not yet attached)\n this.pendingEvents.push(event);\n }\n }\n\n private replayPendingEvents(): void {\n if (!this.session?.sseController || this.pendingEvents.length === 0) return;\n const events = this.pendingEvents;\n this.pendingEvents = [];\n for (const event of events) {\n this.sendSseEvent(this.session.sseController, event);\n }\n }\n\n private sendSseEvent(controller: SseController, data: unknown): void {\n controller.send(data);\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.3.116\",\n \"repository\": \"https://github.com/PostHog/code\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./adapters/claude/session/jsonl-hydration\": {\n \"types\": \"./dist/adapters/claude/session/jsonl-hydration.d.ts\",\n \"import\": \"./dist/adapters/claude/session/jsonl-hydration.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.cjs\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"scripts\": {\n \"build\": \"node ../../scripts/rimraf.mjs dist && tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\",\n \"clean\": \"node ../../scripts/rimraf.mjs dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@posthog/git\": \"workspace:*\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"0.16.1\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.76\",\n \"@anthropic-ai/sdk\": \"^0.78.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"minimatch\": \"^10.0.3\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^3.24.1\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","/**\n * PostHog-specific ACP extensions.\n *\n * These follow the ACP extensibility model:\n * - Custom notification methods are prefixed with `_posthog/`\n * - Custom data can be attached via `_meta` fields\n *\n * Note: When using `extNotification()` from the ACP SDK, it automatically\n * adds an extra underscore prefix (e.g., `_posthog/tree_snapshot` becomes\n * `__posthog/tree_snapshot` in the log). Code that reads logs should handle both.\n *\n * See: https://agentclientprotocol.com/docs/extensibility\n */\n\n/**\n * Custom notification methods for PostHog-specific events.\n * Used with AgentSideConnection.extNotification() or Client.extNotification()\n */\nexport const POSTHOG_NOTIFICATIONS = {\n /** Git branch was created for a task */\n BRANCH_CREATED: \"_posthog/branch_created\",\n\n /** Task run has started execution */\n RUN_STARTED: \"_posthog/run_started\",\n\n /** Task has completed (success or failure) */\n TASK_COMPLETE: \"_posthog/task_complete\",\n\n /** Agent finished processing a turn (prompt returned, waiting for next input) */\n TURN_COMPLETE: \"_posthog/turn_complete\",\n\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n\n /** Console/log output from the agent */\n CONSOLE: \"_posthog/console\",\n\n /** Maps taskRunId to agent's sessionId and adapter type (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n\n /** Tree state snapshot captured (git tree hash + file archive) */\n TREE_SNAPSHOT: \"_posthog/tree_snapshot\",\n\n /** Agent mode changed (interactive/background) */\n MODE_CHANGE: \"_posthog/mode_change\",\n\n /** Request to resume a session from previous state */\n SESSION_RESUME: \"_posthog/session/resume\",\n\n /** User message sent from client to agent */\n USER_MESSAGE: \"_posthog/user_message\",\n\n /** Request to cancel current operation */\n CANCEL: \"_posthog/cancel\",\n\n /** Request to close the session */\n CLOSE: \"_posthog/close\",\n\n /** Agent status update (thinking, working, etc.) */\n STATUS: \"_posthog/status\",\n\n /** Task-level notification (progress, milestones) */\n TASK_NOTIFICATION: \"_posthog/task_notification\",\n\n /** Marks a boundary for log compaction */\n COMPACT_BOUNDARY: \"_posthog/compact_boundary\",\n} as const;\n","import { AgentSideConnection, ndJsonStream } from \"@agentclientprotocol/sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions\";\nimport { formatModelId } from \"../gateway-models\";\nimport type { SessionLogWriter } from \"../session-log-writer\";\nimport type { ProcessSpawnedCallback } from \"../types\";\nimport { Logger } from \"../utils/logger\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n type StreamPair,\n} from \"../utils/streams\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent\";\nimport { type CodexProcessOptions, spawnCodexProcess } from \"./codex/spawn\";\n\ntype AgentAdapter = \"claude\" | \"codex\";\n\nexport type AcpConnectionConfig = {\n adapter?: AgentAdapter;\n logWriter?: SessionLogWriter;\n taskRunId?: string;\n taskId?: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n codexOptions?: CodexProcessOptions;\n allowedModelIds?: Set<string>;\n};\n\nexport type AcpConnection = {\n agentConnection?: AgentSideConnection;\n clientStreams: StreamPair;\n cleanup: () => Promise<void>;\n};\n\nexport type InProcessAcpConnection = AcpConnection;\n\ntype ModelOption = { value?: string; name?: string };\ntype ModelGroup = { group?: string; name?: string; options?: ModelOption[] };\n\ntype ConfigOption = {\n id?: string;\n category?: string | null;\n currentValue?: string;\n options?: Array<ModelOption | ModelGroup>;\n};\n\nfunction isGroupedOptions(\n options: NonNullable<ConfigOption[\"options\"]>,\n): options is ModelGroup[] {\n return options.length > 0 && \"group\" in options[0];\n}\n\nfunction formatOption(o: ModelOption): ModelOption {\n if (!o.value) return o;\n return { ...o, name: formatModelId(o.value) };\n}\n\nfunction filterModelConfigOptions(\n msg: Record<string, unknown>,\n allowedModelIds: Set<string>,\n): Record<string, unknown> | null {\n const payload = msg as {\n method?: string;\n result?: { configOptions?: ConfigOption[] };\n params?: {\n update?: { sessionUpdate?: string; configOptions?: ConfigOption[] };\n };\n };\n\n const configOptions =\n payload.result?.configOptions ?? payload.params?.update?.configOptions;\n if (!configOptions) return null;\n\n const filtered = configOptions.map((opt) => {\n if (opt.category !== \"model\" || !opt.options) return opt;\n\n const options = opt.options;\n if (isGroupedOptions(options)) {\n const filteredOptions = options.map((group) => ({\n ...group,\n options: (group.options ?? [])\n .filter((o) => o?.value && allowedModelIds.has(o.value))\n .map(formatOption),\n }));\n const flat = filteredOptions.flatMap((g) => g.options ?? []);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || flat.length === 0 ? opt.currentValue : flat[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n }\n\n const valueOptions = options as ModelOption[];\n const filteredOptions = valueOptions\n .filter((o) => o?.value && allowedModelIds.has(o.value))\n .map(formatOption);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || filteredOptions.length === 0\n ? opt.currentValue\n : filteredOptions[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n });\n\n if (payload.result?.configOptions) {\n return { ...msg, result: { ...payload.result, configOptions: filtered } };\n }\n if (payload.params?.update?.configOptions) {\n return {\n ...msg,\n params: {\n ...payload.params,\n update: { ...payload.params.update, configOptions: filtered },\n },\n };\n }\n return null;\n}\n\nfunction extractReasoningEffort(\n configOptions: ConfigOption[] | undefined,\n): string | undefined {\n if (!configOptions) return undefined;\n const option = configOptions.find((opt) => opt.id === \"reasoning_effort\");\n return option?.currentValue ?? undefined;\n}\n\n/**\n * Creates an ACP connection with the specified agent framework.\n *\n * @param config - Configuration including framework selection\n * @returns Connection with agent and client streams\n */\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): AcpConnection {\n const adapterType = config.adapter ?? \"claude\";\n\n if (adapterType === \"codex\") {\n return createCodexConnection(config);\n }\n\n return createClaudeConnection(config);\n}\n\nfunction createClaudeConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"AcpConnection\") ??\n new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { logWriter } = config;\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n const taskRunId = config.taskRunId;\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: ClaudeAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new ClaudeAcpAgent(client, config.processCallbacks);\n logger.info(`Created ${agent.adapterName} agent`);\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up ACP connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n\nfunction createCodexConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"CodexConnection\") ??\n new Logger({ debug: true, prefix: \"[CodexConnection]\" });\n\n const { logWriter } = config;\n const allowedModelIds = config.allowedModelIds;\n\n const codexProcess = spawnCodexProcess({\n ...config.codexOptions,\n logger,\n processCallbacks: config.processCallbacks,\n });\n\n let clientReadable = nodeReadableToWebReadable(codexProcess.stdout);\n let clientWritable = nodeWritableToWebWritable(codexProcess.stdin);\n\n let isLoadingSession = false;\n let loadRequestId: string | number | null = null;\n let newSessionRequestId: string | number | null = null;\n let sdkSessionEmitted = false;\n const reasoningEffortBySessionId = new Map<string, string>();\n let injectedConfigId = 0;\n\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let readBuffer = \"\";\n\n const taskRunId = config.taskRunId;\n\n const filteringReadable = clientReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n readBuffer += decoder.decode(chunk, { stream: true });\n const lines = readBuffer.split(\"\\n\");\n readBuffer = lines.pop() ?? \"\";\n\n const outputLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n outputLines.push(line);\n continue;\n }\n\n let shouldFilter = false;\n\n try {\n const msg = JSON.parse(trimmed);\n const sessionId =\n msg?.params?.sessionId ?? msg?.result?.sessionId ?? null;\n const configOptions =\n msg?.result?.configOptions ?? msg?.params?.update?.configOptions;\n if (sessionId && configOptions) {\n const effort = extractReasoningEffort(configOptions);\n if (effort) {\n reasoningEffortBySessionId.set(sessionId, effort);\n }\n }\n\n if (\n !sdkSessionEmitted &&\n newSessionRequestId !== null &&\n msg.id === newSessionRequestId &&\n \"result\" in msg\n ) {\n const sessionId = msg.result?.sessionId;\n if (sessionId && taskRunId) {\n const sdkSessionNotification = {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.SDK_SESSION,\n params: {\n taskRunId,\n sessionId,\n adapter: \"codex\",\n },\n };\n outputLines.push(JSON.stringify(sdkSessionNotification));\n sdkSessionEmitted = true;\n }\n newSessionRequestId = null;\n }\n\n if (isLoadingSession) {\n if (msg.id === loadRequestId && \"result\" in msg) {\n logger.debug(\"session/load complete, resuming stream\");\n isLoadingSession = false;\n loadRequestId = null;\n } else if (msg.method === \"session/update\") {\n shouldFilter = true;\n }\n }\n\n if (!shouldFilter && allowedModelIds && allowedModelIds.size > 0) {\n const updated = filterModelConfigOptions(msg, allowedModelIds);\n if (updated) {\n outputLines.push(JSON.stringify(updated));\n continue;\n }\n }\n } catch {\n // Not valid JSON, pass through\n }\n\n if (!shouldFilter) {\n outputLines.push(line);\n const isChunkNoise =\n trimmed.includes('\"sessionUpdate\":\"agent_message_chunk\"') ||\n trimmed.includes('\"sessionUpdate\":\"agent_thought_chunk\"');\n if (!isChunkNoise) {\n logger.debug(\"codex-acp stdout:\", trimmed);\n }\n }\n }\n\n if (outputLines.length > 0) {\n const output = `${outputLines.join(\"\\n\")}\\n`;\n controller.enqueue(encoder.encode(output));\n }\n },\n flush(controller) {\n if (readBuffer.trim()) {\n controller.enqueue(encoder.encode(readBuffer));\n }\n },\n }),\n );\n clientReadable = filteringReadable;\n\n const originalWritable = clientWritable;\n clientWritable = new WritableStream({\n write(chunk) {\n const text = decoder.decode(chunk, { stream: true });\n const trimmed = text.trim();\n logger.debug(\"codex-acp stdin:\", trimmed);\n\n try {\n const msg = JSON.parse(trimmed);\n if (\n msg.method === \"session/set_config_option\" &&\n msg.params?.configId === \"reasoning_effort\" &&\n msg.params?.sessionId &&\n msg.params?.value\n ) {\n reasoningEffortBySessionId.set(\n msg.params.sessionId,\n msg.params.value,\n );\n }\n if (msg.method === \"session/prompt\" && msg.params?.sessionId) {\n const effort = reasoningEffortBySessionId.get(msg.params.sessionId);\n if (effort) {\n const injection = {\n jsonrpc: \"2.0\",\n id: `reasoning_effort_${Date.now()}_${injectedConfigId++}`,\n method: \"session/set_config_option\",\n params: {\n sessionId: msg.params.sessionId,\n configId: \"reasoning_effort\",\n value: effort,\n },\n };\n const injectionLine = `${JSON.stringify(injection)}\\n`;\n const writer = originalWritable.getWriter();\n return writer\n .write(encoder.encode(injectionLine))\n .then(() => writer.releaseLock())\n .then(() => {\n const nextWriter = originalWritable.getWriter();\n return nextWriter\n .write(chunk)\n .finally(() => nextWriter.releaseLock());\n });\n }\n }\n if (msg.method === \"session/new\" && msg.id) {\n logger.debug(\"session/new detected, tracking request ID\");\n newSessionRequestId = msg.id;\n } else if (msg.method === \"session/load\" && msg.id) {\n logger.debug(\"session/load detected, pausing stream updates\");\n isLoadingSession = true;\n loadRequestId = msg.id;\n }\n } catch {\n // Not valid JSON\n }\n\n const writer = originalWritable.getWriter();\n return writer.write(chunk).finally(() => writer.releaseLock());\n },\n close() {\n const writer = originalWritable.getWriter();\n return writer.close().finally(() => writer.releaseLock());\n },\n });\n\n const shouldTapLogs = config.taskRunId && logWriter;\n\n if (shouldTapLogs && config.taskRunId) {\n const taskRunId = config.taskRunId;\n if (!logWriter.isRegistered(taskRunId)) {\n logWriter.register(taskRunId, {\n taskId: config.taskId ?? taskRunId,\n runId: taskRunId,\n });\n }\n\n clientWritable = createTappedWritableStream(clientWritable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n const originalReadable = clientReadable;\n const logDecoder = new TextDecoder();\n let logBuffer = \"\";\n\n clientReadable = originalReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n logBuffer += logDecoder.decode(chunk, { stream: true });\n const lines = logBuffer.split(\"\\n\");\n logBuffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.trim()) {\n logWriter.appendRawLine(taskRunId, line);\n }\n }\n\n controller.enqueue(chunk);\n },\n flush() {\n if (logBuffer.trim()) {\n logWriter.appendRawLine(taskRunId, logBuffer);\n }\n },\n }),\n );\n } else {\n logger.info(\"Tapped streams NOT enabled for Codex\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n return {\n agentConnection: undefined,\n clientStreams: {\n readable: clientReadable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up Codex connection\");\n codexProcess.kill();\n\n try {\n await clientWritable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n","export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-6\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ModelsListResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nconst CACHE_TTL = 10 * 60 * 1000; // 10 minutes\n\nlet gatewayModelsCache: {\n models: GatewayModel[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n gatewayModelsCache &&\n gatewayModelsCache.url === gatewayUrl &&\n Date.now() < gatewayModelsCache.expiry\n ) {\n return gatewayModelsCache.models;\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));\n gatewayModelsCache = {\n models,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return models;\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport interface ModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet modelsListCache: {\n models: ModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchModelsList(\n options?: FetchGatewayModelsOptions,\n): Promise<ModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n modelsListCache &&\n modelsListCache.url === gatewayUrl &&\n Date.now() < modelsListCache.expiry\n ) {\n return modelsListCache.models;\n }\n\n try {\n const modelsUrl = `${gatewayUrl}/v1/models`;\n const response = await fetch(modelsUrl);\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ModelsListResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n modelsListCache = {\n models: results,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n return formatModelId(model.id);\n}\n\nexport function formatModelId(modelId: string): string {\n let cleanId = modelId;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types\";\n\nexport interface LoggerConfig {\n debug?: boolean;\n prefix?: string;\n scope?: string;\n onLog?: OnLogCallback;\n}\n\nexport class Logger {\n private debugEnabled: boolean;\n private prefix: string;\n private scope: string;\n private onLog?: OnLogCallback;\n\n constructor(config: LoggerConfig = {}) {\n this.debugEnabled = config.debug ?? false;\n this.prefix = config.prefix ?? \"[PostHog Agent]\";\n this.scope = config.scope ?? \"agent\";\n this.onLog = config.onLog;\n }\n\n private formatMessage(\n level: string,\n message: string,\n data?: unknown,\n ): string {\n const timestamp = new Date().toISOString();\n const base = `${timestamp} ${this.prefix} [${level}] ${message}`;\n\n if (data !== undefined) {\n return `${base} ${JSON.stringify(data, null, 2)}`;\n }\n\n return base;\n }\n\n private emitLog(level: LogLevelType, message: string, data?: unknown) {\n if (this.onLog) {\n this.onLog(level, this.scope, message, data);\n return;\n }\n\n const shouldLog = this.debugEnabled || level === \"error\";\n\n if (shouldLog) {\n console[level](this.formatMessage(level.toLowerCase(), message, data));\n }\n }\n\n error(message: string, error?: Error | unknown) {\n const data =\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : error;\n\n this.emitLog(\"error\", message, data);\n }\n\n warn(message: string, data?: unknown) {\n this.emitLog(\"warn\", message, data);\n }\n\n info(message: string, data?: unknown) {\n this.emitLog(\"info\", message, data);\n }\n\n debug(message: string, data?: unknown) {\n this.emitLog(\"debug\", message, data);\n }\n\n child(childPrefix: string): Logger {\n return new Logger({\n debug: this.debugEnabled,\n prefix: `${this.prefix} [${childPrefix}]`,\n scope: `${this.scope}:${childPrefix}`,\n onLog: this.onLog,\n });\n }\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"./logger\";\n\nexport class Pushable<T> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolvers: ((value: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(item: T) {\n const resolve = this.resolvers.shift();\n if (resolve) {\n resolve({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n end() {\n this.done = true;\n for (const resolve of this.resolvers) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n this.resolvers = [];\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.queue.length > 0) {\n const value = this.queue.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (this.done) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n}\n\nexport type StreamPair = {\n readable: globalThis.ReadableStream<Uint8Array>;\n writable: globalThis.WritableStream<Uint8Array>;\n};\n\nexport type BidirectionalStreamPair = {\n client: StreamPair;\n agent: StreamPair;\n};\n\nfunction pushableToReadableStream(\n pushable: Pushable<Uint8Array>,\n): globalThis.ReadableStream<Uint8Array> {\n const iterator = pushable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function createBidirectionalStreams(): BidirectionalStreamPair {\n const clientToAgentPushable = new Pushable<Uint8Array>();\n const agentToClientPushable = new Pushable<Uint8Array>();\n\n const clientToAgentReadable = pushableToReadableStream(clientToAgentPushable);\n const agentToClientReadable = pushableToReadableStream(agentToClientPushable);\n\n const clientToAgentWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n clientToAgentPushable.push(chunk);\n },\n close() {\n clientToAgentPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n const agentToClientWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n agentToClientPushable.push(chunk);\n },\n close() {\n agentToClientPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n return {\n client: {\n readable: agentToClientReadable,\n writable: clientToAgentWritable,\n },\n agent: {\n readable: clientToAgentReadable,\n writable: agentToClientWritable,\n },\n };\n}\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\nexport function createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n options: TappedStreamOptions,\n): WritableStream<Uint8Array> {\n const { onMessage, logger } = options;\n const decoder = new TextDecoder();\n let buffer = \"\";\n let _messageCount = 0;\n\n return new WritableStream({\n async write(chunk: Uint8Array) {\n buffer += decoder.decode(chunk, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n _messageCount++;\n\n onMessage(line);\n }\n\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (err) {\n // Stream may be closed if subprocess crashed - log but don't throw\n logger?.error(\"ACP write error\", err);\n }\n },\n async close() {\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n });\n}\n\nexport function nodeReadableToWebReadable(\n nodeStream: Readable,\n): globalThis.ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n nodeStream.on(\"data\", (chunk: Buffer) => {\n controller.enqueue(new Uint8Array(chunk));\n });\n nodeStream.on(\"end\", () => {\n controller.close();\n });\n nodeStream.on(\"error\", (err) => {\n controller.error(err);\n });\n },\n cancel() {\n nodeStream.destroy();\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function nodeWritableToWebWritable(\n nodeStream: Writable,\n): globalThis.WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise((resolve, reject) => {\n const ok = nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) reject(err);\n });\n if (ok) {\n resolve();\n } else {\n nodeStream.once(\"drain\", resolve);\n }\n });\n },\n close() {\n return new Promise((resolve) => {\n nodeStream.end(resolve);\n });\n },\n abort(reason) {\n nodeStream.destroy(\n reason instanceof Error ? reason : new Error(String(reason)),\n );\n },\n }) as globalThis.WritableStream<Uint8Array>;\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type ModelInfo as AcpModelInfo,\n type AgentSideConnection,\n type ClientCapabilities,\n type ForkSessionRequest,\n type ForkSessionResponse,\n type InitializeRequest,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type ResumeSessionRequest,\n type ResumeSessionResponse,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SessionModelState,\n type SessionModeState,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n type SetSessionModelRequest,\n type SetSessionModelResponse,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n type Usage,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n getSessionMessages,\n listSessions,\n type Query,\n query,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport { unreachable, withTimeout } from \"../../utils/common\";\nimport { Logger } from \"../../utils/logger\";\nimport { Pushable } from \"../../utils/streams\";\nimport { BaseAcpAgent } from \"../base-acp-agent\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp\";\nimport {\n fetchMcpToolMetadata,\n getConnectedMcpServerNames,\n} from \"./mcp/tool-metadata\";\nimport { canUseTool } from \"./permissions/permission-handlers\";\nimport { getAvailableSlashCommands } from \"./session/commands\";\nimport { parseMcpServers } from \"./session/mcp-config\";\nimport {\n DEFAULT_MODEL,\n getEffortOptions,\n resolveModelPreference,\n supports1MContext,\n toSdkModelId,\n} from \"./session/models\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options\";\nimport { SettingsManager } from \"./session/settings\";\nimport {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n} from \"./tools\";\nimport type {\n BackgroundTerminal,\n EffortLevel,\n NewSessionMeta,\n Session,\n ToolUseCache,\n} from \"./types\";\n\nconst SESSION_VALIDATION_TIMEOUT_MS = 30_000;\nconst MAX_TITLE_LENGTH = 256;\nconst LOCAL_ONLY_COMMANDS = new Set([\"/context\", \"/heapdump\", \"/extra-usage\"]);\n\nfunction sanitizeTitle(text: string): string {\n const sanitized = text\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (sanitized.length <= MAX_TITLE_LENGTH) {\n return sanitized;\n }\n return `${sanitized.slice(0, MAX_TITLE_LENGTH - 1)}…`;\n}\n\nexport interface ClaudeAcpAgentOptions {\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n onMcpServersReady?: (serverNames: string[]) => void;\n}\n\nexport class ClaudeAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"claude\";\n declare session: Session;\n toolUseCache: ToolUseCache;\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n private options?: ClaudeAcpAgentOptions;\n\n constructor(client: AgentSideConnection, options?: ClaudeAcpAgentOptions) {\n super(client);\n this.options = options;\n this.toolUseCache = {};\n this.logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n return {\n protocolVersion: 1,\n agentCapabilities: {\n promptCapabilities: {\n image: true,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: true,\n sse: true,\n },\n loadSession: true,\n sessionCapabilities: {\n list: {},\n fork: {},\n resume: {},\n },\n _meta: {\n posthog: {\n resumeSession: true,\n },\n claudeCode: {\n promptQueueing: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Agent\",\n version: packageJson.version,\n },\n authMethods: [],\n };\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n // Upstream Claude Code renames .claude.json to .claude.json.backup on logout.\n // If the backup exists but the original doesn't, the user is logged out.\n if (\n fs.existsSync(path.resolve(os.homedir(), \".claude.json.backup\")) &&\n !fs.existsSync(path.resolve(os.homedir(), \".claude.json\"))\n ) {\n throw RequestError.authRequired();\n }\n\n const response = await this.createSession(params, {\n // Revisit these meta values once we support resume\n resume: (params._meta as NewSessionMeta | undefined)?.claudeCode?.options\n ?.resume as string | undefined,\n });\n\n return response;\n }\n\n async unstable_forkSession(\n params: ForkSessionRequest,\n ): Promise<ForkSessionResponse> {\n return this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, forkSession: true },\n );\n }\n\n async unstable_resumeSession(\n params: ResumeSessionRequest,\n ): Promise<ResumeSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n {\n resume: params.sessionId,\n },\n );\n\n return response;\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, skipBackgroundFetches: true },\n );\n\n await this.replaySessionHistory(params.sessionId);\n\n // Send available commands after replay so they don't interleave with history\n this.deferBackgroundFetches(this.session.query);\n\n return {\n modes: response.modes,\n models: response.models,\n configOptions: response.configOptions,\n };\n }\n\n async listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n const sdkSessions = await listSessions({ dir: params.cwd ?? undefined });\n const sessions = [];\n\n for (const session of sdkSessions) {\n if (!session.cwd) continue;\n sessions.push({\n sessionId: session.sessionId,\n cwd: session.cwd,\n title: sanitizeTitle(session.customTitle || session.summary || \"\"),\n updatedAt: new Date(session.lastModified).toISOString(),\n });\n }\n return {\n sessions,\n };\n }\n\n async unstable_listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.listSessions(params);\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n this.session.accumulatedUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n };\n\n const userMessage = promptToClaude(params);\n const promptUuid = randomUUID();\n userMessage.uuid = promptUuid;\n let promptReplayed = false;\n let isLocalOnlyCommand = false;\n\n // Detect local-only slash commands that return results without model invocation\n const msgContent = userMessage.message.content;\n let firstTextPart = \"\";\n if (typeof msgContent === \"string\") {\n firstTextPart = msgContent;\n } else if (Array.isArray(msgContent)) {\n for (const block of msgContent) {\n if (\"type\" in block && block.type === \"text\" && \"text\" in block) {\n firstTextPart = block.text as string;\n break;\n }\n }\n }\n const commandMatch = firstTextPart.match(/^(\\/\\S+)/);\n if (commandMatch && LOCAL_ONLY_COMMANDS.has(commandMatch[1])) {\n isLocalOnlyCommand = true;\n promptReplayed = true;\n }\n\n if (this.session.promptRunning) {\n this.session.input.push(userMessage);\n const order = this.session.nextPendingOrder++;\n const cancelled = await new Promise<boolean>((resolve) => {\n this.session.pendingMessages.set(promptUuid, { resolve, order });\n });\n if (cancelled) {\n return { stopReason: \"cancelled\" };\n }\n promptReplayed = true;\n } else {\n this.session.input.push(userMessage);\n }\n\n // Broadcast user message to client\n await this.broadcastUserMessage(params);\n\n this.session.promptRunning = true;\n let handedOff = false;\n let lastAssistantTotalUsage: number | null = null;\n if (this.session.lastContextWindowSize == null) {\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n this.session.modelId ?? \"\",\n );\n this.logger.debug(\"Initial context window size from gateway\", {\n modelId: this.session.modelId,\n contextWindowSize: this.session.lastContextWindowSize,\n });\n }\n let lastContextWindowSize = this.session.lastContextWindowSize;\n\n const supportsTerminalOutput =\n (\n this.clientCapabilities?._meta as\n | ClientCapabilities[\"_meta\"]\n | undefined\n )?.terminal_output === true;\n\n const context = {\n session: this.session,\n sessionId: params.sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n supportsTerminalOutput,\n };\n\n try {\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n if (this.session.cancelled) {\n return {\n stopReason: \"cancelled\",\n _meta: this.session.interruptReason\n ? { interruptReason: this.session.interruptReason }\n : undefined,\n };\n }\n break;\n }\n\n switch (message.type) {\n case \"system\":\n if (message.subtype === \"compact_boundary\") {\n lastAssistantTotalUsage = 0;\n promptReplayed = true;\n }\n if (message.subtype === \"local_command_output\") {\n promptReplayed = true;\n }\n await handleSystemMessage(message, context);\n break;\n\n case \"result\": {\n // Skip results from background tasks that finished after our prompt started\n if (!promptReplayed) {\n this.logger.debug(\n \"Skipping background task result before prompt replay\",\n { sessionId: params.sessionId },\n );\n break;\n }\n\n if (this.session.cancelled) {\n return { stopReason: \"cancelled\" };\n }\n\n // Accumulate usage from this result\n this.session.accumulatedUsage.inputTokens +=\n message.usage.input_tokens;\n this.session.accumulatedUsage.outputTokens +=\n message.usage.output_tokens;\n this.session.accumulatedUsage.cachedReadTokens +=\n message.usage.cache_read_input_tokens;\n this.session.accumulatedUsage.cachedWriteTokens +=\n message.usage.cache_creation_input_tokens;\n\n // SDK can underreport context window (e.g. 200k for 1M models).\n // Use SDK value only if it's larger than what gateway reported.\n const contextWindows = Object.values(message.modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n const sdkContextWindow = Math.min(...contextWindows);\n if (sdkContextWindow > lastContextWindowSize) {\n lastContextWindowSize = sdkContextWindow;\n }\n }\n this.session.lastContextWindowSize = lastContextWindowSize;\n this.logger.debug(\"Context window size from result\", {\n sdkReported: contextWindows,\n resolved: lastContextWindowSize,\n modelId: this.session.modelId,\n });\n\n this.session.contextSize = lastContextWindowSize;\n if (lastAssistantTotalUsage !== null) {\n this.session.contextUsed = lastAssistantTotalUsage;\n }\n\n // Send usage_update notification\n if (lastAssistantTotalUsage !== null) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: {\n amount: message.total_cost_usd,\n currency: \"USD\",\n },\n },\n });\n }\n\n await this.client.extNotification(\"_posthog/usage_update\", {\n sessionId: params.sessionId,\n used: {\n inputTokens: message.usage.input_tokens,\n outputTokens: message.usage.output_tokens,\n cachedReadTokens: message.usage.cache_read_input_tokens,\n cachedWriteTokens: message.usage.cache_creation_input_tokens,\n },\n cost: message.total_cost_usd,\n });\n\n const usage: Usage = {\n inputTokens: this.session.accumulatedUsage.inputTokens,\n outputTokens: this.session.accumulatedUsage.outputTokens,\n cachedReadTokens: this.session.accumulatedUsage.cachedReadTokens,\n cachedWriteTokens:\n this.session.accumulatedUsage.cachedWriteTokens,\n totalTokens:\n this.session.accumulatedUsage.inputTokens +\n this.session.accumulatedUsage.outputTokens +\n this.session.accumulatedUsage.cachedReadTokens +\n this.session.accumulatedUsage.cachedWriteTokens,\n };\n\n const result = handleResultMessage(message);\n if (result.error) throw result.error;\n\n // For local-only commands, forward the result text to the client\n if (\n isLocalOnlyCommand &&\n message.subtype === \"success\" &&\n message.result\n ) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: message.result },\n },\n });\n }\n\n return { stopReason: result.stopReason ?? \"end_turn\", usage };\n }\n\n case \"stream_event\":\n await handleStreamEvent(message, context);\n break;\n\n case \"user\":\n case \"assistant\": {\n if (this.session.cancelled) {\n break;\n }\n\n // Check for prompt replay (our own message echoed back)\n if (message.type === \"user\" && \"uuid\" in message && message.uuid) {\n if (message.uuid === promptUuid) {\n promptReplayed = true;\n break;\n }\n\n const pending = this.session.pendingMessages.get(\n message.uuid as string,\n );\n if (pending) {\n pending.resolve(false);\n this.session.pendingMessages.delete(message.uuid as string);\n handedOff = true;\n // the current loop stops with end_turn,\n // the loop of the next prompt continues running\n return { stopReason: \"end_turn\" };\n }\n }\n\n // Skip replayed user messages that aren't pending prompts\n if (\n \"isReplay\" in message &&\n (message as Record<string, unknown>).isReplay\n ) {\n break;\n }\n\n // Store latest assistant usage (excluding subagents)\n if (\n \"usage\" in message.message &&\n message.parent_tool_use_id === null\n ) {\n const usage = (\n message.message as unknown as Record<string, unknown>\n ).usage as {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens: number;\n cache_creation_input_tokens: number;\n };\n lastAssistantTotalUsage =\n usage.input_tokens +\n usage.cache_read_input_tokens +\n usage.cache_creation_input_tokens;\n\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: null,\n },\n });\n }\n\n const result = await handleUserAssistantMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return { stopReason: \"end_turn\" };\n }\n break;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n case \"tool_use_summary\":\n case \"prompt_suggestion\":\n case \"rate_limit_event\":\n break;\n\n default:\n unreachable(message as never, this.logger);\n break;\n }\n }\n throw new Error(\"Session did not end in result\");\n } catch (error) {\n if (error instanceof RequestError || !(error instanceof Error)) {\n throw error;\n }\n const msg = error.message;\n if (\n msg.includes(\"ProcessTransport\") ||\n msg.includes(\"terminated process\") ||\n msg.includes(\"process exited with\") ||\n msg.includes(\"process terminated by signal\") ||\n msg.includes(\"Failed to write to process stdin\")\n ) {\n this.logger.error(`Process died: ${msg}`, {\n sessionId: this.sessionId,\n });\n this.session.settingsManager.dispose();\n this.session.input.end();\n throw RequestError.internalError(\n undefined,\n \"The Claude Agent process exited unexpectedly. Please start a new session.\",\n );\n }\n throw error;\n } finally {\n if (!handedOff) {\n this.session.promptRunning = false;\n // Resolve all remaining pending prompts so no callers get stuck.\n for (const [key, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n this.session.pendingMessages.delete(key);\n }\n }\n }\n }\n\n // Called by BaseAcpAgent#cancel() to interrupt the session\n protected async interrupt(): Promise<void> {\n this.session.cancelled = true;\n for (const [, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n }\n this.session.pendingMessages.clear();\n await this.session.query.interrupt();\n }\n\n async unstable_setSessionModel(\n params: SetSessionModelRequest,\n ): Promise<SetSessionModelResponse | undefined> {\n await this.session.query.setModel(toSdkModelId(params.modelId));\n this.session.modelId = params.modelId;\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n params.modelId,\n );\n this.rebuildEffortConfigOption(params.modelId);\n await this.updateConfigOption(\"model\", params.modelId);\n return {};\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n await this.applySessionMode(params.modeId);\n await this.updateConfigOption(\"mode\", params.modeId);\n return {};\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const option = this.session.configOptions.find(\n (o) => o.id === params.configId,\n );\n if (!option) {\n throw new Error(`Unknown config option: ${params.configId}`);\n }\n\n if (typeof params.value !== \"string\") {\n throw new Error(\n `Invalid value type for config option ${params.configId}`,\n );\n }\n\n const allValues: { value: string; name?: string; description?: string }[] =\n \"options\" in option && Array.isArray(option.options)\n ? (option.options as Array<Record<string, unknown>>).flatMap((o) =>\n \"options\" in o && Array.isArray(o.options)\n ? (o.options as {\n value: string;\n name?: string;\n description?: string;\n }[])\n : [o as { value: string; name?: string; description?: string }],\n )\n : [];\n let validValue = allValues.find((o) => o.value === params.value);\n\n // For model options, fall back to alias resolution when exact match fails.\n // This lets callers use human-friendly aliases like \"opus\" or \"sonnet\"\n // instead of full model IDs like \"claude-opus-4-6\".\n if (!validValue && params.configId === \"model\") {\n const resolved = resolveModelPreference(params.value, allValues);\n if (resolved) {\n validValue = allValues.find((o) => o.value === resolved);\n }\n }\n\n if (!validValue) {\n throw new Error(\n `Invalid value for config option ${params.configId}: ${params.value}`,\n );\n }\n\n // Use the canonical option value so downstream code always receives the\n // model ID rather than the caller-supplied alias.\n const resolvedValue = validValue.value;\n\n if (params.configId === \"mode\") {\n await this.applySessionMode(resolvedValue);\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: resolvedValue,\n },\n });\n } else if (params.configId === \"model\") {\n const sdkModelId = toSdkModelId(resolvedValue);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = resolvedValue;\n this.session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedValue);\n this.rebuildEffortConfigOption(resolvedValue);\n } else if (params.configId === \"effort\") {\n const newEffort = resolvedValue as EffortLevel;\n this.session.effort = newEffort;\n this.session.queryOptions.effort = newEffort;\n }\n\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === params.configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: resolvedValue }\n : o,\n );\n\n return { configOptions: this.session.configOptions };\n }\n\n private async updateConfigOption(\n configId: string,\n value: string,\n ): Promise<void> {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: value }\n : o,\n );\n\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions: this.session.configOptions,\n },\n });\n }\n\n private async applySessionMode(modeId: string): Promise<void> {\n if (!CODE_EXECUTION_MODES.includes(modeId as CodeExecutionMode)) {\n throw new Error(\"Invalid Mode\");\n }\n const previousMode = this.session.permissionMode;\n this.session.permissionMode = modeId as CodeExecutionMode;\n try {\n await this.session.query.setPermissionMode(modeId as CodeExecutionMode);\n } catch (error) {\n this.session.permissionMode = previousMode;\n if (error instanceof Error) {\n if (!error.message) {\n error.message = \"Invalid Mode\";\n }\n throw error;\n }\n throw new Error(\"Invalid Mode\");\n }\n }\n\n private async createSession(\n params: {\n cwd: string;\n mcpServers: NewSessionRequest[\"mcpServers\"];\n _meta?: unknown;\n },\n creationOpts: {\n resume?: string;\n forkSession?: boolean;\n skipBackgroundFetches?: boolean;\n } = {},\n ): Promise<NewSessionResponse> {\n const { cwd } = params;\n const { resume, forkSession } = creationOpts;\n\n const isResume = !!resume;\n\n const meta = params._meta as NewSessionMeta | undefined;\n const taskId = meta?.persistence?.taskId;\n const effort = meta?.claudeCode?.options?.effort as EffortLevel | undefined;\n\n // We want to create a new session id unless it is resume,\n // but not resume + forkSession.\n let sessionId: string;\n if (forkSession) {\n sessionId = uuidv7();\n } else if (isResume) {\n sessionId = resume;\n } else {\n sessionId = uuidv7();\n }\n\n const input = new Pushable<SDKUserMessage>();\n\n const settingsManager = new SettingsManager(cwd);\n await settingsManager.initialize();\n\n const mcpServers = parseMcpServers(params);\n const systemPrompt = buildSystemPrompt(meta?.systemPrompt);\n\n this.logger.info(isResume ? \"Resuming session\" : \"Creating new session\", {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n cwd,\n });\n\n const permissionMode: CodeExecutionMode =\n meta?.permissionMode &&\n CODE_EXECUTION_MODES.includes(meta.permissionMode as CodeExecutionMode)\n ? (meta.permissionMode as CodeExecutionMode)\n : \"default\";\n\n const options = buildSessionOptions({\n cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(sessionId, meta?.allowedDomains),\n logger: this.logger,\n systemPrompt,\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId,\n isResume,\n forkSession,\n additionalDirectories: [\n ...(meta?.claudeCode?.options?.additionalDirectories ?? []),\n ...(meta?.additionalRoots ?? []),\n ],\n disableBuiltInTools: meta?.disableBuiltInTools,\n settingsManager,\n onModeChange: this.createOnModeChange(),\n onProcessSpawned: this.options?.onProcessSpawned,\n onProcessExited: this.options?.onProcessExited,\n effort,\n });\n\n // Use the same abort controller that buildSessionOptions gave to the query\n const abortController = options.abortController as AbortController;\n\n const q = query({ prompt: input, options });\n\n const session: Session = {\n query: q,\n queryOptions: options,\n input,\n cancelled: false,\n settingsManager,\n permissionMode,\n abortController,\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n },\n effort,\n configOptions: [],\n promptRunning: false,\n pendingMessages: new Map(),\n nextPendingOrder: 0,\n\n // Custom properties\n cwd,\n notificationHistory: [],\n taskRunId: meta?.taskRunId,\n };\n this.session = session;\n this.sessionId = sessionId;\n\n this.logger.info(\n isResume\n ? \"Session query initialized, awaiting resumption\"\n : \"Session query initialized, awaiting initialization\",\n { sessionId, taskId, taskRunId: meta?.taskRunId },\n );\n\n try {\n const result = await withTimeout(\n q.initializationResult(),\n SESSION_VALIDATION_TIMEOUT_MS,\n );\n if (result.result === \"timeout\") {\n throw new Error(\n `Session ${isResume ? (forkSession ? \"fork\" : \"resumption\") : \"initialization\"} timed out for sessionId=${sessionId}`,\n );\n }\n } catch (err) {\n settingsManager.dispose();\n if (\n isResume &&\n err instanceof Error &&\n err.message === \"Query closed before response received\"\n ) {\n throw RequestError.resourceNotFound(sessionId);\n }\n this.logger.error(\n isResume\n ? forkSession\n ? \"Session fork failed\"\n : \"Session resumption failed\"\n : \"Session initialization failed\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n throw err;\n }\n\n if (meta?.taskRunId) {\n await this.client.extNotification(\"_posthog/sdk_session\", {\n taskRunId: meta.taskRunId,\n sessionId,\n adapter: \"claude\",\n });\n }\n\n // Resolve model: settings model takes priority, then gateway\n const settingsModel = settingsManager.getSettings().model;\n const modelOptions = await this.getModelConfigOptions();\n const resolvedModelId = settingsModel || modelOptions.currentModelId;\n session.modelId = resolvedModelId;\n session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedModelId);\n\n const resolvedSdkModel = toSdkModelId(resolvedModelId);\n if (!isResume && resolvedSdkModel !== DEFAULT_MODEL) {\n await this.session.query.setModel(resolvedSdkModel);\n }\n\n if (supports1MContext(resolvedModelId)) {\n options.betas = [\"context-1m-2025-08-07\"];\n }\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const models: SessionModelState = {\n currentModelId: resolvedModelId,\n availableModels: modelOptions.options.map(\n (opt): AcpModelInfo => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }),\n ),\n };\n\n const configOptions = this.buildConfigOptions(\n permissionMode,\n modelOptions,\n effort ?? \"high\",\n );\n session.configOptions = configOptions;\n\n if (!creationOpts.skipBackgroundFetches) {\n this.deferBackgroundFetches(q);\n }\n\n this.logger.info(\n isResume\n ? \"Session resumed successfully\"\n : \"Session created successfully\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n },\n );\n\n return { sessionId, modes, models, configOptions };\n }\n\n private createCanUseTool(\n sessionId: string,\n allowedDomains?: string[],\n ): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID, signal }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n signal,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n updateConfigOption: (configId: string, value: string) =>\n this.updateConfigOption(configId, value),\n allowedDomains,\n });\n }\n\n private createOnModeChange() {\n return async (newMode: CodeExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.updateConfigOption(\"mode\", newMode);\n };\n }\n\n private getExistingSessionState(\n sessionId: string,\n ): NewSessionResponse | null {\n if (this.sessionId !== sessionId || !this.session) return null;\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: this.session.permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const modelOptions = this.session.configOptions.find(\n (o) => o.id === \"model\",\n );\n const models: SessionModelState = {\n currentModelId: this.session.modelId ?? DEFAULT_MODEL,\n availableModels:\n modelOptions && \"options\" in modelOptions\n ? (\n modelOptions.options as Array<{\n value: string;\n name: string;\n description?: string;\n }>\n ).map((opt) => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }))\n : [],\n };\n\n return {\n sessionId,\n modes,\n models,\n configOptions: this.session.configOptions,\n };\n }\n\n private buildConfigOptions(\n currentModeId: string,\n modelOptions: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n },\n currentEffort: EffortLevel = \"high\",\n ): SessionConfigOption[] {\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n const configOptions: SessionConfigOption[] = [\n {\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: currentModeId,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description:\n \"Choose an approval and sandboxing preset for your session\",\n },\n {\n id: \"model\",\n name: \"Model\",\n type: \"select\",\n currentValue: modelOptions.currentModelId,\n options: modelOptions.options,\n category: \"model\" as SessionConfigOptionCategory,\n description: \"Choose which model Claude should use\",\n },\n ];\n\n const effortOptions = getEffortOptions(modelOptions.currentModelId);\n if (effortOptions) {\n configOptions.push({\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: currentEffort,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n });\n }\n\n return configOptions;\n }\n\n private rebuildEffortConfigOption(modelId: string): void {\n const effortOptions = getEffortOptions(modelId);\n const existingEffort = this.session.configOptions.find(\n (o) => o.id === \"effort\",\n );\n\n if (!effortOptions) {\n this.session.configOptions = this.session.configOptions.filter(\n (o) => o.id !== \"effort\",\n );\n if (this.session.effort) {\n this.session.effort = undefined;\n this.session.queryOptions.effort = undefined;\n }\n return;\n }\n\n const rawCurrentValue = existingEffort?.currentValue;\n const currentValue =\n typeof rawCurrentValue === \"string\" ? rawCurrentValue : \"high\";\n const isValidValue = effortOptions.some((o) => o.value === currentValue);\n const resolvedValue = isValidValue ? currentValue : \"high\";\n\n if (resolvedValue !== currentValue && this.session.effort) {\n this.session.effort = resolvedValue as EffortLevel;\n this.session.queryOptions.effort = resolvedValue as EffortLevel;\n }\n\n const effortConfig: SessionConfigOption = {\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: resolvedValue,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n };\n\n if (existingEffort) {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === \"effort\" ? effortConfig : o,\n );\n } else {\n this.session.configOptions.push(effortConfig);\n }\n }\n\n private async sendAvailableCommandsUpdate(): Promise<void> {\n const commands = await this.session.query.supportedCommands();\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands: getAvailableSlashCommands(commands),\n },\n });\n }\n\n private async replaySessionHistory(sessionId: string): Promise<void> {\n try {\n const messages = await getSessionMessages(sessionId, {\n dir: this.session.cwd,\n });\n\n const replayContext = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n registerHooks: false,\n };\n\n for (const msg of messages) {\n const sdkMessage = {\n type: msg.type,\n message: msg.message as {\n content: string | Array<{ type: string; text?: string }>;\n role: typeof msg.type;\n },\n parent_tool_use_id: msg.parent_tool_use_id,\n };\n await handleUserAssistantMessage(\n sdkMessage as Parameters<typeof handleUserAssistantMessage>[0],\n replayContext,\n );\n }\n } catch (err) {\n this.logger.warn(\"Failed to replay session history\", {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // ================================\n // EXTENSION METHODS\n // ================================\n\n /**\n * Fire-and-forget: fetch slash commands and MCP tool metadata in parallel.\n * Both populate caches used later — neither is needed to return configOptions.\n */\n private deferBackgroundFetches(q: Query): void {\n this.logger.info(\"Starting background fetches (commands + MCP metadata)\");\n Promise.all([\n new Promise<void>((resolve) => setTimeout(resolve, 10)).then(() =>\n this.sendAvailableCommandsUpdate(),\n ),\n fetchMcpToolMetadata(q, this.logger).then(() => {\n const serverNames = getConnectedMcpServerNames();\n if (serverNames.length > 0) {\n this.options?.onMcpServersReady?.(serverNames);\n }\n }),\n ]).catch((err) =>\n this.logger.error(\"Background fetch failed\", { error: err }),\n );\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n}\n","import type { Logger } from \"./logger\";\n\n/**\n * Races an operation against a timeout.\n * Returns success with the value if the operation completes in time,\n * or timeout if the operation takes longer than the specified duration.\n */\nexport async function withTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n): Promise<{ result: \"success\"; value: T } | { result: \"timeout\" }> {\n const timeoutPromise = new Promise<{ result: \"timeout\" }>((resolve) =>\n setTimeout(() => resolve({ result: \"timeout\" }), timeoutMs),\n );\n const operationPromise = operation.then((value) => ({\n result: \"success\" as const,\n value,\n }));\n return Promise.race([operationPromise, timeoutPromise]);\n}\n\nexport const IS_ROOT =\n typeof process !== \"undefined\" &&\n (process.geteuid?.() ?? process.getuid?.()) === 0;\n\nexport function unreachable(value: never, logger: Logger): void {\n let valueAsString: string;\n try {\n valueAsString = JSON.stringify(value);\n } catch {\n valueAsString = String(value);\n }\n logger.error(`Unexpected case: ${valueAsString}`);\n}\n","import type {\n Agent,\n AgentSideConnection,\n AuthenticateRequest,\n CancelNotification,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n SessionConfigSelectOption,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n DEFAULT_GATEWAY_MODEL,\n fetchGatewayModels,\n formatGatewayModelName,\n type GatewayModel,\n isAnthropicModel,\n} from \"../gateway-models\";\nimport { Logger } from \"../utils/logger\";\nimport type { SettingsManager } from \"./claude/session/settings\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n settingsManager: SettingsManager;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\n\nexport abstract class BaseAcpAgent implements Agent {\n abstract readonly adapterName: string;\n protected session!: BaseSession;\n protected sessionId!: string;\n client: AgentSideConnection;\n logger: Logger;\n fileContentCache: { [key: string]: string } = {};\n protected gatewayModels: GatewayModel[] = [];\n\n constructor(client: AgentSideConnection) {\n this.client = client;\n this.logger = new Logger({ debug: true, prefix: \"[BaseAcpAgent]\" });\n }\n\n abstract initialize(request: InitializeRequest): Promise<InitializeResponse>;\n abstract newSession(params: NewSessionRequest): Promise<NewSessionResponse>;\n abstract prompt(params: PromptRequest): Promise<PromptResponse>;\n protected abstract interrupt(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session ID mismatch\");\n }\n this.session.cancelled = true;\n const meta = params._meta as { interruptReason?: string } | undefined;\n if (meta?.interruptReason) {\n this.session.interruptReason = meta.interruptReason;\n }\n await this.interrupt();\n }\n\n async closeSession(): Promise<void> {\n try {\n // Abort first so in-flight HTTP requests are cancelled,\n // otherwise interrupt() deadlocks waiting for the query to stop\n // while the query waits on an API call that will never abort.\n this.session.abortController.abort();\n await this.cancel({ sessionId: this.sessionId });\n this.session.settingsManager.dispose();\n this.logger.info(\"Closed session\", { sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"Failed to close session\", {\n sessionId: this.sessionId,\n error: err,\n });\n }\n }\n\n hasSession(sessionId: string): boolean {\n return this.sessionId === sessionId;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n if (this.sessionId === sessionId) {\n this.session.notificationHistory.push(notification);\n }\n }\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await this.client.readTextFile(params);\n if (!params.limit && !params.line) {\n this.fileContentCache[params.path] = response.content;\n }\n return response;\n }\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n const response = await this.client.writeTextFile(params);\n this.fileContentCache[params.path] = params.content;\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async getModelConfigOptions(currentModelOverride?: string): Promise<{\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }> {\n this.gatewayModels = await fetchGatewayModels();\n\n const options = this.gatewayModels\n .filter((model) => isAnthropicModel(model))\n .map((model) => ({\n value: model.id,\n name: formatGatewayModelName(model),\n description: `Context: ${model.context_window.toLocaleString()} tokens`,\n }));\n\n const isAnthropicModelId = (modelId: string): boolean =>\n modelId.startsWith(\"claude-\") || modelId.startsWith(\"anthropic/\");\n\n let currentModelId = currentModelOverride ?? DEFAULT_GATEWAY_MODEL;\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n if (!isAnthropicModelId(currentModelId)) {\n currentModelId = DEFAULT_GATEWAY_MODEL;\n }\n }\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n options.unshift({\n value: currentModelId,\n name: currentModelId,\n description: \"Custom model\",\n });\n }\n\n return { currentModelId, options };\n }\n\n getContextWindowForModel(modelId: string): number {\n const match = this.gatewayModels.find((m) => m.id === modelId);\n return match?.context_window ?? DEFAULT_CONTEXT_WINDOW;\n }\n}\n","import * as path from \"node:path\";\nimport type { PromptRequest } from \"@agentclientprotocol/sdk\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\n\ntype ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\nfunction sdkText(value: string): ContentBlockParam {\n return { type: \"text\", text: value };\n}\n\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"file://\")) {\n const filePath = uri.slice(7);\n const name = path.basename(filePath) || filePath;\n return `[@${name}](${uri})`;\n }\n if (uri.startsWith(\"zed://\")) {\n const name = path.basename(uri) || uri;\n return `[@${name}](${uri})`;\n }\n return uri;\n } catch {\n return uri;\n }\n}\n\nfunction transformMcpCommand(text: string): string {\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n return `/${server}:${command} (MCP)${args || \"\"}`;\n }\n return text;\n}\n\nfunction processPromptChunk(\n chunk: PromptRequest[\"prompt\"][number],\n content: ContentBlockParam[],\n context: ContentBlockParam[],\n): void {\n switch (chunk.type) {\n case \"text\":\n content.push(sdkText(transformMcpCommand(chunk.text)));\n break;\n\n case \"resource_link\":\n content.push(sdkText(formatUriAsLink(chunk.uri)));\n break;\n\n case \"resource\":\n if (\"text\" in chunk.resource) {\n content.push(sdkText(formatUriAsLink(chunk.resource.uri)));\n context.push(\n sdkText(\n `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n ),\n );\n }\n break;\n\n case \"image\":\n if (chunk.data) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n data: chunk.data,\n media_type: chunk.mimeType as ImageMimeType,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: chunk.uri },\n });\n }\n break;\n\n default:\n break;\n }\n}\n\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: ContentBlockParam[] = [];\n const context: ContentBlockParam[] = [];\n\n const prContext = (prompt._meta as Record<string, unknown> | undefined)\n ?.prContext;\n if (typeof prContext === \"string\") {\n content.push(sdkText(prContext));\n }\n\n for (const chunk of prompt.prompt) {\n processPromptChunk(chunk, content, context);\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: { role: \"user\", content },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n","import type {\n AgentSideConnection,\n Role,\n SessionNotification,\n SessionUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport { RequestError, type StopReason } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKAssistantMessage,\n SDKMessage,\n SDKPartialAssistantMessage,\n SDKResultMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaContentBlock,\n BetaRawContentBlockDelta,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\nimport { image, text } from \"../../../utils/acp-content\";\nimport { unreachable } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { registerHookCallback } from \"../hooks\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromEditToolResponse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp\";\n\ntype AnthropicContentChunk =\n | ContentBlockParam\n | BetaContentBlock\n | BetaRawContentBlockDelta;\n\ntype AnthropicMessageContent = string | Array<{ type: string; text?: string }>;\n\ninterface AnthropicMessageWithContent {\n type: Role;\n message: {\n content: AnthropicMessageContent;\n role?: Role;\n model?: string;\n };\n}\n\ntype ChunkHandlerContext = {\n sessionId: string;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n client: AgentSideConnection;\n logger: Logger;\n parentToolCallId?: string;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n cwd?: string;\n /** Raw MCP tool result from SDKUserMessage.tool_use_result (contains content, structuredContent, _meta) */\n mcpToolUseResult?: Record<string, unknown>;\n};\n\nexport interface MessageHandlerContext {\n session: Session;\n sessionId: string;\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(\n toolName: string,\n toolResponse?: unknown,\n parentToolCallId?: string,\n): ToolUpdateMeta {\n const meta: ToolUpdateMeta[\"claudeCode\"] = { toolName };\n if (toolResponse !== undefined) meta.toolResponse = toolResponse;\n if (parentToolCallId) meta.parentToolCallId = parentToolCallId;\n return { claudeCode: meta };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionUpdate {\n return {\n sessionUpdate: messageUpdateType(role),\n content: image(\n chunk.source.type === \"base64\" ? (chunk.source.data ?? \"\") : \"\",\n chunk.source.type === \"base64\" ? (chunk.source.media_type ?? \"\") : \"\",\n chunk.source.type === \"url\" ? chunk.source.url : undefined,\n ),\n };\n}\n\nfunction handleThinkingChunk(\n chunk: { thinking: string },\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__thinking__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionUpdate | null {\n const alreadyCached = chunk.id in ctx.toolUseCache;\n ctx.toolUseCache[chunk.id] = chunk;\n\n if (chunk.name === \"TodoWrite\") {\n const input = chunk.input as { todos?: unknown[] };\n if (Array.isArray(input.todos)) {\n return {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n return null;\n }\n\n if (!alreadyCached && ctx.registerHooks !== false) {\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n const editUpdate =\n toolUse.name === \"Edit\"\n ? toolUpdateFromEditToolResponse(toolResponse)\n : null;\n\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse, ctx.parentToolCallId),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n ...(editUpdate ? editUpdate : {}),\n },\n });\n } else {\n ctx.logger.error(\n `Got a tool response for tool use that wasn't tracked: ${toolUseId}`,\n );\n }\n },\n });\n }\n\n let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n const toolInfo = toolInfoFromToolUse(chunk, {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.id,\n cachedFileContent: ctx.fileContentCache,\n cwd: ctx.cwd,\n });\n\n const meta: Record<string, unknown> = {\n ...toolMeta(chunk.name, undefined, ctx.parentToolCallId),\n };\n if (chunk.name === \"Bash\" && ctx.supportsTerminalOutput && !alreadyCached) {\n meta.terminal_info = { terminal_id: chunk.id };\n }\n\n if (alreadyCached) {\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call_update\" as const,\n rawInput,\n ...toolInfo,\n };\n }\n\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\" as const,\n rawInput,\n status: \"pending\",\n ...toolInfo,\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n typeof (item as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((item as { text: string }).text);\n }\n }\n return parts.length > 0 ? parts.join(\"\") : null;\n }\n if (typeof content === \"string\") {\n return content;\n }\n return null;\n}\n\nfunction stripCatLineNumbers(text: string): string {\n return text.replace(/^ *\\d+[\\t→]/gm, \"\");\n}\n\nfunction updateFileContentCache(\n toolUse: { name: string; input: unknown },\n chunk: { content?: unknown },\n ctx: ChunkHandlerContext,\n): void {\n const input = toolUse.input as Record<string, unknown> | undefined;\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n if (!filePath) return;\n\n if (toolUse.name === \"Read\" && !input?.limit && !input?.offset) {\n const fileText = extractTextFromContent(chunk.content);\n if (fileText !== null) {\n ctx.fileContentCache[filePath] = stripCatLineNumbers(fileText);\n }\n } else if (toolUse.name === \"Write\") {\n const content = input?.content;\n if (typeof content === \"string\") {\n ctx.fileContentCache[filePath] = content;\n }\n } else if (toolUse.name === \"Edit\") {\n const oldString = input?.old_string;\n const newString = input?.new_string;\n if (\n typeof oldString === \"string\" &&\n typeof newString === \"string\" &&\n filePath in ctx.fileContentCache\n ) {\n const current = ctx.fileContentCache[filePath];\n ctx.fileContentCache[filePath] = input?.replace_all\n ? current.replaceAll(oldString, newString)\n : current.replace(oldString, newString);\n }\n }\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n const toolUse = ctx.toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n ctx.logger.error(\n `Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n return [];\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return [];\n }\n\n if (!chunk.is_error) {\n updateFileContentCache(toolUse, chunk, ctx);\n }\n\n const { _meta: resultMeta, ...toolUpdate } = toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.tool_use_id,\n cachedFileContent: ctx.fileContentCache,\n },\n );\n\n const updates: SessionUpdate[] = [];\n\n if (resultMeta?.terminal_output) {\n const terminalOutputMeta: Record<string, unknown> = {\n terminal_output: resultMeta.terminal_output,\n };\n if (ctx.parentToolCallId) {\n terminalOutputMeta.claudeCode = {\n parentToolCallId: ctx.parentToolCallId,\n };\n }\n updates.push({\n _meta: terminalOutputMeta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\" as const,\n });\n }\n\n const meta: Record<string, unknown> = {\n ...toolMeta(toolUse.name, undefined, ctx.parentToolCallId),\n ...(resultMeta?.terminal_exit\n ? { terminal_exit: resultMeta.terminal_exit }\n : {}),\n };\n\n updates.push({\n _meta: meta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n rawOutput: ctx.mcpToolUseResult\n ? { ...ctx.mcpToolUseResult, isError: chunk.is_error ?? false }\n : {\n content: Array.isArray(chunk.content)\n ? chunk.content\n : typeof chunk.content === \"string\"\n ? [{ type: \"text\" as const, text: chunk.content }]\n : [],\n isError: chunk.is_error ?? false,\n },\n ...toolUpdate,\n });\n\n return updates;\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\": {\n const update = handleTextChunk(chunk, role, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"image\": {\n const update = handleImageChunk(chunk, role);\n return update ? [update] : [];\n }\n\n case \"thinking\":\n case \"thinking_delta\": {\n const update = handleThinkingChunk(chunk, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\": {\n const update = handleToolUseChunk(chunk as ToolUseCache[string], ctx);\n return update ? [update] : [];\n }\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\":\n return handleToolResultChunk(\n chunk as AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx,\n );\n\n case \"document\":\n case \"search_result\":\n case \"redacted_thinking\":\n case \"input_json_delta\":\n case \"citations_delta\":\n case \"signature_delta\":\n case \"container_upload\":\n case \"compaction\":\n case \"compaction_delta\":\n return [];\n\n default:\n unreachable(chunk as never, ctx.logger);\n return [];\n }\n}\n\nfunction toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: Role,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n mcpToolUseResult?: Record<string, unknown>,\n): SessionNotification[] {\n if (typeof content === \"string\") {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return [{ sessionId, update }];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n mcpToolUseResult,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n for (const update of processContentChunk(chunk, role, ctx)) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nfunction streamEventToAcpNotifications(\n message: SDKPartialAssistantMessage,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n): SessionNotification[] {\n const event = message.event;\n switch (event.type) {\n case \"content_block_start\":\n return toAcpNotifications(\n [event.content_block],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n );\n case \"message_start\":\n case \"message_delta\":\n case \"message_stop\":\n case \"content_block_stop\":\n return [];\n\n default:\n unreachable(event as never, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: Extract<SDKMessage, { type: \"system\" }>,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n break;\n case \"compact_boundary\":\n await client.extNotification(\"_posthog/compact_boundary\", {\n sessionId,\n trigger: message.compact_metadata.trigger,\n preTokens: message.compact_metadata.pre_tokens,\n contextSize: session.contextSize,\n });\n break;\n case \"hook_response\":\n logger.info(\"Hook response received\", {\n hookName: message.hook_name,\n hookEvent: message.hook_event,\n });\n break;\n case \"status\":\n if (message.status === \"compacting\") {\n logger.info(\"Session compacting started\", { sessionId });\n await client.extNotification(\"_posthog/status\", {\n sessionId,\n status: \"compacting\",\n });\n }\n break;\n case \"task_notification\": {\n logger.info(\"Task notification received\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n });\n await client.extNotification(\"_posthog/task_notification\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n outputFile: message.output_file,\n });\n break;\n }\n default:\n break;\n }\n}\n\nexport type ResultMessageHandlerResult = {\n shouldStop: boolean;\n stopReason?: StopReason;\n error?: Error;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cachedWriteTokens: number;\n costUsd?: number;\n contextWindowSize?: number;\n };\n};\n\nexport function handleResultMessage(\n message: SDKResultMessage,\n): ResultMessageHandlerResult {\n const usage = extractUsageFromResult(message);\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n return {\n shouldStop: true,\n error: RequestError.authRequired(),\n usage,\n };\n }\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n }\n case \"error_during_execution\":\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\", usage };\n default:\n return { shouldStop: false, usage };\n }\n}\n\nfunction extractUsageFromResult(\n message: SDKResultMessage,\n): ResultMessageHandlerResult[\"usage\"] {\n const msg = message as Record<string, unknown>;\n const msgUsage = msg.usage as Record<string, number> | undefined;\n if (!msgUsage) return undefined;\n\n const modelUsage = msg.modelUsage as\n | Record<string, { contextWindow: number }>\n | undefined;\n let contextWindowSize: number | undefined;\n if (modelUsage) {\n const contextWindows = Object.values(modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n contextWindowSize = Math.min(...contextWindows);\n }\n }\n\n return {\n inputTokens: msgUsage.input_tokens ?? 0,\n outputTokens: msgUsage.output_tokens ?? 0,\n cachedReadTokens: msgUsage.cache_read_input_tokens ?? 0,\n cachedWriteTokens: msgUsage.cache_creation_input_tokens ?? 0,\n costUsd:\n typeof msg.total_cost_usd === \"number\" ? msg.total_cost_usd : undefined,\n contextWindowSize,\n };\n}\n\nexport async function handleStreamEvent(\n message: SDKPartialAssistantMessage,\n context: MessageHandlerContext,\n): Promise<void> {\n const { sessionId, client, toolUseCache, fileContentCache, logger } = context;\n const parentToolCallId = message.parent_tool_use_id ?? undefined;\n\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n context.session.cwd,\n )) {\n await client.sessionUpdate(notification);\n context.session.notificationHistory.push(notification);\n }\n}\n\nfunction hasLocalCommandStdout(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stdout>\")\n );\n}\n\nfunction hasLocalCommandStderr(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stderr>\")\n );\n}\n\nfunction isLoginRequiredMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"assistant\" &&\n message.message.model === \"<synthetic>\" &&\n Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\" &&\n message.message.content[0].text?.includes(\"Please run /login\") === true\n );\n}\n\nfunction isPlainTextUserMessage(message: AnthropicMessageWithContent): boolean {\n const content = message.message.content;\n return (\n message.type === \"user\" &&\n (typeof content === \"string\" ||\n (Array.isArray(content) &&\n content.length === 1 &&\n content[0].type === \"text\"))\n );\n}\n\nfunction shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isLoginRequiredMessage(message)\n );\n}\n\nfunction logSpecialMessages(\n message: AnthropicMessageWithContent,\n logger: Logger,\n): void {\n const content = message.message.content;\n if (hasLocalCommandStdout(content) && typeof content === \"string\") {\n logger.info(content);\n }\n if (hasLocalCommandStderr(content) && typeof content === \"string\") {\n logger.error(content);\n }\n}\n\nfunction filterMessageContent(\n content: AnthropicMessageContent,\n): AnthropicMessageContent {\n if (!Array.isArray(content)) {\n return content;\n }\n return content.filter(\n (block) => block.type !== \"text\" && block.type !== \"thinking\",\n );\n}\n\nexport async function handleUserAssistantMessage(\n message: SDKUserMessage | SDKAssistantMessage,\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n // Skip plain text user messages (already displayed by the ACP client)\n if (isPlainTextUserMessage(message)) {\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess =\n message.type === \"assistant\" ? filterMessageContent(content) : content;\n const parentToolCallId =\n \"parent_tool_use_id\" in message\n ? (message.parent_tool_use_id ?? undefined)\n : undefined;\n\n // Pass the raw MCP tool result (contains content, structuredContent, _meta)\n // so it can be forwarded as-is to the renderer for MCP Apps\n const mcpToolUseResult =\n message.type === \"user\" && message.tool_use_result != null\n ? (message.tool_use_result as Record<string, unknown>)\n : undefined;\n\n for (const notification of toAcpNotifications(\n contentToProcess as typeof content,\n message.message.role,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n session.cwd,\n mcpToolUseResult,\n )) {\n await client.sessionUpdate(notification);\n session.notificationHistory.push(notification);\n }\n\n return {};\n}\n","import type { ContentBlock, ToolCallContent } from \"@agentclientprotocol/sdk\";\n\nexport function text(value: string): ContentBlock {\n return { type: \"text\", text: value };\n}\n\nexport function image(\n data: string,\n mimeType: string,\n uri?: string,\n): ContentBlock {\n return { type: \"image\", data, mimeType, uri };\n}\n\nexport function resourceLink(\n uri: string,\n name: string,\n options?: {\n mimeType?: string;\n title?: string;\n description?: string;\n size?: number | null;\n },\n): ContentBlock {\n return {\n type: \"resource_link\",\n uri,\n name,\n ...options,\n };\n}\n\nclass ToolContentBuilder {\n private items: ToolCallContent[] = [];\n\n text(value: string): this {\n this.items.push({ type: \"content\", content: text(value) });\n return this;\n }\n\n image(data: string, mimeType: string, uri?: string): this {\n this.items.push({ type: \"content\", content: image(data, mimeType, uri) });\n return this;\n }\n\n diff(path: string, oldText: string | null, newText: string): this {\n this.items.push({ type: \"diff\", path, oldText, newText });\n return this;\n }\n\n build(): ToolCallContent[] {\n return this.items;\n }\n}\n\nexport function toolContent(): ToolContentBuilder {\n return new ToolContentBuilder();\n}\n","import type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Logger } from \"../../utils/logger\";\nimport type { SettingsManager } from \"./session/settings\";\nimport type { CodeExecutionMode } from \"./tools\";\n\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\nexport const registerHookCallback = (\n toolUseID: string,\n {\n onPostToolUseHook,\n }: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n },\n) => {\n toolUseCallbacks[toolUseID] = {\n onPostToolUseHook,\n };\n};\n\nexport type OnModeChange = (mode: CodeExecutionMode) => Promise<void>;\n\ninterface CreatePostToolUseHookParams {\n onModeChange?: OnModeChange;\n logger?: Logger;\n}\n\nexport const createPostToolUseHook =\n ({ onModeChange, logger }: CreatePostToolUseHookParams): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\") {\n const toolName = input.tool_name;\n\n if (onModeChange && toolName === \"EnterPlanMode\") {\n await onModeChange(\"plan\");\n }\n\n if (toolUseID) {\n const onPostToolUseHook =\n toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID];\n } else {\n logger?.error(\n `No onPostToolUseHook found for tool use ID: ${toolUseID}`,\n );\n delete toolUseCallbacks[toolUseID];\n }\n }\n }\n return { continue: true };\n };\n\nexport const createPreToolUseHook =\n (settingsManager: SettingsManager, logger: Logger): HookCallback =>\n async (input: HookInput, _toolUseID: string | undefined) => {\n if (input.hook_event_name !== \"PreToolUse\") {\n return { continue: true };\n }\n\n const toolName = input.tool_name;\n const toolInput = input.tool_input;\n const permissionCheck = settingsManager.checkPermission(\n toolName,\n toolInput,\n );\n\n if (permissionCheck.decision !== \"ask\") {\n logger.info(\n `[PreToolUseHook] Tool: ${toolName}, Decision: ${permissionCheck.decision}, Rule: ${permissionCheck.rule}`,\n );\n }\n\n switch (permissionCheck.decision) {\n case \"allow\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"allow\" as const,\n permissionDecisionReason: `Allowed by settings rule: ${permissionCheck.rule}`,\n },\n };\n case \"deny\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: `Denied by settings rule: ${permissionCheck.rule}`,\n },\n };\n default:\n return { continue: true };\n }\n };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\n ToolCallLocation,\n ToolCallUpdate,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type {\n ToolResultBlockParam,\n ToolUseBlock,\n WebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaBashCodeExecutionToolResultBlockParam,\n BetaCodeExecutionToolResultBlockParam,\n BetaRequestMCPToolResultBlockParam,\n BetaTextEditorCodeExecutionToolResultBlockParam,\n BetaToolSearchToolResultBlockParam,\n BetaWebFetchToolResultBlockParam,\n BetaWebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\n\nconst SYSTEM_REMINDER_REGEX =\n /\\s*<system-reminder>[\\s\\S]*?<\\/system-reminder>/g;\n\nfunction stripSystemReminders(value: string): string {\n return value.replace(SYSTEM_REMINDER_REGEX, \"\");\n}\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content\";\nimport { getMcpToolMetadata } from \"../mcp/tool-metadata\";\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\n/**\n * Convert an absolute file path to a project-relative path for display.\n * Returns the original path if it's outside the project directory or if no cwd is provided.\n */\nexport function toDisplayPath(filePath: string, cwd?: string): string {\n if (!cwd) return filePath;\n const resolvedCwd = path.resolve(cwd);\n const resolvedFile = path.resolve(filePath);\n if (\n resolvedFile.startsWith(resolvedCwd + path.sep) ||\n resolvedFile === resolvedCwd\n ) {\n return path.relative(resolvedCwd, resolvedFile);\n }\n return filePath;\n}\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n cwd?: string;\n },\n): ToolInfo {\n const name = toolUse.name;\n const input = toolUse.input as Record<string, unknown> | undefined;\n\n switch (name) {\n case \"Task\":\n case \"Agent\":\n return {\n title: input?.description ? String(input.description) : name,\n kind: \"think\",\n content: input?.prompt\n ? toolContent().text(String(input.prompt)).build()\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${String(input.notebook_path)}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${String(input.notebook_path)}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? toolContent().text(String(input.new_source)).build()\n : [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"Bash\":\n if (options?.supportsTerminalOutput && options?.toolUseId) {\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: [{ type: \"terminal\", terminalId: options.toolUseId }],\n };\n }\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: input?.command\n ? toolContent().text(String(input.command)).build()\n : [],\n };\n\n case \"BashOutput\":\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case \"Read\": {\n let limit = \"\";\n const inputLimit = input?.limit as number | undefined;\n const inputOffset = (input?.offset as number | undefined) ?? 1;\n if (inputLimit) {\n limit = ` (${inputOffset} - ${inputOffset + inputLimit - 1})`;\n } else if (inputOffset > 1) {\n limit = ` (from line ${inputOffset})`;\n }\n const displayPath = input?.file_path\n ? toDisplayPath(String(input.file_path), options?.cwd)\n : \"File\";\n return {\n title: `Read ${displayPath}${limit}`,\n kind: \"read\",\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: inputOffset,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${String(input.path)}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case \"Edit\": {\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const displayPath = filePath\n ? toDisplayPath(filePath, options?.cwd)\n : undefined;\n let oldText: string | null = input?.old_string\n ? String(input.old_string)\n : null;\n let newText: string = input?.new_string ? String(input.new_string) : \"\";\n\n // try to display a rich diff by first checking if file content is cached\n // and valid (old_text exists in the content), then fall back to reading\n // file from disk, then fall back to fragemented snippet diff\n if (filePath && oldText !== null) {\n const fileContent = resolveFileContent(\n filePath,\n oldText,\n options?.cachedFileContent,\n );\n if (fileContent) {\n const newContent = input?.replace_all\n ? fileContent.replaceAll(oldText, newText)\n : fileContent.replace(oldText, newText);\n oldText = fileContent;\n newText = newContent;\n }\n }\n\n return {\n title: displayPath ? `Edit \\`${displayPath}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && filePath\n ? [\n {\n type: \"diff\",\n path: filePath,\n oldText,\n newText,\n },\n ]\n : [],\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const writeFilePath = input?.file_path\n ? String(input.file_path)\n : undefined;\n const writeDisplayPath = writeFilePath\n ? toDisplayPath(writeFilePath, options?.cwd)\n : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (writeFilePath) {\n const oldContent =\n options?.cachedFileContent &&\n writeFilePath in options.cachedFileContent\n ? options.cachedFileContent[writeFilePath]\n : null;\n contentResult = toolContent()\n .diff(writeFilePath, oldContent, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: writeDisplayPath ? `Write ${writeDisplayPath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: writeFilePath ? [{ path: writeFilePath }] : [],\n };\n }\n\n case \"Glob\": {\n let label = \"Find\";\n const pathStr = input?.path ? String(input.path) : undefined;\n if (pathStr) {\n label += ` \"${pathStr}\"`;\n }\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: pathStr ? [{ path: pathStr }] : [],\n };\n }\n\n case \"Grep\": {\n let label = \"grep\";\n\n if (input?.[\"-i\"]) {\n label += \" -i\";\n }\n if (input?.[\"-n\"]) {\n label += \" -n\";\n }\n\n if (input?.[\"-A\"] !== undefined) {\n label += ` -A ${input[\"-A\"]}`;\n }\n if (input?.[\"-B\"] !== undefined) {\n label += ` -B ${input[\"-B\"]}`;\n }\n if (input?.[\"-C\"] !== undefined) {\n label += ` -C ${input[\"-C\"]}`;\n }\n\n if (input?.output_mode) {\n switch (input.output_mode) {\n case \"files_with_matches\":\n label += \" -l\";\n break;\n case \"count\":\n label += \" -c\";\n break;\n default:\n break;\n }\n }\n\n if (input?.head_limit !== undefined) {\n label += ` | head -${input.head_limit}`;\n }\n\n if (input?.glob) {\n label += ` --include=\"${String(input.glob)}\"`;\n }\n\n if (input?.type) {\n label += ` --type=${String(input.type)}`;\n }\n\n if (input?.multiline) {\n label += \" -P\";\n }\n\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n\n if (input?.path) {\n label += ` ${String(input.path)}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: \"Fetch\",\n kind: \"fetch\",\n content: input?.url\n ? [\n {\n type: \"content\",\n content: resourceLink(String(input.url), String(input.url), {\n description: input?.prompt ? String(input.prompt) : undefined,\n }),\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input?.query ? String(input.query) : \"\"}\"`;\n const allowedDomains = input?.allowed_domains as string[] | undefined;\n const blockedDomains = input?.blocked_domains as string[] | undefined;\n\n if (allowedDomains && allowedDomains.length > 0) {\n label += ` (allowed: ${allowedDomains.join(\", \")})`;\n }\n\n if (blockedDomains && blockedDomains.length > 0) {\n label += ` (blocked: ${blockedDomains.join(\", \")})`;\n }\n\n return {\n title: label,\n kind: \"fetch\",\n content: [],\n };\n }\n\n case \"TodoWrite\":\n return {\n title: Array.isArray(input?.todos)\n ? `Update TODOs: ${input.todos.map((todo: { content?: string }) => todo.content).join(\", \")}`\n : \"Update TODOs\",\n kind: \"think\",\n content: [],\n };\n\n case \"ExitPlanMode\":\n return {\n title: \"Ready to code?\",\n kind: \"switch_mode\",\n content: input?.plan\n ? toolContent().text(String(input.plan)).build()\n : [],\n };\n\n case \"AskUserQuestion\": {\n const questions = input?.questions as\n | Array<{ question?: string }>\n | undefined;\n return {\n title: questions?.[0]?.question || \"Question\",\n kind: \"other\" as ToolKind,\n content: questions\n ? toolContent()\n .text(JSON.stringify(questions, null, 2))\n .build()\n : [],\n };\n }\n\n case \"Other\": {\n let output: string;\n try {\n output = JSON.stringify(input, null, 2);\n } catch {\n output = typeof input === \"string\" ? input : \"{}\";\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: toolContent().text(`\\`\\`\\`json\\n${output}\\`\\`\\``).build(),\n };\n }\n\n default: {\n if (name?.startsWith(\"mcp__\")) {\n return mcpToolInfo(name, input);\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\n }\n}\n\nfunction mcpToolInfo(\n name: string,\n _input: Record<string, unknown> | undefined,\n): ToolInfo {\n const metadata = getMcpToolMetadata(name);\n // Fallback: parse tool name from mcp__<server>__<tool> prefix\n const title =\n metadata?.name ?? (name.split(\"__\").slice(2).join(\"__\") || name);\n\n return {\n title,\n kind: \"other\",\n content: [],\n };\n}\n\ninterface StructuredPatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface StructuredPatch {\n oldFileName: string;\n newFileName: string;\n hunks: StructuredPatchHunk[];\n}\n\nexport function toolUpdateFromEditToolResponse(\n toolResponse: unknown,\n): { content: ToolCallContent[]; locations: ToolCallLocation[] } | null {\n if (!toolResponse || typeof toolResponse !== \"object\") return null;\n const response = toolResponse as Record<string, unknown>;\n\n const patches = response.structuredPatch as StructuredPatch[] | undefined;\n if (!Array.isArray(patches) || patches.length === 0) return null;\n\n const content: ToolCallContent[] = [];\n const locations: ToolCallLocation[] = [];\n\n for (const patch of patches) {\n if (!patch.hunks || patch.hunks.length === 0) continue;\n\n const filePath = patch.newFileName || patch.oldFileName;\n\n const oldLines: string[] = [];\n const newLines: string[] = [];\n for (const hunk of patch.hunks) {\n for (const line of hunk.lines) {\n if (line.startsWith(\"-\")) {\n oldLines.push(line.slice(1));\n } else if (line.startsWith(\"+\")) {\n newLines.push(line.slice(1));\n } else if (line.startsWith(\" \")) {\n oldLines.push(line.slice(1));\n newLines.push(line.slice(1));\n }\n }\n }\n\n content.push({\n type: \"diff\",\n path: filePath,\n oldText: oldLines.join(\"\\n\"),\n newText: newLines.join(\"\\n\"),\n });\n\n const firstHunk = patch.hunks[0];\n locations.push({\n path: filePath,\n line: firstHunk.newStart,\n });\n }\n\n if (content.length === 0) return null;\n return { content, locations };\n}\n\nexport function toolUpdateFromToolResult(\n toolResult:\n | ToolResultBlockParam\n | BetaWebSearchToolResultBlockParam\n | BetaWebFetchToolResultBlockParam\n | WebSearchToolResultBlockParam\n | BetaCodeExecutionToolResultBlockParam\n | BetaBashCodeExecutionToolResultBlockParam\n | BetaTextEditorCodeExecutionToolResultBlockParam\n | BetaRequestMCPToolResultBlockParam\n | BetaToolSearchToolResultBlockParam,\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\"> | undefined,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n },\n): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\" | \"_meta\"> {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n (toolResult.content as unknown[]).length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n\n switch (toolUse?.name) {\n case \"Read\":\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((item) => {\n const itemObj = item as {\n type?: string;\n text?: string;\n source?: { data?: string; media_type?: string };\n };\n if (itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(\n markdownEscape(stripSystemReminders(itemObj.text ?? \"\")),\n ),\n };\n }\n if (itemObj.type === \"image\" && itemObj.source) {\n return {\n type: \"content\" as const,\n content: {\n type: \"image\" as const,\n data: itemObj.source.data ?? \"\",\n mimeType: itemObj.source.media_type ?? \"image/png\",\n },\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: toolContent()\n .text(markdownEscape(stripSystemReminders(toolResult.content)))\n .build(),\n };\n }\n return {};\n\n case \"Bash\": {\n const result = toolResult.content;\n const terminalId =\n \"tool_use_id\" in toolResult ? String(toolResult.tool_use_id) : \"\";\n const isError = \"is_error\" in toolResult && toolResult.is_error;\n\n let output = \"\";\n let exitCode = isError ? 1 : 0;\n\n if (\n result &&\n typeof result === \"object\" &&\n \"type\" in result &&\n (result as { type: string }).type === \"bash_code_execution_result\"\n ) {\n const bashResult = result as {\n stdout?: string;\n stderr?: string;\n return_code: number;\n };\n output = [bashResult.stdout, bashResult.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n exitCode = bashResult.return_code;\n } else if (typeof result === \"string\") {\n output = result;\n } else if (\n Array.isArray(result) &&\n result.length > 0 &&\n \"text\" in result[0] &&\n typeof result[0].text === \"string\"\n ) {\n output = result.map((c: { text?: string }) => c.text ?? \"\").join(\"\\n\");\n }\n\n if (options?.supportsTerminalOutput) {\n return {\n content: [{ type: \"terminal\" as const, terminalId }],\n _meta: {\n terminal_info: {\n terminal_id: terminalId,\n },\n terminal_output: {\n terminal_id: terminalId,\n data: output,\n },\n terminal_exit: {\n terminal_id: terminalId,\n exit_code: exitCode,\n signal: null,\n },\n },\n };\n }\n if (output.trim()) {\n return {\n content: toolContent()\n .text(`\\`\\`\\`console\\n${output.trimEnd()}\\n\\`\\`\\``)\n .build(),\n };\n }\n return {};\n }\n case \"Edit\":\n case \"Write\":\n return {};\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\n }\n case \"AskUserQuestion\": {\n const content = toolResult.content;\n if (Array.isArray(content) && content.length > 0) {\n const firstItem = content[0];\n if (\n typeof firstItem === \"object\" &&\n firstItem !== null &&\n \"text\" in firstItem\n ) {\n return {\n title: \"Answer received\",\n content: toolContent().text(String(firstItem.text)).build(),\n };\n }\n }\n return { title: \"Question answered\" };\n }\n case \"WebFetch\": {\n const input = toolUse?.input as Record<string, unknown> | undefined;\n const url = input?.url ? String(input.url) : \"\";\n const prompt = input?.prompt ? String(input.prompt) : undefined;\n\n const resultContent = toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n\n const content: ToolCallContent[] = [];\n if (url) {\n content.push({\n type: \"content\",\n content: resourceLink(url, url, {\n description: prompt,\n }),\n });\n }\n if (resultContent.content) {\n content.push(...resultContent.content);\n }\n\n return { content };\n }\n default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n }\n}\n\nfunction itemToText(item: unknown): string | null {\n if (!item || typeof item !== \"object\") return null;\n const obj = item as Record<string, unknown>;\n // Standard text block\n if (obj.type === \"text\" && typeof obj.text === \"string\") {\n return stripSystemReminders(obj.text);\n }\n // Any other structured object — serialize it\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return null;\n }\n}\n\nfunction toAcpContentUpdate(\n content: unknown,\n isError: boolean = false,\n): Pick<ToolCallUpdate, \"content\"> {\n if (Array.isArray(content) && content.length > 0) {\n const texts: string[] = [];\n for (const item of content) {\n const t = itemToText(item);\n if (t) texts.push(t);\n }\n if (texts.length > 0) {\n const combined = texts.join(\"\\n\");\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${combined}\\n\\`\\`\\`` : combined)\n .build(),\n };\n }\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content)\n .build(),\n };\n } else if (content && typeof content === \"object\") {\n try {\n const json = JSON.stringify(content, null, 2);\n if (json && json !== \"{}\") {\n return {\n content: toolContent().text(json).build(),\n };\n }\n } catch {\n // ignore serialization errors\n }\n }\n return {};\n}\n\nexport type ClaudePlanEntry = {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n};\n\nexport function planEntries(input: { todos: ClaudePlanEntry[] }): PlanEntry[] {\n return input.todos.map((input) => ({\n content: input.content,\n status: input.status,\n priority: \"medium\",\n }));\n}\n\n/**\n * attempt to resolve full file contents for diff generation\n *\n * 1) check file content cache exists, and is valid (old_text in content)\n * 2) if missing or invalid, read file from disk\n * 3) if both fail, return null, we'll fall back to fragmented snippet diff\n */\nfunction resolveFileContent(\n filePath: string,\n oldText: string,\n cachedFileContent?: Record<string, string>,\n): string | null {\n if (cachedFileContent && filePath in cachedFileContent) {\n const cached = cachedFileContent[filePath];\n if (cached.includes(oldText)) {\n return cached;\n }\n }\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n if (content.includes(oldText)) {\n return content;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction markdownEscape(text: string): string {\n let escapedText = \"```\";\n for (const [m] of text.matchAll(/^```+/gm)) {\n while (m.length >= escapedText.length) {\n escapedText += \"`\";\n }\n }\n return `${escapedText}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${escapedText}`;\n}\n","import type { McpServerStatus, Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Logger } from \"../../../utils/logger\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n name: string;\n description?: string;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nconst PENDING_RETRY_INTERVAL_MS = 1_000;\nconst PENDING_MAX_RETRIES = 10;\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function fetchMcpToolMetadata(\n q: Query,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n let retries = 0;\n\n while (retries <= PENDING_MAX_RETRIES) {\n let statuses: McpServerStatus[];\n try {\n statuses = await q.mcpServerStatus();\n } catch (error) {\n logger.error(\"Failed to fetch MCP server status\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n\n const pendingServers = statuses.filter((s) => s.status === \"pending\");\n\n for (const server of statuses) {\n if (server.status !== \"connected\" || !server.tools) {\n continue;\n }\n\n let readOnlyCount = 0;\n for (const tool of server.tools) {\n const toolKey = buildToolKey(server.name, tool.name);\n const readOnly = tool.annotations?.readOnly === true;\n\n mcpToolMetadataCache.set(toolKey, {\n readOnly,\n name: tool.name,\n description: tool.description,\n });\n if (readOnly) readOnlyCount++;\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName: server.name,\n toolCount: server.tools.length,\n readOnlyCount,\n });\n }\n\n if (pendingServers.length === 0) {\n return;\n }\n\n retries++;\n if (retries > PENDING_MAX_RETRIES) {\n logger.warn(\"Gave up waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n });\n return;\n }\n\n logger.info(\"Waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n retry: retries,\n });\n await delay(PENDING_RETRY_INTERVAL_MS);\n }\n}\n\nexport function getMcpToolMetadata(\n toolName: string,\n): McpToolMetadata | undefined {\n return mcpToolMetadataCache.get(toolName);\n}\n\nexport function isMcpToolReadOnly(toolName: string): boolean {\n const metadata = mcpToolMetadataCache.get(toolName);\n return metadata?.readOnly === true;\n}\n\nexport function getConnectedMcpServerNames(): string[] {\n const names = new Set<string>();\n for (const key of mcpToolMetadataCache.keys()) {\n const parts = key.split(\"__\");\n if (parts.length >= 3) names.add(parts[1]);\n }\n return [...names];\n}\n\nexport function clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\n\nfunction getClaudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n}\n\nexport function getClaudePlansDir(): string {\n return path.join(getClaudeConfigDir(), \"plans\");\n}\n\nexport function isClaudePlanFilePath(filePath: string | undefined): boolean {\n if (!filePath) return false;\n const resolved = path.resolve(filePath);\n const plansDir = path.resolve(getClaudePlansDir());\n return resolved === plansDir || resolved.startsWith(plansDir + path.sep);\n}\n\nexport function isPlanReady(plan: string | undefined): boolean {\n if (!plan) return false;\n const trimmed = plan.trim();\n if (trimmed.length < 40) return false;\n return /(^|\\n)#{1,6}\\s+\\S/.test(trimmed);\n}\n\nexport function getLatestAssistantText(\n notifications: SessionNotification[],\n): string | null {\n const chunks: string[] = [];\n let started = false;\n\n for (let i = notifications.length - 1; i >= 0; i -= 1) {\n const update = notifications[i]?.update;\n if (!update) continue;\n\n if (update.sessionUpdate === \"agent_message_chunk\") {\n started = true;\n const content = update.content as {\n type?: string;\n text?: string;\n } | null;\n if (content?.type === \"text\" && content.text) {\n chunks.push(content.text);\n }\n continue;\n }\n\n if (started) {\n break;\n }\n }\n\n if (chunks.length === 0) return null;\n return chunks.reverse().join(\"\");\n}\n","import type { ToolCallContent, ToolKind } from \"@agentclientprotocol/sdk\";\nimport { z } from \"zod\";\nimport type { PermissionOption } from \"../permissions/permission-options\";\n\nexport const OPTION_PREFIX = \"option_\";\n\nexport const QuestionOptionSchema = z.object({\n label: z.string(),\n description: z.string().optional(),\n});\n\nexport const QuestionItemSchema = z.object({\n question: z.string(),\n header: z.string().optional(),\n options: z.array(QuestionOptionSchema),\n multiSelect: z.boolean().optional(),\n completed: z.boolean().optional(),\n});\n\nexport const QuestionMetaSchema = z.object({\n questions: z.array(QuestionItemSchema),\n});\n\nexport type QuestionOption = z.infer<typeof QuestionOptionSchema>;\nexport type QuestionItem = z.infer<typeof QuestionItemSchema>;\nexport type QuestionMeta = z.infer<typeof QuestionMetaSchema>;\n\nexport interface AskUserQuestionInput {\n questions?: QuestionItem[];\n question?: string;\n header?: string;\n options?: QuestionOption[];\n multiSelect?: boolean;\n}\n\nexport function normalizeAskUserQuestionInput(\n input: AskUserQuestionInput,\n): QuestionItem[] | null {\n if (input.questions && input.questions.length > 0) {\n return input.questions;\n }\n\n if (input.question) {\n return [\n {\n question: input.question,\n header: input.header,\n options: input.options || [],\n multiSelect: input.multiSelect,\n },\n ];\n }\n\n return null;\n}\n\ninterface QuestionToolCallData {\n toolCallId: string;\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n _meta: {\n codeToolKind: \"question\";\n questions: QuestionItem[];\n };\n}\n\nexport function buildQuestionToolCallData(\n questions: QuestionItem[],\n): QuestionToolCallData {\n return {\n toolCallId: `question-${Date.now()}`,\n title: questions[0]?.question ?? \"Question\",\n kind: \"other\",\n content: [],\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n };\n}\n\nexport function buildQuestionOptions(\n question: QuestionItem,\n): PermissionOption[] {\n return question.options.map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n","import { IS_ROOT } from \"./utils/common\";\n\nexport interface ModeInfo {\n id: CodeExecutionMode;\n name: string;\n description: string;\n}\n\n// Helper constant that can easily be toggled for env/feature flag/etc\nconst ALLOW_BYPASS = !IS_ROOT;\n\nconst availableModes: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Default\",\n description: \"Standard behavior, prompts for dangerous operations\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Auto-accept file edit operations\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Planning mode, no actual tool execution\",\n },\n // {\n // id: \"dontAsk\",\n // name: \"Don't Ask\",\n // description: \"Don't prompt for permissions, deny if not pre-approved\",\n // },\n];\n\nif (ALLOW_BYPASS) {\n availableModes.push({\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Bypass all permission checks\",\n });\n}\n\n// Expose execution mode IDs in type-safe order for type checks\nexport const CODE_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n // \"dontAsk\",\n \"bypassPermissions\",\n] as const;\n\nexport type CodeExecutionMode = (typeof CODE_EXECUTION_MODES)[number];\n\nexport function getAvailableModes(): ModeInfo[] {\n // When IS_ROOT, do not allow bypassPermissions\n return IS_ROOT\n ? availableModes.filter((m) => m.id !== \"bypassPermissions\")\n : availableModes;\n}\n","export {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n type ModeInfo,\n} from \"../../execution-mode\";\n\nimport type { CodeExecutionMode } from \"../../execution-mode\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata\";\n\nexport const READ_TOOLS: Set<string> = new Set([\"Read\", \"NotebookRead\"]);\n\nexport const WRITE_TOOLS: Set<string> = new Set([\n \"Edit\",\n \"Write\",\n \"NotebookEdit\",\n]);\n\nexport const BASH_TOOLS: Set<string> = new Set([\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n]);\n\nexport const SEARCH_TOOLS: Set<string> = new Set([\"Glob\", \"Grep\", \"LS\"]);\n\nexport const WEB_TOOLS: Set<string> = new Set([\"WebSearch\", \"WebFetch\"]);\n\nexport const AGENT_TOOLS: Set<string> = new Set([\n \"Task\",\n \"Agent\",\n \"TodoWrite\",\n \"Skill\",\n]);\n\nconst BASE_ALLOWED_TOOLS = [\n ...READ_TOOLS,\n ...SEARCH_TOOLS,\n ...WEB_TOOLS,\n ...AGENT_TOOLS,\n];\n\nconst AUTO_ALLOWED_TOOLS: Record<string, Set<string>> = {\n default: new Set(BASE_ALLOWED_TOOLS),\n acceptEdits: new Set([...BASE_ALLOWED_TOOLS, ...WRITE_TOOLS]),\n plan: new Set(BASE_ALLOWED_TOOLS),\n // dontAsk: new Set(BASE_ALLOWED_TOOLS),\n};\n\nexport function isToolAllowedForMode(\n toolName: string,\n mode: CodeExecutionMode,\n): boolean {\n if (mode === \"bypassPermissions\") {\n return true;\n }\n if (AUTO_ALLOWED_TOOLS[mode]?.has(toolName) === true) {\n return true;\n }\n if (isMcpToolReadOnly(toolName)) {\n return true;\n }\n return false;\n}\n","import type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools\";\n\nexport interface PermissionOption {\n kind: \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n name: string;\n optionId: string;\n _meta?: { description?: string; customInput?: boolean };\n}\n\nfunction permissionOptions(allowAlwaysLabel: string): PermissionOption[] {\n return [\n { kind: \"allow_once\", name: \"Yes\", optionId: \"allow\" },\n { kind: \"allow_always\", name: allowAlwaysLabel, optionId: \"allow_always\" },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject\",\n _meta: { customInput: true },\n },\n ];\n}\n\nexport function buildPermissionOptions(\n toolName: string,\n toolInput: Record<string, unknown>,\n cwd?: string,\n suggestions?: PermissionUpdate[],\n): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const rawRuleContent = suggestions\n ?.flatMap((s) => (\"rules\" in s ? s.rules : []))\n .find((r) => r.toolName === \"Bash\" && r.ruleContent)?.ruleContent;\n const ruleContent = rawRuleContent?.replace(/:?\\*$/, \"\");\n\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n const label = ruleContent ?? `\\`${cmdName}\\` commands`;\n\n return permissionOptions(\n `Yes, and don't ask again for ${label}${cwdLabel}`,\n );\n }\n\n if (toolName === \"BashOutput\") {\n return permissionOptions(\"Yes, allow all background process reads\");\n }\n\n if (toolName === \"KillShell\") {\n return permissionOptions(\"Yes, allow killing processes\");\n }\n\n if (WRITE_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all edits during this session\");\n }\n\n if (READ_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all reads during this session\");\n }\n\n if (SEARCH_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all searches during this session\");\n }\n\n if (toolName === \"WebFetch\") {\n const url = toolInput?.url as string | undefined;\n let domain = \"\";\n try {\n domain = url ? new URL(url).hostname : \"\";\n } catch {}\n return permissionOptions(\n domain\n ? `Yes, allow all fetches from ${domain}`\n : \"Yes, allow all fetches\",\n );\n }\n\n if (toolName === \"WebSearch\") {\n return permissionOptions(\"Yes, allow all web searches\");\n }\n\n if (toolName === \"Task\") {\n return permissionOptions(\"Yes, allow all sub-tasks\");\n }\n\n if (toolName === \"TodoWrite\") {\n return permissionOptions(\"Yes, allow all todo updates\");\n }\n\n return permissionOptions(\"Yes, always allow\");\n}\n\nconst ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;\n\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n const options: PermissionOption[] = [];\n\n if (ALLOW_BYPASS) {\n options.push({\n kind: \"allow_always\",\n name: \"Yes, bypass all permissions\",\n optionId: \"bypassPermissions\",\n });\n }\n\n options.push(\n {\n kind: \"allow_always\",\n name: \"Yes, and auto-accept edits\",\n optionId: \"acceptEdits\",\n },\n {\n kind: \"allow_once\",\n name: \"Yes, and manually approve edits\",\n optionId: \"default\",\n },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject_with_feedback\",\n _meta: { customInput: true },\n },\n );\n\n return options;\n}\n","import type {\n AgentSideConnection,\n RequestPermissionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { text } from \"../../../utils/acp-content\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools\";\nimport type { Session } from \"../types\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options\";\n\nexport type ToolPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput: Record<string, unknown>;\n updatedPermissions?: PermissionUpdate[];\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n };\n\ninterface ToolHandlerContext {\n session: Session;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseID: string;\n suggestions?: PermissionUpdate[];\n signal?: AbortSignal;\n client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n updateConfigOption: (configId: string, value: string) => Promise<void>;\n allowedDomains?: string[];\n}\n\nasync function emitToolDenial(\n context: ToolHandlerContext,\n message: string,\n): Promise<void> {\n context.logger.info(`[canUseTool] Tool denied: ${context.toolName}`, {\n message,\n });\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: context.toolUseID,\n status: \"failed\",\n content: [{ type: \"content\", content: text(message) }],\n },\n });\n}\n\nfunction getPlanFromFile(\n session: Session,\n fileContentCache: { [key: string]: string },\n): string | undefined {\n return (\n session.lastPlanContent ||\n (session.lastPlanFilePath\n ? fileContentCache[session.lastPlanFilePath]\n : undefined)\n );\n}\n\nfunction ensurePlanInInput(\n toolInput: Record<string, unknown>,\n fallbackPlan: string | undefined,\n): Record<string, unknown> {\n const hasPlan = typeof (toolInput as { plan?: unknown })?.plan === \"string\";\n if (hasPlan || !fallbackPlan) {\n return toolInput;\n }\n return { ...toolInput, plan: fallbackPlan };\n}\n\nfunction extractPlanText(input: Record<string, unknown>): string | undefined {\n const plan = (input as { plan?: unknown })?.plan;\n return typeof plan === \"string\" ? plan : undefined;\n}\n\nasync function createPlanValidationError(\n message: string,\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n}\n\nasync function validatePlanContent(\n planText: string | undefined,\n context: ToolHandlerContext,\n): Promise<{ valid: true } | { valid: false; error: ToolPermissionResult }> {\n if (!planText) {\n const message = `Plan not ready. Provide the full markdown plan in ExitPlanMode or write it to ${getClaudePlansDir()} before requesting approval.`;\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n if (!isPlanReady(planText)) {\n const message =\n \"Plan not ready. Provide the full markdown plan in ExitPlanMode before requesting approval.\";\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n return { valid: true };\n}\n\nasync function requestPlanApproval(\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<RequestPermissionResponse> {\n const { client, sessionId, toolUseID } = context;\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: updatedInput,\n });\n\n return await client.requestPermission({\n options: buildExitPlanModePermissionOptions(),\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...updatedInput, toolName: context.toolName },\n },\n });\n}\n\nasync function applyPlanApproval(\n response: RequestPermissionResponse,\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<ToolPermissionResult> {\n const { session } = context;\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"default\" ||\n response.outcome.optionId === \"acceptEdits\" ||\n response.outcome.optionId === \"bypassPermissions\")\n ) {\n session.permissionMode = response.outcome\n .optionId as typeof session.permissionMode;\n await session.query.setPermissionMode(response.outcome.optionId);\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: response.outcome.optionId,\n },\n });\n await context.updateConfigOption(\"mode\", response.outcome.optionId);\n\n return {\n behavior: \"allow\",\n updatedInput,\n updatedPermissions: context.suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"localSettings\",\n },\n ],\n };\n }\n\n const customInput = (response._meta as Record<string, unknown> | undefined)\n ?.customInput as string | undefined;\n const feedback = customInput?.trim();\n\n const message = feedback\n ? `User rejected the plan with feedback: ${feedback}`\n : \"User rejected the plan. Wait for the user to provide direction.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: !feedback };\n}\n\nasync function handleEnterPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.updateConfigOption(\"mode\", \"plan\");\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nasync function handleExitPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput, fileContentCache } = context;\n\n const planFromFile = getPlanFromFile(session, fileContentCache);\n const latestText = getLatestAssistantText(session.notificationHistory);\n const fallbackPlan = planFromFile || (latestText ?? undefined);\n const updatedInput = ensurePlanInInput(toolInput, fallbackPlan);\n const planText = extractPlanText(updatedInput);\n\n const validationResult = await validatePlanContent(planText, context);\n if (!validationResult.valid) {\n return validationResult.error;\n }\n\n const response = await requestPlanApproval(context, updatedInput);\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n return await applyPlanApproval(response, context, updatedInput);\n}\n\nfunction buildQuestionOptions(question: QuestionItem) {\n return (question.options || []).map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n\nasync function handleAskUserQuestionTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const input = context.toolInput as AskUserQuestionInput;\n context.logger.info(\"[AskUserQuestion] Received input\", { input });\n const questions = normalizeAskUserQuestionInput(input);\n context.logger.info(\"[AskUserQuestion] Normalized questions\", { questions });\n\n if (!questions || questions.length === 0) {\n context.logger.warn(\"[AskUserQuestion] No questions found in input\");\n return {\n behavior: \"deny\",\n message: \"No questions provided\",\n };\n }\n\n const { client, sessionId, toolUseID, toolInput } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: toolInput,\n });\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: firstQuestion.question,\n kind: \"other\",\n content: toolInfo.content,\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (response.outcome?.outcome !== \"selected\") {\n const customMessage = (\n response._meta as Record<string, unknown> | undefined\n )?.message;\n return {\n behavior: \"deny\",\n message:\n typeof customMessage === \"string\"\n ? customMessage\n : \"User cancelled the questions\",\n };\n }\n\n const answers = response._meta?.answers as Record<string, string> | undefined;\n if (!answers || Object.keys(answers).length === 0) {\n return {\n behavior: \"deny\",\n message: \"User did not provide answers\",\n };\n }\n\n return {\n behavior: \"allow\",\n updatedInput: {\n ...(context.toolInput as Record<string, unknown>),\n answers,\n },\n };\n}\n\nasync function handleDefaultPermissionFlow(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const {\n session,\n toolName,\n toolInput,\n toolUseID,\n client,\n sessionId,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse({ name: toolName, input: toolInput });\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\n suggestions,\n );\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...(toolInput as Record<string, unknown>), toolName },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"localSettings\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n } else {\n const message = \"User refused permission to run tool\";\n await emitToolDenial(context, message);\n return {\n behavior: \"deny\",\n message,\n };\n }\n}\n\nfunction handlePlanFileException(\n context: ToolHandlerContext,\n): ToolPermissionResult | null {\n const { session, toolName, toolInput } = context;\n\n if (session.permissionMode !== \"plan\" || !WRITE_TOOLS.has(toolName)) {\n return null;\n }\n\n const filePath = (toolInput as { file_path?: string })?.file_path;\n if (!isClaudePlanFilePath(filePath)) {\n return null;\n }\n\n session.lastPlanFilePath = filePath;\n const content = (toolInput as { content?: string })?.content;\n if (typeof content === \"string\") {\n session.lastPlanContent = content;\n }\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nfunction extractDomainFromUrl(url: string): string | null {\n try {\n return new URL(url).hostname;\n } catch {\n return null;\n }\n}\n\nfunction isDomainAllowed(hostname: string, allowedDomains: string[]): boolean {\n return allowedDomains.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".example.com\"\n return hostname === pattern.slice(2) || hostname.endsWith(suffix);\n }\n return hostname === pattern;\n });\n}\n\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session, allowedDomains } = context;\n\n // Enforce domain allowlist for web tools\n if (allowedDomains && allowedDomains.length > 0) {\n if (toolName === \"WebFetch\" || toolName === \"WebSearch\") {\n const url = toolInput.url as string | undefined;\n if (url) {\n const hostname = extractDomainFromUrl(url);\n if (hostname && !isDomainAllowed(hostname, allowedDomains)) {\n const message = `Domain \"${hostname}\" is not in the allowed list: ${allowedDomains.join(\", \")}`;\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n }\n }\n }\n }\n\n if (isToolAllowedForMode(toolName, session.permissionMode)) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n }\n\n if (toolName === \"EnterPlanMode\") {\n return handleEnterPlanModeTool(context);\n }\n\n if (toolName === \"ExitPlanMode\") {\n return handleExitPlanModeTool(context);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return handleAskUserQuestionTool(context);\n }\n\n const planFileResult = handlePlanFileException(context);\n if (planFileResult) {\n return planFileResult;\n }\n\n // if (session.permissionMode === \"dontAsk\") {\n // const message = \"Tool not pre-approved. Denied by dontAsk mode.\";\n // await emitToolDenial(context, message);\n // return { behavior: \"deny\", message, interrupt: false };\n // }\n\n return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { SlashCommand } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"keybindings-help\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport function getAvailableSlashCommands(\n commands: SlashCommand[],\n): AvailableCommand[] {\n return commands\n .map((command) => {\n const input =\n command.argumentHint != null\n ? {\n hint: Array.isArray(command.argumentHint)\n ? command.argumentHint.join(\" \")\n : command.argumentHint,\n }\n : null;\n let name = command.name;\n if (command.name.endsWith(\" (MCP)\")) {\n name = `mcp:${name.replace(\" (MCP)\", \"\")}`;\n }\n return {\n name,\n description: command.description || \"\",\n input,\n };\n })\n .filter(\n (command: AvailableCommand) =>\n !UNSUPPORTED_COMMANDS.includes(command.name),\n );\n}\n","import type { NewSessionRequest } from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: Pick<NewSessionRequest, \"mcpServers\">,\n): Record<string, McpServerConfig> {\n const mcpServers: Record<string, McpServerConfig> = {};\n if (!Array.isArray(params.mcpServers)) {\n return mcpServers;\n }\n\n for (const server of params.mcpServers) {\n if (\"type\" in server) {\n mcpServers[server.name] = {\n type: server.type,\n url: server.url,\n headers: server.headers\n ? Object.fromEntries(server.headers.map((e) => [e.name, e.value]))\n : undefined,\n };\n } else {\n mcpServers[server.name] = {\n type: \"stdio\",\n command: server.command,\n args: server.args,\n env: server.env\n ? Object.fromEntries(server.env.map((e) => [e.name, e.value]))\n : undefined,\n };\n }\n }\n\n return mcpServers;\n}\n","export const DEFAULT_MODEL = \"opus\";\n\nconst GATEWAY_TO_SDK_MODEL: Record<string, string> = {\n \"claude-opus-4-5\": \"opus\",\n \"claude-opus-4-6\": \"opus\",\n \"claude-sonnet-4-5\": \"sonnet\",\n \"claude-sonnet-4-6\": \"sonnet\",\n \"claude-haiku-4-5\": \"haiku\",\n};\n\nexport function toSdkModelId(modelId: string): string {\n return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;\n}\n\nconst MODELS_WITH_1M_CONTEXT = new Set([\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nexport function supports1MContext(modelId: string): boolean {\n return MODELS_WITH_1M_CONTEXT.has(modelId);\n}\n\nconst MODELS_WITH_EFFORT = new Set([\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_MAX_EFFORT = new Set([\"claude-opus-4-6\"]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsMaxEffort(modelId: string): boolean {\n return MODELS_WITH_MAX_EFFORT.has(modelId);\n}\n\ninterface EffortOption {\n value: string;\n name: string;\n}\n\nexport function getEffortOptions(modelId: string): EffortOption[] | null {\n if (!supportsEffort(modelId)) return null;\n\n const options: EffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n ];\n\n if (supportsMaxEffort(modelId)) {\n options.push({ value: \"max\", name: \"Max\" });\n }\n\n return options;\n}\n\n// Model alias resolution — lets callers use human-friendly aliases like\n// \"opus\" or \"sonnet\" instead of full model IDs like \"claude-opus-4-6\".\n\nconst MODEL_CONTEXT_HINT_PATTERN = /\\[(\\d+m)\\]$/i;\n\nfunction tokenizeModelPreference(model: string): {\n tokens: string[];\n contextHint?: string;\n} {\n const lower = model.trim().toLowerCase();\n const contextHint = lower\n .match(MODEL_CONTEXT_HINT_PATTERN)?.[1]\n ?.toLowerCase();\n\n const normalized = lower.replace(MODEL_CONTEXT_HINT_PATTERN, \" $1 \");\n const rawTokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const tokens = rawTokens\n .map((token) => {\n if (token === \"opusplan\") return \"opus\";\n if (token === \"best\" || token === \"default\") return \"\";\n return token;\n })\n .filter((token) => token && token !== \"claude\")\n .filter((token) => /[a-z]/.test(token) || token.endsWith(\"m\"));\n\n return { tokens, contextHint };\n}\n\ninterface ModelOption {\n value: string;\n name?: string;\n description?: string;\n}\n\nfunction scoreModelMatch(\n model: ModelOption,\n tokens: string[],\n contextHint?: string,\n): number {\n const haystack = `${model.value} ${model.name ?? \"\"}`.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) {\n score += token === contextHint ? 3 : 1;\n }\n }\n return score;\n}\n\nexport function resolveModelPreference(\n preference: string,\n options: ModelOption[],\n): string | null {\n const trimmed = preference.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n\n // Exact match on value or display name\n const directMatch = options.find(\n (o) =>\n o.value === trimmed ||\n o.value.toLowerCase() === lower ||\n (o.name && o.name.toLowerCase() === lower),\n );\n if (directMatch) return directMatch.value;\n\n // Substring match\n const includesMatch = options.find((o) => {\n const value = o.value.toLowerCase();\n const display = (o.name ?? \"\").toLowerCase();\n return (\n value.includes(lower) || display.includes(lower) || lower.includes(value)\n );\n });\n if (includesMatch) return includesMatch.value;\n\n // Tokenized matching for aliases like \"opus[1m]\"\n const { tokens, contextHint } = tokenizeModelPreference(trimmed);\n if (tokens.length === 0) return null;\n\n let bestMatch: ModelOption | null = null;\n let bestScore = 0;\n for (const model of options) {\n const score = scoreModelMatch(model, tokens, contextHint);\n if (0 < score && (!bestMatch || bestScore < score)) {\n bestMatch = model;\n bestScore = score;\n }\n }\n\n return bestMatch?.value ?? null;\n}\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type {\n CanUseTool,\n McpServerConfig,\n Options,\n SpawnedProcess,\n SpawnOptions,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport {\n createPostToolUseHook,\n createPreToolUseHook,\n type OnModeChange,\n} from \"../hooks\";\nimport type { CodeExecutionMode } from \"../tools\";\nimport type { EffortLevel } from \"../types\";\nimport { APPENDED_INSTRUCTIONS } from \"./instructions\";\nimport { DEFAULT_MODEL } from \"./models\";\nimport type { SettingsManager } from \"./settings\";\n\nexport interface ProcessSpawnedInfo {\n pid: number;\n command: string;\n sessionId: string;\n}\n\nexport interface BuildOptionsParams {\n cwd: string;\n mcpServers: Record<string, McpServerConfig>;\n permissionMode: CodeExecutionMode;\n canUseTool: CanUseTool;\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId: string;\n isResume: boolean;\n forkSession?: boolean;\n additionalDirectories?: string[];\n disableBuiltInTools?: boolean;\n settingsManager: SettingsManager;\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n effort?: EffortLevel;\n}\n\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: APPENDED_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + APPENDED_INSTRUCTIONS;\n }\n\n if (\n typeof customPrompt === \"object\" &&\n customPrompt !== null &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n return {\n ...defaultPrompt,\n append: customPrompt.append + APPENDED_INSTRUCTIONS,\n };\n }\n\n return defaultPrompt;\n}\n\nfunction buildMcpServers(\n userServers: Record<string, McpServerConfig> | undefined,\n acpServers: Record<string, McpServerConfig>,\n): Record<string, McpServerConfig> {\n return {\n ...(userServers || {}),\n ...acpServers,\n };\n}\n\nfunction buildEnvironment(): Record<string, string> {\n return {\n ...process.env,\n ELECTRON_RUN_AS_NODE: \"1\",\n CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL: \"true\",\n // Offload all MCP tools by default\n ENABLE_TOOL_SEARCH: \"auto:0\",\n };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange: OnModeChange | undefined,\n settingsManager: SettingsManager,\n logger: Logger,\n): Options[\"hooks\"] {\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook({ onModeChange, logger })],\n },\n ],\n PreToolUse: [\n ...(userHooks?.PreToolUse || []),\n {\n hooks: [createPreToolUseHook(settingsManager, logger)],\n },\n ],\n };\n}\n\nfunction getAbortController(\n userProvidedController: AbortController | undefined,\n): AbortController {\n const controller = userProvidedController ?? new AbortController();\n if (controller.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n return controller;\n}\n\nfunction buildSpawnWrapper(\n sessionId: string,\n onProcessSpawned: (info: ProcessSpawnedInfo) => void,\n onProcessExited?: (pid: number) => void,\n logger?: Logger,\n): (options: SpawnOptions) => SpawnedProcess {\n return (spawnOpts: SpawnOptions): SpawnedProcess => {\n const child = spawn(spawnOpts.command, spawnOpts.args, {\n cwd: spawnOpts.cwd,\n env: spawnOpts.env as NodeJS.ProcessEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.pid) {\n onProcessSpawned({\n pid: child.pid,\n command: `${spawnOpts.command} ${spawnOpts.args.join(\" \")}`,\n sessionId,\n });\n }\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && logger) {\n logger.debug(`[claude-code:${child.pid}] stderr: ${msg}`);\n }\n });\n\n if (onProcessExited) {\n child.on(\"exit\", () => {\n if (child.pid) {\n onProcessExited(child.pid);\n }\n });\n }\n\n // Listen for abort signal\n if (spawnOpts.signal) {\n spawnOpts.signal.addEventListener(\"abort\", () => {\n child.kill(\"SIGTERM\");\n });\n }\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\n `Failed to get stdio streams for spawned process (pid=${child.pid})`,\n );\n }\n\n return {\n stdin: child.stdin,\n stdout: child.stdout,\n get killed() {\n return child.killed;\n },\n get exitCode() {\n return child.exitCode;\n },\n kill(signal: NodeJS.Signals) {\n return child.kill(signal);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nfunction ensureLocalSettings(cwd: string): void {\n const claudeDir = path.join(cwd, \".claude\");\n const localSettingsPath = path.join(claudeDir, \"settings.local.json\");\n try {\n if (!fs.existsSync(localSettingsPath)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n fs.writeFileSync(localSettingsPath, \"{}\\n\", { flag: \"wx\" });\n }\n } catch {\n // Best-effort — don't fail session creation if we can't write\n }\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\n ensureLocalSettings(params.cwd);\n\n // Resolve which built-in tools to expose.\n // Explicit tools array from userProvidedOptions takes precedence.\n // disableBuiltInTools is a legacy shorthand for tools: [] — kept for\n // backward compatibility but callers should prefer the tools array.\n const tools: Options[\"tools\"] =\n params.userProvidedOptions?.tools ??\n (params.disableBuiltInTools\n ? []\n : { type: \"preset\", preset: \"claude_code\" });\n\n const options: Options = {\n ...params.userProvidedOptions,\n betas: [\"context-1m-2025-08-07\"],\n systemPrompt: params.systemPrompt ?? buildSystemPrompt(),\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => params.logger.error(err),\n cwd: params.cwd,\n includePartialMessages: true,\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode: params.permissionMode,\n canUseTool: params.canUseTool,\n executable: \"node\",\n tools,\n extraArgs: {\n ...params.userProvidedOptions?.extraArgs,\n \"replay-user-messages\": \"\",\n },\n mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(\n params.userProvidedOptions?.hooks,\n params.onModeChange,\n params.settingsManager,\n params.logger,\n ),\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId,\n params.onProcessSpawned,\n params.onProcessExited,\n params.logger,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.isResume) {\n options.resume = params.sessionId;\n options.forkSession = params.forkSession ?? false;\n } else {\n options.sessionId = params.sessionId;\n options.model = DEFAULT_MODEL;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\n }\n\n if (params.effort) {\n options.effort = params.effort;\n }\n\n clearStatsigCache();\n return options;\n}\n\nfunction clearStatsigCache(): void {\n const statsigPath = path.join(\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\"),\n \"statsig\",\n );\n fs.rm(statsigPath, { recursive: true, force: true }, () => {\n // Best-effort, ignore errors\n });\n}\n","const BRANCH_NAMING = `\n# Branch Naming\n\nWhen working in a detached HEAD state, create a descriptive branch name based on the work being done before committing. Do this automatically without asking the user.\n`;\n\nconst PLAN_MODE = `\n# Plan Mode\n\nOnly enter plan mode (EnterPlanMode) when the user is requesting a significant change in approach or direction mid-task. Do NOT enter plan mode for:\n- Confirmations or approvals (\"yes\", \"looks good\", \"continue\", \"go ahead\")\n- Minor clarifications or small adjustments\n- Answers to questions you asked (unless you are still in the initial planning phase and have not yet started executing)\n- Feedback that does not require replanning\n\nWhen in doubt, continue executing and incorporate the feedback inline.\n`;\n\nexport const APPENDED_INSTRUCTIONS = BRANCH_NAMING + PLAN_MODE;\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { minimatch } from \"minimatch\";\n\nconst ACP_TOOL_NAME_PREFIX = \"mcp__acp__\";\n\nconst acpToolNames = {\n read: `${ACP_TOOL_NAME_PREFIX}Read`,\n edit: `${ACP_TOOL_NAME_PREFIX}Edit`,\n write: `${ACP_TOOL_NAME_PREFIX}Write`,\n bash: `${ACP_TOOL_NAME_PREFIX}Bash`,\n};\n\nconst SHELL_OPERATORS = [\"&&\", \"||\", \";\", \"|\", \"$(\", \"`\", \"\\n\"];\n\nfunction containsShellOperator(str: string): boolean {\n return SHELL_OPERATORS.some((op) => str.includes(op));\n}\n\nconst FILE_EDITING_TOOLS = [acpToolNames.edit, acpToolNames.write];\n\nconst FILE_READING_TOOLS = [acpToolNames.read];\n\nconst TOOL_ARG_ACCESSORS: Record<\n string,\n (input: Record<string, unknown>) => string | undefined\n> = {\n [acpToolNames.read]: (input) => input?.file_path as string | undefined,\n [acpToolNames.edit]: (input) => input?.file_path as string | undefined,\n [acpToolNames.write]: (input) => input?.file_path as string | undefined,\n [acpToolNames.bash]: (input) => input?.command as string | undefined,\n};\n\ninterface ParsedRule {\n toolName: string;\n argument?: string;\n isWildcard?: boolean;\n}\n\nfunction parseRule(rule: string): ParsedRule {\n const match = rule.match(/^(\\w+)(?:\\((.+)\\))?$/);\n if (!match) {\n return { toolName: rule };\n }\n const toolName = match[1] ?? rule;\n const argument = match[2];\n if (argument?.endsWith(\":*\")) {\n return {\n toolName,\n argument: argument.slice(0, -2),\n isWildcard: true,\n };\n }\n return { toolName, argument };\n}\n\nfunction normalizePath(filePath: string, cwd: string): string {\n let resolved = filePath;\n if (resolved.startsWith(\"~/\")) {\n resolved = path.join(os.homedir(), resolved.slice(2));\n } else if (resolved.startsWith(\"./\")) {\n resolved = path.join(cwd, resolved.slice(2));\n } else if (!path.isAbsolute(resolved)) {\n resolved = path.join(cwd, resolved);\n }\n return path.normalize(resolved).replace(/\\\\/g, \"/\");\n}\n\nfunction matchesGlob(pattern: string, filePath: string, cwd: string): boolean {\n const normalizedPattern = normalizePath(pattern, cwd);\n const normalizedPath = normalizePath(filePath, cwd);\n return minimatch(normalizedPath, normalizedPattern, {\n dot: true,\n matchBase: false,\n nocase: process.platform === \"win32\",\n });\n}\n\nfunction matchesRule(\n rule: ParsedRule,\n toolName: string,\n toolInput: unknown,\n cwd: string,\n): boolean {\n const ruleAppliesToTool =\n (rule.toolName === \"Bash\" && toolName === acpToolNames.bash) ||\n (rule.toolName === \"Edit\" && FILE_EDITING_TOOLS.includes(toolName)) ||\n (rule.toolName === \"Read\" && FILE_READING_TOOLS.includes(toolName));\n\n if (!ruleAppliesToTool) {\n return false;\n }\n\n if (!rule.argument) {\n return true;\n }\n\n const argAccessor = TOOL_ARG_ACCESSORS[toolName];\n if (!argAccessor) {\n return true;\n }\n\n const actualArg = argAccessor(toolInput as Record<string, unknown>);\n if (!actualArg) {\n return false;\n }\n\n if (toolName === acpToolNames.bash) {\n if (rule.isWildcard) {\n if (!actualArg.startsWith(rule.argument)) {\n return false;\n }\n const remainder = actualArg.slice(rule.argument.length);\n if (containsShellOperator(remainder)) {\n return false;\n }\n return true;\n }\n return actualArg === rule.argument;\n }\n\n return matchesGlob(rule.argument, actualArg, cwd);\n}\n\nasync function loadSettingsFile(\n filePath: string | undefined,\n): Promise<ClaudeCodeSettings> {\n if (!filePath) {\n return {};\n }\n try {\n const content = await fs.promises.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as ClaudeCodeSettings;\n } catch {\n return {};\n }\n}\n\nexport interface PermissionSettings {\n allow?: string[];\n deny?: string[];\n ask?: string[];\n additionalDirectories?: string[];\n defaultMode?: string;\n}\n\nexport interface ClaudeCodeSettings {\n permissions?: PermissionSettings;\n env?: Record<string, string>;\n model?: string;\n}\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PermissionCheckResult {\n decision: PermissionDecision;\n rule?: string;\n source?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport function getManagedSettingsPath(): string {\n switch (process.platform) {\n case \"darwin\":\n return \"/Library/Application Support/ClaudeCode/managed-settings.json\";\n case \"linux\":\n return \"/etc/claude-code/managed-settings.json\";\n case \"win32\":\n return \"C:\\\\Program Files\\\\ClaudeCode\\\\managed-settings.json\";\n default:\n return \"/etc/claude-code/managed-settings.json\";\n }\n}\nexport class SettingsManager {\n private cwd: string;\n private userSettings: ClaudeCodeSettings = {};\n private projectSettings: ClaudeCodeSettings = {};\n private localSettings: ClaudeCodeSettings = {};\n private enterpriseSettings: ClaudeCodeSettings = {};\n private mergedSettings: ClaudeCodeSettings = {};\n private initialized = false;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n await this.loadAllSettings();\n this.initialized = true;\n }\n\n private getUserSettingsPath(): string {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n return path.join(configDir, \"settings.json\");\n }\n\n private getProjectSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.json\");\n }\n\n private getLocalSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.local.json\");\n }\n\n private async loadAllSettings(): Promise<void> {\n const [userSettings, projectSettings, localSettings, enterpriseSettings] =\n await Promise.all([\n loadSettingsFile(this.getUserSettingsPath()),\n loadSettingsFile(this.getProjectSettingsPath()),\n loadSettingsFile(this.getLocalSettingsPath()),\n loadSettingsFile(getManagedSettingsPath()),\n ]);\n this.userSettings = userSettings;\n this.projectSettings = projectSettings;\n this.localSettings = localSettings;\n this.enterpriseSettings = enterpriseSettings;\n this.mergeAllSettings();\n }\n\n private mergeAllSettings(): void {\n const allSettings = [\n this.userSettings,\n this.projectSettings,\n this.localSettings,\n this.enterpriseSettings,\n ];\n\n const permissions: PermissionSettings = {\n allow: [],\n deny: [],\n ask: [],\n };\n const merged: ClaudeCodeSettings = { permissions };\n\n for (const settings of allSettings) {\n if (settings.permissions) {\n if (settings.permissions.allow) {\n permissions.allow?.push(...settings.permissions.allow);\n }\n if (settings.permissions.deny) {\n permissions.deny?.push(...settings.permissions.deny);\n }\n if (settings.permissions.ask) {\n permissions.ask?.push(...settings.permissions.ask);\n }\n if (settings.permissions.additionalDirectories) {\n permissions.additionalDirectories = [\n ...(permissions.additionalDirectories || []),\n ...settings.permissions.additionalDirectories,\n ];\n }\n if (settings.permissions.defaultMode) {\n permissions.defaultMode = settings.permissions.defaultMode;\n }\n }\n if (settings.env) {\n merged.env = { ...merged.env, ...settings.env };\n }\n if (settings.model) {\n merged.model = settings.model;\n }\n }\n\n this.mergedSettings = merged;\n }\n\n checkPermission(toolName: string, toolInput: unknown): PermissionCheckResult {\n if (!toolName.startsWith(ACP_TOOL_NAME_PREFIX)) {\n return { decision: \"ask\" };\n }\n\n const permissions = this.mergedSettings.permissions;\n if (!permissions) {\n return { decision: \"ask\" };\n }\n\n for (const rule of permissions.deny || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"deny\", rule, source: \"deny\" };\n }\n }\n\n for (const rule of permissions.allow || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"allow\", rule, source: \"allow\" };\n }\n }\n\n for (const rule of permissions.ask || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"ask\", rule, source: \"ask\" };\n }\n }\n\n return { decision: \"ask\" };\n }\n\n getSettings(): ClaudeCodeSettings {\n return this.mergedSettings;\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n async setCwd(cwd: string): Promise<void> {\n if (this.cwd === cwd) {\n return;\n }\n this.dispose();\n this.cwd = cwd;\n this.initialized = false;\n await this.initialize();\n }\n\n dispose(): void {\n this.initialized = false;\n }\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { delimiter, dirname } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { ProcessSpawnedCallback } from \"../../types\";\nimport { Logger } from \"../../utils/logger\";\n\nexport interface CodexProcessOptions {\n cwd?: string;\n apiBaseUrl?: string;\n apiKey?: string;\n model?: string;\n binaryPath?: string;\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n}\n\nexport interface CodexProcess {\n process: ChildProcess;\n stdin: Writable;\n stdout: Readable;\n kill: () => void;\n}\n\nfunction buildConfigArgs(options: CodexProcessOptions): string[] {\n const args: string[] = [];\n\n args.push(\"-c\", `features.remote_models=false`);\n\n if (options.apiBaseUrl) {\n args.push(\"-c\", `model_provider=\"posthog\"`);\n args.push(\"-c\", `model_providers.posthog.name=\"PostHog Gateway\"`);\n args.push(\"-c\", `model_providers.posthog.base_url=\"${options.apiBaseUrl}\"`);\n args.push(\"-c\", `model_providers.posthog.wire_api=\"responses\"`);\n args.push(\n \"-c\",\n `model_providers.posthog.env_key=\"POSTHOG_GATEWAY_API_KEY\"`,\n );\n }\n\n if (options.model) {\n args.push(\"-c\", `model=\"${options.model}\"`);\n }\n\n return args;\n}\n\nfunction findCodexBinary(options: CodexProcessOptions): {\n command: string;\n args: string[];\n} {\n const configArgs = buildConfigArgs(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n return { command: options.binaryPath, args: configArgs };\n }\n\n if (options.binaryPath) {\n throw new Error(\n `codex-acp binary not found at ${options.binaryPath}. Run \"node apps/code/scripts/download-binaries.mjs\" to download it.`,\n );\n }\n\n return { command: \"npx\", args: [\"@zed-industries/codex-acp\", ...configArgs] };\n}\n\nexport function spawnCodexProcess(options: CodexProcessOptions): CodexProcess {\n const logger =\n options.logger ?? new Logger({ debug: true, prefix: \"[CodexSpawn]\" });\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n\n delete env.ELECTRON_RUN_AS_NODE;\n delete env.ELECTRON_NO_ASAR;\n\n if (options.apiKey) {\n env.POSTHOG_GATEWAY_API_KEY = options.apiKey;\n }\n\n const { command, args } = findCodexBinary(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n const binDir = dirname(options.binaryPath);\n env.PATH = `${binDir}${delimiter}${env.PATH ?? \"\"}`;\n }\n\n logger.info(\"Spawning codex-acp process\", {\n command,\n args,\n cwd: options.cwd,\n hasApiBaseUrl: !!options.apiBaseUrl,\n hasApiKey: !!options.apiKey,\n binaryPath: options.binaryPath,\n });\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n logger.warn(\"codex-acp stderr:\", data.toString());\n });\n\n child.on(\"error\", (err) => {\n logger.error(\"codex-acp process error:\", err);\n });\n\n child.on(\"exit\", (code, signal) => {\n logger.info(\"codex-acp process exited\", { code, signal });\n if (child.pid && options.processCallbacks?.onProcessExited) {\n options.processCallbacks.onProcessExited(child.pid);\n }\n });\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\"Failed to get stdio streams from codex-acp process\");\n }\n\n if (child.pid && options.processCallbacks?.onProcessSpawned) {\n options.processCallbacks.onProcessSpawned({\n pid: child.pid,\n command,\n });\n }\n\n return {\n process: child,\n stdin: child.stdin,\n stdout: child.stdout,\n kill: () => {\n logger.info(\"Killing codex-acp process\", { pid: child.pid });\n child.stdin?.destroy();\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.kill(\"SIGTERM\");\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport type { PostHogAPIClient } from \"../../../posthog-api\";\nimport type { StoredEntry } from \"../../../types\";\nimport { supports1MContext } from \"./models\";\n\ninterface ConversationTurn {\n role: \"user\" | \"assistant\";\n content: ContentBlock[];\n toolCalls?: ToolCallInfo[];\n}\n\ninterface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n input: unknown;\n result?: unknown;\n}\n\ninterface JsonlConfig {\n sessionId: string;\n cwd: string;\n model?: string;\n version?: string;\n gitBranch?: string;\n slug?: string;\n permissionMode?: string;\n}\n\ninterface ClaudeCodeMeta {\n toolCallId?: string;\n toolName?: string;\n toolInput?: unknown;\n toolResponse?: unknown;\n}\n\ninterface SessionUpdate {\n sessionUpdate: string;\n content?: ContentBlock | ContentBlock[];\n _meta?: { claudeCode?: ClaudeCodeMeta };\n}\n\nconst MAX_PROJECT_KEY_LENGTH = 200;\n\nfunction hashString(s: string): string {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = (hash << 5) - hash + s.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash).toString(36);\n}\n\nexport function getSessionJsonlPath(sessionId: string, cwd: string): string {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n let projectKey = cwd.replace(/[^a-zA-Z0-9]/g, \"-\");\n if (projectKey.length > MAX_PROJECT_KEY_LENGTH) {\n projectKey = `${projectKey.slice(0, MAX_PROJECT_KEY_LENGTH)}-${hashString(cwd)}`;\n }\n return path.join(configDir, \"projects\", projectKey, `${sessionId}.jsonl`);\n}\n\nexport function rebuildConversation(\n entries: StoredEntry[],\n): ConversationTurn[] {\n const turns: ConversationTurn[] = [];\n let currentAssistantContent: ContentBlock[] = [];\n let currentToolCalls: ToolCallInfo[] = [];\n\n for (const entry of entries) {\n const method = entry.notification?.method;\n const params = entry.notification?.params as Record<string, unknown>;\n\n if (method === \"session/update\" && params?.update) {\n const update = params.update as SessionUpdate;\n\n switch (update.sessionUpdate) {\n case \"user_message\":\n case \"user_message_chunk\": {\n if (\n currentAssistantContent.length > 0 ||\n currentToolCalls.length > 0\n ) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls:\n currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n currentAssistantContent = [];\n currentToolCalls = [];\n }\n\n const content = update.content;\n const contentArray = Array.isArray(content)\n ? content\n : content\n ? [content]\n : [];\n\n const lastTurn = turns[turns.length - 1];\n if (lastTurn?.role === \"user\") {\n lastTurn.content.push(...contentArray);\n } else {\n turns.push({ role: \"user\", content: contentArray });\n }\n break;\n }\n\n case \"agent_message\":\n case \"agent_message_chunk\":\n case \"agent_thought_chunk\": {\n const content = update.content;\n if (content && !Array.isArray(content)) {\n if (\n content.type === \"text\" &&\n currentAssistantContent.length > 0 &&\n currentAssistantContent[currentAssistantContent.length - 1]\n .type === \"text\"\n ) {\n const lastBlock = currentAssistantContent[\n currentAssistantContent.length - 1\n ] as { type: \"text\"; text: string };\n lastBlock.text += (\n content as { type: \"text\"; text: string }\n ).text;\n } else {\n currentAssistantContent.push(content);\n }\n }\n break;\n }\n\n case \"tool_call\":\n case \"tool_call_update\": {\n const meta = update._meta?.claudeCode;\n if (meta) {\n const { toolCallId, toolName, toolInput, toolResponse } = meta;\n\n if (toolCallId && toolName) {\n let toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (!toolCall) {\n toolCall = { toolCallId, toolName, input: toolInput };\n currentToolCalls.push(toolCall);\n }\n if (toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n\n case \"tool_result\": {\n const meta = update._meta?.claudeCode;\n if (meta) {\n const { toolCallId, toolResponse } = meta;\n if (toolCallId) {\n const toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (toolCall && toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n }\n }\n }\n\n if (currentAssistantContent.length > 0 || currentToolCalls.length > 0) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls: currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n }\n\n return turns;\n}\n\nconst CHARS_PER_TOKEN = 4;\nconst DEFAULT_MAX_TOKENS = 150_000;\nconst LARGE_CONTEXT_MAX_TOKENS = 800_000;\n\nfunction estimateTurnTokens(turn: ConversationTurn): number {\n let chars = 0;\n for (const block of turn.content) {\n if (\"text\" in block && typeof block.text === \"string\") {\n chars += block.text.length;\n }\n }\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n chars += JSON.stringify(tc.input ?? \"\").length;\n if (tc.result !== undefined) {\n chars +=\n typeof tc.result === \"string\"\n ? tc.result.length\n : JSON.stringify(tc.result).length;\n }\n }\n }\n return Math.ceil(chars / CHARS_PER_TOKEN);\n}\n\nexport function selectRecentTurns(\n turns: ConversationTurn[],\n maxTokens = DEFAULT_MAX_TOKENS,\n): ConversationTurn[] {\n let budget = maxTokens;\n let startIndex = turns.length;\n\n for (let i = turns.length - 1; i >= 0; i--) {\n const cost = estimateTurnTokens(turns[i]);\n if (cost > budget) break;\n budget -= cost;\n startIndex = i;\n }\n\n // Ensure we start on a user turn so the conversation is well-formed\n while (startIndex < turns.length && turns[startIndex].role !== \"user\") {\n startIndex++;\n }\n\n return turns.slice(startIndex);\n}\n\nconst BASE62 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\nfunction generateMessageId(): string {\n const bytes = new Uint8Array(24);\n crypto.getRandomValues(bytes);\n let id = \"msg_01\";\n for (const b of bytes) {\n id += BASE62[b % 62];\n }\n return id;\n}\n\nconst ADJECTIVES = [\n \"bright\",\n \"calm\",\n \"daring\",\n \"eager\",\n \"fair\",\n \"gentle\",\n \"happy\",\n \"keen\",\n \"lively\",\n \"merry\",\n \"noble\",\n \"polite\",\n \"quick\",\n \"sharp\",\n \"warm\",\n \"witty\",\n];\nconst VERBS = [\n \"blazing\",\n \"crafting\",\n \"dashing\",\n \"flowing\",\n \"gliding\",\n \"humming\",\n \"jumping\",\n \"linking\",\n \"melting\",\n \"nesting\",\n \"pacing\",\n \"roaming\",\n \"sailing\",\n \"turning\",\n \"waving\",\n \"zoning\",\n];\nconst NOUNS = [\n \"aurora\",\n \"breeze\",\n \"cedar\",\n \"delta\",\n \"ember\",\n \"frost\",\n \"grove\",\n \"haven\",\n \"inlet\",\n \"jewel\",\n \"knoll\",\n \"lotus\",\n \"maple\",\n \"nexus\",\n \"oasis\",\n \"prism\",\n];\n\nfunction generateSlug(): string {\n const pick = (arr: string[]) => arr[Math.floor(Math.random() * arr.length)];\n return `${pick(ADJECTIVES)}-${pick(VERBS)}-${pick(NOUNS)}`;\n}\n\nexport function conversationTurnsToJsonlEntries(\n turns: ConversationTurn[],\n config: JsonlConfig,\n): string[] {\n const lines: string[] = [];\n let parentUuid: string | null = null;\n const model = config.model ?? \"claude-opus-4-6\";\n const version = config.version ?? \"2.1.63\";\n const gitBranch = config.gitBranch ?? \"\";\n const slug = config.slug ?? generateSlug();\n const permissionMode = config.permissionMode ?? \"default\";\n const baseTime = Date.now() - turns.length * 3000;\n let turnIndex = 0;\n\n for (const turn of turns) {\n const timestamp = new Date(baseTime + turnIndex * 3000).toISOString();\n turnIndex++;\n if (turn.role === \"user\") {\n lines.push(\n JSON.stringify({\n type: \"queue-operation\",\n operation: \"enqueue\",\n timestamp,\n sessionId: config.sessionId,\n }),\n );\n lines.push(\n JSON.stringify({\n type: \"queue-operation\",\n operation: \"dequeue\",\n timestamp,\n sessionId: config.sessionId,\n }),\n );\n\n const uuid = randomUUID();\n const textParts = turn.content\n .filter(\n (block) =>\n \"text\" in block && typeof block.text === \"string\" && block.text,\n )\n .map((block) => (block as { text: string }).text);\n\n const userText = textParts.length > 0 ? textParts.join(\"\") : \" \";\n\n lines.push(\n JSON.stringify({\n parentUuid,\n isSidechain: false,\n userType: \"external\",\n cwd: config.cwd,\n sessionId: config.sessionId,\n version,\n gitBranch,\n slug,\n type: \"user\",\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: userText }],\n },\n uuid,\n timestamp,\n permissionMode,\n }),\n );\n parentUuid = uuid;\n } else {\n const allBlocks: unknown[] = [];\n\n for (const block of turn.content) {\n const blockType = (block as { type: string }).type;\n if (blockType === \"thinking\" || blockType === \"text\") {\n allBlocks.push(block);\n }\n }\n\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n allBlocks.push({\n type: \"tool_use\",\n id: tc.toolCallId,\n name: tc.toolName,\n input: tc.input,\n });\n }\n }\n\n const msgId = generateMessageId();\n const hasToolUse = allBlocks.some(\n (b) => (b as { type: string }).type === \"tool_use\",\n );\n const lastStopReason = hasToolUse ? \"tool_use\" : \"end_turn\";\n\n for (let i = 0; i < allBlocks.length; i++) {\n const block = allBlocks[i];\n const isLast = i === allBlocks.length - 1;\n const uuid = randomUUID();\n\n lines.push(\n JSON.stringify({\n parentUuid,\n isSidechain: false,\n userType: \"external\",\n cwd: config.cwd,\n sessionId: config.sessionId,\n version,\n gitBranch,\n slug,\n type: \"assistant\",\n message: {\n model,\n id: msgId,\n type: \"message\",\n role: \"assistant\",\n content: [block],\n stop_reason: isLast ? lastStopReason : null,\n stop_sequence: null,\n usage: {\n input_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n output_tokens: 0,\n },\n },\n uuid,\n timestamp,\n }),\n );\n parentUuid = uuid;\n }\n\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n if (tc.result === undefined) continue;\n\n const uuid = randomUUID();\n const resultText =\n typeof tc.result === \"string\"\n ? tc.result\n : JSON.stringify(tc.result);\n\n lines.push(\n JSON.stringify({\n parentUuid,\n isSidechain: false,\n userType: \"external\",\n cwd: config.cwd,\n sessionId: config.sessionId,\n version,\n gitBranch,\n slug,\n type: \"user\",\n message: {\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: tc.toolCallId,\n content: resultText,\n },\n ],\n },\n uuid,\n timestamp,\n }),\n );\n parentUuid = uuid;\n }\n }\n }\n }\n\n return lines;\n}\n\ninterface HydrationLog {\n info: (msg: string, data?: unknown) => void;\n warn: (msg: string, data?: unknown) => void;\n}\n\nexport async function hydrateSessionJsonl(params: {\n sessionId: string;\n cwd: string;\n taskId: string;\n runId: string;\n model?: string;\n gitBranch?: string;\n permissionMode?: string;\n posthogAPI: PostHogAPIClient;\n log: HydrationLog;\n}): Promise<void> {\n const { posthogAPI, log } = params;\n\n try {\n const jsonlPath = getSessionJsonlPath(params.sessionId, params.cwd);\n try {\n await fs.access(jsonlPath);\n log.info(\"Local JSONL exists, skipping S3 hydration\", {\n sessionId: params.sessionId,\n });\n return;\n } catch {\n // File doesn't exist, proceed with hydration\n }\n\n const taskRun = await posthogAPI.getTaskRun(params.taskId, params.runId);\n if (!taskRun.log_url) {\n log.info(\"No log URL, skipping JSONL hydration\");\n return;\n }\n\n const entries = await posthogAPI.fetchTaskRunLogs(taskRun);\n if (entries.length === 0) {\n log.info(\"No S3 log entries, skipping JSONL hydration\");\n return;\n }\n\n const entryCounts: Record<string, number> = {};\n for (const entry of entries) {\n const method = entry.notification?.method ?? \"unknown\";\n const entryParams = entry.notification?.params as\n | Record<string, unknown>\n | undefined;\n const update = entryParams?.update as\n | { sessionUpdate?: string }\n | undefined;\n const key = update?.sessionUpdate\n ? `${method}:${update.sessionUpdate}`\n : method;\n entryCounts[key] = (entryCounts[key] ?? 0) + 1;\n }\n log.info(\"S3 log entry breakdown\", {\n totalEntries: entries.length,\n types: entryCounts,\n });\n\n const allTurns = rebuildConversation(entries);\n if (allTurns.length === 0) {\n log.info(\"No conversation in S3 logs, skipping JSONL hydration\");\n return;\n }\n\n const maxTokens = supports1MContext(params.model ?? \"\")\n ? LARGE_CONTEXT_MAX_TOKENS\n : DEFAULT_MAX_TOKENS;\n const conversation = selectRecentTurns(allTurns, maxTokens);\n log.info(\"Selected recent turns for hydration\", {\n totalTurns: allTurns.length,\n selectedTurns: conversation.length,\n turnRoles: conversation.map((t) => t.role),\n });\n\n const jsonlLines = conversationTurnsToJsonlEntries(conversation, {\n sessionId: params.sessionId,\n cwd: params.cwd,\n model: params.model,\n gitBranch: params.gitBranch,\n permissionMode: params.permissionMode,\n });\n\n await fs.mkdir(path.dirname(jsonlPath), { recursive: true });\n\n const tmpPath = `${jsonlPath}.tmp.${Date.now()}`;\n await fs.writeFile(tmpPath, `${jsonlLines.join(\"\\n\")}\\n`);\n await fs.rename(tmpPath, jsonlPath);\n\n log.info(\"Hydrated session JSONL from S3\", {\n sessionId: params.sessionId,\n turns: conversation.length,\n lines: jsonlLines.length,\n });\n } catch (err) {\n log.warn(\"Failed to hydrate session JSONL, continuing\", {\n sessionId: params.sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n","export type GatewayProduct = \"posthog_code\" | \"background_agents\";\n\nexport function getLlmGatewayUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n // Local development (normalize 127.0.0.1 to localhost)\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308/${product}`;\n }\n\n // Docker containers accessing host\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308/${product}`;\n }\n\n // Production - extract region from hostname, default to US\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com/${product}`;\n}\n","import packageJson from \"../package.json\" with { type: \"json\" };\nimport type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types\";\nimport { getLlmGatewayUrl } from \"./utils/gateway\";\n\nexport { getLlmGatewayUrl };\n\nconst DEFAULT_USER_AGENT = `posthog/agent.hog.dev; version: ${packageJson.version}`;\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n>;\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private isAuthFailure(status: number): boolean {\n return status === 401 || status === 403;\n }\n\n private async resolveApiKey(forceRefresh = false): Promise<string> {\n if (forceRefresh && this.config.refreshApiKey) {\n return this.config.refreshApiKey();\n }\n\n return this.config.getApiKey();\n }\n\n private async buildHeaders(\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Headers> {\n const headers = new Headers(options.headers);\n headers.set(\n \"Authorization\",\n `Bearer ${await this.resolveApiKey(forceRefresh)}`,\n );\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"User-Agent\", this.config.userAgent ?? DEFAULT_USER_AGENT);\n return headers;\n }\n\n private async performRequest(\n endpoint: string,\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Response> {\n const url = `${this.baseUrl}${endpoint}`;\n\n return fetch(url, {\n ...options,\n headers: await this.buildHeaders(options, forceRefresh),\n });\n }\n\n private async performRequestWithRetry(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<Response> {\n let response = await this.performRequest(endpoint, options);\n\n if (!response.ok && this.isAuthFailure(response.status)) {\n response = await this.performRequest(endpoint, options, true);\n }\n\n return response;\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const response = await this.performRequestWithRetry(endpoint, options);\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n async getApiKey(forceRefresh = false): Promise<string> {\n return this.resolveApiKey(forceRefresh);\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async relayMessage(\n taskId: string,\n runId: string,\n text: string,\n ): Promise<void> {\n const teamId = this.getTeamId();\n await this.apiRequest<{ status: string }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/relay_message/`,\n {\n method: \"POST\",\n body: JSON.stringify({ text }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n return response.artifacts ?? [];\n }\n\n async getArtifactPresignedUrl(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<string | null> {\n const teamId = this.getTeamId();\n try {\n const response = await this.apiRequest<{\n url: string;\n expires_in: number;\n }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/presign/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n return response.url;\n } catch {\n return null;\n }\n }\n\n /**\n * Download artifact content by storage path\n * Gets a presigned URL and fetches the content\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const url = await this.getArtifactPresignedUrl(taskId, runId, storagePath);\n if (!url) {\n return null;\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n const endpoint = `/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`;\n\n try {\n const response = await this.performRequestWithRetry(endpoint);\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","/**\n * Configuration for a single saga step\n */\nexport interface SagaStep<T> {\n /** Unique name for this step (used in logging) */\n name: string;\n /** The forward action to execute */\n execute: () => Promise<T>;\n /** The rollback action to undo this step (receives the execute result) */\n rollback: (result: T) => Promise<void>;\n}\n\n/**\n * Result of a saga execution\n */\nexport type SagaResult<T, TFailedStep extends string = string> =\n | { success: true; data: T }\n | { success: false; error: string; failedStep: TFailedStep };\n\nexport interface SagaLogger {\n info(message: string, data?: Record<string, unknown>): void;\n debug(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n warn(message: string, data?: Record<string, unknown>): void;\n}\n\nconst consoleLogger: SagaLogger = {\n info: (_message, _data) => {},\n debug: (_message, _data) => {},\n error: (_message, _data) => {},\n warn: (_message, _data) => {},\n};\n\n/**\n * Abstract base class for implementing our Saga pattern.\n *\n * Subclasses implement the `execute` method, using `this.step()` to define\n * each step with its compensating action. If any step throws, all completed\n * steps are automatically rolled back in reverse order.\n *\n * The failed step name is automatically tracked from the step's `name` property.\n *\n * @template TInput - The input type for the saga\n * @template TOutput - The successful output type\n */\nexport abstract class Saga<TInput, TOutput> {\n abstract readonly sagaName: string;\n\n private completedSteps: Array<{\n name: string;\n rollback: () => Promise<void>;\n }> = [];\n private currentStepName = \"unknown\";\n private stepTimings: Array<{ name: string; durationMs: number }> = [];\n protected readonly log: SagaLogger;\n\n constructor(logger?: SagaLogger) {\n this.log = logger ?? consoleLogger;\n }\n\n /**\n * Run the saga with the given input.\n * Returns a discriminated union result - either success with data or failure with error details.\n */\n async run(input: TInput): Promise<SagaResult<TOutput>> {\n this.completedSteps = [];\n this.currentStepName = \"unknown\";\n this.stepTimings = [];\n\n const sagaStart = performance.now();\n this.log.info(\"Starting saga\", { sagaName: this.sagaName });\n\n try {\n const result = await this.execute(input);\n\n const totalDuration = performance.now() - sagaStart;\n this.log.debug(\"Saga completed successfully\", {\n sagaName: this.sagaName,\n stepsCompleted: this.completedSteps.length,\n totalDurationMs: Math.round(totalDuration),\n stepTimings: this.stepTimings,\n });\n\n return { success: true, data: result };\n } catch (error) {\n this.log.error(\"Saga failed, initiating rollback\", {\n sagaName: this.sagaName,\n failedStep: this.currentStepName,\n error: error instanceof Error ? error.message : String(error),\n });\n\n await this.rollback();\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n failedStep: this.currentStepName,\n };\n }\n }\n\n /**\n * Implement this method to define the saga's steps.\n * Use `this.step()` to execute each step with its compensating action.\n */\n protected abstract execute(input: TInput): Promise<TOutput>;\n\n /**\n * Execute a step with its rollback action.\n * If the step succeeds, its rollback action is stored for potential rollback.\n * The step name is automatically tracked for error reporting.\n *\n * @param config - Step configuration with name, execute, and rollback functions\n * @returns The result of the execute function\n * @throws Re-throws any error from the execute function (triggers rollback)\n */\n protected async step<T>(config: SagaStep<T>): Promise<T> {\n this.currentStepName = config.name;\n this.log.debug(`Executing step: ${config.name}`);\n\n const stepStart = performance.now();\n const result = await config.execute();\n const durationMs = Math.round(performance.now() - stepStart);\n\n this.stepTimings.push({ name: config.name, durationMs });\n this.log.debug(`Step completed: ${config.name}`, { durationMs });\n\n // Store rollback action with the result bound\n this.completedSteps.push({\n name: config.name,\n rollback: () => config.rollback(result),\n });\n\n return result;\n }\n\n /**\n * Execute a step that doesn't need rollback.\n * Useful for read-only operations or operations that are idempotent.\n * The step name is automatically tracked for error reporting.\n *\n * @param name - Step name for logging and error tracking\n * @param execute - The action to execute\n * @returns The result of the execute function\n */\n protected async readOnlyStep<T>(\n name: string,\n execute: () => Promise<T>,\n ): Promise<T> {\n this.currentStepName = name;\n this.log.debug(`Executing read-only step: ${name}`);\n\n const stepStart = performance.now();\n const result = await execute();\n const durationMs = Math.round(performance.now() - stepStart);\n\n this.stepTimings.push({ name, durationMs });\n this.log.debug(`Read-only step completed: ${name}`, { durationMs });\n return result;\n }\n\n /**\n * Roll back all completed steps in reverse order.\n * Rollback errors are logged but don't stop the rollback of other steps.\n */\n private async rollback(): Promise<void> {\n this.log.info(\"Rolling back saga\", {\n stepsToRollback: this.completedSteps.length,\n });\n\n const stepsReversed = [...this.completedSteps].reverse();\n\n for (const step of stepsReversed) {\n try {\n this.log.debug(`Rolling back step: ${step.name}`);\n await step.rollback();\n this.log.debug(`Step rolled back: ${step.name}`);\n } catch (error) {\n // Log but continue - we want to attempt all rollbacks\n this.log.error(`Failed to rollback step: ${step.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n this.log.info(\"Rollback completed\", {\n stepsAttempted: this.completedSteps.length,\n });\n }\n\n /**\n * Get the number of completed steps (useful for testing)\n */\n protected getCompletedStepCount(): number {\n return this.completedSteps.length;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { CreateGitClientOptions } from \"./client\";\nimport { getGitOperationManager } from \"./operation-manager\";\n\nexport interface WorktreeListEntry {\n path: string;\n head: string;\n branch: string | null;\n}\n\nexport interface AheadBehind {\n aheadOfRemote: number;\n behind: number;\n}\n\nexport interface GitStatus {\n isClean: boolean;\n staged: string[];\n modified: string[];\n deleted: string[];\n untracked: string[];\n}\n\ntype GitLike = {\n raw: (args: string[]) => Promise<string>;\n revparse: (args: string[]) => Promise<string>;\n};\n\nexport async function detectDefaultBranch(git: GitLike): Promise<string> {\n try {\n const remoteBranch = await git.raw([\n \"symbolic-ref\",\n \"refs/remotes/origin/HEAD\",\n ]);\n return remoteBranch.trim().replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // Check common default branch names\n for (const candidate of [\"main\", \"master\"]) {\n try {\n await git.revparse([\"--verify\", candidate]);\n return candidate;\n } catch {}\n }\n\n // Check git config init.defaultBranch (user's configured default)\n try {\n const configured = await git.raw([\"config\", \"init.defaultBranch\"]);\n const branch = configured.trim();\n if (branch) {\n try {\n await git.revparse([\"--verify\", branch]);\n return branch;\n } catch {}\n }\n } catch {}\n\n // Fall back to current branch (HEAD)\n try {\n const head = await git.raw([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const branch = head.trim();\n if (branch && branch !== \"HEAD\") {\n return branch;\n }\n } catch {}\n\n throw new Error(\"Cannot determine default branch\");\n }\n}\n\nasync function detectDefaultBranchWithFallback(git: GitLike): Promise<string> {\n try {\n return await detectDefaultBranch(git);\n } catch {\n // Last resort: use current branch or \"main\"\n try {\n const head = await git.raw([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const branch = head.trim();\n if (branch && branch !== \"HEAD\") {\n return branch;\n }\n } catch {}\n return \"main\";\n }\n}\n\nexport async function getCurrentBranch(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const branch = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n return branch === \"HEAD\" ? null : branch;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getDefaultBranch(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, detectDefaultBranch, {\n signal: options?.abortSignal,\n });\n}\n\nexport async function getRemoteUrl(\n baseDir: string,\n remote = \"origin\",\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const url = await git.remote([\"get-url\", remote]);\n return url || null;\n } catch {\n if (remote === \"origin\") {\n const remotes = await git.getRemotes(true);\n if (remotes.length > 0 && remotes[0].refs.fetch) {\n return remotes[0].refs.fetch;\n }\n }\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getStatus(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<GitStatus> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const status = await git.status([\"--untracked-files=normal\"]);\n return {\n isClean: status.isClean(),\n staged: status.staged,\n modified: status.modified,\n deleted: status.deleted,\n untracked: status.not_added,\n };\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function hasChanges(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const status = await git.status([\"--untracked-files=normal\"]);\n return !status.isClean();\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getAheadBehind(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<AheadBehind | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const branchOutput = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n const branch = branchOutput === \"HEAD\" ? null : branchOutput;\n if (!branch) return null;\n\n try {\n await git.raw([\"rev-parse\", \"--abbrev-ref\", `${branch}@{upstream}`]);\n } catch {\n return null;\n }\n\n const status = await git.status([\"--untracked-files=no\"]);\n return {\n aheadOfRemote: status.ahead,\n behind: status.behind,\n };\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function branchExists(\n baseDir: string,\n branchName: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n await git.revparse([\"--verify\", branchName]);\n return true;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listWorktrees(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<WorktreeListEntry[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\"worktree\", \"list\", \"--porcelain\"]);\n const worktrees: WorktreeListEntry[] = [];\n let current: Partial<WorktreeListEntry> = {};\n\n for (const line of output.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n if (current.path) {\n worktrees.push(current as WorktreeListEntry);\n }\n current = { path: line.slice(9), branch: null };\n } else if (line.startsWith(\"HEAD \")) {\n current.head = line.slice(5);\n } else if (line.startsWith(\"branch \")) {\n current.branch = line.slice(7).replace(\"refs/heads/\", \"\");\n } else if (line === \"detached\") {\n current.branch = null;\n }\n }\n\n if (current.path) {\n worktrees.push(current as WorktreeListEntry);\n }\n\n return worktrees;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getFileAtHead(\n baseDir: string,\n filePath: string,\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n return await git.show([`HEAD:${filePath}`]);\n } catch {\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getHeadSha(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.revparse([\"HEAD\"]), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function isDetachedHead(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const branch = await getCurrentBranch(baseDir, options);\n return branch === null;\n}\n\nexport async function isGitRepository(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n await git.revparse([\"--is-inside-work-tree\"]);\n return true;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getChangedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<Set<string>> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const changedFiles = new Set<string>();\n\n try {\n const defaultBranch = await detectDefaultBranchWithFallback(git);\n const branchOutput = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n const currentBranch = branchOutput === \"HEAD\" ? null : branchOutput;\n\n if (currentBranch && currentBranch !== defaultBranch) {\n try {\n const diffOutput = await git.diff([\n \"--name-only\",\n `${defaultBranch}...HEAD`,\n ]);\n for (const file of diffOutput.split(\"\\n\").filter(Boolean)) {\n changedFiles.add(file);\n }\n } catch {}\n }\n\n const status = await git.status([\"--untracked-files=normal\"]);\n for (const file of [\n ...status.modified,\n ...status.created,\n ...status.deleted,\n ...status.renamed.map((r) => r.to),\n ...status.not_added,\n ]) {\n changedFiles.add(file);\n }\n } catch {}\n\n return changedFiles;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getAllBranches(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const summary = await git.branchLocal();\n return summary.all;\n } catch {\n return [];\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport type GitFileStatus =\n | \"modified\"\n | \"added\"\n | \"deleted\"\n | \"renamed\"\n | \"untracked\";\n\nexport interface ChangedFileInfo {\n path: string;\n status: GitFileStatus;\n originalPath?: string;\n linesAdded?: number;\n linesRemoved?: number;\n}\n\nexport interface GetChangedFilesDetailedOptions extends CreateGitClientOptions {\n excludePatterns?: string[];\n}\n\nfunction matchesExcludePattern(filePath: string, patterns: string[]): boolean {\n return patterns.some((pattern) => {\n if (pattern.startsWith(\"/\")) {\n return (\n filePath === pattern.slice(1) ||\n filePath.startsWith(`${pattern.slice(1)}/`)\n );\n }\n return filePath === pattern || filePath.startsWith(`${pattern}/`);\n });\n}\n\nasync function countFileLines(filePath: string): Promise<number> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n if (!content) return 0;\n return content.split(\"\\n\").length - (content.endsWith(\"\\n\") ? 1 : 0);\n } catch {\n return 0;\n }\n}\n\nexport async function getChangedFilesDetailed(\n baseDir: string,\n options?: GetChangedFilesDetailedOptions,\n): Promise<ChangedFileInfo[]> {\n const { excludePatterns, ...gitOptions } = options ?? {};\n const manager = getGitOperationManager();\n\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const [diffSummary, status] = await Promise.all([\n git.diffSummary([\"-M\", \"HEAD\"]),\n git.status([\"--untracked-files=normal\"]),\n ]);\n\n const seenPaths = new Set<string>();\n const files: ChangedFileInfo[] = [];\n\n for (const file of diffSummary.files) {\n if (\n excludePatterns &&\n matchesExcludePattern(file.file, excludePatterns)\n ) {\n seenPaths.add(file.file);\n continue;\n }\n\n const hasFrom = \"from\" in file && file.from;\n const isBinary = file.binary;\n files.push({\n path: file.file,\n status: hasFrom\n ? \"renamed\"\n : status.deleted.includes(file.file)\n ? \"deleted\"\n : status.created.includes(file.file)\n ? \"added\"\n : \"modified\",\n originalPath: hasFrom ? (file.from as string) : undefined,\n linesAdded: isBinary\n ? undefined\n : (file as { insertions: number }).insertions,\n linesRemoved: isBinary\n ? undefined\n : (file as { deletions: number }).deletions,\n });\n seenPaths.add(file.file);\n if (hasFrom) seenPaths.add(file.from as string);\n }\n\n const MAX_UNTRACKED_FILES = 10_000;\n let untrackedProcessed = 0;\n for (const file of status.not_added) {\n if (untrackedProcessed >= MAX_UNTRACKED_FILES) break;\n if (!seenPaths.has(file)) {\n if (\n excludePatterns &&\n matchesExcludePattern(file, excludePatterns)\n ) {\n continue;\n }\n const lineCount = await countFileLines(path.join(baseDir, file));\n files.push({\n path: file,\n status: \"untracked\",\n linesAdded: lineCount,\n linesRemoved: 0,\n });\n untrackedProcessed++;\n }\n }\n\n for (const file of status.modified) {\n if (!seenPaths.has(file)) {\n if (\n excludePatterns &&\n matchesExcludePattern(file, excludePatterns)\n ) {\n continue;\n }\n try {\n const unstaged = await git.diff([file]);\n const lines = unstaged.split(\"\\n\");\n const linesAdded = lines.filter(\n (l) => l.startsWith(\"+\") && !l.startsWith(\"+++\"),\n ).length;\n const linesRemoved = lines.filter(\n (l) => l.startsWith(\"-\") && !l.startsWith(\"---\"),\n ).length;\n files.push({\n path: file,\n status: \"modified\",\n linesAdded,\n linesRemoved,\n });\n } catch {}\n }\n }\n\n for (const file of status.deleted) {\n if (!seenPaths.has(file)) {\n if (\n excludePatterns &&\n matchesExcludePattern(file, excludePatterns)\n ) {\n continue;\n }\n files.push({\n path: file,\n status: \"deleted\",\n linesAdded: 0,\n linesRemoved: 0,\n });\n }\n }\n\n return files;\n } catch {\n return [];\n }\n },\n { signal: gitOptions?.abortSignal },\n );\n}\n\nexport async function getChangedFilesBetweenBranches(\n baseDir: string,\n baseBranch: string,\n headBranch?: string,\n options?: GetChangedFilesDetailedOptions,\n): Promise<ChangedFileInfo[]> {\n const { excludePatterns, ...gitOptions } = options ?? {};\n const manager = getGitOperationManager();\n\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const from = `origin/${baseBranch}`;\n const to = headBranch ?? \"HEAD\";\n\n const [diffSummary, nameStatusOutput] = await Promise.all([\n git.diffSummary([\"-M\", `${from}...${to}`]),\n git.raw([\"diff\", \"--name-status\", \"-M\", `${from}...${to}`]),\n ]);\n\n const statusMap = new Map<string, GitFileStatus>();\n for (const line of nameStatusOutput.split(\"\\n\").filter(Boolean)) {\n const parts = line.split(\"\\t\");\n const code = parts[0];\n const filePath = parts.length === 3 ? parts[2] : parts[1];\n if (!filePath) continue;\n\n if (code?.startsWith(\"R\")) {\n statusMap.set(filePath, \"renamed\");\n } else if (code === \"A\") {\n statusMap.set(filePath, \"added\");\n } else if (code === \"D\") {\n statusMap.set(filePath, \"deleted\");\n } else {\n statusMap.set(filePath, \"modified\");\n }\n }\n\n const files: ChangedFileInfo[] = [];\n for (const file of diffSummary.files) {\n if (\n excludePatterns &&\n matchesExcludePattern(file.file, excludePatterns)\n ) {\n continue;\n }\n\n const hasFrom = \"from\" in file && file.from;\n const isBinary = file.binary;\n\n files.push({\n path: file.file,\n status: statusMap.get(file.file) ?? \"modified\",\n originalPath: hasFrom ? (file.from as string) : undefined,\n linesAdded: isBinary\n ? undefined\n : (file as { insertions: number }).insertions,\n linesRemoved: isBinary\n ? undefined\n : (file as { deletions: number }).deletions,\n });\n }\n\n return files;\n } catch {\n return [];\n }\n },\n { signal: gitOptions?.abortSignal },\n );\n}\n\nexport interface DiffStats {\n filesChanged: number;\n linesAdded: number;\n linesRemoved: number;\n}\n\nexport interface GetDiffStatsOptions extends CreateGitClientOptions {\n excludePatterns?: string[];\n}\n\nexport function computeDiffStatsFromFiles(files: ChangedFileInfo[]): DiffStats {\n let linesAdded = 0;\n let linesRemoved = 0;\n\n for (const file of files) {\n linesAdded += file.linesAdded ?? 0;\n linesRemoved += file.linesRemoved ?? 0;\n }\n\n return {\n filesChanged: files.length,\n linesAdded,\n linesRemoved,\n };\n}\n\nexport async function getDiffStats(\n baseDir: string,\n options?: GetDiffStatsOptions,\n): Promise<DiffStats> {\n const files = await getChangedFilesDetailed(baseDir, options);\n return computeDiffStatsFromFiles(files);\n}\n\nexport interface SyncStatus {\n aheadOfRemote: number;\n behind: number;\n aheadOfDefault: number;\n hasRemote: boolean;\n currentBranch: string | null;\n isFeatureBranch: boolean;\n}\n\nexport async function getSyncStatus(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<SyncStatus> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const status = await git.status([\"--untracked-files=no\"]);\n const isDetached = status.detached || status.current === \"HEAD\";\n const currentBranch = isDetached ? null : status.current || null;\n\n if (!currentBranch) {\n return {\n aheadOfRemote: 0,\n behind: 0,\n aheadOfDefault: 0,\n hasRemote: false,\n currentBranch: null,\n isFeatureBranch: false,\n };\n }\n\n const defaultBranch = await detectDefaultBranchWithFallback(git);\n const hasRemote = status.tracking !== null;\n const isFeatureBranch = currentBranch !== defaultBranch;\n\n let aheadOfDefault = 0;\n if (isFeatureBranch) {\n try {\n const log = await git.log({\n from: `origin/${defaultBranch}`,\n to: currentBranch,\n });\n aheadOfDefault = log.total;\n } catch {}\n }\n\n return {\n aheadOfRemote: status.ahead,\n behind: status.behind,\n aheadOfDefault,\n hasRemote,\n currentBranch,\n isFeatureBranch,\n };\n } catch {\n return {\n aheadOfRemote: 0,\n behind: 0,\n aheadOfDefault: 0,\n hasRemote: false,\n currentBranch: null,\n isFeatureBranch: false,\n };\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport interface CommitInfo {\n sha: string;\n shortSha: string;\n message: string;\n author: string;\n date: string;\n}\n\nexport async function getLatestCommit(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<CommitInfo | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const log = await git.log({ maxCount: 1 });\n const latest = log.latest;\n if (!latest) return null;\n\n return {\n sha: latest.hash,\n shortSha: latest.hash.slice(0, 7),\n message: latest.message,\n author: latest.author_name,\n date: latest.date,\n };\n } catch {\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getCommitsBetweenBranches(\n baseDir: string,\n baseBranch: string,\n headBranch?: string,\n maxCount = 50,\n options?: CreateGitClientOptions,\n): Promise<CommitInfo[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const log = await git.log({\n from: `origin/${baseBranch}`,\n to: headBranch ?? \"HEAD\",\n maxCount,\n });\n return log.all.map((c) => ({\n sha: c.hash,\n shortSha: c.hash.slice(0, 7),\n message: c.message,\n author: c.author_name,\n date: c.date,\n }));\n } catch {\n return [];\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport interface CommitConventions {\n conventionalCommits: boolean;\n commonPrefixes: string[];\n sampleMessages: string[];\n}\n\nexport async function getCommitConventions(\n baseDir: string,\n sampleSize = 20,\n options?: CreateGitClientOptions,\n): Promise<CommitConventions> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const log = await git.log({ maxCount: sampleSize });\n const messages = log.all.map((c) => c.message);\n\n const conventionalPattern =\n /^(feat|fix|docs|style|refactor|test|chore|build|ci|perf|revert)(\\(.+\\))?:/;\n const conventionalCount = messages.filter((m) =>\n conventionalPattern.test(m),\n ).length;\n const conventionalCommits = conventionalCount > messages.length * 0.5;\n\n const prefixes = messages\n .map((m) => m.match(/^([a-z]+)(\\(.+\\))?:/)?.[1])\n .filter((p): p is string => Boolean(p));\n const prefixCounts = prefixes.reduce(\n (acc, p) => {\n acc[p] = (acc[p] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>,\n );\n const commonPrefixes = Object.entries(prefixCounts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([prefix]) => prefix);\n\n return {\n conventionalCommits,\n commonPrefixes,\n sampleMessages: messages.slice(0, 5),\n };\n } catch {\n return {\n conventionalCommits: false,\n commonPrefixes: [],\n sampleMessages: [],\n };\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function fetch(\n baseDir: string,\n remote = \"origin\",\n options?: CreateGitClientOptions,\n): Promise<void> {\n const manager = getGitOperationManager();\n await manager.executeWrite(\n baseDir,\n async (git) => {\n await git.fetch(remote);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\"ls-files\"]);\n return output.split(\"\\n\").filter(Boolean);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listUntrackedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\n \"ls-files\",\n \"--others\",\n \"--exclude-standard\",\n ]);\n return output.split(\"\\n\").filter(Boolean);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listAllFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const [tracked, untracked] = await Promise.all([\n listFiles(baseDir, options),\n listUntrackedFiles(baseDir, options),\n ]);\n return [...tracked, ...untracked];\n}\n\nexport async function hasTrackedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const files = await listFiles(baseDir, options);\n return files.length > 0;\n}\n\nexport async function getStagedDiff(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.diff([\"--cached\", \"HEAD\"]), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function getUnstagedDiff(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.diff(), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function getDiffAgainstRemote(\n baseDir: string,\n baseBranch: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n (git) => git.diff([`origin/${baseBranch}...HEAD`]),\n { signal: options?.abortSignal },\n );\n}\n\nexport async function isCommitOnRemote(\n baseDir: string,\n commit: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const output = await git.branch([\"-r\", \"--contains\", commit]);\n return output.all.length > 0;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function resolveGitDir(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const gitDir = await git.revparse([\"--git-dir\"]);\n return path.resolve(baseDir, gitDir);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function addToLocalExclude(\n baseDir: string,\n pattern: string,\n options?: CreateGitClientOptions,\n): Promise<void> {\n const manager = getGitOperationManager();\n const excludePath = await manager.executeRead(\n baseDir,\n async (git) => {\n // --git-path resolves to the correct location for both regular repos\n // and worktrees (where info/exclude is shared via the common dir)\n const rel = await git.revparse([\"--git-path\", \"info/exclude\"]);\n return path.resolve(baseDir, rel);\n },\n { signal: options?.abortSignal },\n );\n\n let content = \"\";\n try {\n content = await fs.readFile(excludePath, \"utf-8\");\n } catch {}\n\n const normalizedPattern = pattern.startsWith(\"/\") ? pattern : `/${pattern}`;\n const patternWithoutSlash = pattern.replace(/^\\//, \"\");\n if (\n content.includes(normalizedPattern) ||\n content.includes(patternWithoutSlash)\n ) {\n return;\n }\n\n const infoDir = path.dirname(excludePath);\n await fs.mkdir(infoDir, { recursive: true });\n\n const newContent = content.trimEnd()\n ? `${content.trimEnd()}\\n${pattern}\\n`\n : `${pattern}\\n`;\n await fs.writeFile(excludePath, newContent);\n}\n","const cache = new WeakMap<String, string[]>();\n\nexport function pathspec(...paths: string[]) {\n const key = new String(paths);\n cache.set(key, paths);\n\n return key as string;\n}\n\nexport function isPathSpec(path: string | unknown): path is string {\n return path instanceof String && cache.has(path);\n}\n\nexport function toPaths(pathSpec: string): string[] {\n return cache.get(pathSpec) || [];\n}\n","import type { SimpleGitTask } from '../types';\n\n/**\n * The `GitError` is thrown when the underlying `git` process throws a\n * fatal exception (eg an `ENOENT` exception when attempting to use a\n * non-writable directory as the root for your repo), and acts as the\n * base class for more specific errors thrown by the parsing of the\n * git response or errors in the configuration of the task about to\n * be run.\n *\n * When an exception is thrown, pending tasks in the same instance will\n * not be executed. The recommended way to run a series of tasks that\n * can independently fail without needing to prevent future tasks from\n * running is to catch them individually:\n *\n * ```typescript\n import { gitP, SimpleGit, GitError, PullResult } from 'simple-git';\n\n function catchTask (e: GitError) {\n return e.\n }\n\n const git = gitP(repoWorkingDir);\n const pulled: PullResult | GitError = await git.pull().catch(catchTask);\n const pushed: string | GitError = await git.pushTags().catch(catchTask);\n ```\n */\nexport class GitError extends Error {\n constructor(\n public task?: SimpleGitTask<any>,\n message?: string\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { GitError } from './git-error';\n\n/**\n * The `GitResponseError` is the wrapper for a parsed response that is treated as\n * a fatal error, for example attempting a `merge` can leave the repo in a corrupted\n * state when there are conflicts so the task will reject rather than resolve.\n *\n * For example, catching the merge conflict exception:\n *\n * ```typescript\n import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git';\n\n const git = gitP(repoRoot);\n const mergeOptions: string[] = ['--no-ff', 'other-branch'];\n const mergeSummary: MergeSummary = await git.merge(mergeOptions)\n .catch((e: GitResponseError<MergeSummary>) => e.git);\n\n if (mergeSummary.failed) {\n // deal with the error\n }\n ```\n */\nexport class GitResponseError<T = any> extends GitError {\n constructor(\n /**\n * `.git` access the parsed response that is treated as being an error\n */\n public readonly git: T,\n message?: string\n ) {\n super(undefined, message || String(git));\n }\n}\n","import { GitError } from './git-error';\n\n/**\n * The `TaskConfigurationError` is thrown when a command was incorrectly\n * configured. An error of this kind means that no attempt was made to\n * run your command through the underlying `git` binary.\n *\n * Check the `.message` property for more detail on why your configuration\n * resulted in an error.\n */\nexport class TaskConfigurationError extends GitError {\n constructor(message?: string) {\n super(undefined, message);\n }\n}\n","import { Buffer } from 'node:buffer';\nimport { exists, FOLDER } from '@kwsites/file-exists';\nimport type { Maybe } from '../types';\nimport { filterHasLength } from './argument-filters';\n\ntype Callable = (...args: unknown[]) => unknown;\n\nexport const NULL = '\\0';\n\nexport const NOOP: Callable = () => {};\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function asFunction<T>(source: T | unknown): Callable {\n if (typeof source !== 'function') {\n return NOOP;\n }\n return source as Callable;\n}\n\n/**\n * Determines whether the supplied argument is both a function, and is not\n * the `NOOP` function.\n */\nexport function isUserFunction<T extends Function>(source: T | unknown): source is T {\n return typeof source === 'function' && source !== NOOP;\n}\n\nexport function splitOn(input: string, char: string): [string, string] {\n const index = input.indexOf(char);\n if (index <= 0) {\n return [input, ''];\n }\n\n return [input.substr(0, index), input.substr(index + 1)];\n}\n\nexport function first<T extends unknown[]>(input: T, offset?: number): Maybe<T[number]>;\nexport function first<T extends IArguments>(input: T, offset?: number): Maybe<unknown>;\nexport function first(input: unknown[] | IArguments, offset = 0): Maybe<unknown> {\n return isArrayLike(input) && input.length > offset ? input[offset] : undefined;\n}\n\nexport function last<T extends unknown[]>(input: T, offset?: number): Maybe<T[number]>;\nexport function last<T extends IArguments>(input: T, offset?: number): Maybe<unknown>;\nexport function last<T>(input: T, offset?: number): Maybe<unknown>;\nexport function last(input: unknown, offset = 0) {\n if (isArrayLike(input) && input.length > offset) {\n return input[input.length - 1 - offset];\n }\n}\n\ntype ArrayLike<T> = T[] | IArguments | { [index: number]: T; length: number };\n\nfunction isArrayLike(input: unknown): input is ArrayLike<unknown> {\n return filterHasLength(input);\n}\n\nexport function toLinesWithContent(input = '', trimmed = true, separator = '\\n'): string[] {\n return input.split(separator).reduce((output, line) => {\n const lineContent = trimmed ? line.trim() : line;\n if (lineContent) {\n output.push(lineContent);\n }\n return output;\n }, [] as string[]);\n}\n\ntype LineWithContentCallback<T = void> = (line: string) => T;\n\nexport function forEachLineWithContent<T>(\n input: string,\n callback: LineWithContentCallback<T>\n): T[] {\n return toLinesWithContent(input, true).map((line) => callback(line));\n}\n\nexport function folderExists(path: string): boolean {\n return exists(path, FOLDER);\n}\n\n/**\n * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`.\n */\nexport function append<T>(target: T[] | Set<T>, item: T): typeof item {\n if (Array.isArray(target)) {\n if (!target.includes(item)) {\n target.push(item);\n }\n } else {\n target.add(item);\n }\n return item;\n}\n\n/**\n * Adds `item` into the `target` `Array` when it is not already present and returns the `target`.\n */\nexport function including<T>(target: T[], item: T): typeof target {\n if (Array.isArray(target) && !target.includes(item)) {\n target.push(item);\n }\n\n return target;\n}\n\nexport function remove<T>(target: Set<T> | T[], item: T): T {\n if (Array.isArray(target)) {\n const index = target.indexOf(item);\n if (index >= 0) {\n target.splice(index, 1);\n }\n } else {\n target.delete(item);\n }\n return item;\n}\n\nexport const objectToString = Object.prototype.toString.call.bind(Object.prototype.toString) as (\n input: unknown\n) => string;\n\nexport function asArray<T>(source: T | T[]): T[] {\n return Array.isArray(source) ? source : [source];\n}\n\nexport function asCamelCase(str: string) {\n return str.replace(/[\\s-]+(.)/g, (_all, chr) => {\n return chr.toUpperCase();\n });\n}\n\nexport function asStringArray<T>(source: T | T[]): string[] {\n return asArray(source).map((item) => {\n return item instanceof String ? (item as string) : String(item);\n });\n}\n\nexport function asNumber(source: string | null | undefined, onNaN = 0) {\n if (source == null) {\n return onNaN;\n }\n\n const num = parseInt(source, 10);\n return Number.isNaN(num) ? onNaN : num;\n}\n\nexport function prefixedArray<T>(input: T[], prefix: T): T[] {\n const output: T[] = [];\n for (let i = 0, max = input.length; i < max; i++) {\n output.push(prefix, input[i]);\n }\n return output;\n}\n\nexport function bufferToString(input: Buffer | Buffer[]): string {\n return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8');\n}\n\n/**\n * Get a new object from a source object with only the listed properties.\n */\nexport function pick<T, K extends keyof T>(source: T, properties: readonly K[]) {\n const out: Partial<Pick<T, K>> = {};\n\n properties.forEach((key) => {\n if (source[key] !== undefined) {\n out[key] = source[key];\n }\n });\n\n return out;\n}\n\nexport function delay(duration = 0): Promise<void> {\n return new Promise((done) => setTimeout(done, duration));\n}\n\nexport function orVoid<T>(input: T | false) {\n if (input === false) {\n return undefined;\n }\n return input;\n}\n","import { isPathSpec } from '../args/pathspec';\nimport type { Maybe, Options, Primitives } from '../types';\nimport { objectToString } from './util';\n\nexport type ArgumentFilterPredicate<T> = (input: T | unknown) => input is T;\n\nexport function filterType<T, K>(\n input: K,\n filter: ArgumentFilterPredicate<T>\n): K extends T ? T : undefined;\nexport function filterType<T, K>(input: K, filter: ArgumentFilterPredicate<T>, def: T): T;\nexport function filterType<T, K>(input: K, filter: ArgumentFilterPredicate<T>, def?: T): Maybe<T> {\n if (filter(input)) {\n return input;\n }\n return arguments.length > 2 ? def : undefined;\n}\n\nexport const filterArray: ArgumentFilterPredicate<Array<unknown>> = (\n input\n): input is Array<unknown> => {\n return Array.isArray(input);\n};\n\nexport function filterPrimitives(\n input: unknown,\n omit?: Array<'boolean' | 'string' | 'number'>\n): input is Primitives {\n const type = isPathSpec(input) ? 'string' : typeof input;\n\n return (\n /number|string|boolean/.test(type) &&\n (!omit || !omit.includes(type as 'boolean' | 'string' | 'number'))\n );\n}\n\nexport const filterNumber: ArgumentFilterPredicate<number> = (input: unknown): input is number => {\n return typeof input === 'number';\n};\n\nexport const filterString: ArgumentFilterPredicate<string> = (input: unknown): input is string => {\n return typeof input === 'string';\n};\n\nexport const filterStringOrStringArray: ArgumentFilterPredicate<string | string[]> = (\n input\n): input is string | string[] => {\n return filterString(input) || (Array.isArray(input) && input.every(filterString));\n};\n\nexport function filterPlainObject<T extends Options>(input: T | unknown): input is T;\nexport function filterPlainObject<T extends Record<string, unknown>>(\n input: T | unknown\n): input is T {\n return !!input && objectToString(input) === '[object Object]';\n}\n\nexport function filterFunction(input: unknown): input is (...args: unknown[]) => unknown {\n return typeof input === 'function';\n}\n\nexport const filterHasLength: ArgumentFilterPredicate<{ length: number }> = (\n input\n): input is { length: number } => {\n if (input == null || 'number|boolean|function'.includes(typeof input)) {\n return false;\n }\n\n return typeof (input as { length?: number }).length === 'number';\n};\n","/**\n * Known process exit codes used by the task parsers to determine whether an error\n * was one they can automatically handle\n */\nexport enum ExitCodes {\n SUCCESS,\n ERROR,\n NOT_FOUND = -2,\n UNCLEAN = 128,\n}\n","import { TaskResponseFormat } from '../types';\n\nexport class GitOutputStreams<T extends TaskResponseFormat = Buffer> {\n constructor(\n public readonly stdOut: T,\n public readonly stdErr: T\n ) {}\n\n asStrings(): GitOutputStreams<string> {\n return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8'));\n }\n}\n","function useMatchesDefault() {\n throw new Error(`LineParser:useMatches not implemented`);\n}\n\nexport class LineParser<T> {\n protected matches: string[] = [];\n protected useMatches: (target: T, match: string[]) => boolean | void = useMatchesDefault;\n\n private _regExp: RegExp[];\n\n constructor(\n regExp: RegExp | RegExp[],\n useMatches?: (target: T, match: string[]) => boolean | void\n ) {\n this._regExp = Array.isArray(regExp) ? regExp : [regExp];\n if (useMatches) {\n this.useMatches = useMatches;\n }\n }\n\n parse = (line: (offset: number) => string | undefined, target: T): boolean => {\n this.resetMatches();\n\n if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) {\n return false;\n }\n\n return this.useMatches(target, this.prepareMatches()) !== false;\n };\n\n protected resetMatches() {\n this.matches.length = 0;\n }\n\n protected prepareMatches() {\n return this.matches;\n }\n\n protected addMatch(reg: RegExp, index: number, line?: string) {\n const matched = line && reg.exec(line);\n if (matched) {\n this.pushMatch(index, matched);\n }\n\n return !!matched;\n }\n\n protected pushMatch(_index: number, matched: string[]) {\n this.matches.push(...matched.slice(1));\n }\n}\n\nexport class RemoteLineParser<T> extends LineParser<T> {\n protected addMatch(reg: RegExp, index: number, line?: string): boolean {\n return /^remote:\\s/.test(String(line)) && super.addMatch(reg, index, line);\n }\n\n protected pushMatch(index: number, matched: string[]) {\n if (index > 0 || matched.length > 1) {\n super.pushMatch(index, matched);\n }\n }\n}\n","import { SimpleGitOptions } from '../types';\n\nconst defaultOptions: Omit<SimpleGitOptions, 'baseDir'> = {\n binary: 'git',\n maxConcurrentProcesses: 5,\n config: [],\n trimmed: false,\n};\n\nexport function createInstanceConfig(\n ...options: Array<Partial<SimpleGitOptions> | undefined>\n): SimpleGitOptions {\n const baseDir = process.cwd();\n const config: SimpleGitOptions = Object.assign(\n { baseDir, ...defaultOptions },\n ...options.filter((o) => typeof o === 'object' && o)\n );\n\n config.baseDir = config.baseDir || baseDir;\n config.trimmed = config.trimmed === true;\n\n return config;\n}\n","import {\n filterArray,\n filterFunction,\n filterPlainObject,\n filterPrimitives,\n filterType,\n} from './argument-filters';\nimport { asFunction, asStringArray, isUserFunction, last } from './util';\nimport { Maybe, Options } from '../types';\nimport { isPathSpec } from '../args/pathspec';\n\nexport function appendTaskOptions<T extends Options = Options>(\n options: Maybe<T>,\n commands: string[] = []\n): string[] {\n if (!filterPlainObject<Options>(options)) {\n return commands;\n }\n\n return Object.keys(options).reduce((commands: string[], key: string) => {\n const value = options[key];\n\n if (isPathSpec(value)) {\n commands.push(value);\n } else if (filterPrimitives(value, ['boolean'])) {\n commands.push(key + '=' + value);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n if (!filterPrimitives(v, ['string', 'number'])) {\n commands.push(key + '=' + v);\n }\n }\n } else {\n commands.push(key);\n }\n\n return commands;\n }, commands);\n}\n\nexport function getTrailingOptions(\n args: IArguments,\n initialPrimitive = 0,\n objectOnly = false\n): string[] {\n const command: string[] = [];\n\n for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) {\n if ('string|number'.includes(typeof args[i])) {\n command.push(String(args[i]));\n }\n }\n\n appendTaskOptions(trailingOptionsArgument(args), command);\n if (!objectOnly) {\n command.push(...trailingArrayArgument(args));\n }\n\n return command;\n}\n\nfunction trailingArrayArgument(args: IArguments) {\n const hasTrailingCallback = typeof last(args) === 'function';\n return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []));\n}\n\n/**\n * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument\n * if there is one. When not found, the return value is null.\n */\nexport function trailingOptionsArgument(args: IArguments): Maybe<Options> {\n const hasTrailingCallback = filterFunction(last(args));\n return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject);\n}\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function trailingFunctionArgument(\n args: unknown[] | IArguments | unknown,\n includeNoop = true\n): Maybe<(...args: unknown[]) => unknown> {\n const callback = asFunction(last(args));\n return includeNoop || isUserFunction(callback) ? callback : undefined;\n}\n","import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types';\nimport { GitOutputStreams } from './git-output-streams';\nimport { LineParser } from './line-parser';\nimport { asArray, toLinesWithContent } from './util';\n\nexport function callTaskParser<INPUT extends TaskResponseFormat, RESPONSE>(\n parser: TaskParser<INPUT, RESPONSE>,\n streams: GitOutputStreams<INPUT>\n) {\n return parser(streams.stdOut, streams.stdErr);\n}\n\nexport function parseStringResponse<T>(\n result: T,\n parsers: LineParser<T>[],\n texts: MaybeArray<string>,\n trim = true\n): T {\n asArray(texts).forEach((text) => {\n for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) {\n const line = (offset = 0) => {\n if (i + offset >= max) {\n return;\n }\n return lines[i + offset];\n };\n\n parsers.some(({ parse }) => parse(line, result));\n }\n });\n\n return result;\n}\n","export * from './argument-filters';\nexport * from './exit-codes';\nexport * from './git-output-streams';\nexport * from './line-parser';\nexport * from './simple-git-options';\nexport * from './task-options';\nexport * from './task-parser';\nexport * from './util';\n","import { ExitCodes } from '../utils';\nimport { Maybe, StringTask } from '../types';\n\nexport enum CheckRepoActions {\n BARE = 'bare',\n IN_TREE = 'tree',\n IS_REPO_ROOT = 'root',\n}\n\nconst onError: StringTask<boolean>['onError'] = ({ exitCode }, error, done, fail) => {\n if (exitCode === ExitCodes.UNCLEAN && isNotRepoMessage(error)) {\n return done(Buffer.from('false'));\n }\n\n fail(error);\n};\n\nconst parser: StringTask<boolean>['parser'] = (text) => {\n return text.trim() === 'true';\n};\n\nexport function checkIsRepoTask(action: Maybe<CheckRepoActions>): StringTask<boolean> {\n switch (action) {\n case CheckRepoActions.BARE:\n return checkIsBareRepoTask();\n case CheckRepoActions.IS_REPO_ROOT:\n return checkIsRepoRootTask();\n }\n\n const commands = ['rev-parse', '--is-inside-work-tree'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nexport function checkIsRepoRootTask(): StringTask<boolean> {\n const commands = ['rev-parse', '--git-dir'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser(path) {\n return /^\\.(git)?$/.test(path.trim());\n },\n };\n}\n\nexport function checkIsBareRepoTask(): StringTask<boolean> {\n const commands = ['rev-parse', '--is-bare-repository'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nfunction isNotRepoMessage(error: Error): boolean {\n return /(Not a git repository|Kein Git-Repository)/i.test(String(error));\n}\n","import { CleanSummary } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\n\nexport class CleanResponse implements CleanSummary {\n public paths: string[] = [];\n public files: string[] = [];\n public folders: string[] = [];\n\n constructor(public readonly dryRun: boolean) {}\n}\n\nconst removalRegexp = /^[a-z]+\\s*/i;\nconst dryRunRemovalRegexp = /^[a-z]+\\s+[a-z]+\\s*/i;\nconst isFolderRegexp = /\\/$/;\n\nexport function cleanSummaryParser(dryRun: boolean, text: string): CleanSummary {\n const summary = new CleanResponse(dryRun);\n const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp;\n\n toLinesWithContent(text).forEach((line) => {\n const removed = line.replace(regexp, '');\n\n summary.paths.push(removed);\n (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed);\n });\n\n return summary;\n}\n","import { TaskConfigurationError } from '../errors/task-configuration-error';\nimport type { BufferTask, EmptyTaskParser, SimpleGitTask, StringTask } from '../types';\n\nexport const EMPTY_COMMANDS: [] = [];\n\nexport type EmptyTask = {\n commands: typeof EMPTY_COMMANDS;\n format: 'empty';\n parser: EmptyTaskParser;\n onError?: undefined;\n};\n\nexport function adhocExecTask(parser: EmptyTaskParser): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser,\n };\n}\n\nexport function configurationErrorTask(error: Error | string): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser() {\n throw typeof error === 'string' ? new TaskConfigurationError(error) : error;\n },\n };\n}\n\nexport function straightThroughStringTask(commands: string[], trimmed = false): StringTask<string> {\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return trimmed ? String(text).trim() : text;\n },\n };\n}\n\nexport function straightThroughBufferTask(commands: string[]): BufferTask<Buffer> {\n return {\n commands,\n format: 'buffer',\n parser(buffer) {\n return buffer;\n },\n };\n}\n\nexport function isBufferTask<R>(task: SimpleGitTask<R>): task is BufferTask<R> {\n return task.format === 'buffer';\n}\n\nexport function isEmptyTask<R>(task: SimpleGitTask<R>): task is EmptyTask {\n return task.format === 'empty' || !task.commands.length;\n}\n","import { CleanSummary } from '../../../typings';\nimport { cleanSummaryParser } from '../responses/CleanSummary';\nimport { Maybe, StringTask } from '../types';\nimport { asStringArray } from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport const CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported';\nexport const CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter (\"n\" or \"f\") is required';\nexport const CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: ';\n\n/**\n * All supported option switches available for use in a `git.clean` operation\n */\nexport enum CleanOptions {\n DRY_RUN = 'n',\n FORCE = 'f',\n IGNORED_INCLUDED = 'x',\n IGNORED_ONLY = 'X',\n EXCLUDING = 'e',\n QUIET = 'q',\n RECURSIVE = 'd',\n}\n\n/**\n * The two modes `git.clean` can run in - one of these must be supplied in order\n * for the command to not throw a `TaskConfigurationError`\n */\nexport type CleanMode = CleanOptions.FORCE | CleanOptions.DRY_RUN;\n\nconst CleanOptionValues: Set<string> = new Set([\n 'i',\n ...asStringArray(Object.values(CleanOptions as any)),\n]);\n\nexport function cleanWithOptionsTask(mode: CleanMode | string, customArgs: string[]) {\n const { cleanMode, options, valid } = getCleanOptions(mode);\n\n if (!cleanMode) {\n return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED);\n }\n\n if (!valid.options) {\n return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode));\n }\n\n options.push(...customArgs);\n\n if (options.some(isInteractiveMode)) {\n return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE);\n }\n\n return cleanTask(cleanMode, options);\n}\n\nexport function cleanTask(mode: CleanMode, customArgs: string[]): StringTask<CleanSummary> {\n const commands: string[] = ['clean', `-${mode}`, ...customArgs];\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): CleanSummary {\n return cleanSummaryParser(mode === CleanOptions.DRY_RUN, text);\n },\n };\n}\n\nexport function isCleanOptionsArray(input: string[]): input is CleanOptions[] {\n return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test));\n}\n\nfunction getCleanOptions(input: string) {\n let cleanMode: Maybe<CleanMode>;\n let options: string[] = [];\n let valid = { cleanMode: false, options: true };\n\n input\n .replace(/[^a-z]i/g, '')\n .split('')\n .forEach((char) => {\n if (isCleanMode(char)) {\n cleanMode = char;\n valid.cleanMode = true;\n } else {\n valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`));\n }\n });\n\n return {\n cleanMode,\n options,\n valid,\n };\n}\n\nfunction isCleanMode(cleanMode?: string): cleanMode is CleanMode {\n return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN;\n}\n\nfunction isKnownOption(option: string): boolean {\n return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1));\n}\n\nfunction isInteractiveMode(option: string): boolean {\n if (/^-[^\\-]/.test(option)) {\n return option.indexOf('i') > 0;\n }\n\n return option === '--interactive';\n}\n","import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings';\nimport { last, splitOn } from '../utils';\n\nexport class ConfigList implements ConfigListSummary {\n public files: string[] = [];\n public values: { [fileName: string]: ConfigValues } = Object.create(null);\n\n private _all: ConfigValues | undefined;\n\n public get all(): ConfigValues {\n if (!this._all) {\n this._all = this.files.reduce((all: ConfigValues, file: string) => {\n return Object.assign(all, this.values[file]);\n }, {});\n }\n\n return this._all;\n }\n\n public addFile(file: string): ConfigValues {\n if (!(file in this.values)) {\n const latest = last(this.files);\n this.values[file] = latest ? Object.create(this.values[latest]) : {};\n\n this.files.push(file);\n }\n\n return this.values[file];\n }\n\n public addValue(file: string, key: string, value: string) {\n const values = this.addFile(file);\n\n if (!Object.hasOwn(values, key)) {\n values[key] = value;\n } else if (Array.isArray(values[key])) {\n (values[key] as string[]).push(value);\n } else {\n values[key] = [values[key] as string, value];\n }\n\n this._all = undefined;\n }\n}\n\nexport function configListParser(text: string): ConfigList {\n const config = new ConfigList();\n\n for (const item of configParser(text)) {\n config.addValue(item.file, String(item.key), item.value);\n }\n\n return config;\n}\n\nexport function configGetParser(text: string, key: string): ConfigGetResult {\n let value: string | null = null;\n const values: string[] = [];\n const scopes: Map<string, string[]> = new Map();\n\n for (const item of configParser(text, key)) {\n if (item.key !== key) {\n continue;\n }\n\n values.push((value = item.value));\n\n if (!scopes.has(item.file)) {\n scopes.set(item.file, []);\n }\n\n scopes.get(item.file)!.push(value);\n }\n\n return {\n key,\n paths: Array.from(scopes.keys()),\n scopes,\n value,\n values,\n };\n}\n\nfunction configFilePath(filePath: string): string {\n return filePath.replace(/^(file):/, '');\n}\n\nfunction* configParser(text: string, requestedKey: string | null = null) {\n const lines = text.split('\\0');\n\n for (let i = 0, max = lines.length - 1; i < max; ) {\n const file = configFilePath(lines[i++]);\n\n let value = lines[i++];\n let key = requestedKey;\n\n if (value.includes('\\n')) {\n const line = splitOn(value, '\\n');\n key = line[0];\n value = line[1];\n }\n\n yield { file, key, value };\n }\n}\n","import type { ConfigGetResult, ConfigListSummary, SimpleGit } from '../../../typings';\nimport { configGetParser, configListParser } from '../responses/ConfigList';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { trailingFunctionArgument } from '../utils';\n\nexport enum GitConfigScope {\n system = 'system',\n global = 'global',\n local = 'local',\n worktree = 'worktree',\n}\n\nfunction asConfigScope<T extends GitConfigScope | undefined>(\n scope: GitConfigScope | unknown,\n fallback: T\n): GitConfigScope | T {\n if (typeof scope === 'string' && Object.hasOwn(GitConfigScope, scope)) {\n return scope as GitConfigScope;\n }\n return fallback;\n}\n\nfunction addConfigTask(\n key: string,\n value: string,\n append: boolean,\n scope: GitConfigScope\n): StringTask<string> {\n const commands: string[] = ['config', `--${scope}`];\n\n if (append) {\n commands.push('--add');\n }\n\n commands.push(key, value);\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): string {\n return text;\n },\n };\n}\n\nfunction getConfigTask(key: string, scope?: GitConfigScope): StringTask<ConfigGetResult> {\n const commands: string[] = ['config', '--null', '--show-origin', '--get-all', key];\n\n if (scope) {\n commands.splice(1, 0, `--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return configGetParser(text, key);\n },\n };\n}\n\nfunction listConfigTask(scope?: GitConfigScope): StringTask<ConfigListSummary> {\n const commands = ['config', '--list', '--show-origin', '--null'];\n\n if (scope) {\n commands.push(`--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string) {\n return configListParser(text);\n },\n };\n}\n\nexport default function (): Pick<SimpleGit, 'addConfig' | 'getConfig' | 'listConfig'> {\n return {\n addConfig(this: SimpleGitApi, key: string, value: string, ...rest: unknown[]) {\n return this._runTask(\n addConfigTask(\n key,\n value,\n rest[0] === true,\n asConfigScope(rest[1], GitConfigScope.local)\n ),\n trailingFunctionArgument(arguments)\n );\n },\n\n getConfig(this: SimpleGitApi, key: string, scope?: GitConfigScope) {\n return this._runTask(\n getConfigTask(key, asConfigScope(scope, undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n\n listConfig(this: SimpleGitApi, ...rest: unknown[]) {\n return this._runTask(\n listConfigTask(asConfigScope(rest[0], undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","export enum DiffNameStatus {\n ADDED = 'A',\n COPIED = 'C',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n CHANGED = 'T',\n UNMERGED = 'U',\n UNKNOWN = 'X',\n BROKEN = 'B',\n}\n\nconst diffNameStatus = new Set(Object.values(DiffNameStatus));\n\nexport function isDiffNameStatus(input: string): input is DiffNameStatus {\n return diffNameStatus.has(input as DiffNameStatus);\n}\n","import { GrepResult, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport {\n asNumber,\n forEachLineWithContent,\n getTrailingOptions,\n NULL,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\n\nimport { configurationErrorTask } from './task';\n\nconst disallowedOptions = ['-h'];\n\nconst Query = Symbol('grepQuery');\n\nexport interface GitGrepQuery extends Iterable<string> {\n /** Adds one or more terms to be grouped as an \"and\" to any other terms */\n and(...and: string[]): this;\n\n /** Adds one or more search terms - git.grep will \"or\" this to other terms */\n param(...param: string[]): this;\n}\n\nclass GrepQuery implements GitGrepQuery {\n private [Query]: string[] = [];\n\n *[Symbol.iterator]() {\n for (const query of this[Query]) {\n yield query;\n }\n }\n\n and(...and: string[]) {\n and.length && this[Query].push('--and', '(', ...prefixedArray(and, '-e'), ')');\n return this;\n }\n\n param(...param: string[]) {\n this[Query].push(...prefixedArray(param, '-e'));\n return this;\n }\n}\n\n/**\n * Creates a new builder for a `git.grep` query with optional params\n */\nexport function grepQueryBuilder(...params: string[]): GitGrepQuery {\n return new GrepQuery().param(...params);\n}\n\nfunction parseGrep(grep: string): GrepResult {\n const paths: GrepResult['paths'] = new Set<string>();\n const results: GrepResult['results'] = {};\n\n forEachLineWithContent(grep, (input) => {\n const [path, line, preview] = input.split(NULL);\n paths.add(path);\n (results[path] = results[path] || []).push({\n line: asNumber(line),\n path,\n preview,\n });\n });\n\n return {\n paths,\n results,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'grep'> {\n return {\n grep(this: SimpleGitApi, searchTerm: string | GitGrepQuery) {\n const then = trailingFunctionArgument(arguments);\n const options = getTrailingOptions(arguments);\n\n for (const option of disallowedOptions) {\n if (options.includes(option)) {\n return this._runTask(\n configurationErrorTask(`git.grep: use of \"${option}\" is not supported.`),\n then\n );\n }\n }\n\n if (typeof searchTerm === 'string') {\n searchTerm = grepQueryBuilder().param(searchTerm);\n }\n\n const commands = ['grep', '--null', '-n', '--full-name', ...options, ...searchTerm];\n\n return this._runTask(\n {\n commands,\n format: 'utf-8',\n parser(stdOut) {\n return parseGrep(stdOut);\n },\n },\n then\n );\n },\n };\n}\n","import type { Maybe, OptionFlags, Options } from '../types';\nimport { asStringArray } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport enum ResetMode {\n MIXED = 'mixed',\n SOFT = 'soft',\n HARD = 'hard',\n MERGE = 'merge',\n KEEP = 'keep',\n}\n\nconst validResetModes = asStringArray(Object.values(ResetMode));\n\nexport type ResetOptions = Options &\n OptionFlags<'-q' | '--quiet' | '--no-quiet' | '--pathspec-from-nul'> &\n OptionFlags<'--pathspec-from-file', string>;\n\nexport function resetTask(mode: Maybe<ResetMode>, customArgs: string[]) {\n const commands: string[] = ['reset'];\n if (isValidResetMode(mode)) {\n commands.push(`--${mode}`);\n }\n commands.push(...customArgs);\n\n return straightThroughStringTask(commands);\n}\n\nexport function getResetMode(mode: ResetMode | unknown): Maybe<ResetMode> {\n if (isValidResetMode(mode)) {\n return mode;\n }\n\n switch (typeof mode) {\n case 'string':\n case 'undefined':\n return ResetMode.SOFT;\n }\n\n return;\n}\n\nfunction isValidResetMode(mode: ResetMode | unknown): mode is ResetMode {\n return typeof mode === 'string' && validResetModes.includes(mode);\n}\n","import debug, { Debugger } from 'debug';\nimport {\n append,\n filterHasLength,\n filterString,\n filterType,\n NOOP,\n objectToString,\n remove,\n} from './utils';\nimport { Maybe } from './types';\n\ndebug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-');\ndebug.formatters.B = (value: Buffer) => {\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8');\n }\n return objectToString(value);\n};\n\ntype OutputLoggingHandler = (message: string, ...args: any[]) => void;\n\nfunction createLog() {\n return debug('simple-git');\n}\n\nexport interface OutputLogger extends OutputLoggingHandler {\n readonly label: string;\n\n info: OutputLoggingHandler;\n step(nextStep?: string): OutputLogger;\n sibling(name: string): OutputLogger;\n}\n\nfunction prefixedLogger(\n to: Debugger,\n prefix: string,\n forward?: OutputLoggingHandler\n): OutputLoggingHandler {\n if (!prefix || !String(prefix).replace(/\\s*/, '')) {\n return !forward\n ? to\n : (message, ...args) => {\n to(message, ...args);\n forward(message, ...args);\n };\n }\n\n return (message, ...args) => {\n to(`%s ${message}`, prefix, ...args);\n if (forward) {\n forward(message, ...args);\n }\n };\n}\n\nfunction childLoggerName(\n name: Maybe<string>,\n childDebugger: Maybe<Debugger>,\n { namespace: parentNamespace }: Debugger\n): string {\n if (typeof name === 'string') {\n return name;\n }\n const childNamespace = (childDebugger && childDebugger.namespace) || '';\n\n if (childNamespace.startsWith(parentNamespace)) {\n return childNamespace.substr(parentNamespace.length + 1);\n }\n\n return childNamespace || parentNamespace;\n}\n\nexport function createLogger(\n label: string,\n verbose?: string | Debugger,\n initialStep?: string,\n infoDebugger = createLog()\n): OutputLogger {\n const labelPrefix = (label && `[${label}]`) || '';\n\n const spawned: OutputLogger[] = [];\n const debugDebugger: Maybe<Debugger> =\n typeof verbose === 'string' ? infoDebugger.extend(verbose) : verbose;\n const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger);\n\n return step(initialStep);\n\n function sibling(name: string, initial?: string) {\n return append(\n spawned,\n createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)\n );\n }\n\n function step(phase?: string) {\n const stepPrefix = (phase && `[${phase}]`) || '';\n const debug = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP;\n const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug);\n\n return Object.assign(debugDebugger ? debug : info, {\n label,\n sibling,\n info,\n step,\n });\n }\n}\n\n/**\n * The `GitLogger` is used by the main `SimpleGit` runner to handle logging\n * any warnings or errors.\n */\nexport class GitLogger {\n public error: OutputLoggingHandler;\n\n public warn: OutputLoggingHandler;\n\n constructor(private _out: Debugger = createLog()) {\n this.error = prefixedLogger(_out, '[ERROR]');\n this.warn = prefixedLogger(_out, '[WARN]');\n }\n\n silent(silence = false) {\n if (silence !== this._out.enabled) {\n return;\n }\n\n const { namespace } = this._out;\n const env = (process.env.DEBUG || '').split(',').filter((s) => !!s);\n const hasOn = env.includes(namespace);\n const hasOff = env.includes(`-${namespace}`);\n\n // enabling the log\n if (!silence) {\n if (hasOff) {\n remove(env, `-${namespace}`);\n } else {\n env.push(namespace);\n }\n } else {\n if (hasOn) {\n remove(env, namespace);\n } else {\n env.push(`-${namespace}`);\n }\n }\n\n debug.enable(env.join(','));\n }\n}\n","import { SimpleGitTask } from '../types';\nimport { GitError } from '../errors/git-error';\nimport { createLogger, OutputLogger } from '../git-logger';\n\ntype AnySimpleGitTask = SimpleGitTask<any>;\n\ntype TaskInProgress = {\n name: string;\n logger: OutputLogger;\n task: AnySimpleGitTask;\n};\n\nexport class TasksPendingQueue {\n private _queue: Map<AnySimpleGitTask, TaskInProgress> = new Map();\n\n constructor(private logLabel = 'GitExecutor') {}\n\n private withProgress(task: AnySimpleGitTask) {\n return this._queue.get(task);\n }\n\n private createProgress(task: AnySimpleGitTask): TaskInProgress {\n const name = TasksPendingQueue.getName(task.commands[0]);\n const logger = createLogger(this.logLabel, name);\n\n return {\n task,\n logger,\n name,\n };\n }\n\n push(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.createProgress(task);\n progress.logger('Adding task to the queue, commands = %o', task.commands);\n\n this._queue.set(task, progress);\n\n return progress;\n }\n\n fatal(err: GitError) {\n for (const [task, { logger }] of Array.from(this._queue.entries())) {\n if (task === err.task) {\n logger.info(`Failed %o`, err);\n logger(\n `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`\n );\n } else {\n logger.info(\n `A fatal exception occurred in a previous task, the queue has been purged: %o`,\n err.message\n );\n }\n\n this.complete(task);\n }\n\n if (this._queue.size !== 0) {\n throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`);\n }\n }\n\n complete(task: AnySimpleGitTask) {\n const progress = this.withProgress(task);\n if (progress) {\n this._queue.delete(task);\n }\n }\n\n attempt(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.withProgress(task);\n if (!progress) {\n throw new GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task');\n }\n progress.logger('Starting task');\n\n return progress;\n }\n\n static getName(name = 'empty') {\n return `task:${name}:${++TasksPendingQueue.counter}`;\n }\n\n private static counter = 0;\n}\n","import { spawn, SpawnOptions } from 'child_process';\nimport { GitError } from '../errors/git-error';\nimport { OutputLogger } from '../git-logger';\nimport { PluginStore } from '../plugins';\nimport { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task';\nimport {\n GitExecutorResult,\n Maybe,\n outputHandler,\n RunnableTask,\n SimpleGitExecutor,\n SimpleGitTask,\n} from '../types';\nimport { callTaskParser, first, GitOutputStreams, objectToString } from '../utils';\nimport { Scheduler } from './scheduler';\nimport { TasksPendingQueue } from './tasks-pending-queue';\n\nexport class GitExecutorChain implements SimpleGitExecutor {\n private _chain: Promise<any> = Promise.resolve();\n private _queue = new TasksPendingQueue();\n private _cwd: string | undefined;\n\n public get cwd() {\n return this._cwd || this._executor.cwd;\n }\n\n public set cwd(cwd: string) {\n this._cwd = cwd;\n }\n\n public get env() {\n return this._executor.env;\n }\n\n public get outputHandler() {\n return this._executor.outputHandler;\n }\n\n constructor(\n private _executor: SimpleGitExecutor,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n public chain() {\n return this;\n }\n\n public push<R>(task: SimpleGitTask<R>): Promise<R> {\n this._queue.push(task);\n\n return (this._chain = this._chain.then(() => this.attemptTask(task)));\n }\n\n private async attemptTask<R>(task: SimpleGitTask<R>): Promise<void | R> {\n const onScheduleComplete = await this._scheduler.next();\n const onQueueComplete = () => this._queue.complete(task);\n\n try {\n const { logger } = this._queue.attempt(task);\n return (await (isEmptyTask(task)\n ? this.attemptEmptyTask(task, logger)\n : this.attemptRemoteTask(task, logger))) as R;\n } catch (e) {\n throw this.onFatalException(task, e as Error);\n } finally {\n onQueueComplete();\n onScheduleComplete();\n }\n }\n\n private onFatalException<R>(task: SimpleGitTask<R>, e: Error) {\n const gitError =\n e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e));\n\n this._chain = Promise.resolve();\n this._queue.fatal(gitError);\n\n return gitError;\n }\n\n private async attemptRemoteTask<R>(task: RunnableTask<R>, logger: OutputLogger) {\n const binary = this._plugins.exec('spawn.binary', '', pluginContext(task, task.commands));\n const args = this._plugins.exec(\n 'spawn.args',\n [...task.commands],\n pluginContext(task, task.commands)\n );\n\n const raw = await this.gitResponse(\n task,\n binary,\n args,\n this.outputHandler,\n logger.step('SPAWN')\n );\n const outputStreams = await this.handleTaskData(task, args, raw, logger.step('HANDLE'));\n\n logger(`passing response to task's parser as a %s`, task.format);\n\n if (isBufferTask(task)) {\n return callTaskParser(task.parser, outputStreams);\n }\n\n return callTaskParser(task.parser, outputStreams.asStrings());\n }\n\n private async attemptEmptyTask(task: EmptyTask, logger: OutputLogger) {\n logger(`empty task bypassing child process to call to task's parser`);\n return task.parser(this);\n }\n\n private handleTaskData<R>(\n task: SimpleGitTask<R>,\n args: string[],\n result: GitExecutorResult,\n logger: OutputLogger\n ): Promise<GitOutputStreams> {\n const { exitCode, rejection, stdOut, stdErr } = result;\n\n return new Promise((done, fail) => {\n logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode);\n\n const { error } = this._plugins.exec(\n 'task.error',\n { error: rejection },\n {\n ...pluginContext(task, args),\n ...result,\n }\n );\n\n if (error && task.onError) {\n logger.info(`exitCode=%s handling with custom error handler`);\n\n return task.onError(\n result,\n error,\n (newStdOut) => {\n logger.info(`custom error handler treated as success`);\n logger(`custom error returned a %s`, objectToString(newStdOut));\n\n done(\n new GitOutputStreams(\n Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut,\n Buffer.concat(stdErr)\n )\n );\n },\n fail\n );\n }\n\n if (error) {\n logger.info(\n `handling as error: exitCode=%s stdErr=%s rejection=%o`,\n exitCode,\n stdErr.length,\n rejection\n );\n return fail(error);\n }\n\n logger.info(`retrieving task output complete`);\n done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr)));\n });\n }\n\n private async gitResponse<R>(\n task: SimpleGitTask<R>,\n command: string,\n args: string[],\n outputHandler: Maybe<outputHandler>,\n logger: OutputLogger\n ): Promise<GitExecutorResult> {\n const outputLogger = logger.sibling('output');\n const spawnOptions: SpawnOptions = this._plugins.exec(\n 'spawn.options',\n {\n cwd: this.cwd,\n env: this.env,\n windowsHide: true,\n },\n pluginContext(task, task.commands)\n );\n\n return new Promise((done) => {\n const stdOut: Buffer[] = [];\n const stdErr: Buffer[] = [];\n\n logger.info(`%s %o`, command, args);\n logger('%O', spawnOptions);\n\n let rejection = this._beforeSpawn(task, args);\n if (rejection) {\n return done({\n stdOut,\n stdErr,\n exitCode: 9901,\n rejection,\n });\n }\n\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n const spawned = spawn(command, args, spawnOptions);\n\n spawned.stdout!.on(\n 'data',\n onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))\n );\n spawned.stderr!.on(\n 'data',\n onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))\n );\n\n spawned.on('error', onErrorReceived(stdErr, logger));\n\n if (outputHandler) {\n logger(`Passing child process stdOut/stdErr to custom outputHandler`);\n outputHandler(command, spawned.stdout!, spawned.stderr!, [...args]);\n }\n\n this._plugins.exec('spawn.after', undefined, {\n ...pluginContext(task, args),\n spawned,\n close(exitCode: number, reason?: Error) {\n done({\n stdOut,\n stdErr,\n exitCode,\n rejection: rejection || reason,\n });\n },\n kill(reason: Error) {\n if (spawned.killed) {\n return;\n }\n\n rejection = reason;\n spawned.kill('SIGINT');\n },\n });\n });\n }\n\n private _beforeSpawn<R>(task: SimpleGitTask<R>, args: string[]) {\n let rejection: Maybe<Error>;\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n return rejection;\n }\n}\n\nfunction pluginContext<R>(task: SimpleGitTask<R>, commands: string[]) {\n return {\n method: first(task.commands) || '',\n commands,\n };\n}\n\nfunction onErrorReceived(target: Buffer[], logger: OutputLogger) {\n return (err: Error) => {\n logger(`[ERROR] child process exception %o`, err);\n target.push(Buffer.from(String(err.stack), 'ascii'));\n };\n}\n\nfunction onDataReceived(\n target: Buffer[],\n name: string,\n logger: OutputLogger,\n output: OutputLogger\n) {\n return (buffer: Buffer) => {\n logger(`%s received %L bytes`, name, buffer);\n output(`%B`, buffer);\n target.push(buffer);\n };\n}\n","import type { PluginStore } from '../plugins';\nimport type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types';\n\nimport { GitExecutorChain } from './git-executor-chain';\nimport { Scheduler } from './scheduler';\n\nexport class GitExecutor implements SimpleGitExecutor {\n private _chain = new GitExecutorChain(this, this._scheduler, this._plugins);\n\n public env: GitExecutorEnv;\n public outputHandler?: outputHandler;\n\n constructor(\n public cwd: string,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n chain(): SimpleGitExecutor {\n return new GitExecutorChain(this, this._scheduler, this._plugins);\n }\n\n push<R>(task: SimpleGitTask<R>): Promise<R> {\n return this._chain.push(task);\n }\n}\n","import { GitError } from './errors/git-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport { NOOP } from './utils';\n\nexport function taskCallback<R>(\n task: SimpleGitTask<R>,\n response: Promise<R>,\n callback: SimpleGitTaskCallback<R> = NOOP\n) {\n const onSuccess = (data: R) => {\n callback(null, data);\n };\n\n const onError = (err: GitError | GitResponseError) => {\n if (err?.task === task) {\n callback(\n err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err,\n undefined as any\n );\n }\n };\n\n response.then(onSuccess, onError);\n}\n\nfunction addDeprecationNoticeToError(err: GitResponseError) {\n let log = (name: string) => {\n console.warn(\n `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`\n );\n log = NOOP;\n };\n\n return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {}));\n\n function descriptorReducer(all: PropertyDescriptorMap, name: string): typeof all {\n if (name in err) {\n return all;\n }\n\n all[name] = {\n enumerable: false,\n configurable: false,\n get() {\n log(name);\n return err.git[name];\n },\n };\n\n return all;\n }\n}\n","import { folderExists } from '../utils';\nimport { SimpleGitExecutor } from '../types';\nimport { adhocExecTask } from './task';\n\nexport function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) {\n return adhocExecTask((instance: SimpleGitExecutor) => {\n if (!folderExists(directory)) {\n throw new Error(`Git.cwd: cannot change to non-directory \"${directory}\"`);\n }\n\n return ((root || instance).cwd = directory);\n });\n}\n","import type { SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, remove, trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nfunction checkoutTask(args: string[]) {\n const commands = ['checkout', ...args];\n if (commands[1] === '-b' && commands.includes('-B')) {\n commands[1] = remove(commands, '-B');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport default function (): Pick<SimpleGit, 'checkout' | 'checkoutBranch' | 'checkoutLocalBranch'> {\n return {\n checkout(this: SimpleGitApi) {\n return this._runTask(\n checkoutTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutBranch(this: SimpleGitApi, branchName, startPoint) {\n return this._runTask(\n checkoutTask(['-b', branchName, startPoint, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutLocalBranch(this: SimpleGitApi, branchName) {\n return this._runTask(\n checkoutTask(['-b', branchName, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils';\n\nexport interface CountObjectsResult {\n count: number;\n size: number;\n inPack: number;\n packs: number;\n sizePack: number;\n prunePackable: number;\n garbage: number;\n sizeGarbage: number;\n}\n\nfunction countObjectsResponse(): CountObjectsResult {\n return {\n count: 0,\n garbage: 0,\n inPack: 0,\n packs: 0,\n prunePackable: 0,\n size: 0,\n sizeGarbage: 0,\n sizePack: 0,\n };\n}\n\nconst parser: LineParser<CountObjectsResult> = new LineParser(\n /([a-z-]+): (\\d+)$/,\n (result, [key, value]) => {\n const property = asCamelCase(key);\n if (Object.hasOwn(result, property)) {\n result[property as keyof typeof result] = asNumber(value);\n }\n }\n);\n\nexport default function (): Pick<SimpleGit, 'countObjects'> {\n return {\n countObjects(this: SimpleGitApi) {\n return this._runTask({\n commands: ['count-objects', '--verbose'],\n format: 'utf-8',\n parser(stdOut: string) {\n return parseStringResponse(countObjectsResponse(), [parser], stdOut);\n },\n });\n },\n };\n}\n","import { CommitResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<CommitResult>[] = [\n new LineParser(/^\\[([^\\s]+)( \\([^)]+\\))? ([^\\]]+)/, (result, [branch, root, commit]) => {\n result.branch = branch;\n result.commit = commit;\n result.root = !!root;\n }),\n new LineParser(/\\s*Author:\\s(.+)/i, (result, [author]) => {\n const parts = author.split('<');\n const email = parts.pop();\n\n if (!email || !email.includes('@')) {\n return;\n }\n\n result.author = {\n email: email.substr(0, email.length - 1),\n name: parts.join('<').trim(),\n };\n }),\n new LineParser(\n /(\\d+)[^,]*(?:,\\s*(\\d+)[^,]*)(?:,\\s*(\\d+))/g,\n (result, [changes, insertions, deletions]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n result.summary.insertions = parseInt(insertions, 10) || 0;\n result.summary.deletions = parseInt(deletions, 10) || 0;\n }\n ),\n new LineParser(\n /^(\\d+)[^,]*(?:,\\s*(\\d+)[^(]+\\(([+-]))?/,\n (result, [changes, lines, direction]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n const count = parseInt(lines, 10) || 0;\n if (direction === '-') {\n result.summary.deletions = count;\n } else if (direction === '+') {\n result.summary.insertions = count;\n }\n }\n ),\n];\n\nexport function parseCommitResult(stdOut: string): CommitResult {\n const result: CommitResult = {\n author: null,\n branch: '',\n commit: '',\n root: false,\n summary: {\n changes: 0,\n insertions: 0,\n deletions: 0,\n },\n };\n return parseStringResponse(result, parsers, stdOut);\n}\n","import type { CommitResult, SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { parseCommitResult } from '../parsers/parse-commit';\nimport {\n asArray,\n asStringArray,\n filterArray,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport function commitTask(\n message: string[],\n files: string[],\n customArgs: string[]\n): StringTask<CommitResult> {\n const commands: string[] = [\n '-c',\n 'core.abbrev=40',\n 'commit',\n ...prefixedArray(message, '-m'),\n ...files,\n ...customArgs,\n ];\n\n return {\n commands,\n format: 'utf-8',\n parser: parseCommitResult,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'commit'> {\n return {\n commit(this: SimpleGitApi, message: string | string[], ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const task =\n rejectDeprecatedSignatures(message) ||\n commitTask(\n asArray(message),\n asArray(filterType(rest[0], filterStringOrStringArray, [])),\n [\n ...asStringArray(filterType(rest[1], filterArray, [])),\n ...getTrailingOptions(arguments, 0, true),\n ]\n );\n\n return this._runTask(task, next);\n },\n };\n\n function rejectDeprecatedSignatures(message?: unknown) {\n return (\n !filterStringOrStringArray(message) &&\n configurationErrorTask(\n `git.commit: requires the commit message to be supplied as a string/string[]`\n )\n );\n }\n}\n","import { Response, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport default function (): Pick<SimpleGit, 'firstCommit'> {\n return {\n firstCommit(this: SimpleGitApi): Response<string> {\n return this._runTask(\n straightThroughStringTask(['rev-list', '--max-parents=0', 'HEAD'], true),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import { straightThroughStringTask } from './task';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.hashObject`\n */\nexport function hashObjectTask(filePath: string, write: boolean): StringTask<string> {\n const commands = ['hash-object', filePath];\n if (write) {\n commands.push('-w');\n }\n\n return straightThroughStringTask(commands, true);\n}\n","import { InitResult } from '../../../typings';\n\nexport class InitSummary implements InitResult {\n constructor(\n public readonly bare: boolean,\n public readonly path: string,\n public readonly existing: boolean,\n public readonly gitDir: string\n ) {}\n}\n\nconst initResponseRegex = /^Init.+ repository in (.+)$/;\nconst reInitResponseRegex = /^Rein.+ in (.+)$/;\n\nexport function parseInit(bare: boolean, path: string, text: string) {\n const response = String(text).trim();\n let result;\n\n if ((result = initResponseRegex.exec(response))) {\n return new InitSummary(bare, path, false, result[1]);\n }\n\n if ((result = reInitResponseRegex.exec(response))) {\n return new InitSummary(bare, path, true, result[1]);\n }\n\n let gitDir = '';\n const tokens = response.split(' ');\n while (tokens.length) {\n const token = tokens.shift();\n if (token === 'in') {\n gitDir = tokens.join(' ');\n break;\n }\n }\n\n return new InitSummary(bare, path, /^re/i.test(response), gitDir);\n}\n","import { InitResult } from '../../../typings';\nimport { parseInit } from '../responses/InitSummary';\nimport { StringTask } from '../types';\n\nconst bareCommand = '--bare';\n\nfunction hasBareCommand(command: string[]) {\n return command.includes(bareCommand);\n}\n\nexport function initTask(bare = false, path: string, customArgs: string[]): StringTask<InitResult> {\n const commands = ['init', ...customArgs];\n if (bare && !hasBareCommand(commands)) {\n commands.splice(1, 0, bareCommand);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): InitResult {\n return parseInit(commands.includes('--bare'), path, text);\n },\n };\n}\n","export enum LogFormat {\n NONE = '',\n STAT = '--stat',\n NUM_STAT = '--numstat',\n NAME_ONLY = '--name-only',\n NAME_STATUS = '--name-status',\n}\n\nconst logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/;\n\nexport function logFormatFromCommand(customArgs: string[]) {\n for (let i = 0; i < customArgs.length; i++) {\n const format = logFormatRegex.exec(customArgs[i]);\n if (format) {\n return `--${format[1]}` as LogFormat;\n }\n }\n\n return LogFormat.NONE;\n}\n\nexport function isLogFormat(customArg: string | unknown) {\n return logFormatRegex.test(customArg as string);\n}\n","import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings';\n\n/***\n * The DiffSummary is returned as a response to getting `git().status()`\n */\nexport class DiffSummary implements DiffResult {\n changed = 0;\n deletions = 0;\n insertions = 0;\n\n files: Array<DiffResultTextFile | DiffResultBinaryFile> = [];\n}\n","import { DiffResult } from '../../../typings';\nimport { LogFormat } from '../args/log-format';\nimport { DiffSummary } from '../responses/DiffSummary';\nimport { isDiffNameStatus } from '../tasks/diff-name-status';\nimport { asNumber, LineParser, orVoid, parseStringResponse } from '../utils';\n\nconst statParser = [\n new LineParser<DiffResult>(\n /^(.+)\\s+\\|\\s+(\\d+)(\\s+[+\\-]+)?$/,\n (result, [file, changes, alterations = '']) => {\n result.files.push({\n file: file.trim(),\n changes: asNumber(changes),\n insertions: alterations.replace(/[^+]/g, '').length,\n deletions: alterations.replace(/[^-]/g, '').length,\n binary: false,\n });\n }\n ),\n new LineParser<DiffResult>(\n /^(.+) \\|\\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,\n (result, [file, before, after]) => {\n result.files.push({\n file: file.trim(),\n before: asNumber(before),\n after: asNumber(after),\n binary: true,\n });\n }\n ),\n new LineParser<DiffResult>(\n /(\\d+) files? changed\\s*((?:, \\d+ [^,]+){0,2})/,\n (result, [changed, summary]) => {\n const inserted = /(\\d+) i/.exec(summary);\n const deleted = /(\\d+) d/.exec(summary);\n\n result.changed = asNumber(changed);\n result.insertions = asNumber(inserted?.[1]);\n result.deletions = asNumber(deleted?.[1]);\n }\n ),\n];\n\nconst numStatParser = [\n new LineParser<DiffResult>(\n /(\\d+)\\t(\\d+)\\t(.+)$/,\n (result, [changesInsert, changesDelete, file]) => {\n const insertions = asNumber(changesInsert);\n const deletions = asNumber(changesDelete);\n\n result.changed++;\n result.insertions += insertions;\n result.deletions += deletions;\n\n result.files.push({\n file,\n changes: insertions + deletions,\n insertions,\n deletions,\n binary: false,\n });\n }\n ),\n new LineParser<DiffResult>(/-\\t-\\t(.+)$/, (result, [file]) => {\n result.changed++;\n\n result.files.push({\n file,\n after: 0,\n before: 0,\n binary: true,\n });\n }),\n];\n\nconst nameOnlyParser = [\n new LineParser<DiffResult>(/(.+)$/, (result, [file]) => {\n result.changed++;\n result.files.push({\n file,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n });\n }),\n];\n\nconst nameStatusParser = [\n new LineParser<DiffResult>(\n /([ACDMRTUXB])([0-9]{0,3})\\t(.[^\\t]*)(\\t(.[^\\t]*))?$/,\n (result, [status, similarity, from, _to, to]) => {\n result.changed++;\n result.files.push({\n file: to ?? from,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n status: orVoid(isDiffNameStatus(status) && status),\n from: orVoid(!!to && from !== to && from),\n similarity: asNumber(similarity),\n });\n }\n ),\n];\n\nconst diffSummaryParsers: Record<LogFormat, LineParser<DiffResult>[]> = {\n [LogFormat.NONE]: statParser,\n [LogFormat.STAT]: statParser,\n [LogFormat.NUM_STAT]: numStatParser,\n [LogFormat.NAME_STATUS]: nameStatusParser,\n [LogFormat.NAME_ONLY]: nameOnlyParser,\n};\n\nexport function getDiffParser(format = LogFormat.NONE) {\n const parser = diffSummaryParsers[format];\n\n return (stdOut: string) => parseStringResponse(new DiffSummary(), parser, stdOut, false);\n}\n","import { ListLogLine, LogResult } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\nimport { getDiffParser } from './parse-diff-summary';\nimport { LogFormat } from '../args/log-format';\n\nexport const START_BOUNDARY = 'òòòòòò ';\n\nexport const COMMIT_BOUNDARY = ' òò';\n\nexport const SPLITTER = ' ò ';\n\nconst defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email'];\n\nfunction lineBuilder(tokens: string[], fields: string[]): any {\n return fields.reduce(\n (line, field, index) => {\n line[field] = tokens[index] || '';\n return line;\n },\n Object.create({ diff: null }) as any\n );\n}\n\nexport function createListLogSummaryParser<T = any>(\n splitter = SPLITTER,\n fields = defaultFieldNames,\n logFormat = LogFormat.NONE\n) {\n const parseDiffResult = getDiffParser(logFormat);\n\n return function (stdOut: string): LogResult<T> {\n const all: ReadonlyArray<T & ListLogLine> = toLinesWithContent(\n stdOut.trim(),\n false,\n START_BOUNDARY\n ).map(function (item) {\n const lineDetail = item.split(COMMIT_BOUNDARY);\n const listLogLine: T & ListLogLine = lineBuilder(lineDetail[0].split(splitter), fields);\n\n if (lineDetail.length > 1 && !!lineDetail[1].trim()) {\n listLogLine.diff = parseDiffResult(lineDetail[1]);\n }\n\n return listLogLine;\n });\n\n return {\n all,\n latest: (all.length && all[0]) || null,\n total: all.length,\n };\n };\n}\n","import { StringTask } from '../types';\nimport { DiffResult } from '../../../typings';\nimport { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format';\nimport { getDiffParser } from '../parsers/parse-diff-summary';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function diffSummaryTask(customArgs: string[]): StringTask<DiffResult> | EmptyTask {\n let logFormat = logFormatFromCommand(customArgs);\n\n const commands = ['diff'];\n\n if (logFormat === LogFormat.NONE) {\n logFormat = LogFormat.STAT;\n commands.push('--stat=4096');\n }\n\n commands.push(...customArgs);\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser: getDiffParser(logFormat),\n }\n );\n}\n\nexport function validateLogFormatConfig(customArgs: unknown[]): EmptyTask | void {\n const flags = customArgs.filter(isLogFormat);\n\n if (flags.length > 1) {\n return configurationErrorTask(\n `Summary flags are mutually exclusive - pick one of ${flags.join(',')}`\n );\n }\n\n if (flags.length && customArgs.includes('-z')) {\n return configurationErrorTask(\n `Summary flag ${flags} parsing is not compatible with null termination option '-z'`\n );\n }\n}\n","import type { LogResult, Options, SimpleGit } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { pathspec } from '../args/pathspec';\nimport {\n COMMIT_BOUNDARY,\n createListLogSummaryParser,\n SPLITTER,\n START_BOUNDARY,\n} from '../parsers/parse-list-log-summary';\nimport {\n appendTaskOptions,\n asStringArray,\n filterArray,\n filterPlainObject,\n filterString,\n filterType,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} from '../utils';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { configurationErrorTask } from './task';\nimport { validateLogFormatConfig } from './diff';\nimport { StringTask } from '../types';\n\nenum excludeOptions {\n '--pretty',\n 'max-count',\n 'maxCount',\n 'n',\n 'file',\n 'format',\n 'from',\n 'to',\n 'splitter',\n 'symmetric',\n 'mailMap',\n 'multiLine',\n 'strictDate',\n}\n\nexport interface DefaultLogFields {\n hash: string;\n date: string;\n message: string;\n refs: string;\n body: string;\n author_name: string;\n author_email: string;\n}\n\nexport type LogOptions<T = DefaultLogFields> = {\n file?: string;\n format?: T;\n from?: string;\n mailMap?: boolean;\n maxCount?: number;\n multiLine?: boolean;\n splitter?: string;\n strictDate?: boolean;\n symmetric?: boolean;\n to?: string;\n};\n\ninterface ParsedLogOptions {\n fields: string[];\n splitter: string;\n commands: string[];\n}\n\nfunction prettyFormat(\n format: Record<string, string | unknown>,\n splitter: string\n): [string[], string] {\n const fields: string[] = [];\n const formatStr: string[] = [];\n\n Object.keys(format).forEach((field) => {\n fields.push(field);\n formatStr.push(String(format[field]));\n });\n\n return [fields, formatStr.join(splitter)];\n}\n\nfunction userOptions<T extends Options>(input: T): Options {\n return Object.keys(input).reduce((out, key) => {\n if (!(key in excludeOptions)) {\n out[key] = input[key];\n }\n return out;\n }, {} as Options);\n}\n\nexport function parseLogOptions<T extends Options>(\n opt: Options | LogOptions<T> = {},\n customArgs: string[] = []\n): ParsedLogOptions {\n const splitter = filterType(opt.splitter, filterString, SPLITTER);\n const format = filterPlainObject(opt.format)\n ? opt.format\n : {\n hash: '%H',\n date: opt.strictDate === false ? '%ai' : '%aI',\n message: '%s',\n refs: '%D',\n body: opt.multiLine ? '%B' : '%b',\n author_name: opt.mailMap !== false ? '%aN' : '%an',\n author_email: opt.mailMap !== false ? '%aE' : '%ae',\n };\n\n const [fields, formatStr] = prettyFormat(format, splitter);\n\n const suffix: string[] = [];\n const command: string[] = [\n `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`,\n ...customArgs,\n ];\n\n const maxCount: number | undefined = (opt as any).n || (opt as any)['max-count'] || opt.maxCount;\n if (maxCount) {\n command.push(`--max-count=${maxCount}`);\n }\n\n if (opt.from || opt.to) {\n const rangeOperator = opt.symmetric !== false ? '...' : '..';\n suffix.push(`${opt.from || ''}${rangeOperator}${opt.to || ''}`);\n }\n\n if (filterString(opt.file)) {\n command.push('--follow', pathspec(opt.file));\n }\n\n appendTaskOptions(userOptions(opt as Options), command);\n\n return {\n fields,\n splitter,\n commands: [...command, ...suffix],\n };\n}\n\nexport function logTask<T>(\n splitter: string,\n fields: string[],\n customArgs: string[]\n): StringTask<LogResult<T>> {\n const parser = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs));\n\n return {\n commands: ['log', ...customArgs],\n format: 'utf-8',\n parser,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'log'> {\n return {\n log<T extends Options>(this: SimpleGitApi, ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const options = parseLogOptions<T>(\n trailingOptionsArgument(arguments),\n asStringArray(filterType(arguments[0], filterArray, []))\n );\n const task =\n rejectDeprecatedSignatures(...rest) ||\n validateLogFormatConfig(options.commands) ||\n createLogTask(options);\n\n return this._runTask(task, next);\n },\n };\n\n function createLogTask(options: ParsedLogOptions) {\n return logTask(options.splitter, options.fields, options.commands);\n }\n\n function rejectDeprecatedSignatures(from?: unknown, to?: unknown) {\n return (\n filterString(from) &&\n filterString(to) &&\n configurationErrorTask(\n `git.log(string, string) should be replaced with git.log({ from: string, to: string })`\n )\n );\n }\n}\n","import {\n MergeConflict,\n MergeConflictDeletion,\n MergeDetail,\n MergeResultStatus,\n} from '../../../typings';\n\nexport class MergeSummaryConflict implements MergeConflict {\n constructor(\n public readonly reason: string,\n public readonly file: string | null = null,\n public readonly meta?: MergeConflictDeletion\n ) {}\n\n toString() {\n return `${this.file}:${this.reason}`;\n }\n}\n\nexport class MergeSummaryDetail implements MergeDetail {\n public conflicts: MergeConflict[] = [];\n public merges: string[] = [];\n public result: MergeResultStatus = 'success';\n\n get failed() {\n return this.conflicts.length > 0;\n }\n\n get reason() {\n return this.result;\n }\n\n toString() {\n if (this.conflicts.length) {\n return `CONFLICTS: ${this.conflicts.join(', ')}`;\n }\n\n return 'OK';\n }\n}\n","import {\n PullDetailFileChanges,\n PullDetailSummary,\n PullFailedResult,\n PullResult,\n} from '../../../typings';\n\nexport class PullSummary implements PullResult {\n public remoteMessages = {\n all: [],\n };\n public created = [];\n public deleted: string[] = [];\n public files: string[] = [];\n public deletions: PullDetailFileChanges = {};\n public insertions: PullDetailFileChanges = {};\n public summary: PullDetailSummary = {\n changes: 0,\n deletions: 0,\n insertions: 0,\n };\n}\n\nexport class PullFailedSummary implements PullFailedResult {\n remote = '';\n hash = {\n local: '',\n remote: '',\n };\n branch = {\n local: '',\n remote: '',\n };\n message = '';\n\n toString() {\n return this.message;\n }\n}\n","import {\n RemoteMessageResult,\n RemoteMessages,\n RemoteMessagesObjectEnumeration,\n} from '../../../typings';\nimport { asNumber, RemoteLineParser } from '../utils';\n\nfunction objectEnumerationResult<T extends RemoteMessages = RemoteMessages>(\n remoteMessages: T\n): RemoteMessagesObjectEnumeration {\n return (remoteMessages.objects = remoteMessages.objects || {\n compressing: 0,\n counting: 0,\n enumerating: 0,\n packReused: 0,\n reused: { count: 0, delta: 0 },\n total: { count: 0, delta: 0 },\n });\n}\n\nfunction asObjectCount(source: string) {\n const count = /^\\s*(\\d+)/.exec(source);\n const delta = /delta (\\d+)/i.exec(source);\n\n return {\n count: asNumber((count && count[1]) || '0'),\n delta: asNumber((delta && delta[1]) || '0'),\n };\n}\n\nexport const remoteMessagesObjectParsers: RemoteLineParser<RemoteMessageResult<RemoteMessages>>[] =\n [\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: (\\d+),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: \\d+% \\(\\d+\\/(\\d+)\\),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /total ([^,]+), reused ([^,]+), pack-reused (\\d+)/i,\n (result, [total, reused, packReused]) => {\n const objects = objectEnumerationResult(result.remoteMessages);\n objects.total = asObjectCount(total);\n objects.reused = asObjectCount(reused);\n objects.packReused = asNumber(packReused);\n }\n ),\n ];\n","import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings';\nimport { asNumber, parseStringResponse, RemoteLineParser } from '../utils';\nimport { remoteMessagesObjectParsers } from './parse-remote-objects';\n\nconst parsers: RemoteLineParser<RemoteMessageResult<PushResultRemoteMessages | RemoteMessages>>[] =\n [\n new RemoteLineParser(/^remote:\\s*(.+)$/, (result, [text]) => {\n result.remoteMessages.all.push(text.trim());\n return false;\n }),\n ...remoteMessagesObjectParsers,\n new RemoteLineParser(\n [/create a (?:pull|merge) request/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [pullRequestUrl]) => {\n (result.remoteMessages as PushResultRemoteMessages).pullRequestUrl = pullRequestUrl;\n }\n ),\n new RemoteLineParser(\n [/found (\\d+) vulnerabilities.+\\(([^)]+)\\)/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [count, summary, url]) => {\n (result.remoteMessages as PushResultRemoteMessages).vulnerabilities = {\n count: asNumber(count),\n summary,\n url,\n };\n }\n ),\n ];\n\nexport function parseRemoteMessages<T extends RemoteMessages = RemoteMessages>(\n _stdOut: string,\n stdErr: string\n): RemoteMessageResult {\n return parseStringResponse({ remoteMessages: new RemoteMessageSummary() as T }, parsers, stdErr);\n}\n\nexport class RemoteMessageSummary implements RemoteMessages {\n public readonly all: string[] = [];\n}\n","import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings';\nimport { PullFailedSummary, PullSummary } from '../responses/PullSummary';\nimport { TaskParser } from '../types';\nimport { append, LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nconst FILE_UPDATE_REGEX = /^\\s*(.+?)\\s+\\|\\s+\\d+\\s*(\\+*)(-*)/;\nconst SUMMARY_REGEX = /(\\d+)\\D+((\\d+)\\D+\\(\\+\\))?(\\D+(\\d+)\\D+\\(-\\))?/;\nconst ACTION_REGEX = /^(create|delete) mode \\d+ (.+)/;\n\nconst parsers: LineParser<PullResult>[] = [\n new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => {\n result.files.push(file);\n\n if (insertions) {\n result.insertions[file] = insertions.length;\n }\n\n if (deletions) {\n result.deletions[file] = deletions.length;\n }\n }),\n new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => {\n if (insertions !== undefined || deletions !== undefined) {\n result.summary.changes = +changes || 0;\n result.summary.insertions = +insertions || 0;\n result.summary.deletions = +deletions || 0;\n return true;\n }\n return false;\n }),\n new LineParser(ACTION_REGEX, (result, [action, file]) => {\n append(result.files, file);\n append(action === 'create' ? result.created : result.deleted, file);\n }),\n];\n\nconst errorParsers: LineParser<PullFailedResult>[] = [\n new LineParser(/^from\\s(.+)$/i, (result, [remote]) => void (result.remote = remote)),\n new LineParser(/^fatal:\\s(.+)$/, (result, [message]) => void (result.message = message)),\n new LineParser(\n /([a-z0-9]+)\\.\\.([a-z0-9]+)\\s+(\\S+)\\s+->\\s+(\\S+)$/,\n (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => {\n result.branch.local = branchLocal;\n result.hash.local = hashLocal;\n result.branch.remote = branchRemote;\n result.hash.remote = hashRemote;\n }\n ),\n];\n\nexport const parsePullDetail: TaskParser<string, PullDetail> = (stdOut, stdErr) => {\n return parseStringResponse(new PullSummary(), parsers, [stdOut, stdErr]);\n};\n\nexport const parsePullResult: TaskParser<string, PullResult> = (stdOut, stdErr) => {\n return Object.assign(\n new PullSummary(),\n parsePullDetail(stdOut, stdErr),\n parseRemoteMessages<RemoteMessages>(stdOut, stdErr)\n );\n};\n\nexport function parsePullErrorResult(stdOut: string, stdErr: string) {\n const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]);\n\n return pullError.message && pullError;\n}\n","import { MergeDetail, MergeResult } from '../../../typings';\nimport { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parsePullResult } from './parse-pull';\n\nconst parsers: LineParser<MergeDetail>[] = [\n new LineParser(/^Auto-merging\\s+(.+)$/, (summary, [autoMerge]) => {\n summary.merges.push(autoMerge);\n }),\n new LineParser(/^CONFLICT\\s+\\((.+)\\): Merge conflict in (.+)$/, (summary, [reason, file]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file));\n }),\n new LineParser(\n /^CONFLICT\\s+\\((.+\\/delete)\\): (.+) deleted in (.+) and/,\n (summary, [reason, file, deleteRef]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef }));\n }\n ),\n new LineParser(/^CONFLICT\\s+\\((.+)\\):/, (summary, [reason]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, null));\n }),\n new LineParser(/^Automatic merge failed;\\s+(.+)$/, (summary, [result]) => {\n summary.result = result;\n }),\n];\n\n/**\n * Parse the complete response from `git.merge`\n */\nexport const parseMergeResult: TaskParser<string, MergeResult> = (stdOut, stdErr) => {\n return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr));\n};\n\n/**\n * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge`\n * @param stdOut\n */\nexport const parseMergeDetail: TaskParser<string, MergeDetail> = (stdOut) => {\n return parseStringResponse(new MergeSummaryDetail(), parsers, stdOut);\n};\n","import { MergeResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parseMergeResult } from '../parsers/parse-merge';\nimport { StringTask } from '../types';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function mergeTask(customArgs: string[]): EmptyTask | StringTask<MergeResult> {\n if (!customArgs.length) {\n return configurationErrorTask('Git.merge requires at least one option');\n }\n\n return {\n commands: ['merge', ...customArgs],\n format: 'utf-8',\n parser(stdOut, stdErr): MergeResult {\n const merge = parseMergeResult(stdOut, stdErr);\n if (merge.failed) {\n throw new GitResponseError(merge);\n }\n\n return merge;\n },\n };\n}\n","import {\n PushDetail,\n PushResult,\n PushResultPushedItem,\n PushResultRemoteMessages,\n} from '../../../typings';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nfunction pushResultPushedItem(local: string, remote: string, status: string): PushResultPushedItem {\n const deleted = status.includes('deleted');\n const tag = status.includes('tag') || /^refs\\/tags/.test(local);\n const alreadyUpdated = !status.includes('new');\n\n return {\n deleted,\n tag,\n branch: !tag,\n new: !alreadyUpdated,\n alreadyUpdated,\n local,\n remote,\n };\n}\n\nconst parsers: LineParser<PushDetail>[] = [\n new LineParser(/^Pushing to (.+)$/, (result, [repo]) => {\n result.repo = repo;\n }),\n new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => {\n result.ref = {\n ...(result.ref || {}),\n local,\n };\n }),\n new LineParser(/^[=*-]\\s+([^:]+):(\\S+)\\s+\\[(.+)]$/, (result, [local, remote, type]) => {\n result.pushed.push(pushResultPushedItem(local, remote, type));\n }),\n new LineParser(\n /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,\n (result, [local, remote, remoteName]) => {\n result.branch = {\n ...(result.branch || {}),\n local,\n remote,\n remoteName,\n };\n }\n ),\n new LineParser(\n /^([^:]+):(\\S+)\\s+([a-z0-9]+)\\.\\.([a-z0-9]+)$/,\n (result, [local, remote, from, to]) => {\n result.update = {\n head: {\n local,\n remote,\n },\n hash: {\n from,\n to,\n },\n };\n }\n ),\n];\n\nexport const parsePushResult: TaskParser<string, PushResult> = (stdOut, stdErr) => {\n const pushDetail = parsePushDetail(stdOut, stdErr);\n const responseDetail = parseRemoteMessages<PushResultRemoteMessages>(stdOut, stdErr);\n\n return {\n ...pushDetail,\n ...responseDetail,\n };\n};\n\nexport const parsePushDetail: TaskParser<string, PushDetail> = (stdOut, stdErr) => {\n return parseStringResponse({ pushed: [] }, parsers, [stdOut, stdErr]);\n};\n","import { PushResult } from '../../../typings';\nimport { parsePushResult as parser } from '../parsers/parse-push';\nimport { StringTask } from '../types';\nimport { append, remove } from '../utils';\n\ntype PushRef = { remote?: string; branch?: string };\n\nexport function pushTagsTask(ref: PushRef = {}, customArgs: string[]): StringTask<PushResult> {\n append(customArgs, '--tags');\n return pushTask(ref, customArgs);\n}\n\nexport function pushTask(ref: PushRef = {}, customArgs: string[]): StringTask<PushResult> {\n const commands = ['push', ...customArgs];\n if (ref.branch) {\n commands.splice(1, 0, ref.branch);\n }\n if (ref.remote) {\n commands.splice(1, 0, ref.remote);\n }\n\n remove(commands, '-v');\n append(commands, '--verbose');\n append(commands, '--porcelain');\n\n return {\n commands,\n format: 'utf-8',\n parser,\n };\n}\n","import { SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, trailingFunctionArgument } from '../utils';\nimport { straightThroughBufferTask, straightThroughStringTask } from './task';\n\nexport default function (): Pick<SimpleGit, 'showBuffer' | 'show'> {\n return {\n showBuffer(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n if (!commands.includes('--binary')) {\n commands.splice(1, 0, '--binary');\n }\n\n return this._runTask(\n straightThroughBufferTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n\n show(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n return this._runTask(\n straightThroughStringTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import { FileStatusResult } from '../../../typings';\n\nexport const fromPathRegex = /^(.+)\\0(.+)$/;\n\nexport class FileStatusSummary implements FileStatusResult {\n public readonly from: string | undefined;\n\n constructor(\n public path: string,\n public index: string,\n public working_dir: string\n ) {\n if (index === 'R' || working_dir === 'R') {\n const detail = fromPathRegex.exec(path) || [null, path, path];\n this.from = detail[2] || '';\n this.path = detail[1] || '';\n }\n }\n}\n","import { StatusResult } from '../../../typings';\nimport { append, filterString, filterType, NULL } from '../utils';\nimport { FileStatusSummary } from './FileStatusSummary';\n\ntype StatusLineParser = (result: StatusResult, file: string) => void;\n\nexport class StatusSummary implements StatusResult {\n public not_added = [];\n public conflicted = [];\n public created = [];\n public deleted = [];\n public ignored = undefined;\n public modified = [];\n public renamed = [];\n public files = [];\n public staged = [];\n public ahead = 0;\n public behind = 0;\n public current = null;\n public tracking = null;\n public detached = false;\n\n public isClean = () => {\n return !this.files.length;\n };\n}\n\nenum PorcelainFileStatus {\n ADDED = 'A',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n COPIED = 'C',\n UNMERGED = 'U',\n UNTRACKED = '?',\n IGNORED = '!',\n NONE = ' ',\n}\n\nfunction renamedFile(line: string) {\n const [to, from] = line.split(NULL);\n\n return {\n from: from || to,\n to,\n };\n}\n\nfunction parser(\n indexX: PorcelainFileStatus,\n indexY: PorcelainFileStatus,\n handler: StatusLineParser\n): [string, StatusLineParser] {\n return [`${indexX}${indexY}`, handler];\n}\n\nfunction conflicts(indexX: PorcelainFileStatus, ...indexY: PorcelainFileStatus[]) {\n return indexY.map((y) => parser(indexX, y, (result, file) => append(result.conflicted, file)));\n}\n\nconst parsers: Map<string, StatusLineParser> = new Map([\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) =>\n append(result.created, file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) =>\n append(result.deleted, file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) =>\n append(result.modified, file)\n ),\n\n parser(\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.created, file) && append(result.staged, file)\n ),\n parser(\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.MODIFIED,\n (result, file) =>\n append(result.created, file) &&\n append(result.staged, file) &&\n append(result.modified, file)\n ),\n\n parser(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.deleted, file) && append(result.staged, file)\n ),\n\n parser(\n PorcelainFileStatus.MODIFIED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.modified, file) && append(result.staged, file)\n ),\n parser(\n PorcelainFileStatus.MODIFIED,\n PorcelainFileStatus.MODIFIED,\n (result, file) => append(result.modified, file) && append(result.staged, file)\n ),\n\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => {\n append(result.renamed, renamedFile(file));\n }),\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => {\n const renamed = renamedFile(file);\n append(result.renamed, renamed);\n append(result.modified, renamed.to);\n }),\n parser(PorcelainFileStatus.IGNORED, PorcelainFileStatus.IGNORED, (_result, _file) => {\n append((_result.ignored = _result.ignored || []), _file);\n }),\n\n parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) =>\n append(result.not_added, file)\n ),\n\n ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED),\n ...conflicts(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n ...conflicts(\n PorcelainFileStatus.UNMERGED,\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n\n [\n '##',\n (result, line) => {\n const aheadReg = /ahead (\\d+)/;\n const behindReg = /behind (\\d+)/;\n const currentReg = /^(.+?(?=(?:\\.{3}|\\s|$)))/;\n const trackingReg = /\\.{3}(\\S*)/;\n const onEmptyBranchReg = /\\son\\s(\\S+?)(?=\\.{3}|$)/;\n\n let regexResult = aheadReg.exec(line);\n result.ahead = (regexResult && +regexResult[1]) || 0;\n\n regexResult = behindReg.exec(line);\n result.behind = (regexResult && +regexResult[1]) || 0;\n\n regexResult = currentReg.exec(line);\n result.current = filterType(regexResult?.[1], filterString, null);\n\n regexResult = trackingReg.exec(line);\n result.tracking = filterType(regexResult?.[1], filterString, null);\n\n regexResult = onEmptyBranchReg.exec(line);\n if (regexResult) {\n result.current = filterType(regexResult?.[1], filterString, result.current);\n }\n\n result.detached = /\\(no branch\\)/.test(line);\n },\n ],\n]);\n\nexport const parseStatusSummary = function (text: string): StatusResult {\n const lines = text.split(NULL);\n const status = new StatusSummary();\n\n for (let i = 0, l = lines.length; i < l; ) {\n let line = lines[i++].trim();\n\n if (!line) {\n continue;\n }\n\n if (line.charAt(0) === PorcelainFileStatus.RENAMED) {\n line += NULL + (lines[i++] || '');\n }\n\n splitLine(status, line);\n }\n\n return status;\n};\n\nfunction splitLine(result: StatusResult, lineStr: string) {\n const trimmed = lineStr.trim();\n switch (' ') {\n case trimmed.charAt(2):\n return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.substr(3));\n case trimmed.charAt(1):\n return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.substr(2));\n default:\n return;\n }\n\n function data(index: string, workingDir: string, path: string) {\n const raw = `${index}${workingDir}`;\n const handler = parsers.get(raw);\n\n if (handler) {\n handler(result, path);\n }\n\n if (raw !== '##' && raw !== '!!') {\n result.files.push(new FileStatusSummary(path, index, workingDir));\n }\n }\n}\n","import { StatusResult } from '../../../typings';\nimport { parseStatusSummary } from '../responses/StatusSummary';\nimport { StringTask } from '../types';\n\nconst ignoredOptions = ['--null', '-z'];\n\nexport function statusTask(customArgs: string[]): StringTask<StatusResult> {\n const commands = [\n 'status',\n '--porcelain',\n '-b',\n '-u',\n '--null',\n ...customArgs.filter((arg) => !ignoredOptions.includes(arg)),\n ];\n\n return {\n format: 'utf-8',\n commands,\n parser(text: string) {\n return parseStatusSummary(text);\n },\n };\n}\n","import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nexport interface VersionResult {\n major: number;\n minor: number;\n patch: number | string;\n agent: string;\n installed: boolean;\n}\n\nconst NOT_INSTALLED = 'installed=false';\n\nfunction versionResponse(\n major = 0,\n minor = 0,\n patch: string | number = 0,\n agent = '',\n installed = true\n): VersionResult {\n return Object.defineProperty(\n {\n major,\n minor,\n patch,\n agent,\n installed,\n },\n 'toString',\n {\n value() {\n return `${this.major}.${this.minor}.${this.patch}`;\n },\n configurable: false,\n enumerable: false,\n }\n );\n}\n\nfunction notInstalledResponse() {\n return versionResponse(0, 0, 0, '', false);\n}\n\nexport default function (): Pick<SimpleGit, 'version'> {\n return {\n version(this: SimpleGitApi) {\n return this._runTask({\n commands: ['--version'],\n format: 'utf-8',\n parser: versionParser,\n onError(result, error, done, fail) {\n if (result.exitCode === ExitCodes.NOT_FOUND) {\n return done(Buffer.from(NOT_INSTALLED));\n }\n\n fail(error);\n },\n });\n },\n };\n}\n\nconst parsers: LineParser<VersionResult>[] = [\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*\\((.+)\\))?/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(\n result,\n versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)\n );\n }\n ),\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\D+)(.+)?$/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent));\n }\n ),\n];\n\nfunction versionParser(stdOut: string) {\n if (stdOut === NOT_INSTALLED) {\n return notInstalledResponse();\n }\n\n return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers, stdOut);\n}\n","import { SimpleGitBase } from '../../typings';\nimport { taskCallback } from './task-callback';\nimport { changeWorkingDirectoryTask } from './tasks/change-working-directory';\nimport checkout from './tasks/checkout';\nimport countObjects from './tasks/count-objects';\nimport commit from './tasks/commit';\nimport config from './tasks/config';\nimport firstCommit from './tasks/first-commit';\nimport grep from './tasks/grep';\nimport { hashObjectTask } from './tasks/hash-object';\nimport { initTask } from './tasks/init';\nimport log from './tasks/log';\nimport { mergeTask } from './tasks/merge';\nimport { pushTask } from './tasks/push';\nimport show from './tasks/show';\nimport { statusTask } from './tasks/status';\nimport { configurationErrorTask, straightThroughStringTask } from './tasks/task';\nimport version from './tasks/version';\nimport { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport {\n asArray,\n filterString,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n} from './utils';\n\nexport class SimpleGitApi implements SimpleGitBase {\n constructor(private _executor: SimpleGitExecutor) {}\n\n protected _runTask<T>(task: SimpleGitTask<T>, then?: SimpleGitTaskCallback<T>) {\n const chain = this._executor.chain();\n const promise = chain.push(task);\n\n if (then) {\n taskCallback(task, promise, then);\n }\n\n return Object.create(this, {\n then: { value: promise.then.bind(promise) },\n catch: { value: promise.catch.bind(promise) },\n _executor: { value: chain },\n });\n }\n\n add(files: string | string[]) {\n return this._runTask(\n straightThroughStringTask(['add', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n cwd(directory: string | { path: string; root?: boolean }) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof directory === 'string') {\n return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next);\n }\n\n if (typeof directory?.path === 'string') {\n return this._runTask(\n changeWorkingDirectoryTask(\n directory.path,\n (directory.root && this._executor) || undefined\n ),\n next\n );\n }\n\n return this._runTask(\n configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string'),\n next\n );\n }\n\n hashObject(path: string, write: boolean | unknown) {\n return this._runTask(\n hashObjectTask(path, write === true),\n trailingFunctionArgument(arguments)\n );\n }\n\n init(bare?: boolean | unknown) {\n return this._runTask(\n initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n merge() {\n return this._runTask(\n mergeTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n mergeFromTo(remote: string, branch: string) {\n if (!(filterString(remote) && filterString(branch))) {\n return this._runTask(\n configurationErrorTask(\n `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`\n )\n );\n }\n\n return this._runTask(\n mergeTask([remote, branch, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments, false)\n );\n }\n\n outputHandler(handler: outputHandler) {\n this._executor.outputHandler = handler;\n return this;\n }\n\n push() {\n const task = pushTask(\n {\n remote: filterType(arguments[0], filterString),\n branch: filterType(arguments[1], filterString),\n },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n }\n\n stash() {\n return this._runTask(\n straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n status() {\n return this._runTask(\n statusTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n}\n\nObject.assign(\n SimpleGitApi.prototype,\n checkout(),\n commit(),\n config(),\n countObjects(),\n firstCommit(),\n grep(),\n log(),\n show(),\n version()\n);\n","import { append, remove } from '../utils';\nimport { createDeferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { createLogger } from '../git-logger';\n\ntype ScheduleCompleteCallback = () => void;\ntype ScheduledTask = Pick<DeferredPromise<ScheduleCompleteCallback>, 'promise' | 'done'> & {\n id: number;\n};\n\nconst createScheduledTask: () => ScheduledTask = (() => {\n let id = 0;\n return () => {\n id++;\n const { promise, done } = createDeferred<ScheduleCompleteCallback>();\n\n return {\n promise,\n done,\n id,\n };\n };\n})();\n\nexport class Scheduler {\n private logger = createLogger('', 'scheduler');\n private pending: ScheduledTask[] = [];\n private running: ScheduledTask[] = [];\n\n constructor(private concurrency = 2) {\n this.logger(`Constructed, concurrency=%s`, concurrency);\n }\n\n private schedule() {\n if (!this.pending.length || this.running.length >= this.concurrency) {\n this.logger(\n `Schedule attempt ignored, pending=%s running=%s concurrency=%s`,\n this.pending.length,\n this.running.length,\n this.concurrency\n );\n return;\n }\n\n const task = append(this.running, this.pending.shift()!);\n this.logger(`Attempting id=%s`, task.id);\n task.done(() => {\n this.logger(`Completing id=`, task.id);\n remove(this.running, task);\n this.schedule();\n });\n }\n\n next(): Promise<ScheduleCompleteCallback> {\n const { promise, id } = append(this.pending, createScheduledTask());\n this.logger(`Scheduling id=%s`, id);\n\n this.schedule();\n\n return promise;\n }\n}\n","import { straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\n\nexport type ApplyOptions = Options &\n OptionFlags<\n | '--stat'\n | '--numstat'\n | '--summary'\n | '--check'\n | '--index'\n | '--intent-to-add'\n | '--3way'\n | '--apply'\n | '--no-add'\n | '-R'\n | '--reverse'\n | '--allow-binary-replacement'\n | '--binary'\n | '--reject'\n | '-z'\n | '--inaccurate-eof'\n | '--recount'\n | '--cached'\n | '--ignore-space-change'\n | '--ignore-whitespace'\n | '--verbose'\n | '--unsafe-paths'\n > &\n OptionFlags<'--whitespace', 'nowarn' | 'warn' | 'fix' | 'error' | 'error-all'> &\n OptionFlags<'--build-fake-ancestor' | '--exclude' | '--include' | '--directory', string> &\n OptionFlags<'-p' | '-C', number>;\n\nexport function applyPatchTask(patches: string[], customArgs: string[]): StringTask<string> {\n return straightThroughStringTask(['apply', ...customArgs, ...patches]);\n}\n","import {\n BranchMultiDeleteResult,\n BranchSingleDeleteFailure,\n BranchSingleDeleteResult,\n BranchSingleDeleteSuccess,\n} from '../../../typings';\n\nexport class BranchDeletionBatch implements BranchMultiDeleteResult {\n all: BranchSingleDeleteResult[] = [];\n branches: { [branchName: string]: BranchSingleDeleteResult } = {};\n errors: BranchSingleDeleteResult[] = [];\n\n get success(): boolean {\n return !this.errors.length;\n }\n}\n\nexport function branchDeletionSuccess(branch: string, hash: string): BranchSingleDeleteSuccess {\n return {\n branch,\n hash,\n success: true,\n };\n}\n\nexport function branchDeletionFailure(branch: string): BranchSingleDeleteFailure {\n return {\n branch,\n hash: null,\n success: false,\n };\n}\n\nexport function isSingleBranchDeleteFailure(\n test: BranchSingleDeleteResult\n): test is BranchSingleDeleteSuccess {\n return test.success;\n}\n","import { BranchMultiDeleteResult } from '../../../typings';\nimport {\n BranchDeletionBatch,\n branchDeletionFailure,\n branchDeletionSuccess,\n} from '../responses/BranchDeleteSummary';\nimport { TaskParser } from '../types';\nimport { ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nconst deleteSuccessRegex = /(\\S+)\\s+\\(\\S+\\s([^)]+)\\)/;\nconst deleteErrorRegex = /^error[^']+'([^']+)'/m;\n\nconst parsers: LineParser<BranchMultiDeleteResult>[] = [\n new LineParser(deleteSuccessRegex, (result, [branch, hash]) => {\n const deletion = branchDeletionSuccess(branch, hash);\n\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n new LineParser(deleteErrorRegex, (result, [branch]) => {\n const deletion = branchDeletionFailure(branch);\n\n result.errors.push(deletion);\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n];\n\nexport const parseBranchDeletions: TaskParser<string, BranchMultiDeleteResult> = (\n stdOut,\n stdErr\n) => {\n return parseStringResponse(new BranchDeletionBatch(), parsers, [stdOut, stdErr]);\n};\n\nexport function hasBranchDeletionError(data: string, processExitCode: ExitCodes): boolean {\n return processExitCode === ExitCodes.ERROR && deleteErrorRegex.test(data);\n}\n","import type { BranchSummary, BranchSummaryBranch } from '../../../typings';\n\nexport enum BranchStatusIdentifier {\n CURRENT = '*',\n LINKED = '+',\n}\n\nexport class BranchSummaryResult implements BranchSummary {\n public all: string[] = [];\n public branches: { [p: string]: BranchSummaryBranch } = {};\n public current: string = '';\n public detached: boolean = false;\n\n push(\n status: BranchStatusIdentifier | unknown,\n detached: boolean,\n name: string,\n commit: string,\n label: string\n ) {\n if (status === BranchStatusIdentifier.CURRENT) {\n this.detached = detached;\n this.current = name;\n }\n\n this.all.push(name);\n this.branches[name] = {\n current: status === BranchStatusIdentifier.CURRENT,\n linkedWorkTree: status === BranchStatusIdentifier.LINKED,\n name,\n commit,\n label,\n };\n }\n}\n","import type { BranchSummary } from '../../../typings';\nimport { BranchStatusIdentifier, BranchSummaryResult } from '../responses/BranchSummary';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<BranchSummaryResult>[] = [\n new LineParser(\n /^([*+]\\s)?\\((?:HEAD )?detached (?:from|at) (\\S+)\\)\\s+([a-z0-9]+)\\s(.*)$/,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), true, name, commit, label);\n }\n ),\n new LineParser(\n /^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$/s,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), false, name, commit, label);\n }\n ),\n];\n\nconst currentBranchParser = new LineParser<BranchSummaryResult>(/^(\\S+)$/s, (result, [name]) => {\n result.push(BranchStatusIdentifier.CURRENT, false, name, '', '');\n});\n\nfunction branchStatus(input?: string) {\n return input ? input.charAt(0) : '';\n}\n\nexport function parseBranchSummary(stdOut: string, currentOnly = false): BranchSummary {\n return parseStringResponse(\n new BranchSummaryResult(),\n currentOnly ? [currentBranchParser] : parsers,\n stdOut\n );\n}\n","import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings';\nimport { StringTask } from '../types';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete';\nimport { parseBranchSummary } from '../parsers/parse-branch';\nimport { bufferToString } from '../utils';\n\nexport function containsDeleteBranchCommand(commands: string[]) {\n const deleteCommands = ['-d', '-D', '--delete'];\n return commands.some((command) => deleteCommands.includes(command));\n}\n\nexport function branchTask(\n customArgs: string[]\n): StringTask<BranchSummary | BranchSingleDeleteResult> {\n const isDelete = containsDeleteBranchCommand(customArgs);\n const isCurrentOnly = customArgs.includes('--show-current');\n\n const commands = ['branch', ...customArgs];\n\n if (commands.length === 1) {\n commands.push('-a');\n }\n\n if (!commands.includes('-v')) {\n commands.splice(1, 0, '-v');\n }\n\n return {\n format: 'utf-8',\n commands,\n parser(stdOut, stdErr) {\n if (isDelete) {\n return parseBranchDeletions(stdOut, stdErr).all[0];\n }\n\n return parseBranchSummary(stdOut, isCurrentOnly);\n },\n };\n}\n\nexport function branchLocalTask(): StringTask<BranchSummary> {\n return {\n format: 'utf-8',\n commands: ['branch', '-v'],\n parser(stdOut) {\n return parseBranchSummary(stdOut);\n },\n };\n}\n\nexport function deleteBranchesTask(\n branches: string[],\n forceDelete = false\n): StringTask<BranchMultiDeleteResult> {\n return {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr);\n },\n onError({ exitCode, stdOut }, error, done, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n done(stdOut);\n },\n };\n}\n\nexport function deleteBranchTask(\n branch: string,\n forceDelete = false\n): StringTask<BranchSingleDeleteResult> {\n const task: StringTask<BranchSingleDeleteResult> = {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr).branches[branch]!;\n },\n onError({ exitCode, stdErr, stdOut }, error, _, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n throw new GitResponseError(\n task.parser(bufferToString(stdOut), bufferToString(stdErr)),\n String(error)\n );\n },\n };\n\n return task;\n}\n","import { normalize } from 'node:path';\n\n/**\n * Parser for the `check-ignore` command - returns each file as a string array\n */\nexport const parseCheckIgnore = (text: string): string[] => {\n return text.split(/\\n/g).map(toPath).filter(Boolean);\n};\n\nfunction toPath(input: string) {\n const path = input.trim().replace(/^[\"']|[\"']$/g, '');\n return path && normalize(path);\n}\n","import { StringTask } from '../types';\nimport { parseCheckIgnore } from '../responses/CheckIgnore';\n\nexport function checkIgnoreTask(paths: string[]): StringTask<string[]> {\n return {\n commands: ['check-ignore', ...paths],\n format: 'utf-8',\n parser: parseCheckIgnore,\n };\n}\n","import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\nimport { append, filterString } from '../utils';\n\nexport type CloneOptions = Options &\n OptionFlags<\n | '--bare'\n | '--dissociate'\n | '--mirror'\n | '--no-checkout'\n | '--no-remote-submodules'\n | '--no-shallow-submodules'\n | '--no-single-branch'\n | '--no-tags'\n | '--remote-submodules'\n | '--single-branch'\n | '--shallow-submodules'\n | '--verbose'\n > &\n OptionFlags<'--depth' | '-j' | '--jobs', number> &\n OptionFlags<\n | '--branch'\n | '--origin'\n | '--recurse-submodules'\n | '--separate-git-dir'\n | '--shallow-exclude'\n | '--shallow-since'\n | '--template',\n string\n >;\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function cloneTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n): StringTask<string> | EmptyTask {\n const commands = ['clone', ...customArgs];\n\n filterString(repo) && commands.push(repo);\n filterString(directory) && commands.push(directory);\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function cloneMirrorTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n) {\n append(customArgs, '--mirror');\n\n return cloneTask(repo, directory, customArgs);\n}\n","import { FetchResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<FetchResult>[] = [\n new LineParser(/From (.+)$/, (result, [remote]) => {\n result.remote = remote;\n }),\n new LineParser(/\\* \\[new branch]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.branches.push({\n name,\n tracking,\n });\n }),\n new LineParser(/\\* \\[new tag]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.tags.push({\n name,\n tracking,\n });\n }),\n new LineParser(/- \\[deleted]\\s+\\S+\\s*-> (.+)$/, (result, [tracking]) => {\n result.deleted.push({\n tracking,\n });\n }),\n new LineParser(\n /\\s*([^.]+)\\.\\.(\\S+)\\s+(\\S+)\\s*-> (.+)$/,\n (result, [from, to, name, tracking]) => {\n result.updated.push({\n name,\n tracking,\n to,\n from,\n });\n }\n ),\n];\n\nexport function parseFetchResult(stdOut: string, stdErr: string): FetchResult {\n const result: FetchResult = {\n raw: stdOut,\n remote: null,\n branches: [],\n tags: [],\n updated: [],\n deleted: [],\n };\n return parseStringResponse(result, parsers, [stdOut, stdErr]);\n}\n","import { FetchResult } from '../../../typings';\nimport { parseFetchResult } from '../parsers/parse-fetch';\nimport { StringTask } from '../types';\n\nimport { configurationErrorTask, EmptyTask } from './task';\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function fetchTask(\n remote: string,\n branch: string,\n customArgs: string[]\n): StringTask<FetchResult> | EmptyTask {\n const commands = ['fetch', ...customArgs];\n if (remote && branch) {\n commands.push(remote, branch);\n }\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: parseFetchResult,\n };\n}\n","import { MoveResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<MoveResult>[] = [\n new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => {\n result.moves.push({ from, to });\n }),\n];\n\nexport function parseMoveResult(stdOut: string): MoveResult {\n return parseStringResponse({ moves: [] }, parsers, stdOut);\n}\n","import { MoveResult } from '../../../typings';\nimport { parseMoveResult } from '../parsers/parse-move';\nimport { StringTask } from '../types';\nimport { asArray } from '../utils';\n\nexport function moveTask(from: string | string[], to: string): StringTask<MoveResult> {\n return {\n commands: ['mv', '-v', ...asArray(from), to],\n format: 'utf-8',\n parser: parseMoveResult,\n };\n}\n","import { PullResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull';\nimport { Maybe, StringTask } from '../types';\nimport { bufferToString } from '../utils';\n\nexport function pullTask(\n remote: Maybe<string>,\n branch: Maybe<string>,\n customArgs: string[]\n): StringTask<PullResult> {\n const commands: string[] = ['pull', ...customArgs];\n if (remote && branch) {\n commands.splice(1, 0, remote, branch);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(stdOut, stdErr): PullResult {\n return parsePullResult(stdOut, stdErr);\n },\n onError(result, _error, _done, fail) {\n const pullError = parsePullErrorResult(\n bufferToString(result.stdOut),\n bufferToString(result.stdErr)\n );\n if (pullError) {\n return fail(new GitResponseError(pullError));\n }\n\n fail(_error);\n },\n };\n}\n","import { forEachLineWithContent } from '../utils';\n\nexport interface RemoteWithoutRefs {\n name: string;\n}\n\nexport interface RemoteWithRefs extends RemoteWithoutRefs {\n refs: {\n fetch: string;\n push: string;\n };\n}\n\nexport function parseGetRemotes(text: string): RemoteWithoutRefs[] {\n const remotes: { [name: string]: RemoteWithoutRefs } = {};\n\n forEach(text, ([name]) => (remotes[name] = { name }));\n\n return Object.values(remotes);\n}\n\nexport function parseGetRemotesVerbose(text: string): RemoteWithRefs[] {\n const remotes: { [name: string]: RemoteWithRefs } = {};\n\n forEach(text, ([name, url, purpose]) => {\n if (!Object.hasOwn(remotes, name)) {\n remotes[name] = {\n name: name,\n refs: { fetch: '', push: '' },\n };\n }\n\n if (purpose && url) {\n remotes[name].refs[purpose.replace(/[^a-z]/g, '') as keyof RemoteWithRefs['refs']] = url;\n }\n });\n\n return Object.values(remotes);\n}\n\nfunction forEach(text: string, handler: (line: string[]) => void) {\n forEachLineWithContent(text, (line) => handler(line.split(/\\s+/)));\n}\n","import {\n parseGetRemotes,\n parseGetRemotesVerbose,\n type RemoteWithoutRefs,\n type RemoteWithRefs,\n} from '../responses/GetRemoteSummary';\nimport type { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addRemoteTask(\n remoteName: string,\n remoteRepo: string,\n customArgs: string[]\n): StringTask<string> {\n return straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]);\n}\n\nexport function getRemotesTask(verbose: true): StringTask<RemoteWithRefs[]>;\nexport function getRemotesTask(verbose: false): StringTask<RemoteWithoutRefs[]>;\nexport function getRemotesTask(\n verbose: boolean\n): StringTask<RemoteWithRefs[] | RemoteWithoutRefs[]> {\n const commands = ['remote'];\n if (verbose) {\n commands.push('-v');\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: verbose ? parseGetRemotesVerbose : parseGetRemotes,\n };\n}\n\nexport function listRemotesTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'ls-remote') {\n commands.unshift('ls-remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function remoteTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'remote') {\n commands.unshift('remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function removeRemoteTask(remoteName: string) {\n return straightThroughStringTask(['remote', 'remove', remoteName]);\n}\n","import { LogOptions, LogResult } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { createListLogSummaryParser } from '../parsers/parse-list-log-summary';\nimport type { StringTask } from '../types';\nimport { validateLogFormatConfig } from './diff';\nimport { parseLogOptions } from './log';\nimport type { EmptyTask } from './task';\n\nexport function stashListTask(\n opt: LogOptions = {},\n customArgs: string[]\n): EmptyTask | StringTask<LogResult> {\n const options = parseLogOptions<any>(opt);\n const commands = ['stash', 'list', ...options.commands, ...customArgs];\n const parser = createListLogSummaryParser(\n options.splitter,\n options.fields,\n logFormatFromCommand(commands)\n );\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser,\n }\n );\n}\n","import { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addSubModuleTask(repo: string, path: string): StringTask<string> {\n return subModuleTask(['add', repo, path]);\n}\n\nexport function initSubModuleTask(customArgs: string[]): StringTask<string> {\n return subModuleTask(['init', ...customArgs]);\n}\n\nexport function subModuleTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'submodule') {\n commands.unshift('submodule');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function updateSubModuleTask(customArgs: string[]): StringTask<string> {\n return subModuleTask(['update', ...customArgs]);\n}\n","import { TagResult } from '../../../typings';\n\nexport class TagList implements TagResult {\n constructor(\n public readonly all: string[],\n public readonly latest: string | undefined\n ) {}\n}\n\nexport const parseTagList = function (data: string, customSort = false) {\n const tags = data.split('\\n').map(trimmed).filter(Boolean);\n\n if (!customSort) {\n tags.sort(function (tagA, tagB) {\n const partsA = tagA.split('.');\n const partsB = tagB.split('.');\n\n if (partsA.length === 1 || partsB.length === 1) {\n return singleSorted(toNumber(partsA[0]), toNumber(partsB[0]));\n }\n\n for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) {\n const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i]));\n\n if (diff) {\n return diff;\n }\n }\n\n return 0;\n });\n }\n\n const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0);\n\n return new TagList(tags, latest);\n};\n\nfunction singleSorted(a: number, b: number): number {\n const aIsNum = Number.isNaN(a);\n const bIsNum = Number.isNaN(b);\n\n if (aIsNum !== bIsNum) {\n return aIsNum ? 1 : -1;\n }\n\n return aIsNum ? sorted(a, b) : 0;\n}\n\nfunction sorted(a: number, b: number) {\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction trimmed(input: string) {\n return input.trim();\n}\n\nfunction toNumber(input: string | undefined) {\n if (typeof input === 'string') {\n return parseInt(input.replace(/^\\D+/g, ''), 10) || 0;\n }\n\n return 0;\n}\n","import { TagResult } from '../../../typings';\nimport { parseTagList } from '../responses/TagList';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.tags`\n */\nexport function tagListTask(customArgs: string[] = []): StringTask<TagResult> {\n const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option));\n\n return {\n format: 'utf-8',\n commands: ['tag', '-l', ...customArgs],\n parser(text: string) {\n return parseTagList(text, hasCustomSort);\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addTagTask(name: string): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', name],\n parser() {\n return { name };\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addAnnotatedTagTask(\n name: string,\n tagMessage: string\n): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', '-a', '-m', tagMessage, name],\n parser() {\n return { name };\n },\n };\n}\n","const { GitExecutor } = require('./lib/runners/git-executor');\nconst { SimpleGitApi } = require('./lib/simple-git-api');\n\nconst { Scheduler } = require('./lib/runners/scheduler');\nconst { configurationErrorTask } = require('./lib/tasks/task');\nconst {\n asArray,\n filterArray,\n filterPrimitives,\n filterString,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} = require('./lib/utils');\nconst { applyPatchTask } = require('./lib/tasks/apply-patch');\nconst {\n branchTask,\n branchLocalTask,\n deleteBranchesTask,\n deleteBranchTask,\n} = require('./lib/tasks/branch');\nconst { checkIgnoreTask } = require('./lib/tasks/check-ignore');\nconst { checkIsRepoTask } = require('./lib/tasks/check-is-repo');\nconst { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone');\nconst { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean');\nconst { diffSummaryTask } = require('./lib/tasks/diff');\nconst { fetchTask } = require('./lib/tasks/fetch');\nconst { moveTask } = require('./lib/tasks/move');\nconst { pullTask } = require('./lib/tasks/pull');\nconst { pushTagsTask } = require('./lib/tasks/push');\nconst {\n addRemoteTask,\n getRemotesTask,\n listRemotesTask,\n remoteTask,\n removeRemoteTask,\n} = require('./lib/tasks/remote');\nconst { getResetMode, resetTask } = require('./lib/tasks/reset');\nconst { stashListTask } = require('./lib/tasks/stash-list');\nconst {\n addSubModuleTask,\n initSubModuleTask,\n subModuleTask,\n updateSubModuleTask,\n} = require('./lib/tasks/sub-module');\nconst { addAnnotatedTagTask, addTagTask, tagListTask } = require('./lib/tasks/tag');\nconst { straightThroughBufferTask, straightThroughStringTask } = require('./lib/tasks/task');\n\nfunction Git(options, plugins) {\n this._plugins = plugins;\n this._executor = new GitExecutor(\n options.baseDir,\n new Scheduler(options.maxConcurrentProcesses),\n plugins\n );\n\n this._trimmed = options.trimmed;\n}\n\n(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git;\n\n/**\n * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on\n * the system path, or a fully qualified path to the executable.\n */\nGit.prototype.customBinary = function (command) {\n this._plugins.reconfigure('binary', command);\n return this;\n};\n\n/**\n * Sets an environment variable for the spawned child process, either supply both a name and value as strings or\n * a single object to entirely replace the current environment variables.\n *\n * @param {string|Object} name\n * @param {string} [value]\n * @returns {Git}\n */\nGit.prototype.env = function (name, value) {\n if (arguments.length === 1 && typeof name === 'object') {\n this._executor.env = name;\n } else {\n (this._executor.env = this._executor.env || {})[name] = value;\n }\n\n return this;\n};\n\n/**\n * List the stash(s) of the local repo\n */\nGit.prototype.stashList = function (options) {\n return this._runTask(\n stashListTask(\n trailingOptionsArgument(arguments) || {},\n (filterArray(options) && options) || []\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\nfunction createCloneTask(api, task, repoPath, localPath) {\n if (typeof repoPath !== 'string') {\n return configurationErrorTask(`git.${api}() requires a string 'repoPath'`);\n }\n\n return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments));\n}\n\n/**\n * Clone a git repo\n */\nGit.prototype.clone = function () {\n return this._runTask(\n createCloneTask('clone', cloneTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Mirror a git repo\n */\nGit.prototype.mirror = function () {\n return this._runTask(\n createCloneTask('mirror', cloneMirrorTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Moves one or more files to a new destination.\n *\n * @see https://git-scm.com/docs/git-mv\n *\n * @param {string|string[]} from\n * @param {string} to\n */\nGit.prototype.mv = function (from, to) {\n return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments));\n};\n\n/**\n * Internally uses pull and tags to get the list of tags then checks out the latest tag.\n *\n * @param {Function} [then]\n */\nGit.prototype.checkoutLatestTag = function (then) {\n var git = this;\n return this.pull(function () {\n git.tags(function (err, tags) {\n git.checkout(tags.latest, then);\n });\n });\n};\n\n/**\n * Pull the updated contents of the current repo\n */\nGit.prototype.pull = function (remote, branch, options, then) {\n return this._runTask(\n pullTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Fetch the updated contents of the current repo.\n *\n * @example\n * .fetch('upstream', 'master') // fetches from master on remote named upstream\n * .fetch(function () {}) // runs fetch against default remote and branch and calls function\n *\n * @param {string} [remote]\n * @param {string} [branch]\n */\nGit.prototype.fetch = function (remote, branch) {\n return this._runTask(\n fetchTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in\n * a production environment.\n *\n * @param {boolean} silence\n * @returns {Git}\n */\nGit.prototype.silent = function (silence) {\n console.warn(\n 'simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'\n );\n return this;\n};\n\n/**\n * List all tags. When using git 2.7.0 or above, include an options object with `\"--sort\": \"property-name\"` to\n * sort the tags by that property instead of using the default semantic versioning sort.\n *\n * Note, supplying this option when it is not supported by your Git version will cause the operation to fail.\n *\n * @param {Object} [options]\n * @param {Function} [then]\n */\nGit.prototype.tags = function (options, then) {\n return this._runTask(\n tagListTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Rebases the current working copy. Options can be supplied either as an array of string parameters\n * to be sent to the `git rebase` command, or a standard options object.\n */\nGit.prototype.rebase = function () {\n return this._runTask(\n straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Reset a repo\n */\nGit.prototype.reset = function (mode) {\n return this._runTask(\n resetTask(getResetMode(mode), getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Revert one or more commits in the local working copy\n */\nGit.prototype.revert = function (commit) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof commit !== 'string') {\n return this._runTask(configurationErrorTask('Commit must be a string'), next);\n }\n\n return this._runTask(\n straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]),\n next\n );\n};\n\n/**\n * Add a lightweight tag to the head of the current branch\n */\nGit.prototype.addTag = function (name) {\n const task =\n typeof name === 'string'\n ? addTagTask(name)\n : configurationErrorTask('Git.addTag requires a tag name');\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Add an annotated tag to the head of the current branch\n */\nGit.prototype.addAnnotatedTag = function (tagName, tagMessage) {\n return this._runTask(\n addAnnotatedTagTask(tagName, tagMessage),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete a local branch\n */\nGit.prototype.deleteLocalBranch = function (branchName, forceDelete, then) {\n return this._runTask(\n deleteBranchTask(branchName, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete one or more local branches\n */\nGit.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) {\n return this._runTask(\n deleteBranchesTask(branchNames, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * List all branches\n *\n * @param {Object | string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.branch = function (options, then) {\n return this._runTask(\n branchTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Return list of local branches\n *\n * @param {Function} [then]\n */\nGit.prototype.branchLocal = function (then) {\n return this._runTask(branchLocalTask(), trailingFunctionArgument(arguments));\n};\n\n/**\n * Executes any command against the git binary.\n */\nGit.prototype.raw = function (commands) {\n const createRestCommands = !Array.isArray(commands);\n const command = [].slice.call(createRestCommands ? arguments : commands, 0);\n\n for (let i = 0; i < command.length && createRestCommands; i++) {\n if (!filterPrimitives(command[i])) {\n command.splice(i, command.length - i);\n break;\n }\n }\n\n command.push(...getTrailingOptions(arguments, 0, true));\n\n var next = trailingFunctionArgument(arguments);\n\n if (!command.length) {\n return this._runTask(\n configurationErrorTask('Raw: must supply one or more command to execute'),\n next\n );\n }\n\n return this._runTask(straightThroughStringTask(command, this._trimmed), next);\n};\n\nGit.prototype.submoduleAdd = function (repo, path, then) {\n return this._runTask(addSubModuleTask(repo, path), trailingFunctionArgument(arguments));\n};\n\nGit.prototype.submoduleUpdate = function (args, then) {\n return this._runTask(\n updateSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.submoduleInit = function (args, then) {\n return this._runTask(\n initSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.subModule = function (options, then) {\n return this._runTask(\n subModuleTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.listRemote = function () {\n return this._runTask(\n listRemotesTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Adds a remote to the list of remotes.\n */\nGit.prototype.addRemote = function (remoteName, remoteRepo, then) {\n return this._runTask(\n addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes an entry by name from the list of remotes.\n */\nGit.prototype.removeRemote = function (remoteName, then) {\n return this._runTask(removeRemoteTask(remoteName), trailingFunctionArgument(arguments));\n};\n\n/**\n * Gets the currently available remotes, setting the optional verbose argument to true includes additional\n * detail on the remotes themselves.\n */\nGit.prototype.getRemotes = function (verbose, then) {\n return this._runTask(getRemotesTask(verbose === true), trailingFunctionArgument(arguments));\n};\n\n/**\n * Call any `git remote` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.remote = function (options, then) {\n return this._runTask(\n remoteTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Call any `git tag` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.tag = function (options, then) {\n const command = getTrailingOptions(arguments);\n\n if (command[0] !== 'tag') {\n command.unshift('tag');\n }\n\n return this._runTask(straightThroughStringTask(command), trailingFunctionArgument(arguments));\n};\n\n/**\n * Updates repository server info\n *\n * @param {Function} [then]\n */\nGit.prototype.updateServerInfo = function (then) {\n return this._runTask(\n straightThroughStringTask(['update-server-info']),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the\n * default configured remote spec.\n *\n * @param {string} [remote]\n * @param {Function} [then]\n */\nGit.prototype.pushTags = function (remote, then) {\n const task = pushTagsTask(\n { remote: filterType(remote, filterString) },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Removes the named files from source control.\n */\nGit.prototype.rm = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '-f', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To\n * completely remove the files, use `rm`.\n *\n * @param {string|string[]} files\n */\nGit.prototype.rmKeepLocal = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '--cached', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content,\n * size, and type.\n *\n * Passing \"-p\" will instruct cat-file to determine the object type, and display its formatted contents.\n *\n * @param {string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.catFile = function (options, then) {\n return this._catFile('utf-8', arguments);\n};\n\nGit.prototype.binaryCatFile = function () {\n return this._catFile('buffer', arguments);\n};\n\nGit.prototype._catFile = function (format, args) {\n var handler = trailingFunctionArgument(args);\n var command = ['cat-file'];\n var options = args[0];\n\n if (typeof options === 'string') {\n return this._runTask(\n configurationErrorTask('Git.catFile: options must be supplied as an array of strings'),\n handler\n );\n }\n\n if (Array.isArray(options)) {\n command.push.apply(command, options);\n }\n\n const task =\n format === 'buffer' ? straightThroughBufferTask(command) : straightThroughStringTask(command);\n\n return this._runTask(task, handler);\n};\n\nGit.prototype.diff = function (options, then) {\n const task = filterString(options)\n ? configurationErrorTask(\n 'git.diff: supplying options as a single string is no longer supported, switch to an array of strings'\n )\n : straightThroughStringTask(['diff', ...getTrailingOptions(arguments)]);\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.diffSummary = function () {\n return this._runTask(\n diffSummaryTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.applyPatch = function (patches) {\n const task = !filterStringOrStringArray(patches)\n ? configurationErrorTask(\n `git.applyPatch requires one or more string patches as the first argument`\n )\n : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1)));\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.revparse = function () {\n const commands = ['rev-parse', ...getTrailingOptions(arguments, true)];\n return this._runTask(\n straightThroughStringTask(commands, true),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n */\nGit.prototype.clean = function (mode, options, then) {\n const usingCleanOptionsArray = isCleanOptionsArray(mode);\n const cleanMode =\n (usingCleanOptionsArray && mode.join('')) || filterType(mode, filterString) || '';\n const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0));\n\n return this._runTask(\n cleanWithOptionsTask(cleanMode, customArgs),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.exec = function (then) {\n const task = {\n commands: [],\n format: 'utf-8',\n parser() {\n if (typeof then === 'function') {\n then();\n }\n },\n };\n\n return this._runTask(task);\n};\n\n/**\n * Clears the queue of pending commands and returns the wrapper instance for chaining.\n *\n * @returns {Git}\n */\nGit.prototype.clearQueue = function () {\n // TODO:\n // this._executor.clear();\n return this;\n};\n\n/**\n * Check if a pathname or pathnames are excluded by .gitignore\n *\n * @param {string|string[]} pathnames\n * @param {Function} [then]\n */\nGit.prototype.checkIgnore = function (pathnames, then) {\n return this._runTask(\n checkIgnoreTask(asArray(filterType(pathnames, filterStringOrStringArray, []))),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.checkIsRepo = function (checkType, then) {\n return this._runTask(\n checkIsRepoTask(filterType(checkType, filterString)),\n trailingFunctionArgument(arguments)\n );\n};\n\nmodule.exports = Git;\n","import { pathspec } from './args/pathspec';\nimport { GitConstructError } from './errors/git-construct-error';\nimport { GitError } from './errors/git-error';\nimport { GitPluginError } from './errors/git-plugin-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { TaskConfigurationError } from './errors/task-configuration-error';\nimport { CheckRepoActions } from './tasks/check-is-repo';\nimport { CleanOptions } from './tasks/clean';\nimport { GitConfigScope } from './tasks/config';\nimport { DiffNameStatus } from './tasks/diff-name-status';\nimport { grepQueryBuilder } from './tasks/grep';\nimport { ResetMode } from './tasks/reset';\n\nexport {\n CheckRepoActions,\n CleanOptions,\n DiffNameStatus,\n GitConfigScope,\n GitConstructError,\n GitError,\n GitPluginError,\n GitResponseError,\n ResetMode,\n TaskConfigurationError,\n grepQueryBuilder,\n pathspec,\n};\n","import { GitError } from './git-error';\nimport { SimpleGitOptions } from '../types';\n\n/**\n * The `GitConstructError` is thrown when an error occurs in the constructor\n * of the `simple-git` instance itself. Most commonly as a result of using\n * a `baseDir` option that points to a folder that either does not exist,\n * or cannot be read by the user the node script is running as.\n *\n * Check the `.message` property for more detail including the properties\n * passed to the constructor.\n */\nexport class GitConstructError extends GitError {\n constructor(\n public readonly config: SimpleGitOptions,\n message: string\n ) {\n super(undefined, message);\n }\n}\n","import { SimpleGitOptions, SimpleGitTask } from '../types';\nimport { GitError } from './git-error';\n\nexport class GitPluginError extends GitError {\n constructor(\n public task?: SimpleGitTask<any>,\n public readonly plugin?: keyof SimpleGitOptions,\n message?: string\n ) {\n super(task, message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { SimpleGitOptions } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function abortPlugin(signal: SimpleGitOptions['abort']) {\n if (!signal) {\n return;\n }\n\n const onSpawnAfter: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n function kill() {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort signal received'));\n }\n\n signal.addEventListener('abort', kill);\n\n context.spawned.on('close', () => signal.removeEventListener('abort', kill));\n },\n };\n\n const onSpawnBefore: SimpleGitPlugin<'spawn.before'> = {\n type: 'spawn.before',\n action(_data, context) {\n if (signal.aborted) {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort already signaled'));\n }\n },\n };\n\n return [onSpawnBefore, onSpawnAfter];\n}\n","import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport type { SimpleGitPluginConfig } from '../types';\n\nfunction isConfigSwitch(arg: string | unknown) {\n return typeof arg === 'string' && arg.trim().toLowerCase() === '-c';\n}\n\nfunction preventProtocolOverride(arg: string, next: string) {\n if (!isConfigSwitch(arg)) {\n return;\n }\n\n if (!/^\\s*protocol(.[a-z]+)?.allow/.test(next)) {\n return;\n }\n\n throw new GitPluginError(\n undefined,\n 'unsafe',\n 'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol'\n );\n}\n\nfunction preventUploadPack(arg: string, method: string) {\n if (/^\\s*--(upload|receive)-pack/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'clone' && /^\\s*-u\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of clone with option -u is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'push' && /^\\s*--exec\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of push with option --exec is not permitted without enabling allowUnsafePack`\n );\n }\n}\n\nexport function blockUnsafeOperationsPlugin({\n allowUnsafeProtocolOverride = false,\n allowUnsafePack = false,\n}: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(args, context) {\n args.forEach((current, index) => {\n const next = index < args.length ? args[index + 1] : '';\n\n allowUnsafeProtocolOverride || preventProtocolOverride(current, next);\n allowUnsafePack || preventUploadPack(current, context.method);\n });\n\n return args;\n },\n };\n}\n","import { prefixedArray } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function commandConfigPrefixingPlugin(\n configuration: string[]\n): SimpleGitPlugin<'spawn.args'> {\n const prefix = prefixedArray(configuration, '-c');\n\n return {\n type: 'spawn.args',\n action(data) {\n return [...prefix, ...data];\n },\n };\n}\n","import { deferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { SimpleGitPluginConfig } from '../types';\nimport { delay } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nconst never = deferred().promise;\n\nexport function completionDetectionPlugin({\n onClose = true,\n onExit = 50,\n}: SimpleGitPluginConfig['completion'] = {}): SimpleGitPlugin<'spawn.after'> {\n function createEvents() {\n let exitCode = -1;\n const events = {\n close: deferred(),\n closeTimeout: deferred(),\n exit: deferred(),\n exitTimeout: deferred(),\n };\n\n const result = Promise.race([\n onClose === false ? never : events.closeTimeout.promise,\n onExit === false ? never : events.exitTimeout.promise,\n ]);\n\n configureTimeout(onClose, events.close, events.closeTimeout);\n configureTimeout(onExit, events.exit, events.exitTimeout);\n\n return {\n close(code: number) {\n exitCode = code;\n events.close.done();\n },\n exit(code: number) {\n exitCode = code;\n events.exit.done();\n },\n get exitCode() {\n return exitCode;\n },\n result,\n };\n }\n\n function configureTimeout(\n flag: boolean | number,\n event: DeferredPromise<void>,\n timeout: DeferredPromise<void>\n ) {\n if (flag === false) {\n return;\n }\n\n (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done);\n }\n\n return {\n type: 'spawn.after',\n async action(_data, { spawned, close }) {\n const events = createEvents();\n\n let deferClose = true;\n let quickClose = () => void (deferClose = false);\n\n spawned.stdout?.on('data', quickClose);\n spawned.stderr?.on('data', quickClose);\n spawned.on('error', quickClose);\n\n spawned.on('close', (code: number) => events.close(code));\n spawned.on('exit', (code: number) => events.exit(code));\n\n try {\n await events.result;\n if (deferClose) {\n await delay(50);\n }\n close(events.exitCode);\n } catch (err) {\n close(events.exitCode, err as Error);\n }\n },\n };\n}\n","import type { SimpleGitOptions } from '../types';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport { asArray } from '../utils';\nimport { PluginStore } from './plugin-store';\n\nconst WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`;\nconst WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`;\n\nfunction isBadArgument(arg: string) {\n return !arg || !/^([a-z]:)?([a-z0-9/.\\\\_-]+)$/i.test(arg);\n}\n\nfunction toBinaryConfig(\n input: string[],\n allowUnsafe: boolean\n): { binary: string; prefix?: string } {\n if (input.length < 1 || input.length > 2) {\n throw new GitPluginError(undefined, 'binary', WRONG_NUMBER_ERR);\n }\n\n const isBad = input.some(isBadArgument);\n if (isBad) {\n if (allowUnsafe) {\n console.warn(WRONG_CHARS_ERR);\n } else {\n throw new GitPluginError(undefined, 'binary', WRONG_CHARS_ERR);\n }\n }\n\n const [binary, prefix] = input;\n return {\n binary,\n prefix,\n };\n}\n\nexport function customBinaryPlugin(\n plugins: PluginStore,\n input: SimpleGitOptions['binary'] = ['git'],\n allowUnsafe = false\n) {\n let config = toBinaryConfig(asArray(input), allowUnsafe);\n\n plugins.on('binary', (input) => {\n config = toBinaryConfig(asArray(input), allowUnsafe);\n });\n\n plugins.append('spawn.binary', () => {\n return config.binary;\n });\n\n plugins.append('spawn.args', (data) => {\n return config.prefix ? [config.prefix, ...data] : data;\n });\n}\n","import { GitError } from '../errors/git-error';\nimport { GitExecutorResult, SimpleGitPluginConfig } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\ntype TaskResult = Omit<GitExecutorResult, 'rejection'>;\n\nfunction isTaskError(result: TaskResult) {\n return !!(result.exitCode && result.stdErr.length);\n}\n\nfunction getErrorMessage(result: TaskResult) {\n return Buffer.concat([...result.stdOut, ...result.stdErr]);\n}\n\nexport function errorDetectionHandler(\n overwrite = false,\n isError = isTaskError,\n errorMessage: (result: TaskResult) => Buffer | Error = getErrorMessage\n) {\n return (error: Buffer | Error | undefined, result: TaskResult) => {\n if ((!overwrite && error) || !isError(result)) {\n return error;\n }\n\n return errorMessage(result);\n };\n}\n\nexport function errorDetectionPlugin(\n config: SimpleGitPluginConfig['errors']\n): SimpleGitPlugin<'task.error'> {\n return {\n type: 'task.error',\n action(data, context) {\n const error = config(data.error, {\n stdErr: context.stdErr,\n stdOut: context.stdOut,\n exitCode: context.exitCode,\n });\n\n if (Buffer.isBuffer(error)) {\n return { error: new GitError(undefined, error.toString('utf-8')) };\n }\n\n return {\n error,\n };\n },\n };\n}\n","import { EventEmitter } from 'node:events';\n\nimport type {\n SimpleGitPlugin,\n SimpleGitPluginType,\n SimpleGitPluginTypes,\n} from './simple-git-plugin';\nimport { append, asArray } from '../utils';\nimport type { SimpleGitPluginConfig } from '../types';\n\nexport class PluginStore {\n private plugins: Set<SimpleGitPlugin<SimpleGitPluginType>> = new Set();\n private events = new EventEmitter();\n\n on<K extends keyof SimpleGitPluginConfig>(\n type: K,\n listener: (data: SimpleGitPluginConfig[K]) => void\n ) {\n this.events.on(type, listener);\n }\n\n reconfigure<K extends keyof SimpleGitPluginConfig>(type: K, data: SimpleGitPluginConfig[K]) {\n this.events.emit(type, data);\n }\n\n public append<T extends SimpleGitPluginType>(type: T, action: SimpleGitPlugin<T>['action']) {\n const plugin = append(this.plugins, { type, action });\n\n return () => this.plugins.delete(plugin);\n }\n\n public add<T extends SimpleGitPluginType>(\n plugin: void | SimpleGitPlugin<T> | SimpleGitPlugin<T>[]\n ) {\n const plugins: SimpleGitPlugin<T>[] = [];\n\n asArray(plugin).forEach((plugin) => plugin && this.plugins.add(append(plugins, plugin)));\n\n return () => {\n plugins.forEach((plugin) => this.plugins.delete(plugin));\n };\n }\n\n public exec<T extends SimpleGitPluginType>(\n type: T,\n data: SimpleGitPluginTypes[T]['data'],\n context: SimpleGitPluginTypes[T]['context']\n ): typeof data {\n let output = data;\n const contextual = Object.freeze(Object.create(context));\n\n for (const plugin of this.plugins) {\n if (plugin.type === type) {\n output = plugin.action(output, contextual);\n }\n }\n\n return output;\n }\n}\n","import { SimpleGitOptions } from '../types';\nimport { asNumber, including } from '../utils';\n\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function progressMonitorPlugin(progress: Exclude<SimpleGitOptions['progress'], void>) {\n const progressCommand = '--progress';\n const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push'];\n\n const onProgress: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n if (!context.commands.includes(progressCommand)) {\n return;\n }\n\n context.spawned.stderr?.on('data', (chunk: Buffer) => {\n const message = /^([\\s\\S]+?):\\s*(\\d+)% \\((\\d+)\\/(\\d+)\\)/.exec(chunk.toString('utf8'));\n if (!message) {\n return;\n }\n\n progress({\n method: context.method,\n stage: progressEventStage(message[1]),\n progress: asNumber(message[2]),\n processed: asNumber(message[3]),\n total: asNumber(message[4]),\n });\n });\n },\n };\n\n const onArgs: SimpleGitPlugin<'spawn.args'> = {\n type: 'spawn.args',\n action(args, context) {\n if (!progressMethods.includes(context.method)) {\n return args;\n }\n\n return including(args, progressCommand);\n },\n };\n\n return [onArgs, onProgress];\n}\n\nfunction progressEventStage(input: string) {\n return String(input.toLowerCase().split(' ', 1)) || 'unknown';\n}\n","import { SpawnOptions } from 'child_process';\nimport { pick } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function spawnOptionsPlugin(\n spawnOptions: Partial<SpawnOptions>\n): SimpleGitPlugin<'spawn.options'> {\n const options = pick(spawnOptions, ['uid', 'gid']);\n\n return {\n type: 'spawn.options',\n action(data) {\n return { ...options, ...data };\n },\n };\n}\n","import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport type { SimpleGitOptions } from '../types';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function timeoutPlugin({\n block,\n stdErr = true,\n stdOut = true,\n}: Exclude<SimpleGitOptions['timeout'], undefined>): SimpleGitPlugin<'spawn.after'> | void {\n if (block > 0) {\n return {\n type: 'spawn.after',\n action(_data, context) {\n let timeout: NodeJS.Timeout;\n\n function wait() {\n timeout && clearTimeout(timeout);\n timeout = setTimeout(kill, block);\n }\n\n function stop() {\n context.spawned.stdout?.off('data', wait);\n context.spawned.stderr?.off('data', wait);\n context.spawned.off('exit', stop);\n context.spawned.off('close', stop);\n timeout && clearTimeout(timeout);\n }\n\n function kill() {\n stop();\n context.kill(new GitPluginError(undefined, 'timeout', `block timeout reached`));\n }\n\n stdOut && context.spawned.stdout?.on('data', wait);\n stdErr && context.spawned.stderr?.on('data', wait);\n context.spawned.on('exit', stop);\n context.spawned.on('close', stop);\n\n wait();\n },\n };\n }\n}\n","import { SimpleGitPlugin } from './simple-git-plugin';\nimport { isPathSpec, toPaths } from '../args/pathspec';\n\nexport function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(data) {\n const prefix: string[] = [];\n let suffix: undefined | string[];\n function append(args: string[]) {\n (suffix = suffix || []).push(...args);\n }\n\n for (let i = 0; i < data.length; i++) {\n const param = data[i];\n\n if (isPathSpec(param)) {\n append(toPaths(param));\n continue;\n }\n\n if (param === '--') {\n append(\n data.slice(i + 1).flatMap((item) => (isPathSpec(item) && toPaths(item)) || item)\n );\n break;\n }\n\n prefix.push(param);\n }\n\n return !suffix ? prefix : [...prefix, '--', ...suffix.map(String)];\n },\n };\n}\n","import { SimpleGitFactory } from '../../typings';\n\nimport * as api from './api';\nimport {\n abortPlugin,\n blockUnsafeOperationsPlugin,\n commandConfigPrefixingPlugin,\n completionDetectionPlugin,\n customBinaryPlugin,\n errorDetectionHandler,\n errorDetectionPlugin,\n PluginStore,\n progressMonitorPlugin,\n spawnOptionsPlugin,\n timeoutPlugin,\n} from './plugins';\nimport { suffixPathsPlugin } from './plugins/suffix-paths.plugin';\nimport { createInstanceConfig, folderExists } from './utils';\nimport { SimpleGitOptions } from './types';\n\nconst Git = require('../git');\n\n/**\n * Adds the necessary properties to the supplied object to enable it for use as\n * the default export of a module.\n *\n * Eg: `module.exports = esModuleFactory({ something () {} })`\n */\nexport function esModuleFactory<T>(defaultExport: T) {\n return Object.defineProperties(defaultExport, {\n __esModule: { value: true },\n default: { value: defaultExport },\n }) as T & { __esModule: true; default: T };\n}\n\nexport function gitExportFactory(factory: SimpleGitFactory) {\n return Object.assign(factory.bind(null), api);\n}\n\nexport function gitInstanceFactory(\n baseDir?: string | Partial<SimpleGitOptions>,\n options?: Partial<SimpleGitOptions>\n) {\n const plugins = new PluginStore();\n const config = createInstanceConfig(\n (baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir)) || {},\n options\n );\n\n if (!folderExists(config.baseDir)) {\n throw new api.GitConstructError(\n config,\n `Cannot use simple-git on a directory that does not exist`\n );\n }\n\n if (Array.isArray(config.config)) {\n plugins.add(commandConfigPrefixingPlugin(config.config));\n }\n\n plugins.add(blockUnsafeOperationsPlugin(config.unsafe));\n plugins.add(suffixPathsPlugin());\n plugins.add(completionDetectionPlugin(config.completion));\n config.abort && plugins.add(abortPlugin(config.abort));\n config.progress && plugins.add(progressMonitorPlugin(config.progress));\n config.timeout && plugins.add(timeoutPlugin(config.timeout));\n config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions));\n\n plugins.add(errorDetectionPlugin(errorDetectionHandler(true)));\n config.errors && plugins.add(errorDetectionPlugin(config.errors));\n\n customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary);\n\n return new Git(config, plugins);\n}\n","import { SimpleGit, SimpleGitOptions } from '../../../typings';\n\nimport { GitResponseError } from '../errors/git-response-error';\nimport { gitInstanceFactory } from '../git-factory';\nimport { SimpleGitTaskCallback } from '../types';\n\nconst functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent'];\n\nconst functionNamesPromiseApi = [\n 'add',\n 'addAnnotatedTag',\n 'addConfig',\n 'addRemote',\n 'addTag',\n 'applyPatch',\n 'binaryCatFile',\n 'branch',\n 'branchLocal',\n 'catFile',\n 'checkIgnore',\n 'checkIsRepo',\n 'checkout',\n 'checkoutBranch',\n 'checkoutLatestTag',\n 'checkoutLocalBranch',\n 'clean',\n 'clone',\n 'commit',\n 'cwd',\n 'deleteLocalBranch',\n 'deleteLocalBranches',\n 'diff',\n 'diffSummary',\n 'exec',\n 'fetch',\n 'getRemotes',\n 'init',\n 'listConfig',\n 'listRemote',\n 'log',\n 'merge',\n 'mergeFromTo',\n 'mirror',\n 'mv',\n 'pull',\n 'push',\n 'pushTags',\n 'raw',\n 'rebase',\n 'remote',\n 'removeRemote',\n 'reset',\n 'revert',\n 'revparse',\n 'rm',\n 'rmKeepLocal',\n 'show',\n 'stash',\n 'stashList',\n 'status',\n 'subModule',\n 'submoduleAdd',\n 'submoduleInit',\n 'submoduleUpdate',\n 'tag',\n 'tags',\n 'updateServerInfo',\n];\n\nexport function gitP(\n ...args: [] | [string] | [Partial<SimpleGitOptions>] | [string, Partial<SimpleGitOptions>]\n): SimpleGit {\n let git: any;\n\n let chain = Promise.resolve();\n\n try {\n git = gitInstanceFactory(...args);\n } catch (e) {\n chain = Promise.reject(e);\n }\n\n function builderReturn() {\n return promiseApi;\n }\n\n function chainReturn() {\n return chain;\n }\n\n const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce(\n (api: any, name: string) => {\n const isAsync = functionNamesPromiseApi.includes(name);\n\n const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api);\n const alternative = isAsync ? chainReturn : builderReturn;\n\n Object.defineProperty(api, name, {\n enumerable: false,\n configurable: false,\n value: git ? valid : alternative,\n });\n\n return api;\n },\n {}\n );\n\n return promiseApi as SimpleGit;\n\n function asyncWrapper(fn: string, git: any): (...args: any[]) => Promise<any> {\n return function (...args: any[]) {\n if (typeof args[args.length] === 'function') {\n throw new TypeError(\n 'Promise interface requires that handlers are not supplied inline, ' +\n 'trailing function not allowed in call to ' +\n fn\n );\n }\n\n return chain.then(function () {\n return new Promise(function (resolve, reject) {\n const callback: SimpleGitTaskCallback = (err: Error | null, result?: any) => {\n if (err) {\n return reject(toError(err));\n }\n\n resolve(result);\n };\n args.push(callback);\n\n git[fn].apply(git, args);\n });\n });\n };\n }\n\n function syncWrapper(fn: string, git: any, api: SimpleGit) {\n return (...args: any[]) => {\n git[fn](...args);\n\n return api;\n };\n }\n}\n\nfunction toError(error: Error | string | any): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new GitResponseError(error);\n}\n","import { gitInstanceFactory } from './lib/git-factory';\n\nexport { gitP } from './lib/runners/promise-wrapped';\nexport * from './lib/api';\n\nexport const simpleGit = gitInstanceFactory;\n\nexport default gitInstanceFactory;\n","import { type SimpleGit, type SimpleGitOptions, simpleGit } from \"simple-git\";\n\nexport type GitClient = SimpleGit;\n\nexport interface CreateGitClientOptions extends Partial<SimpleGitOptions> {\n abortSignal?: AbortSignal;\n}\n\nexport function createGitClient(\n baseDir?: string,\n options?: CreateGitClientOptions,\n): GitClient {\n const { abortSignal: signal, ...rest } = options ?? {};\n return simpleGit({\n baseDir,\n maxConcurrentProcesses: 6,\n trimmed: true,\n abort: signal,\n ...rest,\n });\n}\n","import { execFile } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface LockInfo {\n path: string;\n ageMs: number;\n}\n\nexport async function getIndexLockPath(repoPath: string): Promise<string> {\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"rev-parse\", \"--git-path\", \"index.lock\"],\n { cwd: repoPath },\n );\n return path.resolve(repoPath, stdout.trim());\n } catch {\n return path.join(repoPath, \".git\", \"index.lock\");\n }\n}\n\nexport async function getLockInfo(repoPath: string): Promise<LockInfo | null> {\n const lockPath = await getIndexLockPath(repoPath);\n try {\n const stat = await fs.stat(lockPath);\n return {\n path: lockPath,\n ageMs: Date.now() - stat.mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nexport async function removeLock(repoPath: string): Promise<void> {\n const lockPath = await getIndexLockPath(repoPath);\n await fs.rm(lockPath, { force: true });\n}\n\nexport async function isLocked(repoPath: string): Promise<boolean> {\n return (await getLockInfo(repoPath)) !== null;\n}\n\nexport async function waitForUnlock(\n repoPath: string,\n timeoutMs = 10000,\n intervalMs = 100,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (!(await isLocked(repoPath))) return true;\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n return false;\n}\n","export class AsyncReaderWriterLock {\n private readers = 0;\n private writer = false;\n private writerWaiting = false;\n private readQueue: Array<() => void> = [];\n private writeQueue: Array<() => void> = [];\n\n async acquireRead(): Promise<void> {\n if (!this.writer && !this.writerWaiting) {\n this.readers++;\n return;\n }\n return new Promise((resolve) => {\n this.readQueue.push(() => {\n this.readers++;\n resolve();\n });\n });\n }\n\n releaseRead(): void {\n this.readers--;\n this.processQueue();\n }\n\n async acquireWrite(): Promise<void> {\n if (!this.writer && this.readers === 0) {\n this.writer = true;\n return;\n }\n this.writerWaiting = true;\n return new Promise((resolve) => {\n this.writeQueue.push(() => {\n this.writerWaiting = this.writeQueue.length > 0;\n this.writer = true;\n resolve();\n });\n });\n }\n\n releaseWrite(): void {\n this.writer = false;\n this.processQueue();\n }\n\n private processQueue(): void {\n if (this.writer || this.readers > 0) return;\n\n if (this.writeQueue.length > 0) {\n const next = this.writeQueue.shift();\n if (next) next();\n } else {\n while (this.readQueue.length > 0 && !this.writerWaiting) {\n const next = this.readQueue.shift();\n if (next) next();\n }\n }\n }\n}\n","import { createGitClient, type GitClient } from \"./client\";\nimport { removeLock, waitForUnlock } from \"./lock-detector\";\nimport { AsyncReaderWriterLock } from \"./rw-lock\";\n\n/**\n * Returns process.env with Electron/Chromium variables cleaned so that\n * child processes spawned by git hooks (e.g. biome via lint-staged) don't\n * crash trying to initialise GPU subsystems.\n *\n * The agent service symlinks `node → Electron binary` and prepends it to\n * PATH. If ELECTRON_RUN_AS_NODE is missing, that binary starts as a full\n * Chromium browser (GPU init → SIGTRAP crash). We strip most ELECTRON_/\n * CHROME_ vars but explicitly keep ELECTRON_RUN_AS_NODE=1 so any such\n * shim still behaves as plain Node.js.\n */\nfunction getCleanEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value === undefined) continue;\n if (key === \"ELECTRON_RUN_AS_NODE\") continue;\n if (key.startsWith(\"ELECTRON_\") || key.startsWith(\"CHROME_\")) continue;\n env[key] = value;\n }\n env.ELECTRON_RUN_AS_NODE = \"1\";\n return env;\n}\n\ninterface RepoState {\n lock: AsyncReaderWriterLock;\n client: GitClient;\n lastAccess: number;\n}\n\nexport interface ExecuteOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n waitForExternalLock?: boolean;\n}\n\nclass GitOperationManagerImpl {\n private repoStates = new Map<string, RepoState>();\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n private static readonly CLEANUP_INTERVAL_MS = 60000;\n private static readonly IDLE_TIMEOUT_MS = 300000;\n\n constructor() {\n this.cleanupInterval = setInterval(\n () => this.cleanupIdleRepos(),\n GitOperationManagerImpl.CLEANUP_INTERVAL_MS,\n );\n }\n\n private getRepoState(repoPath: string): RepoState {\n let state = this.repoStates.get(repoPath);\n if (!state) {\n state = {\n lock: new AsyncReaderWriterLock(),\n client: createGitClient(repoPath),\n lastAccess: Date.now(),\n };\n this.repoStates.set(repoPath, state);\n }\n state.lastAccess = Date.now();\n return state;\n }\n\n private cleanupIdleRepos(): void {\n const now = Date.now();\n for (const [repoPath, state] of this.repoStates) {\n if (now - state.lastAccess > GitOperationManagerImpl.IDLE_TIMEOUT_MS) {\n this.repoStates.delete(repoPath);\n }\n }\n }\n\n async executeRead<T>(\n repoPath: string,\n operation: (git: GitClient) => Promise<T>,\n options?: ExecuteOptions,\n ): Promise<T> {\n const state = this.getRepoState(repoPath);\n\n if (options?.signal) {\n const scopedGit = createGitClient(repoPath, {\n abortSignal: options.signal,\n });\n return operation(\n scopedGit.env({ ...getCleanEnv(), GIT_OPTIONAL_LOCKS: \"0\" }),\n );\n }\n\n const git = state.client.env({ ...getCleanEnv(), GIT_OPTIONAL_LOCKS: \"0\" });\n return operation(git);\n }\n\n async executeWrite<T>(\n repoPath: string,\n operation: (git: GitClient) => Promise<T>,\n options?: ExecuteOptions,\n ): Promise<T> {\n const state = this.getRepoState(repoPath);\n\n if (options?.waitForExternalLock !== false) {\n const unlocked = await waitForUnlock(\n repoPath,\n options?.timeoutMs ?? 10000,\n );\n if (!unlocked) {\n throw new Error(`Git repository is locked: ${repoPath}`);\n }\n }\n\n await state.lock.acquireWrite();\n try {\n if (options?.signal) {\n const scopedGit = createGitClient(repoPath, {\n abortSignal: options.signal,\n });\n return await operation(scopedGit.env(getCleanEnv()));\n }\n\n return await operation(state.client.env(getCleanEnv()));\n } catch (error) {\n if (options?.signal?.aborted) {\n await removeLock(repoPath).catch(() => {});\n }\n throw error;\n } finally {\n state.lock.releaseWrite();\n }\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.repoStates.clear();\n }\n}\n\nlet instance: GitOperationManagerImpl | null = null;\n\nexport function getGitOperationManager(): GitOperationManagerImpl {\n if (!instance) {\n instance = new GitOperationManagerImpl();\n }\n return instance;\n}\n\nexport function resetGitOperationManager(): void {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n}\n\nexport type GitOperationManager = GitOperationManagerImpl;\n","import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ApplyTreeSaga as GitApplyTreeSaga } from \"@posthog/git/sagas/tree\";\nimport { Saga } from \"@posthog/shared\";\nimport type { PostHogAPIClient } from \"../posthog-api\";\nimport type { TreeSnapshot } from \"../types\";\n\nexport interface ApplySnapshotInput {\n snapshot: TreeSnapshot;\n repositoryPath: string;\n apiClient: PostHogAPIClient;\n taskId: string;\n runId: string;\n}\n\nexport interface ApplySnapshotOutput {\n treeHash: string;\n}\n\nexport class ApplySnapshotSaga extends Saga<\n ApplySnapshotInput,\n ApplySnapshotOutput\n> {\n readonly sagaName = \"ApplySnapshotSaga\";\n\n private archivePath: string | null = null;\n\n protected async execute(\n input: ApplySnapshotInput,\n ): Promise<ApplySnapshotOutput> {\n const { snapshot, repositoryPath, apiClient, taskId, runId } = input;\n const tmpDir = join(repositoryPath, \".posthog\", \"tmp\");\n\n if (!snapshot.archiveUrl) {\n throw new Error(\"Cannot apply snapshot: no archive URL\");\n }\n\n const archiveUrl = snapshot.archiveUrl;\n\n await this.step({\n name: \"create_tmp_dir\",\n execute: () => mkdir(tmpDir, { recursive: true }),\n rollback: async () => {},\n });\n\n const archivePath = join(tmpDir, `${snapshot.treeHash}.tar.gz`);\n this.archivePath = archivePath;\n await this.step({\n name: \"download_archive\",\n execute: async () => {\n const arrayBuffer = await apiClient.downloadArtifact(\n taskId,\n runId,\n archiveUrl,\n );\n if (!arrayBuffer) {\n throw new Error(\"Failed to download archive\");\n }\n const base64Content = Buffer.from(arrayBuffer).toString(\"utf-8\");\n const binaryContent = Buffer.from(base64Content, \"base64\");\n await writeFile(archivePath, binaryContent);\n },\n rollback: async () => {\n if (this.archivePath) {\n await rm(this.archivePath, { force: true }).catch(() => {});\n }\n },\n });\n\n const gitApplySaga = new GitApplyTreeSaga(this.log);\n const applyResult = await gitApplySaga.run({\n baseDir: repositoryPath,\n treeHash: snapshot.treeHash,\n baseCommit: snapshot.baseCommit,\n changes: snapshot.changes,\n archivePath: this.archivePath,\n });\n\n if (!applyResult.success) {\n throw new Error(`Failed to apply tree: ${applyResult.error}`);\n }\n\n await rm(this.archivePath, { force: true }).catch(() => {});\n\n this.log.info(\"Tree snapshot applied\", {\n treeHash: snapshot.treeHash,\n totalChanges: snapshot.changes.length,\n deletedFiles: snapshot.changes.filter((c) => c.status === \"D\").length,\n });\n\n return { treeHash: snapshot.treeHash };\n }\n}\n","import { existsSync } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as tar from \"tar\";\nimport type { GitClient } from \"../client\";\nimport { GitSaga, type GitSagaInput } from \"../git-saga\";\nimport { getHeadSha } from \"../queries\";\n\nexport type FileStatus = \"A\" | \"M\" | \"D\";\n\nexport interface FileChange {\n path: string;\n status: FileStatus;\n}\n\nexport interface TreeSnapshot {\n treeHash: string;\n baseCommit: string | null;\n changes: FileChange[];\n timestamp: string;\n}\n\nexport interface CaptureTreeInput extends GitSagaInput {\n lastTreeHash?: string | null;\n archivePath?: string;\n}\n\nexport interface CaptureTreeOutput {\n snapshot: TreeSnapshot | null;\n archivePath?: string;\n changed: boolean;\n}\n\nexport class CaptureTreeSaga extends GitSaga<\n CaptureTreeInput,\n CaptureTreeOutput\n> {\n readonly sagaName = \"CaptureTreeSaga\";\n private tempIndexPath: string | null = null;\n\n protected async executeGitOperations(\n input: CaptureTreeInput,\n ): Promise<CaptureTreeOutput> {\n const { baseDir, lastTreeHash, archivePath, signal } = input;\n const tmpDir = path.join(baseDir, \".git\", \"posthog-code-tmp\");\n\n await this.step({\n name: \"create_tmp_dir\",\n execute: () => fs.mkdir(tmpDir, { recursive: true }),\n rollback: async () => {},\n });\n\n this.tempIndexPath = path.join(tmpDir, `index-${Date.now()}`);\n const tempIndexGit = this.git.env({\n ...process.env,\n GIT_INDEX_FILE: this.tempIndexPath,\n });\n\n await this.step({\n name: \"init_temp_index\",\n execute: () => tempIndexGit.raw([\"read-tree\", \"HEAD\"]),\n rollback: async () => {\n if (this.tempIndexPath) {\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n }\n },\n });\n\n await this.readOnlyStep(\"stage_files\", () =>\n tempIndexGit.raw([\"add\", \"-A\"]),\n );\n\n const treeHash = await this.readOnlyStep(\"write_tree\", () =>\n tempIndexGit.raw([\"write-tree\"]),\n );\n\n if (lastTreeHash && treeHash === lastTreeHash) {\n this.log.debug(\"No changes since last capture\", { treeHash });\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n return { snapshot: null, changed: false };\n }\n\n const baseCommit = await this.readOnlyStep(\"get_base_commit\", async () => {\n try {\n return await getHeadSha(baseDir, { abortSignal: signal });\n } catch {\n return null;\n }\n });\n\n const changes = await this.readOnlyStep(\"get_changes\", () =>\n this.getChanges(this.git, baseCommit, treeHash),\n );\n\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n\n const snapshot: TreeSnapshot = {\n treeHash,\n baseCommit,\n changes,\n timestamp: new Date().toISOString(),\n };\n\n let createdArchivePath: string | undefined;\n if (archivePath) {\n createdArchivePath = await this.createArchive(\n baseDir,\n archivePath,\n changes,\n );\n }\n\n this.log.info(\"Tree captured\", {\n treeHash,\n changes: changes.length,\n archived: !!createdArchivePath,\n });\n\n return { snapshot, archivePath: createdArchivePath, changed: true };\n }\n\n private async createArchive(\n baseDir: string,\n archivePath: string,\n changes: FileChange[],\n ): Promise<string | undefined> {\n const filesToArchive = changes\n .filter((c) => c.status !== \"D\")\n .map((c) => c.path);\n\n if (filesToArchive.length === 0) {\n return undefined;\n }\n\n const existingFiles = filesToArchive.filter((f) =>\n existsSync(path.join(baseDir, f)),\n );\n\n if (existingFiles.length === 0) {\n return undefined;\n }\n\n await this.step({\n name: \"create_archive\",\n execute: async () => {\n const archiveDir = path.dirname(archivePath);\n await fs.mkdir(archiveDir, { recursive: true });\n await tar.create(\n {\n gzip: true,\n file: archivePath,\n cwd: baseDir,\n },\n existingFiles,\n );\n },\n rollback: async () => {\n await fs.rm(archivePath, { force: true }).catch(() => {});\n },\n });\n\n return archivePath;\n }\n\n private async getChanges(\n git: GitClient,\n fromRef: string | null,\n toRef: string,\n ): Promise<FileChange[]> {\n if (!fromRef) {\n const stdout = await git.raw([\"ls-tree\", \"-r\", \"--name-only\", toRef]);\n return stdout\n .split(\"\\n\")\n .filter((p) => p.trim())\n .map((p) => ({ path: p, status: \"A\" as FileStatus }));\n }\n\n const stdout = await git.raw([\n \"diff-tree\",\n \"-r\",\n \"--name-status\",\n fromRef,\n toRef,\n ]);\n\n const changes: FileChange[] = [];\n for (const line of stdout.split(\"\\n\")) {\n if (!line.trim()) continue;\n const [status, filePath] = line.split(\"\\t\");\n if (!filePath) continue;\n\n let normalizedStatus: FileStatus;\n if (status === \"D\") {\n normalizedStatus = \"D\";\n } else if (status === \"A\") {\n normalizedStatus = \"A\";\n } else {\n normalizedStatus = \"M\";\n }\n\n changes.push({ path: filePath, status: normalizedStatus });\n }\n\n return changes;\n }\n}\n\nexport interface ApplyTreeInput extends GitSagaInput {\n treeHash: string;\n baseCommit?: string | null;\n changes: FileChange[];\n archivePath?: string;\n}\n\nexport interface ApplyTreeOutput {\n treeHash: string;\n checkoutPerformed: boolean;\n}\n\nexport class ApplyTreeSaga extends GitSaga<ApplyTreeInput, ApplyTreeOutput> {\n readonly sagaName = \"ApplyTreeSaga\";\n private originalHead: string | null = null;\n private originalBranch: string | null = null;\n private extractedFiles: string[] = [];\n private fileBackups: Map<string, Buffer> = new Map();\n\n protected async executeGitOperations(\n input: ApplyTreeInput,\n ): Promise<ApplyTreeOutput> {\n const { baseDir, treeHash, baseCommit, changes, archivePath } = input;\n\n const headInfo = await this.readOnlyStep(\"get_current_head\", async () => {\n let head: string | null = null;\n let branch: string | null = null;\n\n try {\n head = await this.git.revparse([\"HEAD\"]);\n } catch {\n head = null;\n }\n\n try {\n branch = await this.git.raw([\"symbolic-ref\", \"--short\", \"HEAD\"]);\n } catch {\n branch = null;\n }\n\n return { head, branch };\n });\n this.originalHead = headInfo.head;\n this.originalBranch = headInfo.branch;\n\n let checkoutPerformed = false;\n\n if (baseCommit && baseCommit !== this.originalHead) {\n await this.readOnlyStep(\"check_working_tree\", async () => {\n const status = await this.git.status();\n if (!status.isClean()) {\n const changedFiles =\n status.modified.length +\n status.staged.length +\n status.deleted.length;\n throw new Error(\n `Cannot apply tree: ${changedFiles} uncommitted change(s) exist. ` +\n `Commit or stash your changes first.`,\n );\n }\n });\n\n await this.step({\n name: \"checkout_base\",\n execute: async () => {\n await this.git.checkout(baseCommit);\n checkoutPerformed = true;\n this.log.warn(\n \"Applied tree from different commit - now in detached HEAD state\",\n {\n originalHead: this.originalHead,\n originalBranch: this.originalBranch,\n baseCommit,\n },\n );\n },\n rollback: async () => {\n try {\n if (this.originalBranch) {\n await this.git.checkout(this.originalBranch);\n } else if (this.originalHead) {\n await this.git.checkout(this.originalHead);\n }\n } catch (error) {\n this.log.warn(\"Failed to rollback checkout\", { error });\n }\n },\n });\n }\n\n if (archivePath) {\n const filesToExtract = changes\n .filter((c) => c.status !== \"D\")\n .map((c) => c.path);\n\n await this.readOnlyStep(\"backup_existing_files\", async () => {\n for (const filePath of filesToExtract) {\n const fullPath = path.join(baseDir, filePath);\n try {\n const content = await fs.readFile(fullPath);\n this.fileBackups.set(filePath, content);\n } catch {}\n }\n });\n\n await this.step({\n name: \"extract_archive\",\n execute: async () => {\n await tar.extract({\n file: archivePath,\n cwd: baseDir,\n });\n this.extractedFiles = filesToExtract;\n },\n rollback: async () => {\n for (const filePath of this.extractedFiles) {\n const fullPath = path.join(baseDir, filePath);\n const backup = this.fileBackups.get(filePath);\n if (backup) {\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n await fs.writeFile(fullPath, backup).catch(() => {});\n } else {\n await fs.rm(fullPath, { force: true }).catch(() => {});\n }\n }\n },\n });\n }\n\n for (const change of changes.filter((c) => c.status === \"D\")) {\n const fullPath = path.join(baseDir, change.path);\n\n const backupContent = await this.readOnlyStep(\n `backup_${change.path}`,\n async () => {\n try {\n return await fs.readFile(fullPath);\n } catch {\n return null;\n }\n },\n );\n\n await this.step({\n name: `delete_${change.path}`,\n execute: async () => {\n await fs.rm(fullPath, { force: true });\n this.log.debug(`Deleted file: ${change.path}`);\n },\n rollback: async () => {\n if (backupContent) {\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n await fs.writeFile(fullPath, backupContent).catch(() => {});\n }\n },\n });\n }\n\n const deletedCount = changes.filter((c) => c.status === \"D\").length;\n this.log.info(\"Tree applied\", {\n treeHash,\n totalChanges: changes.length,\n deletedFiles: deletedCount,\n checkoutPerformed,\n });\n\n return { treeHash, checkoutPerformed };\n }\n}\n\nexport interface ReadTreeInput extends GitSagaInput {\n treeHash: string;\n}\n\nexport interface ReadTreeOutput {\n files: string[];\n}\n\nexport class ReadTreeSaga extends GitSaga<ReadTreeInput, ReadTreeOutput> {\n readonly sagaName = \"ReadTreeSaga\";\n\n protected async executeGitOperations(\n input: ReadTreeInput,\n ): Promise<ReadTreeOutput> {\n const { treeHash } = input;\n\n const stdout = await this.readOnlyStep(\"ls_tree\", () =>\n this.git.raw([\"ls-tree\", \"-r\", \"--name-only\", treeHash]),\n );\n\n const files = stdout.split(\"\\n\").filter((f) => f.trim());\n return { files };\n }\n}\n","import { Saga } from \"@posthog/shared\";\nimport type { GitClient } from \"./client\";\nimport { getGitOperationManager } from \"./operation-manager\";\n\nexport interface GitSagaInput {\n baseDir: string;\n signal?: AbortSignal;\n}\n\nexport abstract class GitSaga<\n TInput extends GitSagaInput,\n TOutput,\n> extends Saga<TInput, TOutput> {\n private _git: GitClient | null = null;\n\n protected get git(): GitClient {\n if (!this._git) {\n throw new Error(\"git client accessed before execute() was called\");\n }\n return this._git;\n }\n\n protected async execute(input: TInput): Promise<TOutput> {\n const manager = getGitOperationManager();\n\n return manager.executeWrite(\n input.baseDir,\n async (git) => {\n this._git = git;\n return this.executeGitOperations(input);\n },\n { signal: input.signal },\n );\n }\n\n protected abstract executeGitOperations(input: TInput): Promise<TOutput>;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { CaptureTreeSaga as GitCaptureTreeSaga } from \"@posthog/git/sagas/tree\";\nimport { Saga } from \"@posthog/shared\";\nimport type { PostHogAPIClient } from \"../posthog-api\";\nimport type { TreeSnapshot } from \"../types\";\n\nexport interface CaptureTreeInput {\n repositoryPath: string;\n taskId: string;\n runId: string;\n apiClient?: PostHogAPIClient;\n lastTreeHash: string | null;\n interrupted?: boolean;\n}\n\nexport interface CaptureTreeOutput {\n snapshot: TreeSnapshot | null;\n newTreeHash: string | null;\n}\n\nexport class CaptureTreeSaga extends Saga<CaptureTreeInput, CaptureTreeOutput> {\n readonly sagaName = \"CaptureTreeSaga\";\n\n protected async execute(input: CaptureTreeInput): Promise<CaptureTreeOutput> {\n const {\n repositoryPath,\n lastTreeHash,\n interrupted,\n apiClient,\n taskId,\n runId,\n } = input;\n const tmpDir = join(repositoryPath, \".posthog\", \"tmp\");\n\n if (existsSync(join(repositoryPath, \".gitmodules\"))) {\n this.log.warn(\n \"Repository has submodules - snapshot may not capture submodule state\",\n );\n }\n\n const shouldArchive = !!apiClient;\n const archivePath = shouldArchive\n ? join(tmpDir, `tree-${Date.now()}.tar.gz`)\n : undefined;\n\n const gitCaptureSaga = new GitCaptureTreeSaga(this.log);\n const captureResult = await gitCaptureSaga.run({\n baseDir: repositoryPath,\n lastTreeHash,\n archivePath,\n });\n\n if (!captureResult.success) {\n throw new Error(`Failed to capture tree: ${captureResult.error}`);\n }\n\n const {\n snapshot: gitSnapshot,\n archivePath: createdArchivePath,\n changed,\n } = captureResult.data;\n\n if (!changed || !gitSnapshot) {\n this.log.debug(\"No changes since last capture\", { lastTreeHash });\n return { snapshot: null, newTreeHash: lastTreeHash };\n }\n\n let archiveUrl: string | undefined;\n if (apiClient && createdArchivePath) {\n try {\n archiveUrl = await this.uploadArchive(\n createdArchivePath,\n gitSnapshot.treeHash,\n apiClient,\n taskId,\n runId,\n );\n } finally {\n await rm(createdArchivePath, { force: true }).catch(() => {});\n }\n }\n\n const snapshot: TreeSnapshot = {\n treeHash: gitSnapshot.treeHash,\n baseCommit: gitSnapshot.baseCommit,\n changes: gitSnapshot.changes,\n timestamp: gitSnapshot.timestamp,\n interrupted,\n archiveUrl,\n };\n\n this.log.info(\"Tree captured\", {\n treeHash: snapshot.treeHash,\n changes: snapshot.changes.length,\n interrupted,\n archiveUrl,\n });\n\n return { snapshot, newTreeHash: snapshot.treeHash };\n }\n\n private async uploadArchive(\n archivePath: string,\n treeHash: string,\n apiClient: PostHogAPIClient,\n taskId: string,\n runId: string,\n ): Promise<string | undefined> {\n const archiveUrl = await this.step({\n name: \"upload_archive\",\n execute: async () => {\n const archiveContent = await readFile(archivePath);\n const base64Content = archiveContent.toString(\"base64\");\n\n const artifacts = await apiClient.uploadTaskArtifacts(taskId, runId, [\n {\n name: `trees/${treeHash}.tar.gz`,\n type: \"tree_snapshot\",\n content: base64Content,\n content_type: \"application/gzip\",\n },\n ]);\n\n if (artifacts.length > 0 && artifacts[0].storage_path) {\n this.log.info(\"Tree archive uploaded\", {\n storagePath: artifacts[0].storage_path,\n treeHash,\n });\n return artifacts[0].storage_path;\n }\n\n return undefined;\n },\n rollback: async () => {\n await rm(archivePath, { force: true }).catch(() => {});\n },\n });\n\n return archiveUrl;\n }\n}\n","/**\n * TreeTracker - Git tree-based state capture for cloud/local sync\n *\n * Captures the entire working state as a git tree hash + archive:\n * - Atomic state snapshots (no partial syncs)\n * - Efficient delta detection using git's diffing\n * - Simpler resume logic (restore tree, continue)\n *\n * Uses Saga pattern for atomic operations with automatic rollback on failure.\n * Uses a temporary git index to avoid modifying the user's staging area.\n */\n\nimport { isCommitOnRemote as gitIsCommitOnRemote } from \"@posthog/git/queries\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport { ApplySnapshotSaga } from \"./sagas/apply-snapshot-saga\";\nimport { CaptureTreeSaga } from \"./sagas/capture-tree-saga\";\nimport type { TreeSnapshot } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport type { TreeSnapshot };\n\nexport interface TreeTrackerConfig {\n repositoryPath: string;\n taskId: string;\n runId: string;\n apiClient?: PostHogAPIClient;\n logger?: Logger;\n}\n\nexport class TreeTracker {\n private repositoryPath: string;\n private taskId: string;\n private runId: string;\n private apiClient?: PostHogAPIClient;\n private logger: Logger;\n private lastTreeHash: string | null = null;\n\n constructor(config: TreeTrackerConfig) {\n this.repositoryPath = config.repositoryPath;\n this.taskId = config.taskId;\n this.runId = config.runId;\n this.apiClient = config.apiClient;\n this.logger =\n config.logger || new Logger({ debug: false, prefix: \"[TreeTracker]\" });\n }\n\n /**\n * Capture current working tree state as a snapshot.\n * Uses a temporary index to avoid modifying user's staging area.\n * Uses Saga pattern for atomic operation with automatic cleanup on failure.\n */\n async captureTree(options?: {\n interrupted?: boolean;\n }): Promise<TreeSnapshot | null> {\n const saga = new CaptureTreeSaga(this.logger);\n\n const result = await saga.run({\n repositoryPath: this.repositoryPath,\n taskId: this.taskId,\n runId: this.runId,\n apiClient: this.apiClient,\n lastTreeHash: this.lastTreeHash,\n interrupted: options?.interrupted,\n });\n\n if (!result.success) {\n this.logger.error(\"Failed to capture tree\", {\n error: result.error,\n failedStep: result.failedStep,\n });\n throw new Error(\n `Failed to capture tree at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n // Only update lastTreeHash on success\n if (result.data.newTreeHash !== null) {\n this.lastTreeHash = result.data.newTreeHash;\n }\n\n return result.data.snapshot;\n }\n\n /**\n * Download and apply a tree snapshot.\n * Uses Saga pattern for atomic operation with rollback on failure.\n */\n async applyTreeSnapshot(snapshot: TreeSnapshot): Promise<void> {\n if (!this.apiClient) {\n throw new Error(\"Cannot apply snapshot: API client not configured\");\n }\n\n if (!snapshot.archiveUrl) {\n this.logger.warn(\"Cannot apply snapshot: no archive URL\", {\n treeHash: snapshot.treeHash,\n changes: snapshot.changes.length,\n });\n throw new Error(\"Cannot apply snapshot: no archive URL\");\n }\n\n const saga = new ApplySnapshotSaga(this.logger);\n\n const result = await saga.run({\n snapshot,\n repositoryPath: this.repositoryPath,\n apiClient: this.apiClient,\n taskId: this.taskId,\n runId: this.runId,\n });\n\n if (!result.success) {\n this.logger.error(\"Failed to apply tree snapshot\", {\n error: result.error,\n failedStep: result.failedStep,\n treeHash: snapshot.treeHash,\n });\n throw new Error(\n `Failed to apply snapshot at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n // Only update lastTreeHash on success\n this.lastTreeHash = result.data.treeHash;\n }\n\n /**\n * Get the last captured tree hash.\n */\n getLastTreeHash(): string | null {\n return this.lastTreeHash;\n }\n\n /**\n * Set the last tree hash (used when resuming).\n */\n setLastTreeHash(hash: string | null): void {\n this.lastTreeHash = hash;\n }\n}\n\n/**\n * Check if a commit is available on any remote branch.\n * Used to validate that cloud can fetch the base commit during handoff.\n */\nexport async function isCommitOnRemote(\n commit: string,\n cwd: string,\n): Promise<boolean> {\n return gitIsCommitOnRemote(cwd, commit);\n}\n\n/**\n * Validate that a snapshot can be handed off to cloud execution.\n * Cloud needs to be able to fetch the baseCommit from a remote.\n *\n * @throws Error if the snapshot cannot be restored on cloud\n */\nexport async function validateForCloudHandoff(\n snapshot: TreeSnapshot,\n repositoryPath: string,\n): Promise<void> {\n if (!snapshot.baseCommit) {\n throw new Error(\"Cannot hand off to cloud: no base commit\");\n }\n\n const onRemote = await isCommitOnRemote(snapshot.baseCommit, repositoryPath);\n if (!onRemote) {\n throw new Error(\n `Cannot hand off to cloud: commit ${snapshot.baseCommit.slice(0, 7)} is not pushed. ` +\n `Run 'git push' to push your branch first.`,\n );\n }\n}\n","import type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport { Saga } from \"@posthog/shared\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions\";\nimport type { PostHogAPIClient } from \"../posthog-api\";\nimport { TreeTracker } from \"../tree-tracker\";\nimport type {\n DeviceInfo,\n StoredNotification,\n TreeSnapshotEvent,\n} from \"../types\";\nimport { Logger } from \"../utils/logger\";\n\nexport interface ConversationTurn {\n role: \"user\" | \"assistant\";\n content: ContentBlock[];\n toolCalls?: ToolCallInfo[];\n}\n\nexport interface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n input: unknown;\n result?: unknown;\n}\n\nexport interface ResumeInput {\n taskId: string;\n runId: string;\n repositoryPath?: string;\n apiClient: PostHogAPIClient;\n logger?: Logger;\n}\n\nexport interface ResumeOutput {\n conversation: ConversationTurn[];\n latestSnapshot: TreeSnapshotEvent | null;\n snapshotApplied: boolean;\n interrupted: boolean;\n lastDevice?: DeviceInfo;\n logEntryCount: number;\n}\n\nexport class ResumeSaga extends Saga<ResumeInput, ResumeOutput> {\n readonly sagaName = \"ResumeSaga\";\n\n protected async execute(input: ResumeInput): Promise<ResumeOutput> {\n const { taskId, runId, repositoryPath, apiClient } = input;\n const logger =\n input.logger || new Logger({ debug: false, prefix: \"[Resume]\" });\n\n // Step 1: Fetch task run (read-only)\n const taskRun = await this.readOnlyStep(\"fetch_task_run\", () =>\n apiClient.getTaskRun(taskId, runId),\n );\n\n if (!taskRun.log_url) {\n this.log.info(\"No log URL found, starting fresh\");\n return this.emptyResult();\n }\n\n // Step 2: Fetch log entries (read-only)\n const entries = await this.readOnlyStep(\"fetch_logs\", () =>\n apiClient.fetchTaskRunLogs(taskRun),\n );\n\n if (entries.length === 0) {\n this.log.info(\"No log entries found, starting fresh\");\n return this.emptyResult();\n }\n\n this.log.info(\"Fetched log entries\", { count: entries.length });\n\n // Step 3: Find latest snapshot (read-only, pure computation)\n const latestSnapshot = await this.readOnlyStep(\"find_snapshot\", () =>\n Promise.resolve(this.findLatestTreeSnapshot(entries)),\n );\n\n // Step 4: Apply snapshot if present (wrapped in step for consistent logging)\n // Note: We use a try/catch inside the step because snapshot failure should NOT fail the saga\n let snapshotApplied = false;\n if (latestSnapshot?.archiveUrl && repositoryPath) {\n this.log.info(\"Found tree snapshot\", {\n treeHash: latestSnapshot.treeHash,\n hasArchiveUrl: true,\n changes: latestSnapshot.changes?.length ?? 0,\n interrupted: latestSnapshot.interrupted,\n });\n\n await this.step({\n name: \"apply_snapshot\",\n execute: async () => {\n const treeTracker = new TreeTracker({\n repositoryPath,\n taskId,\n runId,\n apiClient,\n logger: logger.child(\"TreeTracker\"),\n });\n\n try {\n await treeTracker.applyTreeSnapshot(latestSnapshot);\n treeTracker.setLastTreeHash(latestSnapshot.treeHash);\n snapshotApplied = true;\n this.log.info(\"Tree snapshot applied successfully\", {\n treeHash: latestSnapshot.treeHash,\n });\n } catch (error) {\n // Log but don't fail - continue with conversation rebuild\n // ApplySnapshotSaga handles its own rollback internally\n this.log.warn(\n \"Failed to apply tree snapshot, continuing without it\",\n {\n error: error instanceof Error ? error.message : String(error),\n treeHash: latestSnapshot.treeHash,\n },\n );\n }\n },\n rollback: async () => {\n // Inner ApplySnapshotSaga handles its own rollback\n },\n });\n } else if (latestSnapshot?.archiveUrl && !repositoryPath) {\n this.log.warn(\n \"Snapshot found but no repositoryPath configured - files cannot be restored\",\n {\n treeHash: latestSnapshot.treeHash,\n changes: latestSnapshot.changes?.length ?? 0,\n },\n );\n } else if (latestSnapshot) {\n this.log.warn(\n \"Snapshot found but has no archive URL - files cannot be restored\",\n {\n treeHash: latestSnapshot.treeHash,\n changes: latestSnapshot.changes?.length ?? 0,\n },\n );\n }\n\n // Step 5: Rebuild conversation (read-only, pure computation)\n const conversation = await this.readOnlyStep(\"rebuild_conversation\", () =>\n Promise.resolve(this.rebuildConversation(entries)),\n );\n\n // Step 6: Find device info (read-only, pure computation)\n const lastDevice = await this.readOnlyStep(\"find_device\", () =>\n Promise.resolve(this.findLastDeviceInfo(entries)),\n );\n\n this.log.info(\"Resume state rebuilt\", {\n turns: conversation.length,\n hasSnapshot: !!latestSnapshot,\n snapshotApplied,\n interrupted: latestSnapshot?.interrupted ?? false,\n });\n\n return {\n conversation,\n latestSnapshot,\n snapshotApplied,\n interrupted: latestSnapshot?.interrupted ?? false,\n lastDevice,\n logEntryCount: entries.length,\n };\n }\n\n private emptyResult(): ResumeOutput {\n return {\n conversation: [],\n latestSnapshot: null,\n snapshotApplied: false,\n interrupted: false,\n logEntryCount: 0,\n };\n }\n\n private findLatestTreeSnapshot(\n entries: StoredNotification[],\n ): TreeSnapshotEvent | null {\n const sdkPrefixedMethod = `_${POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT}`;\n\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n const method = entry.notification?.method;\n if (\n method === sdkPrefixedMethod ||\n method === POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT\n ) {\n const params = entry.notification.params as\n | TreeSnapshotEvent\n | undefined;\n if (params?.treeHash) {\n return params;\n }\n }\n }\n return null;\n }\n\n private findLastDeviceInfo(\n entries: StoredNotification[],\n ): DeviceInfo | undefined {\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n const params = entry.notification?.params as\n | { device?: DeviceInfo }\n | undefined;\n if (params?.device) {\n return params.device;\n }\n }\n return undefined;\n }\n\n private rebuildConversation(\n entries: StoredNotification[],\n ): ConversationTurn[] {\n const turns: ConversationTurn[] = [];\n let currentAssistantContent: ContentBlock[] = [];\n let currentToolCalls: ToolCallInfo[] = [];\n\n for (const entry of entries) {\n const method = entry.notification?.method;\n const params = entry.notification?.params as Record<string, unknown>;\n\n if (method === \"session/update\" && params?.update) {\n const update = params.update as Record<string, unknown>;\n const sessionUpdate = update.sessionUpdate as string;\n\n switch (sessionUpdate) {\n case \"user_message\":\n case \"user_message_chunk\": {\n if (\n currentAssistantContent.length > 0 ||\n currentToolCalls.length > 0\n ) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls:\n currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n currentAssistantContent = [];\n currentToolCalls = [];\n }\n\n const content = update.content as ContentBlock | ContentBlock[];\n const contentArray = Array.isArray(content) ? content : [content];\n turns.push({\n role: \"user\",\n content: contentArray,\n });\n break;\n }\n\n case \"agent_message\": {\n const content = update.content as ContentBlock | undefined;\n if (content) {\n if (\n content.type === \"text\" &&\n currentAssistantContent.length > 0 &&\n currentAssistantContent[currentAssistantContent.length - 1]\n .type === \"text\"\n ) {\n const lastBlock = currentAssistantContent[\n currentAssistantContent.length - 1\n ] as { type: \"text\"; text: string };\n lastBlock.text += (\n content as { type: \"text\"; text: string }\n ).text;\n } else {\n currentAssistantContent.push(content);\n }\n }\n break;\n }\n\n case \"agent_message_chunk\": {\n // Backward compatibility with older logs that have individual chunks\n const content = update.content as ContentBlock | undefined;\n if (content) {\n if (\n content.type === \"text\" &&\n currentAssistantContent.length > 0 &&\n currentAssistantContent[currentAssistantContent.length - 1]\n .type === \"text\"\n ) {\n const lastBlock = currentAssistantContent[\n currentAssistantContent.length - 1\n ] as { type: \"text\"; text: string };\n lastBlock.text += (\n content as { type: \"text\"; text: string }\n ).text;\n } else {\n currentAssistantContent.push(content);\n }\n }\n break;\n }\n\n case \"tool_call\":\n case \"tool_call_update\": {\n const meta = (update._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n if (meta) {\n const toolCallId = meta.toolCallId as string | undefined;\n const toolName = meta.toolName as string | undefined;\n const toolInput = meta.toolInput;\n const toolResponse = meta.toolResponse;\n\n if (toolCallId && toolName) {\n let toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (!toolCall) {\n toolCall = {\n toolCallId,\n toolName,\n input: toolInput,\n };\n currentToolCalls.push(toolCall);\n }\n\n if (toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n\n case \"tool_result\": {\n const meta = (update._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n if (meta) {\n const toolCallId = meta.toolCallId as string | undefined;\n const toolResponse = meta.toolResponse;\n\n if (toolCallId) {\n const toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (toolCall && toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n }\n }\n }\n\n if (currentAssistantContent.length > 0 || currentToolCalls.length > 0) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls: currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n }\n\n return turns;\n }\n}\n","/**\n * Resume - Restore agent state from persisted log\n *\n * Handles resuming a task from any point:\n * - Fetches log via the PostHog API\n * - Finds latest tree_snapshot event\n * - Rebuilds conversation from log events\n * - Restores working tree from snapshot\n *\n * Uses Saga pattern for atomic operations with clear success/failure tracking.\n *\n * The log is the single source of truth for:\n * - Conversation history (user_message, agent_message_chunk, tool_call, tool_result)\n * - Working tree state (tree_snapshot events)\n * - Session metadata (device info, mode changes)\n */\n\nimport type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport { ResumeSaga } from \"./sagas/resume-saga\";\nimport type { DeviceInfo, TreeSnapshotEvent } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport interface ResumeState {\n conversation: ConversationTurn[];\n latestSnapshot: TreeSnapshotEvent | null;\n /** Whether the tree snapshot was successfully applied (files restored) */\n snapshotApplied: boolean;\n interrupted: boolean;\n lastDevice?: DeviceInfo;\n logEntryCount: number;\n}\n\nexport interface ConversationTurn {\n role: \"user\" | \"assistant\";\n content: ContentBlock[];\n toolCalls?: ToolCallInfo[];\n}\n\nexport interface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n input: unknown;\n result?: unknown;\n}\n\nexport interface ResumeConfig {\n taskId: string;\n runId: string;\n repositoryPath?: string;\n apiClient: PostHogAPIClient;\n logger?: Logger;\n}\n\n/**\n * Resume a task from its persisted log.\n * Returns the rebuilt state for the agent to continue from.\n *\n * Uses Saga pattern internally for atomic operations.\n * Note: snapshotApplied field indicates if files were actually restored -\n * even if latestSnapshot is non-null, files may not have been restored if\n * the snapshot had no archive URL or download/extraction failed.\n */\nexport async function resumeFromLog(\n config: ResumeConfig,\n): Promise<ResumeState> {\n const logger =\n config.logger || new Logger({ debug: false, prefix: \"[Resume]\" });\n\n logger.info(\"Resuming from log\", {\n taskId: config.taskId,\n runId: config.runId,\n });\n\n const saga = new ResumeSaga(logger);\n\n const result = await saga.run({\n taskId: config.taskId,\n runId: config.runId,\n repositoryPath: config.repositoryPath,\n apiClient: config.apiClient,\n logger,\n });\n\n if (!result.success) {\n logger.error(\"Failed to resume from log\", {\n error: result.error,\n failedStep: result.failedStep,\n });\n throw new Error(\n `Failed to resume at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n return {\n conversation: result.data.conversation as ConversationTurn[],\n latestSnapshot: result.data.latestSnapshot,\n snapshotApplied: result.data.snapshotApplied,\n interrupted: result.data.interrupted,\n lastDevice: result.data.lastDevice,\n logEntryCount: result.data.logEntryCount,\n };\n}\n\n/**\n * Convert resumed conversation back to API format for continuation.\n */\nexport function conversationToPromptHistory(\n conversation: ConversationTurn[],\n): Array<{ role: \"user\" | \"assistant\"; content: ContentBlock[] }> {\n return conversation.map((turn) => ({\n role: turn.role,\n content: turn.content,\n }));\n}\n","import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SessionContext } from \"./otel-log-writer\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport type { StoredNotification } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport interface SessionLogWriterOptions {\n /** PostHog API client for log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n /** Local cache path for instant log loading (e.g., ~/.posthog-code) */\n localCachePath?: string;\n}\n\ninterface ChunkBuffer {\n text: string;\n firstTimestamp: string;\n}\n\ninterface SessionState {\n context: SessionContext;\n chunkBuffer?: ChunkBuffer;\n lastAgentMessage?: string;\n currentTurnMessages: string[];\n}\n\nexport class SessionLogWriter {\n private static readonly FLUSH_DEBOUNCE_MS = 500;\n private static readonly FLUSH_MAX_INTERVAL_MS = 5000;\n private static readonly MAX_FLUSH_RETRIES = 10;\n private static readonly MAX_RETRY_DELAY_MS = 30_000;\n private static readonly SESSIONS_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\n\n private posthogAPI?: PostHogAPIClient;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private lastFlushAttemptTime: Map<string, number> = new Map();\n private retryCounts: Map<string, number> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n private flushQueues: Map<string, Promise<void>> = new Map();\n\n private logger: Logger;\n private localCachePath?: string;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.localCachePath = options.localCachePath;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n // Coalesce any in-progress chunk buffers before the final flush\n // During normal operation, chunks are coalesced when the next non-chunk\n // event arrives, but on shutdown there may be no subsequent event\n const flushPromises: Promise<void>[] = [];\n for (const [sessionId, session] of this.sessions) {\n this.emitCoalescedMessage(sessionId, session);\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n }\n\n register(sessionId: string, context: SessionContext): void {\n if (this.sessions.has(sessionId)) {\n return;\n }\n\n this.logger.info(\"Session registered\", {\n taskId: context.taskId,\n runId: context.runId,\n });\n this.sessions.set(sessionId, { context, currentTurnMessages: [] });\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n if (this.localCachePath) {\n const sessionDir = path.join(\n this.localCachePath,\n \"sessions\",\n context.runId,\n );\n try {\n fs.mkdirSync(sessionDir, { recursive: true });\n } catch (error) {\n this.logger.warn(\"Failed to create local cache directory\", {\n sessionDir,\n error,\n });\n }\n }\n }\n\n isRegistered(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n appendRawLine(sessionId: string, line: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"appendRawLine called for unregistered session\", {\n sessionId,\n });\n return;\n }\n\n try {\n const message = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n // Check if this is an agent_message_chunk event\n if (this.isAgentMessageChunk(message)) {\n const text = this.extractChunkText(message);\n if (text) {\n if (!session.chunkBuffer) {\n session.chunkBuffer = { text, firstTimestamp: timestamp };\n } else {\n session.chunkBuffer.text += text;\n }\n }\n // Don't emit chunk events\n return;\n }\n\n // Non-chunk event: flush any buffered chunks first.\n // If this is a direct agent_message AND there are buffered chunks,\n // the direct message supersedes the partial chunks\n if (this.isDirectAgentMessage(message) && session.chunkBuffer) {\n session.chunkBuffer = undefined;\n } else {\n this.emitCoalescedMessage(sessionId, session);\n }\n\n const nonChunkAgentText = this.extractAgentMessageText(message);\n if (nonChunkAgentText) {\n session.lastAgentMessage = nonChunkAgentText;\n session.currentTurnMessages.push(nonChunkAgentText);\n }\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp,\n notification: message,\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n lineLength: line.length,\n });\n }\n }\n\n async flush(\n sessionId: string,\n { coalesce = false }: { coalesce?: boolean } = {},\n ): Promise<void> {\n if (coalesce) {\n const session = this.sessions.get(sessionId);\n if (session) {\n this.emitCoalescedMessage(sessionId, session);\n }\n }\n\n // Serialize flushes per session\n const prev = this.flushQueues.get(sessionId) ?? Promise.resolve();\n const next = prev.catch(() => {}).then(() => this._doFlush(sessionId));\n this.flushQueues.set(sessionId, next);\n next.finally(() => {\n if (this.flushQueues.get(sessionId) === next) {\n this.flushQueues.delete(sessionId);\n }\n });\n return next;\n }\n\n private async _doFlush(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"flush: no session found\", { sessionId });\n return;\n }\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) {\n return;\n }\n\n this.pendingEntries.delete(sessionId);\n const timeout = this.flushTimeouts.get(sessionId);\n if (timeout) {\n clearTimeout(timeout);\n this.flushTimeouts.delete(sessionId);\n }\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n this.retryCounts.set(sessionId, 0);\n } catch (error) {\n const retryCount = (this.retryCounts.get(sessionId) ?? 0) + 1;\n this.retryCounts.set(sessionId, retryCount);\n\n if (retryCount >= SessionLogWriter.MAX_FLUSH_RETRIES) {\n this.logger.error(\n `Dropping ${pending.length} session log entries after ${retryCount} failed flush attempts`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error,\n },\n );\n this.retryCounts.set(sessionId, 0);\n } else {\n if (retryCount === 1) {\n this.logger.warn(\n `Failed to persist session logs, will retry (up to ${SessionLogWriter.MAX_FLUSH_RETRIES} attempts)`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n const currentPending = this.pendingEntries.get(sessionId) ?? [];\n this.pendingEntries.set(sessionId, [...pending, ...currentPending]);\n this.scheduleFlush(sessionId);\n }\n }\n }\n\n private getSessionUpdateType(\n message: Record<string, unknown>,\n ): string | undefined {\n if (message.method !== \"session/update\") return undefined;\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n return update?.sessionUpdate as string | undefined;\n }\n\n private isDirectAgentMessage(message: Record<string, unknown>): boolean {\n return this.getSessionUpdateType(message) === \"agent_message\";\n }\n\n private isAgentMessageChunk(message: Record<string, unknown>): boolean {\n return this.getSessionUpdateType(message) === \"agent_message_chunk\";\n }\n\n private extractChunkText(message: Record<string, unknown>): string {\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n const content = update?.content as\n | { type: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && content.text) {\n return content.text;\n }\n return \"\";\n }\n\n private emitCoalescedMessage(sessionId: string, session: SessionState): void {\n if (!session.chunkBuffer) return;\n\n const { text, firstTimestamp } = session.chunkBuffer;\n session.chunkBuffer = undefined;\n session.lastAgentMessage = text;\n session.currentTurnMessages.push(text);\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp: firstTimestamp,\n notification: {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: {\n update: {\n sessionUpdate: \"agent_message\",\n content: { type: \"text\", text },\n },\n },\n },\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n }\n\n getLastAgentMessage(sessionId: string): string | undefined {\n return this.sessions.get(sessionId)?.lastAgentMessage;\n }\n\n getFullAgentResponse(sessionId: string): string | undefined {\n const session = this.sessions.get(sessionId);\n if (!session || session.currentTurnMessages.length === 0) return undefined;\n\n if (session.chunkBuffer) {\n this.logger.warn(\n \"getFullAgentResponse called with non-empty chunk buffer\",\n {\n sessionId,\n bufferedLength: session.chunkBuffer.text.length,\n },\n );\n }\n\n return session.currentTurnMessages.join(\"\\n\\n\");\n }\n\n resetTurnMessages(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.currentTurnMessages = [];\n }\n }\n\n private extractAgentMessageText(\n message: Record<string, unknown>,\n ): string | null {\n if (message.method !== \"session/update\") {\n return null;\n }\n\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n if (update?.sessionUpdate !== \"agent_message\") {\n return null;\n }\n\n const content = update.content as\n | { type?: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && typeof content.text === \"string\") {\n const trimmed = content.text.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (typeof update.message === \"string\") {\n const trimmed = update.message.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n return null;\n }\n\n private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n\n const retryCount = this.retryCounts.get(sessionId) ?? 0;\n const lastAttempt = this.lastFlushAttemptTime.get(sessionId) ?? 0;\n const elapsed = Date.now() - lastAttempt;\n\n let delay: number;\n if (retryCount > 0) {\n // Exponential backoff on retries: FLUSH_DEBOUNCE_MS * 2^retryCount, capped\n delay = Math.min(\n SessionLogWriter.FLUSH_DEBOUNCE_MS * 2 ** retryCount,\n SessionLogWriter.MAX_RETRY_DELAY_MS,\n );\n } else if (elapsed >= SessionLogWriter.FLUSH_MAX_INTERVAL_MS) {\n // If we've been accumulating for longer than the max interval, flush immediately\n delay = 0;\n } else {\n delay = SessionLogWriter.FLUSH_DEBOUNCE_MS;\n }\n\n const timeout = setTimeout(() => this.flush(sessionId), delay);\n this.flushTimeouts.set(sessionId, timeout);\n }\n\n private writeToLocalCache(\n sessionId: string,\n entry: StoredNotification,\n ): void {\n if (!this.localCachePath) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n const logPath = path.join(\n this.localCachePath,\n \"sessions\",\n session.context.runId,\n \"logs.ndjson\",\n );\n\n try {\n fs.appendFileSync(logPath, `${JSON.stringify(entry)}\\n`);\n } catch (error) {\n this.logger.warn(\"Failed to write to local cache\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n logPath,\n error,\n });\n }\n }\n\n static async cleanupOldSessions(localCachePath: string): Promise<number> {\n const sessionsDir = path.join(localCachePath, \"sessions\");\n let deleted = 0;\n try {\n const entries = await fsp.readdir(sessionsDir);\n const now = Date.now();\n for (const entry of entries) {\n const entryPath = path.join(sessionsDir, entry);\n try {\n const stats = await fsp.stat(entryPath);\n if (\n stats.isDirectory() &&\n now - stats.birthtimeMs > SessionLogWriter.SESSIONS_MAX_AGE_MS\n ) {\n await fsp.rm(entryPath, { recursive: true, force: true });\n deleted++;\n }\n } catch {\n // Skip entries we can't stat\n }\n }\n } catch {\n // Sessions dir may not exist yet\n }\n return deleted;\n }\n}\n","export class AsyncMutex {\n private locked = false;\n private queue: Array<() => void> = [];\n\n async acquire(): Promise<void> {\n if (!this.locked) {\n this.locked = true;\n return;\n }\n return new Promise((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.locked = false;\n }\n }\n\n isLocked(): boolean {\n return this.locked;\n }\n\n get queueLength(): number {\n return this.queue.length;\n }\n}\n","import jwt from \"jsonwebtoken\";\nimport { z } from \"zod\";\n\nexport const SANDBOX_CONNECTION_AUDIENCE = \"posthog:sandbox_connection\";\n\nexport const userDataSchema = z.object({\n run_id: z.string(),\n task_id: z.string(),\n team_id: z.number(),\n user_id: z.number(),\n distinct_id: z.string(),\n mode: z.enum([\"interactive\", \"background\"]).optional().default(\"interactive\"),\n});\n\nconst jwtPayloadSchema = userDataSchema.extend({\n exp: z.number(),\n iat: z.number().optional(),\n aud: z.string().optional(),\n});\n\nexport type JwtPayload = z.infer<typeof userDataSchema>;\n\nexport class JwtValidationError extends Error {\n constructor(\n message: string,\n public code:\n | \"invalid_token\"\n | \"expired\"\n | \"invalid_signature\"\n | \"server_error\",\n ) {\n super(message);\n this.name = \"JwtValidationError\";\n }\n}\n\nexport function validateJwt(token: string, publicKey: string): JwtPayload {\n try {\n const decoded = jwt.verify(token, publicKey, {\n algorithms: [\"RS256\"],\n audience: SANDBOX_CONNECTION_AUDIENCE,\n });\n\n const result = jwtPayloadSchema.safeParse(decoded);\n if (!result.success) {\n throw new JwtValidationError(\n `Missing required fields: ${result.error.message}`,\n \"invalid_token\",\n );\n }\n\n return result.data;\n } catch (error) {\n if (error instanceof JwtValidationError) {\n throw error;\n }\n if (error instanceof jwt.TokenExpiredError) {\n throw new JwtValidationError(\"Token expired\", \"expired\");\n }\n if (error instanceof jwt.JsonWebTokenError) {\n throw new JwtValidationError(\"Invalid signature\", \"invalid_signature\");\n }\n throw new JwtValidationError(\"Invalid token\", \"invalid_token\");\n }\n}\n","import { z } from \"zod\";\n\nconst httpHeaderSchema = z.object({\n name: z.string(),\n value: z.string(),\n});\n\nconst remoteMcpServerSchema = z.object({\n type: z.enum([\"http\", \"sse\"]),\n name: z.string().min(1, \"MCP server name is required\"),\n url: z.string().url(\"MCP server url must be a valid URL\"),\n headers: z.array(httpHeaderSchema).default([]),\n});\n\nexport const mcpServersSchema = z.array(remoteMcpServerSchema);\n\nexport type RemoteMcpServer = z.infer<typeof remoteMcpServerSchema>;\n\nexport const claudeCodeConfigSchema = z.object({\n systemPrompt: z\n .union([\n z.string(),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n append: z.string().optional(),\n }),\n ])\n .optional(),\n plugins: z\n .array(z.object({ type: z.literal(\"local\"), path: z.string() }))\n .optional(),\n});\n\nexport const jsonRpcRequestSchema = z.object({\n jsonrpc: z.literal(\"2.0\"),\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n id: z.union([z.string(), z.number()]).optional(),\n});\n\nexport type JsonRpcRequest = z.infer<typeof jsonRpcRequestSchema>;\n\nexport const userMessageParamsSchema = z.object({\n content: z.string().min(1, \"Content is required\"),\n});\n\nexport const commandParamsSchemas = {\n user_message: userMessageParamsSchema,\n \"posthog/user_message\": userMessageParamsSchema,\n cancel: z.object({}).optional(),\n \"posthog/cancel\": z.object({}).optional(),\n close: z.object({}).optional(),\n \"posthog/close\": z.object({}).optional(),\n} as const;\n\nexport type CommandMethod = keyof typeof commandParamsSchemas;\n\nexport function validateCommandParams(\n method: string,\n params: unknown,\n): { success: true; data: unknown } | { success: false; error: string } {\n const schema =\n commandParamsSchemas[method as CommandMethod] ??\n commandParamsSchemas[\n method.replace(\"posthog/\", \"\") as keyof typeof commandParamsSchemas\n ];\n\n if (!schema) {\n return { success: false, error: `Unknown method: ${method}` };\n }\n\n const result = schema.safeParse(params);\n if (!result.success) {\n return { success: false, error: result.error.message };\n }\n\n return { success: true, data: result.data };\n}\n"],"mappings":"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","names":["debug","delimiter","os","useColors","debug","path","exists","__export","deferred","ndJsonStream","ReadableStream","WritableStream","resolve","fs","os","path","RequestError","resolve","text","path","path","resolve","path","input","text","text","path","trimmed","ALLOW_BYPASS","trimmed","fs","os","path","fs","os","path","text","RequestError","resolve","availableModes","spawn","existsSync","existsSync","spawn","filteredOptions","currentAllowed","nextCurrent","trimmed","sessionId","text","writer","taskRunId","randomUUID","fs","os","path","text","fs","path","import_promise_deferred","Buffer","spawn","normalize","path","trimmed","delay","ExitCodes","commands","parser","parsers","text","CheckRepoActions","CleanOptions","append","GitConfigScope","DiffNameStatus","query","ResetMode","debug","onError","instance","excludeOptions","disallowedCommand","__commonJS","GitExecutor","SimpleGitApi","Scheduler","configurationErrorTask","asArray","filterArray","filterPrimitives","filterString","filterStringOrStringArray","filterType","getTrailingOptions","trailingFunctionArgument","trailingOptionsArgument","applyPatchTask","branchTask","branchLocalTask","deleteBranchesTask","deleteBranchTask","checkIgnoreTask","checkIsRepoTask","cloneTask","cloneMirrorTask","cleanWithOptionsTask","isCleanOptionsArray","diffSummaryTask","fetchTask","moveTask","pullTask","pushTagsTask","addRemoteTask","getRemotesTask","listRemotesTask","remoteTask","removeRemoteTask","getResetMode","resetTask","stashListTask","addSubModuleTask","initSubModuleTask","subModuleTask","updateSubModuleTask","addAnnotatedTagTask","addTagTask","tagListTask","straightThroughBufferTask","straightThroughStringTask","Git","input","plugin","fs","path","resolve","mkdir","rm","writeFile","join","existsSync","fs","path","existsSync","stdout","join","mkdir","writeFile","rm","existsSync","readFile","rm","join","CaptureTreeSaga","join","existsSync","rm","readFile","CaptureTreeSaga","fs","path","path","fs","text","trimmed","delay","resolve","z","z","createTappedWritableStream","resolve","ndJsonStream","trimmed","toolMeta"]}