@posthog/agent 2.3.663 → 2.3.670

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/protocols/lib/index.js","../../../../../node_modules/parse-path/lib/index.js","../../../../../node_modules/parse-url/dist/index.js","../../../../../node_modules/is-ssh/lib/index.js","../../../../../node_modules/git-up/lib/index.js","../../../../../node_modules/git-url-parse/lib/index.js","../../../src/adapters/codex/local-tools-mcp-server.ts","../../../../git/src/signed-commit.ts","../../../../git/src/concurrency.ts","../../../../git/src/gh.ts","../../../../git/src/trailers.ts","../../../../git/src/utils.ts","../../../src/utils/common.ts","../../../src/adapters/signed-commit-shared.ts","../../../src/adapters/local-tools/registry.ts","../../../src/adapters/local-tools/tools/signed-commit.ts","../../../src/adapters/local-tools/index.ts"],"sourcesContent":["\"use strict\";\n\n/**\n * protocols\n * Returns the protocols of an input url.\n *\n * @name protocols\n * @function\n * @param {String|URL} input The input url (string or `URL` instance)\n * @param {Boolean|Number} first If `true`, the first protocol will be returned. If number, it will represent the zero-based index of the protocols array.\n * @return {Array|String} The array of protocols or the specified protocol.\n */\nmodule.exports = function protocols(input, first) {\n\n if (first === true) {\n first = 0;\n }\n\n var prots = \"\";\n if (typeof input === \"string\") {\n try {\n prots = new URL(input).protocol;\n } catch (e) {}\n } else if (input && input.constructor === URL) {\n prots = input.protocol;\n }\n\n var splits = prots.split(/\\:|\\+/).filter(Boolean);\n\n if (typeof first === \"number\") {\n return splits[first];\n }\n\n return splits;\n};","\"use strict\";\n\nvar protocols = require(\"protocols\");\n\n/**\n * parsePath\n * Parses the input url.\n *\n * @name parsePath\n * @function\n * @param {String} url The input url.\n * @return {Object} An object containing the following fields:\n *\n * - `protocols` (Array): An array with the url protocols (usually it has one element).\n * - `protocol` (String): The first protocol or `\"file\"`.\n * - `port` (String): The domain port (default: `\"\"`).\n * - `resource` (String): The url domain/hostname.\n * - `host` (String): The url domain (including subdomain and port).\n * - `user` (String): The authentication user (default: `\"\"`).\n * - `password` (String): The authentication password (default: `\"\"`).\n * - `pathname` (String): The url pathname.\n * - `hash` (String): The url hash.\n * - `search` (String): The url querystring value (excluding `?`).\n * - `href` (String): The normalized input url.\n * - `query` (Object): The url querystring, parsed as object.\n * - `parse_failed` (Boolean): Whether the parsing failed or not.\n */\nfunction parsePath(url) {\n\n var output = {\n protocols: [],\n protocol: null,\n port: null,\n resource: \"\",\n host: \"\",\n user: \"\",\n password: \"\",\n pathname: \"\",\n hash: \"\",\n search: \"\",\n href: url,\n query: {},\n parse_failed: false\n };\n\n try {\n var parsed = new URL(url);\n output.protocols = protocols(parsed);\n output.protocol = output.protocols[0];\n output.port = parsed.port;\n output.resource = parsed.hostname;\n output.host = parsed.host;\n output.user = parsed.username || \"\";\n output.password = parsed.password || \"\";\n output.pathname = parsed.pathname;\n output.hash = parsed.hash.slice(1);\n output.search = parsed.search.slice(1);\n output.href = parsed.href;\n output.query = Object.fromEntries(parsed.searchParams);\n } catch (e) {\n // TODO Maybe check if it is a valid local file path\n // In any case, these will be parsed by higher\n // level parsers such as parse-url, git-url-parse, git-up\n output.protocols = [\"file\"];\n output.protocol = output.protocols[0];\n output.port = \"\";\n output.resource = \"\";\n output.user = \"\";\n output.pathname = \"\";\n output.hash = \"\";\n output.search = \"\";\n output.href = url;\n output.query = {};\n output.parse_failed = true;\n }\n\n return output;\n}\n\nmodule.exports = parsePath;","'use strict';\n\nvar require$$1 = require('parse-path');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nvar require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);\n\nfunction getAugmentedNamespace(n) {\n if (n.__esModule) return n;\n var f = n.default;\n\tif (typeof f == \"function\") {\n\t\tvar a = function a () {\n\t\t\tif (this instanceof a) {\n\t\t\t\tvar args = [null];\n\t\t\t\targs.push.apply(args, arguments);\n\t\t\t\tvar Ctor = Function.bind.apply(f, args);\n\t\t\t\treturn new Ctor();\n\t\t\t}\n\t\t\treturn f.apply(this, arguments);\n\t\t};\n\t\ta.prototype = f.prototype;\n } else a = {};\n Object.defineProperty(a, '__esModule', {value: true});\n\tObject.keys(n).forEach(function (k) {\n\t\tvar d = Object.getOwnPropertyDescriptor(n, k);\n\t\tObject.defineProperty(a, k, d.get ? d : {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn n[k];\n\t\t\t}\n\t\t});\n\t});\n\treturn a;\n}\n\nvar src = {};\n\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\nconst DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii';\n\nconst testParameter = (name, filters) => filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\n\nconst normalizeDataURL = (urlString, {stripHash}) => {\n\tconst match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);\n\n\tif (!match) {\n\t\tthrow new Error(`Invalid URL: ${urlString}`);\n\t}\n\n\tlet {type, data, hash} = match.groups;\n\tconst mediaType = type.split(';');\n\thash = stripHash ? '' : hash;\n\n\tlet isBase64 = false;\n\tif (mediaType[mediaType.length - 1] === 'base64') {\n\t\tmediaType.pop();\n\t\tisBase64 = true;\n\t}\n\n\t// Lowercase MIME type\n\tconst mimeType = (mediaType.shift() || '').toLowerCase();\n\tconst attributes = mediaType\n\t\t.map(attribute => {\n\t\t\tlet [key, value = ''] = attribute.split('=').map(string => string.trim());\n\n\t\t\t// Lowercase `charset`\n\t\t\tif (key === 'charset') {\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\tif (value === DATA_URL_DEFAULT_CHARSET) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn `${key}${value ? `=${value}` : ''}`;\n\t\t})\n\t\t.filter(Boolean);\n\n\tconst normalizedMediaType = [\n\t\t...attributes,\n\t];\n\n\tif (isBase64) {\n\t\tnormalizedMediaType.push('base64');\n\t}\n\n\tif (normalizedMediaType.length > 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {\n\t\tnormalizedMediaType.unshift(mimeType);\n\t}\n\n\treturn `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;\n};\n\nfunction normalizeUrl(urlString, options) {\n\toptions = {\n\t\tdefaultProtocol: 'http:',\n\t\tnormalizeProtocol: true,\n\t\tforceHttp: false,\n\t\tforceHttps: false,\n\t\tstripAuthentication: true,\n\t\tstripHash: false,\n\t\tstripTextFragment: true,\n\t\tstripWWW: true,\n\t\tremoveQueryParameters: [/^utm_\\w+/i],\n\t\tremoveTrailingSlash: true,\n\t\tremoveSingleSlash: true,\n\t\tremoveDirectoryIndex: false,\n\t\tsortQueryParameters: true,\n\t\t...options,\n\t};\n\n\turlString = urlString.trim();\n\n\t// Data URL\n\tif (/^data:/i.test(urlString)) {\n\t\treturn normalizeDataURL(urlString, options);\n\t}\n\n\tif (/^view-source:/i.test(urlString)) {\n\t\tthrow new Error('`view-source:` is not supported as it is a non-standard protocol');\n\t}\n\n\tconst hasRelativeProtocol = urlString.startsWith('//');\n\tconst isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\n\n\t// Prepend protocol\n\tif (!isRelativeUrl) {\n\t\turlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol);\n\t}\n\n\tconst urlObject = new URL(urlString);\n\n\tif (options.forceHttp && options.forceHttps) {\n\t\tthrow new Error('The `forceHttp` and `forceHttps` options cannot be used together');\n\t}\n\n\tif (options.forceHttp && urlObject.protocol === 'https:') {\n\t\turlObject.protocol = 'http:';\n\t}\n\n\tif (options.forceHttps && urlObject.protocol === 'http:') {\n\t\turlObject.protocol = 'https:';\n\t}\n\n\t// Remove auth\n\tif (options.stripAuthentication) {\n\t\turlObject.username = '';\n\t\turlObject.password = '';\n\t}\n\n\t// Remove hash\n\tif (options.stripHash) {\n\t\turlObject.hash = '';\n\t} else if (options.stripTextFragment) {\n\t\turlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, '');\n\t}\n\n\t// Remove duplicate slashes if not preceded by a protocol\n\t// NOTE: This could be implemented using a single negative lookbehind\n\t// regex, but we avoid that to maintain compatibility with older js engines\n\t// which do not have support for that feature.\n\tif (urlObject.pathname) {\n\t\t// TODO: Replace everything below with `urlObject.pathname = urlObject.pathname.replace(/(?<!\\b[a-z][a-z\\d+\\-.]{1,50}:)\\/{2,}/g, '/');` when Safari supports negative lookbehind.\n\n\t\t// Split the string by occurrences of this protocol regex, and perform\n\t\t// duplicate-slash replacement on the strings between those occurrences\n\t\t// (if any).\n\t\tconst protocolRegex = /\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g;\n\n\t\tlet lastIndex = 0;\n\t\tlet result = '';\n\t\tfor (;;) {\n\t\t\tconst match = protocolRegex.exec(urlObject.pathname);\n\t\t\tif (!match) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst protocol = match[0];\n\t\t\tconst protocolAtIndex = match.index;\n\t\t\tconst intermediate = urlObject.pathname.slice(lastIndex, protocolAtIndex);\n\n\t\t\tresult += intermediate.replace(/\\/{2,}/g, '/');\n\t\t\tresult += protocol;\n\t\t\tlastIndex = protocolAtIndex + protocol.length;\n\t\t}\n\n\t\tconst remnant = urlObject.pathname.slice(lastIndex, urlObject.pathname.length);\n\t\tresult += remnant.replace(/\\/{2,}/g, '/');\n\n\t\turlObject.pathname = result;\n\t}\n\n\t// Decode URI octets\n\tif (urlObject.pathname) {\n\t\ttry {\n\t\t\turlObject.pathname = decodeURI(urlObject.pathname);\n\t\t} catch {}\n\t}\n\n\t// Remove directory index\n\tif (options.removeDirectoryIndex === true) {\n\t\toptions.removeDirectoryIndex = [/^index\\.[a-z]+$/];\n\t}\n\n\tif (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\n\t\tlet pathComponents = urlObject.pathname.split('/');\n\t\tconst lastComponent = pathComponents[pathComponents.length - 1];\n\n\t\tif (testParameter(lastComponent, options.removeDirectoryIndex)) {\n\t\t\tpathComponents = pathComponents.slice(0, -1);\n\t\t\turlObject.pathname = pathComponents.slice(1).join('/') + '/';\n\t\t}\n\t}\n\n\tif (urlObject.hostname) {\n\t\t// Remove trailing dot\n\t\turlObject.hostname = urlObject.hostname.replace(/\\.$/, '');\n\n\t\t// Remove `www.`\n\t\tif (options.stripWWW && /^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(urlObject.hostname)) {\n\t\t\t// Each label should be max 63 at length (min: 1).\n\t\t\t// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\n\t\t\t// Each TLD should be up to 63 characters long (min: 2).\n\t\t\t// It is technically possible to have a single character TLD, but none currently exist.\n\t\t\turlObject.hostname = urlObject.hostname.replace(/^www\\./, '');\n\t\t}\n\t}\n\n\t// Remove query unwanted parameters\n\tif (Array.isArray(options.removeQueryParameters)) {\n\t\t// eslint-disable-next-line unicorn/no-useless-spread -- We are intentionally spreading to get a copy.\n\t\tfor (const key of [...urlObject.searchParams.keys()]) {\n\t\t\tif (testParameter(key, options.removeQueryParameters)) {\n\t\t\t\turlObject.searchParams.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (options.removeQueryParameters === true) {\n\t\turlObject.search = '';\n\t}\n\n\t// Sort query parameters\n\tif (options.sortQueryParameters) {\n\t\turlObject.searchParams.sort();\n\n\t\t// Calling `.sort()` encodes the search parameters, so we need to decode them again.\n\t\ttry {\n\t\t\turlObject.search = decodeURIComponent(urlObject.search);\n\t\t} catch {}\n\t}\n\n\tif (options.removeTrailingSlash) {\n\t\turlObject.pathname = urlObject.pathname.replace(/\\/$/, '');\n\t}\n\n\tconst oldUrlString = urlString;\n\n\t// Take advantage of many of the Node `url` normalizations\n\turlString = urlObject.toString();\n\n\tif (!options.removeSingleSlash && urlObject.pathname === '/' && !oldUrlString.endsWith('/') && urlObject.hash === '') {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Remove ending `/` unless removeSingleSlash is false\n\tif ((options.removeTrailingSlash || urlObject.pathname === '/') && urlObject.hash === '' && options.removeSingleSlash) {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Restore relative protocol, if applicable\n\tif (hasRelativeProtocol && !options.normalizeProtocol) {\n\t\turlString = urlString.replace(/^http:\\/\\//, '//');\n\t}\n\n\t// Remove http/https\n\tif (options.stripProtocol) {\n\t\turlString = urlString.replace(/^(?:https?:)?\\/\\//, '');\n\t}\n\n\treturn urlString;\n}\n\nvar normalizeUrl$1 = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\t'default': normalizeUrl\n});\n\nvar require$$0 = /*@__PURE__*/getAugmentedNamespace(normalizeUrl$1);\n\nObject.defineProperty(src, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; // Dependencies\n\nvar _normalizeUrl = require$$0;\n\nvar _normalizeUrl2 = _interopRequireDefault(_normalizeUrl);\n\nvar _parsePath = require$$1__default[\"default\"];\n\nvar _parsePath2 = _interopRequireDefault(_parsePath);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * parseUrl\n * Parses the input url.\n *\n * **Note**: This *throws* if invalid urls are provided.\n *\n * @name parseUrl\n * @function\n * @param {String} url The input url.\n * @param {Boolean|Object} normalize Whether to normalize the url or not.\n * Default is `false`. If `true`, the url will\n * be normalized. If an object, it will be the\n * options object sent to [`normalize-url`](https://github.com/sindresorhus/normalize-url).\n *\n * For SSH urls, normalize won't work.\n *\n * @return {Object} An object containing the following fields:\n *\n * - `protocols` (Array): An array with the url protocols (usually it has one element).\n * - `protocol` (String): The first protocol, `\"ssh\"` (if the url is a ssh url) or `\"file\"`.\n * - `port` (null|Number): The domain port.\n * - `resource` (String): The url domain (including subdomains).\n * - `host` (String): The fully qualified domain name of a network host, or its IP address.\n * - `user` (String): The authentication user (usually for ssh urls).\n * - `pathname` (String): The url pathname.\n * - `hash` (String): The url hash.\n * - `search` (String): The url querystring value.\n * - `href` (String): The input url.\n * - `query` (Object): The url querystring, parsed as object.\n * - `parse_failed` (Boolean): Whether the parsing failed or not.\n */\nvar parseUrl = function parseUrl(url) {\n var normalize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\n // Constants\n /**\n * ([a-zA-Z_][a-zA-Z0-9_-]{0,31}) Try to match the user\n * ([\\w\\.\\-@]+) Match the host/resource\n * (([\\~,\\.\\w,\\-,\\_,\\/,\\s]|%[0-9A-Fa-f]{2})+?(?:\\.git|\\/)?) Match the path, allowing spaces/white \n */\n var GIT_RE = /^(?:([a-zA-Z_][a-zA-Z0-9_-]{0,31})@|https?:\\/\\/)([\\w\\.\\-@]+)[\\/:](([\\~,\\.\\w,\\-,\\_,\\/,\\s]|%[0-9A-Fa-f]{2})+?(?:\\.git|\\/)?)$/;\n\n var throwErr = function throwErr(msg) {\n var err = new Error(msg);\n err.subject_url = url;\n throw err;\n };\n\n if (typeof url !== \"string\" || !url.trim()) {\n throwErr(\"Invalid url.\");\n }\n\n if (url.length > parseUrl.MAX_INPUT_LENGTH) {\n throwErr(\"Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.\");\n }\n\n if (normalize) {\n if ((typeof normalize === \"undefined\" ? \"undefined\" : _typeof(normalize)) !== \"object\") {\n normalize = {\n stripHash: false\n };\n }\n url = (0, _normalizeUrl2.default)(url, normalize);\n }\n\n var parsed = (0, _parsePath2.default)(url);\n\n // Potential git-ssh urls\n if (parsed.parse_failed) {\n var matched = parsed.href.match(GIT_RE);\n\n if (matched) {\n parsed.protocols = [\"ssh\"];\n parsed.protocol = \"ssh\";\n parsed.resource = matched[2];\n parsed.host = matched[2];\n parsed.user = matched[1];\n parsed.pathname = \"/\" + matched[3];\n parsed.parse_failed = false;\n } else {\n throwErr(\"URL parsing failed.\");\n }\n }\n\n return parsed;\n};\n\nparseUrl.MAX_INPUT_LENGTH = 2048;\n\nvar _default = src.default = parseUrl;\n\nmodule.exports = _default;\n","\"use strict\";\n\n// Dependencies\nvar protocols = require(\"protocols\");\n\n/**\n * isSsh\n * Checks if an input value is a ssh url or not.\n *\n * @name isSsh\n * @function\n * @param {String|Array} input The input url or an array of protocols.\n * @return {Boolean} `true` if the input is a ssh url, `false` otherwise.\n */\nfunction isSsh(input) {\n\n if (Array.isArray(input)) {\n return input.indexOf(\"ssh\") !== -1 || input.indexOf(\"rsync\") !== -1;\n }\n\n if (typeof input !== \"string\") {\n return false;\n }\n\n var prots = protocols(input);\n input = input.substring(input.indexOf(\"://\") + 3);\n if (isSsh(prots)) {\n return true;\n }\n\n // TODO This probably could be improved :)\n var urlPortPattern = new RegExp('\\.([a-zA-Z\\\\d]+):(\\\\d+)\\/');\n return !input.match(urlPortPattern) && input.indexOf(\"@\") < input.indexOf(\":\");\n}\n\nmodule.exports = isSsh;","\"use strict\";\n\n// Dependencies\nconst parseUrl = require(\"parse-url\")\n , isSsh = require(\"is-ssh\")\n ;\n\n/**\n * gitUp\n * Parses the input url.\n *\n * @name gitUp\n * @function\n * @param {String} input The input url.\n * @return {Object} An object containing the following fields:\n *\n * - `protocols` (Array): An array with the url protocols (usually it has one element).\n * - `port` (String): The domain port.\n * - `resource` (String): The url domain (including subdomains).\n * - `user` (String): The authentication user (usually for ssh urls).\n * - `pathname` (String): The url pathname.\n * - `hash` (String): The url hash.\n * - `search` (String): The url querystring value.\n * - `href` (String): The input url.\n * - `protocol` (String): The git url protocol.\n * - `token` (String): The oauth token (could appear in the https urls).\n */\nfunction gitUp(input) {\n let output = parseUrl(input);\n output.token = \"\";\n\n if (output.password === \"x-oauth-basic\") {\n output.token = output.user;\n } else if (output.user === \"x-token-auth\") {\n output.token = output.password\n }\n\n if (isSsh(output.protocols) || (output.protocols.length === 0 && isSsh(input))) {\n output.protocol = \"ssh\";\n } else if (output.protocols.length) {\n output.protocol = output.protocols[0];\n } else {\n output.protocol = \"file\";\n output.protocols = [\"file\"]\n }\n\n output.href = output.href.replace(/\\/$/, \"\")\n return output;\n}\n\nmodule.exports = gitUp;\n","\"use strict\";\n\nvar gitUp = require(\"git-up\");\n\n/**\n * gitUrlParse\n * Parses a Git url.\n *\n * @name gitUrlParse\n * @function\n * @param {String} url The Git url to parse.\n * @param {Array} refs An array of strings representing the refs. This is\n * helpful in the context of the URLs that contain branches with slashes.\n * If user wants to identify the branch, he should pass all branch names\n * of the project as part of refs parameter\n * @return {GitUrl} The `GitUrl` object containing:\n *\n * - `protocols` (Array): An array with the url protocols (usually it has one element).\n * - `port` (String): The domain port.\n * - `resource` (String): The url domain (including subdomains).\n * - `user` (String): The authentication user (usually for ssh urls).\n * - `pathname` (String): The url pathname.\n * - `hash` (String): The url hash.\n * - `search` (String): The url querystring value.\n * - `href` (String): The input url.\n * - `protocol` (String): The git url protocol.\n * - `token` (String): The oauth token (could appear in the https urls).\n * - `source` (String): The Git provider (e.g. `\"github.com\"`).\n * - `owner` (String): The repository owner.\n * - `name` (String): The repository name.\n * - `ref` (String): The repository ref (e.g., \"master\" or \"dev\").\n * - `filepath` (String): A filepath relative to the repository root.\n * - `filepathtype` (String): The type of filepath in the url (\"blob\" or \"tree\").\n * - `full_name` (String): The owner and name values in the `owner/name` format.\n * - `toString` (Function): A function to stringify the parsed url into another url type.\n * - `organization` (String): The organization the owner belongs to. This is CloudForge specific.\n * - `git_suffix` (Boolean): Whether to add the `.git` suffix or not.\n *\n */\nfunction gitUrlParse(url, refs) {\n refs = refs || [];\n\n if (typeof url !== \"string\") {\n throw new Error(\"The url must be a string.\");\n }\n\n if (!refs.every(function (item) {\n return typeof item === \"string\";\n })) {\n throw new Error(\"The refs should contain only strings\");\n }\n\n var shorthandRe = /^([a-z\\d-]{1,39})\\/([-\\.\\w]{1,100})$/i;\n\n if (shorthandRe.test(url)) {\n url = \"https://github.com/\" + url;\n }\n\n var urlInfo = gitUp(url),\n sourceParts = urlInfo.resource.split(\".\"),\n splits = null;\n\n urlInfo.toString = function (type) {\n return gitUrlParse.stringify(this, type);\n };\n\n urlInfo.source = sourceParts.length > 2 ? sourceParts.slice(1 - sourceParts.length).join(\".\") : urlInfo.source = urlInfo.resource;\n\n // Note: Some hosting services (e.g. Visual Studio Team Services) allow whitespace characters\n // in the repository and owner names so we decode the URL pieces to get the correct result\n urlInfo.git_suffix = /\\.git$/.test(urlInfo.pathname);\n urlInfo.name = decodeURIComponent((urlInfo.pathname || urlInfo.href).replace(/(^\\/)|(\\/$)/g, \"\").replace(/\\.git$/, \"\"));\n urlInfo.owner = decodeURIComponent(urlInfo.user);\n\n switch (urlInfo.source) {\n case \"git.cloudforge.com\":\n urlInfo.owner = urlInfo.user;\n urlInfo.organization = sourceParts[0];\n urlInfo.source = \"cloudforge.com\";\n break;\n case \"visualstudio.com\":\n // Handle VSTS SSH URLs\n if (urlInfo.resource === \"vs-ssh.visualstudio.com\") {\n splits = urlInfo.name.split(\"/\");\n if (splits.length === 4) {\n urlInfo.organization = splits[1];\n urlInfo.owner = splits[2];\n urlInfo.name = splits[3];\n urlInfo.full_name = splits[2] + \"/\" + splits[3];\n }\n break;\n } else {\n splits = urlInfo.name.split(\"/\");\n if (splits.length === 2) {\n urlInfo.owner = splits[1];\n urlInfo.name = splits[1];\n urlInfo.full_name = \"_git/\" + urlInfo.name;\n } else if (splits.length === 3) {\n urlInfo.name = splits[2];\n if (splits[0] === \"DefaultCollection\") {\n urlInfo.owner = splits[2];\n urlInfo.organization = splits[0];\n urlInfo.full_name = urlInfo.organization + \"/_git/\" + urlInfo.name;\n } else {\n urlInfo.owner = splits[0];\n urlInfo.full_name = urlInfo.owner + \"/_git/\" + urlInfo.name;\n }\n } else if (splits.length === 4) {\n urlInfo.organization = splits[0];\n urlInfo.owner = splits[1];\n urlInfo.name = splits[3];\n urlInfo.full_name = urlInfo.organization + \"/\" + urlInfo.owner + \"/_git/\" + urlInfo.name;\n }\n break;\n }\n\n // Azure DevOps (formerly Visual Studio Team Services)\n case \"dev.azure.com\":\n case \"azure.com\":\n if (urlInfo.resource === \"ssh.dev.azure.com\") {\n splits = urlInfo.name.split(\"/\");\n if (splits.length === 4) {\n urlInfo.organization = splits[1];\n urlInfo.owner = splits[2];\n urlInfo.name = splits[3];\n }\n break;\n } else {\n splits = urlInfo.name.split(\"/\");\n if (splits.length === 5) {\n urlInfo.organization = splits[0];\n urlInfo.owner = splits[1];\n urlInfo.name = splits[4];\n urlInfo.full_name = \"_git/\" + urlInfo.name;\n } else if (splits.length === 3) {\n urlInfo.name = splits[2];\n if (splits[0] === \"DefaultCollection\") {\n urlInfo.owner = splits[2];\n urlInfo.organization = splits[0];\n urlInfo.full_name = urlInfo.organization + \"/_git/\" + urlInfo.name;\n } else {\n urlInfo.owner = splits[0];\n urlInfo.full_name = urlInfo.owner + \"/_git/\" + urlInfo.name;\n }\n } else if (splits.length === 4) {\n urlInfo.organization = splits[0];\n urlInfo.owner = splits[1];\n urlInfo.name = splits[3];\n urlInfo.full_name = urlInfo.organization + \"/\" + urlInfo.owner + \"/_git/\" + urlInfo.name;\n }\n if (urlInfo.query && urlInfo.query[\"path\"]) {\n urlInfo.filepath = urlInfo.query[\"path\"].replace(/^\\/+/g, \"\"); // Strip leading slash (/)\n }\n if (urlInfo.query && urlInfo.query[\"version\"]) {\n // version=GB<branch>\n urlInfo.ref = urlInfo.query[\"version\"].replace(/^GB/, \"\"); // remove GB\n }\n break;\n }\n default:\n splits = urlInfo.name.split(\"/\");\n var nameIndex = splits.length - 1;\n if (splits.length >= 2) {\n var dashIndex = splits.indexOf(\"-\", 2);\n var blobIndex = splits.indexOf(\"blob\", 2);\n var treeIndex = splits.indexOf(\"tree\", 2);\n var commitIndex = splits.indexOf(\"commit\", 2);\n var issuesIndex = splits.indexOf(\"issues\", 2);\n var srcIndex = splits.indexOf(\"src\", 2);\n var rawIndex = splits.indexOf(\"raw\", 2);\n var editIndex = splits.indexOf(\"edit\", 2);\n nameIndex = dashIndex > 0 ? dashIndex - 1 : blobIndex > 0 && treeIndex > 0 ? Math.min(blobIndex - 1, treeIndex - 1) : blobIndex > 0 ? blobIndex - 1 : issuesIndex > 0 ? issuesIndex - 1 : treeIndex > 0 ? treeIndex - 1 : commitIndex > 0 ? commitIndex - 1 : srcIndex > 0 ? srcIndex - 1 : rawIndex > 0 ? rawIndex - 1 : editIndex > 0 ? editIndex - 1 : nameIndex;\n\n urlInfo.owner = splits.slice(0, nameIndex).join(\"/\");\n urlInfo.name = splits[nameIndex];\n if (commitIndex && issuesIndex < 0) {\n urlInfo.commit = splits[nameIndex + 2];\n }\n }\n\n urlInfo.ref = \"\";\n urlInfo.filepathtype = \"\";\n urlInfo.filepath = \"\";\n var offsetNameIndex = splits.length > nameIndex && splits[nameIndex + 1] === \"-\" ? nameIndex + 1 : nameIndex;\n\n if (splits.length > offsetNameIndex + 2 && [\"raw\", \"src\", \"blob\", \"tree\", \"edit\"].indexOf(splits[offsetNameIndex + 1]) >= 0) {\n urlInfo.filepathtype = splits[offsetNameIndex + 1];\n urlInfo.ref = splits[offsetNameIndex + 2];\n if (splits.length > offsetNameIndex + 3) {\n urlInfo.filepath = splits.slice(offsetNameIndex + 3).join(\"/\");\n }\n }\n urlInfo.organization = urlInfo.owner;\n break;\n }\n\n if (!urlInfo.full_name) {\n urlInfo.full_name = urlInfo.owner;\n if (urlInfo.name) {\n urlInfo.full_name && (urlInfo.full_name += \"/\");\n urlInfo.full_name += urlInfo.name;\n }\n }\n // Bitbucket Server\n if (urlInfo.owner.startsWith(\"scm/\")) {\n urlInfo.source = \"bitbucket-server\";\n urlInfo.owner = urlInfo.owner.replace(\"scm/\", \"\");\n urlInfo.organization = urlInfo.owner;\n urlInfo.full_name = urlInfo.owner + \"/\" + urlInfo.name;\n }\n\n var bitbucket = /(projects|users)\\/(.*?)\\/repos\\/(.*?)((\\/.*$)|$)/;\n var matches = bitbucket.exec(urlInfo.pathname);\n if (matches != null) {\n urlInfo.source = \"bitbucket-server\";\n if (matches[1] === \"users\") {\n urlInfo.owner = \"~\" + matches[2];\n } else {\n urlInfo.owner = matches[2];\n }\n\n urlInfo.organization = urlInfo.owner;\n urlInfo.name = matches[3];\n\n splits = matches[4].split(\"/\");\n if (splits.length > 1) {\n if ([\"raw\", \"browse\"].indexOf(splits[1]) >= 0) {\n urlInfo.filepathtype = splits[1];\n if (splits.length > 2) {\n urlInfo.filepath = splits.slice(2).join(\"/\");\n }\n } else if (splits[1] === \"commits\" && splits.length > 2) {\n urlInfo.commit = splits[2];\n }\n }\n urlInfo.full_name = urlInfo.owner + \"/\" + urlInfo.name;\n\n if (urlInfo.query.at) {\n urlInfo.ref = urlInfo.query.at;\n } else {\n urlInfo.ref = \"\";\n }\n }\n\n if (refs.length !== 0 && urlInfo.ref) {\n urlInfo.ref = findLongestMatchingSubstring(urlInfo.href, refs) || urlInfo.ref;\n urlInfo.filepath = urlInfo.href.split(urlInfo.ref + \"/\")[1];\n }\n\n return urlInfo;\n}\n\n/**\n * stringify\n * Stringifies a `GitUrl` object.\n *\n * @name stringify\n * @function\n * @param {GitUrl} obj The parsed Git url object.\n * @param {String} type The type of the stringified url (default `obj.protocol`).\n * @return {String} The stringified url.\n */\ngitUrlParse.stringify = function (obj, type) {\n type = type || (obj.protocols && obj.protocols.length ? obj.protocols.join(\"+\") : obj.protocol);\n var port = obj.port ? \":\" + obj.port : \"\";\n var user = obj.user || \"git\";\n var maybeGitSuffix = obj.git_suffix ? \".git\" : \"\";\n switch (type) {\n case \"ssh\":\n if (port) return \"ssh://\" + user + \"@\" + obj.resource + port + \"/\" + obj.full_name + maybeGitSuffix;else return user + \"@\" + obj.resource + \":\" + obj.full_name + maybeGitSuffix;\n case \"git+ssh\":\n case \"ssh+git\":\n case \"ftp\":\n case \"ftps\":\n return type + \"://\" + user + \"@\" + obj.resource + port + \"/\" + obj.full_name + maybeGitSuffix;\n case \"http\":\n case \"https\":\n var auth = obj.token ? buildToken(obj) : obj.user && (obj.protocols.includes(\"http\") || obj.protocols.includes(\"https\")) ? obj.user + \"@\" : \"\";\n return type + \"://\" + auth + obj.resource + port + \"/\" + buildPath(obj) + maybeGitSuffix;\n default:\n return obj.href;\n }\n};\n\n/*!\n * buildToken\n * Builds OAuth token prefix (helper function)\n *\n * @name buildToken\n * @function\n * @param {GitUrl} obj The parsed Git url object.\n * @return {String} token prefix\n */\nfunction buildToken(obj) {\n switch (obj.source) {\n case \"bitbucket.org\":\n return \"x-token-auth:\" + obj.token + \"@\";\n default:\n return obj.token + \"@\";\n }\n}\n\nfunction buildPath(obj) {\n switch (obj.source) {\n case \"bitbucket-server\":\n return \"scm/\" + obj.full_name;\n default:\n // Note: Re-encode the repository and owner names for hosting services that allow whitespace characters\n var encoded_full_name = obj.full_name.split(\"/\").map(function (x) {\n return encodeURIComponent(x);\n }).join(\"/\");\n\n return encoded_full_name;\n }\n}\n\nfunction findLongestMatchingSubstring(string, array) {\n var longestMatch = \"\";\n\n array.forEach(function (item) {\n if (string.includes(item) && item.length > longestMatch.length) {\n longestMatch = item;\n }\n });\n\n return longestMatch;\n}\n\nmodule.exports = gitUrlParse;","/**\n * Standalone stdio MCP server exposing the general local tools to the Codex\n * adapter. Spawned by codex-acp as an MCP server process. Reads its context\n * (cwd, taskId, token) from POSTHOG_LOCAL_TOOLS_CTX and the set of tools to\n * register from POSTHOG_LOCAL_TOOLS_ENABLED (both set by the parent, which has\n * already evaluated each tool's gate) — then registers those registry tools,\n * the same ones the Claude adapter exposes in-process.\n *\n * Usage:\n * POSTHOG_LOCAL_TOOLS_CTX=<base64> \\\n * POSTHOG_LOCAL_TOOLS_ENABLED=git_signed_commit \\\n * node local-tools-mcp-server.js\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { readGithubTokenFromEnv } from \"@posthog/git/signed-commit\";\nimport {\n LOCAL_TOOLS,\n LOCAL_TOOLS_MCP_NAME,\n type LocalToolCtx,\n} from \"../local-tools\";\n\nfunction die(message: string): never {\n process.stderr.write(`[local-tools-mcp-server] ${message}\\n`);\n process.exit(1);\n}\n\nconst ctxEnv = process.env.POSTHOG_LOCAL_TOOLS_CTX;\nif (!ctxEnv) {\n die(\"POSTHOG_LOCAL_TOOLS_CTX env var is required\");\n}\n\nlet parsed: { cwd: string; taskId?: string; token?: string };\ntry {\n parsed = JSON.parse(Buffer.from(ctxEnv, \"base64\").toString(\"utf-8\"));\n} catch (err) {\n die(`Failed to parse POSTHOG_LOCAL_TOOLS_CTX as base64-encoded JSON: ${err}`);\n}\n\nif (!parsed.cwd) {\n die(\"POSTHOG_LOCAL_TOOLS_CTX must include cwd\");\n}\n\nconst ctx: LocalToolCtx = {\n cwd: parsed.cwd,\n token: parsed.token ?? readGithubTokenFromEnv(),\n taskId: parsed.taskId,\n};\n\nconst enabledNames = (process.env.POSTHOG_LOCAL_TOOLS_ENABLED ?? \"\")\n .split(\",\")\n .filter(Boolean);\nconst tools = LOCAL_TOOLS.filter((t) => enabledNames.includes(t.name));\nif (tools.length === 0) {\n die(\"POSTHOG_LOCAL_TOOLS_ENABLED listed no known tools\");\n}\n\nconst server = new McpServer({\n name: LOCAL_TOOLS_MCP_NAME,\n version: \"1.0.0\",\n});\n\nfor (const t of tools) {\n server.tool(t.name, t.description, t.schema, async (args) =>\n t.handler(ctx, args),\n );\n}\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","// Namespace import (not `{ execFile }`) so the renderer's browser bundle can\n// resolve this node-only module against vite's `__vite-browser-external` stub,\n// which has no named exports. This module never runs in the browser.\nimport * as childProcess from \"node:child_process\";\nimport { mapWithConcurrency } from \"./concurrency\";\nimport { execGh, execGhWithRetry } from \"./gh\";\nimport { buildPostHogTrailers } from \"./trailers\";\nimport { parseGithubUrl } from \"./utils\";\n\n/**\n * Creates GitHub-signed (\"Verified\") commits without any local signing key, by\n * sending the staged changes through GitHub's GraphQL `createCommitOnBranch`\n * mutation. The mutation authors and signs the commit as the identity that owns\n * the token, so cloud-agent commits satisfy signed-commit branch protection.\n *\n * This is the deterministic replacement for the prompt-driven `gh api graphql`\n * flow: it passes the `FileChanges` payload as a real GraphQL object (not a\n * string scalar), fetches the branch tip so multi-commit diffs work, chunks\n * oversized payloads, and keeps the local checkout pointed at the new commit.\n */\n\nconst DEFAULT_MAX_PAYLOAD_BYTES = 35 * 1024 * 1024;\nconst MAX_GIT_BUFFER = 256 * 1024 * 1024;\n// Per-attempt cap for the GraphQL commit call; retried with backoff on timeout.\nconst GH_GRAPHQL_TIMEOUT_MS = 30_000;\n\nexport interface SignedCommitCtx {\n /** Working directory of the clone. */\n cwd: string;\n /** GitHub token used for the mutation; determines the signed author identity. */\n token: string;\n /** Appended as a `Task-Id` trailer when present. */\n taskId?: string;\n /**\n * Branch the tool refuses to commit directly onto. Defaults to the remote's\n * default branch (`origin/HEAD`), so an accidental commit straight onto `main`\n * is blocked even without an explicit value.\n */\n baseBranch?: string;\n}\n\nexport interface SignedCommitInput {\n /** Commit headline (first line). */\n message: string;\n /** Optional extended body; PostHog trailers are appended automatically. */\n body?: string;\n /** Target branch; defaults to the current branch. Created on the remote if missing. */\n branch?: string;\n /** Files to stage before committing; defaults to whatever is already staged. */\n paths?: string[];\n}\n\nexport interface SignedCommitResult {\n branch: string;\n /** One entry per chunk; >1 only when the payload was split. */\n commits: { sha: string; url: string }[];\n}\n\nexport class OversizedFileError extends Error {\n constructor(\n readonly path: string,\n readonly bytes: number,\n readonly maxBytes: number,\n ) {\n super(\n `File '${path}' (~${Math.round(bytes / 1024 / 1024)}MB once base64-encoded) ` +\n `exceeds the per-commit request limit (~${Math.round(maxBytes / 1024 / 1024)}MB). ` +\n `A single file cannot be split across createCommitOnBranch requests; use Git LFS ` +\n `or a local signing key for this change.`,\n );\n this.name = \"OversizedFileError\";\n }\n}\n\ninterface FileAddition {\n path: string;\n contents: string;\n}\ninterface FileDeletion {\n path: string;\n}\ninterface FileChanges {\n additions: FileAddition[];\n deletions: FileDeletion[];\n}\n\ninterface GitRunResult {\n stdout: Buffer;\n stderr: string;\n exitCode: number;\n}\n\nfunction runGit(args: string[], cwd: string): Promise<GitRunResult> {\n return new Promise((resolve) => {\n childProcess.execFile(\n \"git\",\n args,\n { cwd, maxBuffer: MAX_GIT_BUFFER, encoding: \"buffer\" },\n (error, stdout, stderr) => {\n const err = error as (Error & { code?: number | string }) | null;\n const exitCode =\n err && typeof err.code === \"number\" ? err.code : err ? 1 : 0;\n resolve({\n stdout: (stdout as unknown as Buffer) ?? Buffer.alloc(0),\n stderr: ((stderr as unknown as Buffer) ?? Buffer.alloc(0)).toString(\n \"utf8\",\n ),\n exitCode,\n });\n },\n );\n });\n}\n\nasync function gitText(args: string[], cwd: string): Promise<string> {\n const r = await runGit(args, cwd);\n if (r.exitCode !== 0) {\n throw new Error(`git ${args.join(\" \")} failed: ${r.stderr.trim()}`);\n }\n return r.stdout.toString(\"utf8\").trim();\n}\n\nasync function resolveRepoNameWithOwner(ctx: SignedCommitCtx): Promise<string> {\n const url = await gitText([\"remote\", \"get-url\", \"origin\"], ctx.cwd);\n const parsed = parseGithubUrl(url);\n if (!parsed) {\n throw new Error(`Could not parse owner/repo from origin remote: ${url}`);\n }\n return `${parsed.owner}/${parsed.repo}`;\n}\n\nasync function resolveBaseBranch(ctx: SignedCommitCtx): Promise<string | null> {\n if (ctx.baseBranch) return ctx.baseBranch;\n // Fall back to the remote's default branch so the guard still fires when no\n // explicit base is supplied. Best-effort: a clone without origin/HEAD just\n // leaves the guard inactive rather than failing the commit.\n const r = await runGit(\n [\"symbolic-ref\", \"--short\", \"refs/remotes/origin/HEAD\"],\n ctx.cwd,\n );\n if (r.exitCode !== 0) return null;\n return (\n r.stdout\n .toString(\"utf8\")\n .trim()\n .replace(/^origin\\//, \"\") || null\n );\n}\n\nasync function resolveBranchName(\n ctx: SignedCommitCtx,\n input: SignedCommitInput,\n): Promise<string> {\n const branch = input.branch\n ? input.branch.replace(/^refs\\/heads\\//, \"\")\n : await resolveCurrentBranch(ctx);\n\n // Guard both paths: an explicit `branch: \"main\"` must be refused the same as\n // landing on the base branch implicitly via HEAD.\n const baseBranch = await resolveBaseBranch(ctx);\n if (baseBranch && branch === baseBranch) {\n throw new Error(\n `Refusing to commit directly to base branch '${baseBranch}'. ` +\n `Pass a 'branch' name prefixed with posthog-code/.`,\n );\n }\n return branch;\n}\n\nasync function resolveCurrentBranch(ctx: SignedCommitCtx): Promise<string> {\n const current = await gitText([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], ctx.cwd);\n if (!current || current === \"HEAD\") {\n throw new Error(\n \"Detached HEAD — pass a `branch` to git_signed_commit (e.g. posthog-code/...).\",\n );\n }\n return current;\n}\n\nasync function remoteTip(\n ctx: SignedCommitCtx,\n branch: string,\n): Promise<string | null> {\n const out = await gitText(\n [\"ls-remote\", \"--heads\", \"origin\", branch],\n ctx.cwd,\n );\n if (!out) return null;\n return out.split(\"\\t\")[0]?.trim() || null;\n}\n\nasync function createRef(\n ctx: SignedCommitCtx,\n repo: string,\n branch: string,\n sha: string,\n): Promise<void> {\n const res = await execGh(\n [\n \"api\",\n \"-X\",\n \"POST\",\n `/repos/${repo}/git/refs`,\n \"-f\",\n `ref=refs/heads/${branch}`,\n \"-f\",\n `sha=${sha}`,\n ],\n { cwd: ctx.cwd, env: ghTokenEnv(ctx.token) },\n );\n if (res.exitCode !== 0) {\n throw new Error(\n `Failed to create branch '${branch}': ${res.stderr || res.error}`,\n );\n }\n}\n\n/** Env var names the GitHub CLI / git credential helper read a token from, in order. */\nexport const GITHUB_TOKEN_ENV_VARS = [\"GH_TOKEN\", \"GITHUB_TOKEN\"] as const;\n\n/** First GitHub token found in `env` (defaults to the process env), if any. */\nexport function readGithubTokenFromEnv(\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n for (const name of GITHUB_TOKEN_ENV_VARS) {\n if (env[name]) return env[name];\n }\n return undefined;\n}\n\nexport function ghTokenEnv(token: string): Record<string, string> {\n return Object.fromEntries(GITHUB_TOKEN_ENV_VARS.map((name) => [name, token]));\n}\n\n// Concurrency for staged-blob reads; bounds spawned `git show` processes while\n// still cutting wall-clock for multi-file commits.\nconst STAGED_READ_CONCURRENCY = 16;\n\nasync function buildFileChanges(\n ctx: SignedCommitCtx,\n baseOid: string,\n): Promise<FileChanges> {\n // One `--name-status -z` diff yields additions and deletions together; output\n // is `<status>\\0<path>\\0...` (no rename pairs, since `--no-renames`). Read raw\n // (no trim) so paths with leading/trailing spaces survive.\n const diff = await runGit(\n [\"diff\", \"--cached\", \"-z\", \"--no-renames\", \"--name-status\", baseOid],\n ctx.cwd,\n );\n if (diff.exitCode !== 0) {\n throw new Error(`git diff --cached failed: ${diff.stderr.trim()}`);\n }\n const tokens = diff.stdout.toString(\"utf8\").split(\"\\0\").filter(Boolean);\n\n const addPaths: string[] = [];\n const deletions: FileDeletion[] = [];\n for (let i = 0; i + 1 < tokens.length; i += 2) {\n const path = tokens[i + 1];\n if (tokens[i].startsWith(\"D\")) {\n deletions.push({ path });\n } else {\n addPaths.push(path);\n }\n }\n\n const additions = await mapWithConcurrency(\n addPaths,\n STAGED_READ_CONCURRENCY,\n async (path) => {\n // Read the *staged* blob (`:path`) so we commit exactly what was staged,\n // not any later unstaged edits in the working tree.\n const r = await runGit([\"show\", `:${path}`], ctx.cwd);\n if (r.exitCode !== 0) {\n throw new Error(\n `Failed to read staged file '${path}': ${r.stderr.trim()}`,\n );\n }\n return { path, contents: r.stdout.toString(\"base64\") };\n },\n );\n return { additions, deletions };\n}\n\nfunction additionBytes(a: FileAddition): number {\n // base64 contents dominate; add path + per-entry JSON envelope overhead.\n return a.contents.length + a.path.length + 32;\n}\n\nexport function chunkFileChanges(\n changes: FileChanges,\n maxBytes: number,\n): FileChanges[] {\n for (const a of changes.additions) {\n const bytes = additionBytes(a);\n if (bytes > maxBytes) throw new OversizedFileError(a.path, bytes, maxBytes);\n }\n\n if (changes.additions.length === 0) {\n return [{ additions: [], deletions: changes.deletions }];\n }\n\n const chunks: FileChanges[] = [];\n // Deletions are path-only (negligible); put them all in the first chunk.\n let cur: FileChanges = { additions: [], deletions: [...changes.deletions] };\n let curBytes = changes.deletions.reduce((n, d) => n + d.path.length + 16, 0);\n\n for (const a of changes.additions) {\n const bytes = additionBytes(a);\n if (cur.additions.length > 0 && curBytes + bytes > maxBytes) {\n chunks.push(cur);\n cur = { additions: [], deletions: [] };\n curBytes = 0;\n }\n cur.additions.push(a);\n curBytes += bytes;\n }\n chunks.push(cur);\n return chunks;\n}\n\nconst CREATE_COMMIT_MUTATION = `mutation($input: CreateCommitOnBranchInput!) {\n createCommitOnBranch(input: $input) { commit { oid url } }\n}`;\n\nasync function createCommitOnBranch(\n ctx: SignedCommitCtx,\n repo: string,\n branch: string,\n expectedHeadOid: string,\n headline: string,\n body: string,\n changes: FileChanges,\n): Promise<{ oid: string; url: string }> {\n const payload = JSON.stringify({\n query: CREATE_COMMIT_MUTATION,\n variables: {\n input: {\n branch: { repositoryNameWithOwner: repo, branchName: branch },\n expectedHeadOid,\n message: { headline, body },\n fileChanges: changes,\n },\n },\n });\n\n const res = await execGhWithRetry(\n [\"api\", \"graphql\", \"--input\", \"-\"],\n {\n cwd: ctx.cwd,\n input: payload,\n env: ghTokenEnv(ctx.token),\n // Bound each attempt so a stalled connection can't hang the tool forever.\n timeoutMs: GH_GRAPHQL_TIMEOUT_MS,\n },\n { maxAttempts: 3 },\n );\n if (res.exitCode !== 0) {\n throw new Error(\n `createCommitOnBranch failed: ${res.stderr || res.error || res.stdout}`,\n );\n }\n\n let parsed: {\n data?: { createCommitOnBranch?: { commit?: { oid: string; url: string } } };\n errors?: unknown;\n };\n try {\n parsed = JSON.parse(res.stdout);\n } catch {\n throw new Error(\n `createCommitOnBranch returned non-JSON: ${res.stdout.slice(0, 500)}`,\n );\n }\n if (parsed.errors) {\n throw new Error(\n `createCommitOnBranch errors: ${JSON.stringify(parsed.errors)}`,\n );\n }\n const commit = parsed.data?.createCommitOnBranch?.commit;\n if (!commit?.oid) {\n throw new Error(`createCommitOnBranch returned no commit: ${res.stdout}`);\n }\n return commit;\n}\n\nasync function syncLocalCheckout(\n ctx: SignedCommitCtx,\n branch: string,\n newOid: string,\n): Promise<void> {\n // Fetch the new tip object, point the local branch + HEAD at it, and reset\n // the index — all without touching the working tree, so unstaged work the\n // agent intends for a later commit is preserved. Best-effort: the commit is\n // already on the remote, and the next call re-resolves the tip via ls-remote,\n // so a sync failure isn't fatal — but warn rather than swallow it silently,\n // since a stale local checkout is otherwise painful to diagnose.\n const steps: [string, string[]][] = [\n [\"fetch\", [\"fetch\", \"--no-tags\", \"origin\", branch]],\n [\"update-ref\", [\"update-ref\", `refs/heads/${branch}`, newOid]],\n [\"symbolic-ref\", [\"symbolic-ref\", \"HEAD\", `refs/heads/${branch}`]],\n [\"reset\", [\"reset\", \"-q\"]],\n ];\n for (const [label, args] of steps) {\n const r = await runGit(args, ctx.cwd);\n if (r.exitCode !== 0) {\n process.stderr.write(\n `[signed-commit] local sync step '${label}' failed after committing ${newOid}: ${r.stderr.trim()}\\n`,\n );\n }\n }\n}\n\nexport async function createSignedCommit(\n ctx: SignedCommitCtx,\n input: SignedCommitInput,\n): Promise<SignedCommitResult> {\n // Repo (from origin remote) and branch (from HEAD) are independent reads.\n const [repo, branch] = await Promise.all([\n resolveRepoNameWithOwner(ctx),\n resolveBranchName(ctx, input),\n ]);\n\n if (input.paths && input.paths.length > 0) {\n const r = await runGit([\"add\", \"--\", ...input.paths], ctx.cwd);\n if (r.exitCode !== 0) {\n throw new Error(`git add failed: ${r.stderr.trim()}`);\n }\n }\n\n let tip = await remoteTip(ctx, branch);\n if (tip === null) {\n // New branch: create it from the local HEAD, which is already present —\n // no fetch needed to diff against it.\n const baseSha = await gitText([\"rev-parse\", \"HEAD\"], ctx.cwd);\n await createRef(ctx, repo, branch, baseSha);\n tip = baseSha;\n } else {\n // Existing branch: make its tip object local so the staged diff (and any\n // later reset) can resolve it.\n await runGit([\"fetch\", \"--no-tags\", \"origin\", branch], ctx.cwd);\n }\n\n const changes = await buildFileChanges(ctx, tip);\n if (changes.additions.length === 0 && changes.deletions.length === 0) {\n throw new Error(\n \"No staged changes to commit. Stage files with `git add` first (or pass `paths`).\",\n );\n }\n\n const chunks = chunkFileChanges(changes, DEFAULT_MAX_PAYLOAD_BYTES);\n const body = [input.body, buildPostHogTrailers(ctx.taskId).join(\"\\n\")]\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n const commits: { sha: string; url: string }[] = [];\n let expectedHeadOid = tip;\n for (let i = 0; i < chunks.length; i++) {\n const headline =\n chunks.length > 1\n ? `${input.message} — part ${i + 1}/${chunks.length}`\n : input.message;\n const commit = await createCommitOnBranch(\n ctx,\n repo,\n branch,\n expectedHeadOid,\n headline,\n body,\n chunks[i],\n );\n commits.push({ sha: commit.oid, url: commit.url });\n expectedHeadOid = commit.oid;\n }\n\n await syncLocalCheckout(ctx, branch, expectedHeadOid);\n return { branch, commits };\n}\n","/** Maps `items` through `mapper` with at most `concurrency` in flight, preserving\n * input order. Stops early if `options.signal` aborts. */\nexport async function mapWithConcurrency<T, R>(\n items: readonly T[],\n concurrency: number,\n mapper: (item: T) => Promise<R>,\n options?: { signal?: AbortSignal },\n): Promise<R[]> {\n if (items.length === 0) return [];\n const results = new Array<R>(items.length);\n let index = 0;\n const worker = async () => {\n while (index < items.length) {\n if (options?.signal?.aborted) return;\n const i = index++;\n results[i] = await mapper(items[i]);\n }\n };\n await Promise.all(\n Array.from({ length: Math.min(concurrency, items.length) }, () => worker()),\n );\n return results;\n}\n","// Namespace import (not `{ execFile }`) so the renderer's browser bundle can\n// resolve this node-only module against vite's `__vite-browser-external` stub,\n// which has no named exports. execGh never runs in the browser.\nimport * as childProcess from \"node:child_process\";\n\nexport interface GhExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n error?: string;\n}\n\nexport interface GhExecOptions {\n cwd?: string;\n env?: Record<string, string>;\n /**\n * Written to the child's stdin and then closed. Use with `gh api graphql\n * --input -` (or `gh api --input -`) to pass a JSON request body so complex\n * GraphQL variables are sent as real objects rather than `-F` string scalars.\n */\n input?: string;\n /**\n * Kill the `gh` subprocess after this many ms. Without it a stalled network\n * call (the symptom behind GitHub's `HTTP 499`) hangs the caller — and any\n * MCP tool awaiting it — indefinitely. Omit for no timeout.\n */\n timeoutMs?: number;\n}\n\nexport function execGh(\n args: string[],\n options: GhExecOptions = {},\n): Promise<GhExecResult> {\n const env = options.env ? { ...process.env, ...options.env } : process.env;\n\n return new Promise<GhExecResult>((resolve) => {\n const child = childProcess.execFile(\n \"gh\",\n args,\n { cwd: options.cwd, env, timeout: options.timeoutMs ?? 0 },\n (error, stdout, stderr) => {\n if (!error) {\n resolve({ stdout, stderr, exitCode: 0 });\n return;\n }\n\n const err = error as Error & {\n code?: number | string;\n killed?: boolean;\n stdout?: string;\n stderr?: string;\n };\n // execFile kills the child on timeout (`killed` set, `code` null);\n // surface a recognizable message so retries treat it as transient.\n const timedOut = err.killed === true && !!options.timeoutMs;\n const exitCode =\n typeof err.code === \"number\"\n ? err.code\n : err.code === \"ENOENT\"\n ? 127\n : 1;\n\n resolve({\n stdout: stdout ?? err.stdout ?? \"\",\n stderr: stderr ?? err.stderr ?? \"\",\n exitCode,\n error: timedOut\n ? `gh timed out after ${options.timeoutMs}ms`\n : err.message,\n });\n },\n );\n\n if (options.input !== undefined) {\n child.stdin?.end(options.input);\n }\n });\n}\n\n// Failures worth retrying: server-side blips (5xx), the proxy \"client closed\"\n// 499 we kept hitting from sandboxes, our own timeout, and transport-level\n// network errors. Deterministic failures (auth, 404, 422, GraphQL validation)\n// are intentionally excluded — retrying them only wastes time.\nconst TRANSIENT_GH_PATTERNS: readonly RegExp[] = [\n /HTTP 5\\d\\d/,\n /HTTP 499/,\n /\\btimed out\\b/i,\n /\\bETIMEDOUT\\b/,\n /\\bECONNRESET\\b/,\n /\\bECONNREFUSED\\b/,\n /\\bEAI_AGAIN\\b/,\n /connection reset/i,\n];\n\nexport function isTransientGhFailure(res: GhExecResult): boolean {\n if (res.exitCode === 0) {\n return false;\n }\n const text = `${res.stderr} ${res.error ?? \"\"} ${res.stdout}`;\n return TRANSIENT_GH_PATTERNS.some((re) => re.test(text));\n}\n\nexport interface GhRetryOptions {\n maxAttempts?: number;\n /** Base backoff; attempt N waits `backoffMs * 2^(N-2)` before retrying. */\n backoffMs?: number;\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Runs `execGh`, retrying only on transient failures with exponential backoff.\n * `exec` is injectable for tests; production callers use the default.\n */\nexport async function execGhWithRetry(\n args: string[],\n options: GhExecOptions = {},\n retry: GhRetryOptions = {},\n exec: typeof execGh = execGh,\n): Promise<GhExecResult> {\n const maxAttempts = retry.maxAttempts ?? 3;\n const backoffMs = retry.backoffMs ?? 500;\n\n let res = await exec(args, options);\n for (\n let attempt = 2;\n attempt <= maxAttempts && isTransientGhFailure(res);\n attempt++\n ) {\n await sleep(backoffMs * 2 ** (attempt - 2));\n res = await exec(args, options);\n }\n return res;\n}\n","// Standalone (no git-saga / simple-git imports) so signed-commit.ts can append\n// PostHog trailers without dragging the heavy git machinery into bundles that\n// reach it (e.g. the renderer's browser build).\nexport function buildPostHogTrailers(taskId?: string): string[] {\n const trailers = [\"Generated-By: PostHog Code\"];\n if (taskId) trailers.push(`Task-Id: ${taskId}`);\n return trailers;\n}\n","// Namespace import (not `{ execFile }`) so modules that transitively reach this\n// file stay bundle-safe for the renderer's browser build, where node builtins\n// resolve to vite's `__vite-browser-external` stub (no named exports).\nimport * as childProcess from \"node:child_process\";\nimport * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport gitUrlParse from \"git-url-parse\";\n\nexport type GitHubUrl =\n | { kind: \"repo\"; owner: string; repo: string }\n | { kind: \"issue\"; owner: string; repo: string; number: number }\n | { kind: \"pr\"; owner: string; repo: string; number: number };\n\nexport async function safeSymlink(\n source: string,\n target: string,\n type: \"file\" | \"dir\",\n): Promise<boolean> {\n if (path.resolve(source) === path.resolve(target)) {\n return false;\n }\n\n const sourceDir = path.dirname(path.resolve(source));\n const targetDir = path.dirname(path.resolve(target));\n if (\n sourceDir === targetDir &&\n path.basename(source) === path.basename(target)\n ) {\n return false;\n }\n\n try {\n await fs.access(source);\n } catch {\n return false;\n }\n\n try {\n if (os.platform() === \"win32\") {\n // On Windows, skip symlinks entirely — they need admin/Developer Mode.\n // Use junctions for directories and hard links for files instead,\n // matching the approach used by pnpm, Deno, and npm.\n if (type === \"dir\") {\n await fs.symlink(source, target, \"junction\");\n } else {\n try {\n await fs.link(source, target);\n } catch {\n // Hard link can fail across drives — copy as last resort\n await fs.copyFile(source, target);\n }\n }\n } else {\n await fs.symlink(source, target, type);\n }\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * copy file or directory, use copy-on-write, fall back to cp\n */\nexport async function clonePath(\n source: string,\n destination: string,\n): Promise<boolean> {\n try {\n await fs.access(source);\n } catch {\n return false;\n }\n\n const parentDir = path.dirname(destination);\n await fs.mkdir(parentDir, { recursive: true });\n\n const platform = os.platform();\n\n try {\n if (platform === \"darwin\") {\n await execFileAsync(\"cp\", [\"-c\", \"-a\", source, destination]);\n } else {\n await execFileAsync(\"cp\", [\"--reflink=auto\", \"-a\", source, destination]);\n }\n return true;\n } catch {\n // CoW not supported, fall back to regular copy\n }\n\n await fs.cp(source, destination, { recursive: true });\n return true;\n}\n\nfunction execFileAsync(\n command: string,\n args: string[],\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n childProcess.execFile(command, args, (error, stdout, stderr) => {\n if (error) {\n reject(error);\n return;\n }\n resolve({ stdout, stderr });\n });\n });\n}\n\nasync function chmodTreeWritable(target: string): Promise<void> {\n let stat: import(\"node:fs\").Stats;\n try {\n stat = await fs.lstat(target);\n } catch {\n return;\n }\n if (stat.isSymbolicLink()) return;\n try {\n await fs.chmod(target, stat.isDirectory() ? 0o700 : 0o600);\n } catch (error) {\n console.warn(`forceRemove: chmod failed on ${target}`, error);\n }\n if (!stat.isDirectory()) return;\n let entries: string[];\n try {\n entries = await fs.readdir(target);\n } catch (error) {\n console.warn(`forceRemove: readdir failed on ${target}`, error);\n return;\n }\n await Promise.all(\n entries.map((entry) => chmodTreeWritable(path.join(target, entry))),\n );\n}\n\n/**\n * Recursively remove a path, retrying after chmod'ing the tree writable when\n * the kernel rejects the initial removal with EACCES/EPERM. Worktrees commonly\n * contain read-only subtrees populated by Go's module cache (which marks every\n * cached directory mode 0555); plain `fs.rm` cannot unlink entries from those\n * parents until we restore the write bit.\n */\nexport async function forceRemove(target: string): Promise<void> {\n try {\n await fs.rm(target, { recursive: true, force: true, maxRetries: 3 });\n return;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EACCES\" && code !== \"EPERM\") throw error;\n }\n await chmodTreeWritable(target);\n await fs.rm(target, { recursive: true, force: true, maxRetries: 3 });\n}\n\nexport function parseGithubUrl(\n url: string | null | undefined,\n): GitHubUrl | null {\n if (!url) return null;\n let parsed: gitUrlParse.GitUrl;\n try {\n parsed = gitUrlParse(url.trim());\n } catch {\n return null;\n }\n // git-url-parse normalizes source to github.com for any *.github.com host,\n // so check resource to reject api.github.com etc. SSH uses ssh.github.com.\n const resource = parsed.resource.toLowerCase();\n if (resource !== \"github.com\" && resource !== \"ssh.github.com\") return null;\n\n // Read pathname directly: git-url-parse keeps /pull/N in full_name but\n // strips /issues/N, and stuffs unknown path segments into owner. Pathname\n // is consistent across HTTPS, SSH, and shorthand inputs.\n const raw = parsed.pathname.split(\"/\");\n if (raw[0] !== \"\") return null;\n const parts = raw[raw.length - 1] === \"\" ? raw.slice(1, -1) : raw.slice(1);\n if (parts.length < 2 || parts.some((p) => p === \"\")) return null;\n const [owner, repoRaw, segment, num] = parts;\n const repo = repoRaw.replace(/\\.git$/, \"\");\n\n if (segment === \"issues\" || segment === \"pull\") {\n const number = Number(num);\n if (!Number.isInteger(number) || number <= 0) return null;\n return {\n kind: segment === \"pull\" ? \"pr\" : \"issue\",\n owner,\n repo,\n number,\n };\n }\n\n return { kind: \"repo\", owner, repo };\n}\n","import { readGithubTokenFromEnv } from \"@posthog/git/signed-commit\";\nimport 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 const ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;\n\n/**\n * A cloud sandbox run, as opposed to a local desktop session. Cloud sandboxes\n * always set IS_SANDBOX and carry a taskRunId; desktop sessions have neither.\n */\nexport function isCloudRun(meta: { taskRunId?: string } | undefined): boolean {\n return !!process.env.IS_SANDBOX || !!meta?.taskRunId;\n}\n\n/** The GitHub token available to the sandbox, if any. */\nexport function resolveGithubToken(): string | undefined {\n return readGithubTokenFromEnv();\n}\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 {\n createSignedCommit,\n type SignedCommitCtx,\n type SignedCommitInput,\n type SignedCommitResult,\n} from \"@posthog/git/signed-commit\";\nimport { z } from \"zod\";\nimport { qualifiedLocalToolName } from \"./local-tools/registry\";\n\n/**\n * Shared definitions for the `git_signed_commit` tool, used by the local-tools\n * registry entry (which both adapters expose) so the tool name, schema,\n * description, and result formatting can't drift. The qualified name also\n * appears in the cloud system prompt and the PreToolUse guard message.\n */\n\nexport const SIGNED_COMMIT_TOOL_NAME = \"git_signed_commit\";\nexport const SIGNED_COMMIT_QUALIFIED_TOOL_NAME = qualifiedLocalToolName(\n SIGNED_COMMIT_TOOL_NAME,\n);\n\nexport const SIGNED_COMMIT_TOOL_DESCRIPTION =\n \"Create a GitHub-signed (Verified) commit on the branch. Stage files with `git add` \" +\n \"first (or pass `paths`), then call this instead of `git commit`/`git push` — those are \" +\n \"blocked because all commits must be signed. The commit is created via GitHub's API and \" +\n \"your local checkout is kept in sync. For a new branch, pass `branch` (prefixed with \" +\n \"`posthog-code/`) and the tool creates it on the remote.\";\n\nexport const signedCommitToolSchema = {\n message: z.string().describe(\"Commit headline (first line).\"),\n body: z.string().optional().describe(\"Optional extended commit body.\"),\n branch: z\n .string()\n .optional()\n .describe(\n \"Target branch; defaults to the current branch. Use a posthog-code/ prefix for new branches.\",\n ),\n paths: z\n .array(z.string())\n .optional()\n .describe(\n \"Files to stage before committing; defaults to already-staged files.\",\n ),\n};\n\nexport function formatSignedCommitResult(result: SignedCommitResult): string {\n const list = result.commits.map((c) => `- ${c.sha} ${c.url}`).join(\"\\n\");\n return `Created ${result.commits.length} signed commit(s) on ${result.branch}:\\n${list}`;\n}\n\nexport interface SignedCommitToolResult {\n content: { type: \"text\"; text: string }[];\n isError?: true;\n // Both SDKs' CallToolResult carries an open `_meta`/index signature; mirror it\n // so this shape is assignable to either adapter's tool-handler return type.\n [key: string]: unknown;\n}\n\n/**\n * Runs `git_signed_commit` and formats the MCP result. Shared by the Claude\n * in-process tool and the Codex stdio server so success/error formatting (and\n * the error-message prefix) can't drift between adapters.\n */\nexport async function runSignedCommitTool(\n ctx: SignedCommitCtx,\n args: SignedCommitInput,\n): Promise<SignedCommitToolResult> {\n try {\n const result = await createSignedCommit(ctx, args);\n return {\n content: [{ type: \"text\", text: formatSignedCommitResult(result) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n { type: \"text\", text: `${SIGNED_COMMIT_TOOL_NAME} failed: ${message}` },\n ],\n isError: true,\n };\n }\n}\n","import type { z } from \"zod\";\n\n/**\n * A single general-purpose local MCP server hosts every tool registered here,\n * for both adapters: the Claude in-process SDK server and the Codex stdio\n * server. Adding a tool means adding one entry to `LOCAL_TOOLS` (see\n * `./index.ts`) — no per-tool server file or adapter wiring. The name appears\n * in tool ids as `mcp__posthog-local__<tool>`.\n */\nexport const LOCAL_TOOLS_MCP_NAME = \"posthog-local\";\n\n/** Runtime context handed to every local tool's handler and gate. */\nexport interface LocalToolCtx {\n cwd: string;\n /** GitHub token available to the sandbox, if any. */\n token?: string;\n taskId?: string;\n}\n\n/** Minimal session-meta shape needed to gate tools (e.g. cloud-only). */\nexport interface LocalToolGateMeta {\n taskRunId?: string;\n}\n\n/**\n * MCP tool result shape. Carries an open index signature so the value is\n * assignable to either SDK's `CallToolResult` (the Claude SDK and the MCP SDK\n * both attach an open `_meta`).\n */\nexport interface LocalToolResult {\n content: { type: \"text\"; text: string }[];\n isError?: true;\n [key: string]: unknown;\n}\n\n/** Tool definition with its input schema's type preserved for the handler. */\nexport interface LocalToolDef<S extends z.ZodRawShape> {\n name: string;\n description: string;\n schema: S;\n /**\n * Keep the tool visible even though MCP tools are offloaded behind ToolSearch\n * by default in the Claude adapter (ENABLE_TOOL_SEARCH). Ignored by Codex.\n */\n alwaysLoad?: boolean;\n isEnabled(ctx: LocalToolCtx, meta: LocalToolGateMeta | undefined): boolean;\n handler(\n ctx: LocalToolCtx,\n args: z.infer<z.ZodObject<S>>,\n ): Promise<LocalToolResult>;\n}\n\n/** Schema-erased tool, the shape stored in the registry array. */\nexport interface LocalTool {\n name: string;\n description: string;\n schema: z.ZodRawShape;\n alwaysLoad?: boolean;\n isEnabled(ctx: LocalToolCtx, meta: LocalToolGateMeta | undefined): boolean;\n handler(\n ctx: LocalToolCtx,\n args: Record<string, unknown>,\n ): Promise<LocalToolResult>;\n}\n\n/**\n * Registers a tool, preserving its schema's inferred type at the definition\n * site. The returned value erases the schema generic so tools of different\n * shapes can live in one array; the cast is sound because both MCP SDKs\n * validate `args` against `schema` before dispatching to the handler.\n */\nexport function defineLocalTool<S extends z.ZodRawShape>(\n def: LocalToolDef<S>,\n): LocalTool {\n return def as unknown as LocalTool;\n}\n\n/** The qualified tool id as the model and tool guards see it. */\nexport function qualifiedLocalToolName(toolName: string): string {\n return `mcp__${LOCAL_TOOLS_MCP_NAME}__${toolName}`;\n}\n","import { isCloudRun } from \"../../../utils/common\";\nimport {\n runSignedCommitTool,\n SIGNED_COMMIT_TOOL_DESCRIPTION,\n SIGNED_COMMIT_TOOL_NAME,\n signedCommitToolSchema,\n} from \"../../signed-commit-shared\";\nimport { defineLocalTool } from \"../registry\";\n\n/**\n * `git_signed_commit` as a local tool. Cloud runs only, and only when a GitHub\n * token is available (the commit is created via GitHub's API, which also signs\n * it). Committing is core to cloud tasks, so keep it visible past ToolSearch.\n */\nexport const signedCommitTool = defineLocalTool({\n name: SIGNED_COMMIT_TOOL_NAME,\n description: SIGNED_COMMIT_TOOL_DESCRIPTION,\n schema: signedCommitToolSchema,\n alwaysLoad: true,\n isEnabled: (ctx, meta) => isCloudRun(meta) && !!ctx.token,\n handler: (ctx, args) =>\n runSignedCommitTool(\n { cwd: ctx.cwd, token: ctx.token ?? \"\", taskId: ctx.taskId },\n args,\n ),\n});\n","import type { LocalTool, LocalToolCtx, LocalToolGateMeta } from \"./registry\";\nimport { signedCommitTool } from \"./tools/signed-commit\";\n\nexport {\n LOCAL_TOOLS_MCP_NAME,\n type LocalTool,\n type LocalToolCtx,\n type LocalToolGateMeta,\n type LocalToolResult,\n qualifiedLocalToolName,\n} from \"./registry\";\n\n/** Every tool the general local MCP server can expose. Add new tools here. */\nexport const LOCAL_TOOLS: LocalTool[] = [signedCommitTool];\n\n/** Tools whose gate passes for the given context — the set to actually expose. */\nexport function enabledLocalTools(\n ctx: LocalToolCtx,\n meta: LocalToolGateMeta | undefined,\n): LocalTool[] {\n return LOCAL_TOOLS.filter((t) => t.isEnabled(ctx, meta));\n}\n"],"mappings":"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","names":["require_lib","parsed","a","parseUrl","throwErr","parsed","require_lib","require_lib","require_lib","gitUrlParse","childProcess","resolve","childProcess","parsed","gitUrlParse","path","resolve","ctx","parsed","ctx","ctx"]}
1
+ {"version":3,"sources":["../../../../../node_modules/protocols/lib/index.js","../../../../../node_modules/parse-path/lib/index.js","../../../../../node_modules/parse-url/dist/index.js","../../../../../node_modules/is-ssh/lib/index.js","../../../../../node_modules/git-up/lib/index.js","../../../../../node_modules/git-url-parse/lib/index.js","../../../src/adapters/codex/local-tools-mcp-server.ts","../../../../git/src/signed-commit.ts","../../../../git/src/concurrency.ts","../../../../git/src/gh.ts","../../../../git/src/trailers.ts","../../../../git/src/utils.ts","../../../src/utils/common.ts","../../../src/adapters/signed-commit-shared.ts","../../../src/adapters/local-tools/registry.ts","../../../src/adapters/local-tools/tools/signed-commit.ts","../../../src/adapters/local-tools/index.ts"],"sourcesContent":["\"use strict\";\n\n/**\n * protocols\n * Returns the protocols of an input url.\n *\n * @name protocols\n * @function\n * @param {String|URL} input The input url (string or `URL` instance)\n * @param {Boolean|Number} first If `true`, the first protocol will be returned. If number, it will represent the zero-based index of the protocols array.\n * @return {Array|String} The array of protocols or the specified protocol.\n */\nmodule.exports = function protocols(input, first) {\n\n if (first === true) {\n first = 0;\n }\n\n var prots = \"\";\n if (typeof input === \"string\") {\n try {\n prots = new URL(input).protocol;\n } catch (e) {}\n } else if (input && input.constructor === URL) {\n prots = input.protocol;\n }\n\n var splits = prots.split(/\\:|\\+/).filter(Boolean);\n\n if (typeof first === \"number\") {\n return splits[first];\n }\n\n return splits;\n};","\"use strict\";\n\nvar protocols = require(\"protocols\");\n\n/**\n * parsePath\n * Parses the input url.\n *\n * @name parsePath\n * @function\n * @param {String} url The input url.\n * @return {Object} An object containing the following fields:\n *\n * - `protocols` (Array): An array with the url protocols (usually it has one element).\n * - `protocol` (String): The first protocol or `\"file\"`.\n * - `port` (String): The domain port (default: `\"\"`).\n * - `resource` (String): The url domain/hostname.\n * - `host` (String): The url domain (including subdomain and port).\n * - `user` (String): The authentication user (default: `\"\"`).\n * - `password` (String): The authentication password (default: `\"\"`).\n * - `pathname` (String): The url pathname.\n * - `hash` (String): The url hash.\n * - `search` (String): The url querystring value (excluding `?`).\n * - `href` (String): The normalized input url.\n * - `query` (Object): The url querystring, parsed as object.\n * - `parse_failed` (Boolean): Whether the parsing failed or not.\n */\nfunction parsePath(url) {\n\n var output = {\n protocols: [],\n protocol: null,\n port: null,\n resource: \"\",\n host: \"\",\n user: \"\",\n password: \"\",\n pathname: \"\",\n hash: \"\",\n search: \"\",\n href: url,\n query: {},\n parse_failed: false\n };\n\n try {\n var parsed = new URL(url);\n output.protocols = protocols(parsed);\n output.protocol = output.protocols[0];\n output.port = parsed.port;\n output.resource = parsed.hostname;\n output.host = parsed.host;\n output.user = parsed.username || \"\";\n output.password = parsed.password || \"\";\n output.pathname = parsed.pathname;\n output.hash = parsed.hash.slice(1);\n output.search = parsed.search.slice(1);\n output.href = parsed.href;\n output.query = Object.fromEntries(parsed.searchParams);\n } catch (e) {\n // TODO Maybe check if it is a valid local file path\n // In any case, these will be parsed by higher\n // level parsers such as parse-url, git-url-parse, git-up\n output.protocols = [\"file\"];\n output.protocol = output.protocols[0];\n output.port = \"\";\n output.resource = \"\";\n output.user = \"\";\n output.pathname = \"\";\n output.hash = \"\";\n output.search = \"\";\n output.href = url;\n output.query = {};\n output.parse_failed = true;\n }\n\n return output;\n}\n\nmodule.exports = parsePath;","'use strict';\n\nvar require$$1 = require('parse-path');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nvar require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);\n\nfunction getAugmentedNamespace(n) {\n if (n.__esModule) return n;\n var f = n.default;\n\tif (typeof f == \"function\") {\n\t\tvar a = function a () {\n\t\t\tif (this instanceof a) {\n\t\t\t\tvar args = [null];\n\t\t\t\targs.push.apply(args, arguments);\n\t\t\t\tvar Ctor = Function.bind.apply(f, args);\n\t\t\t\treturn new Ctor();\n\t\t\t}\n\t\t\treturn f.apply(this, arguments);\n\t\t};\n\t\ta.prototype = f.prototype;\n } else a = {};\n Object.defineProperty(a, '__esModule', {value: true});\n\tObject.keys(n).forEach(function (k) {\n\t\tvar d = Object.getOwnPropertyDescriptor(n, k);\n\t\tObject.defineProperty(a, k, d.get ? d : {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn n[k];\n\t\t\t}\n\t\t});\n\t});\n\treturn a;\n}\n\nvar src = {};\n\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\nconst DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii';\n\nconst testParameter = (name, filters) => filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\n\nconst normalizeDataURL = (urlString, {stripHash}) => {\n\tconst match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);\n\n\tif (!match) {\n\t\tthrow new Error(`Invalid URL: ${urlString}`);\n\t}\n\n\tlet {type, data, hash} = match.groups;\n\tconst mediaType = type.split(';');\n\thash = stripHash ? '' : hash;\n\n\tlet isBase64 = false;\n\tif (mediaType[mediaType.length - 1] === 'base64') {\n\t\tmediaType.pop();\n\t\tisBase64 = true;\n\t}\n\n\t// Lowercase MIME type\n\tconst mimeType = (mediaType.shift() || '').toLowerCase();\n\tconst attributes = mediaType\n\t\t.map(attribute => {\n\t\t\tlet [key, value = ''] = attribute.split('=').map(string => string.trim());\n\n\t\t\t// Lowercase `charset`\n\t\t\tif (key === 'charset') {\n\t\t\t\tvalue = value.toLowerCase();\n\n\t\t\t\tif (value === DATA_URL_DEFAULT_CHARSET) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn `${key}${value ? `=${value}` : ''}`;\n\t\t})\n\t\t.filter(Boolean);\n\n\tconst normalizedMediaType = [\n\t\t...attributes,\n\t];\n\n\tif (isBase64) {\n\t\tnormalizedMediaType.push('base64');\n\t}\n\n\tif (normalizedMediaType.length > 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {\n\t\tnormalizedMediaType.unshift(mimeType);\n\t}\n\n\treturn `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;\n};\n\nfunction normalizeUrl(urlString, options) {\n\toptions = {\n\t\tdefaultProtocol: 'http:',\n\t\tnormalizeProtocol: true,\n\t\tforceHttp: false,\n\t\tforceHttps: false,\n\t\tstripAuthentication: true,\n\t\tstripHash: false,\n\t\tstripTextFragment: true,\n\t\tstripWWW: true,\n\t\tremoveQueryParameters: [/^utm_\\w+/i],\n\t\tremoveTrailingSlash: true,\n\t\tremoveSingleSlash: true,\n\t\tremoveDirectoryIndex: false,\n\t\tsortQueryParameters: true,\n\t\t...options,\n\t};\n\n\turlString = urlString.trim();\n\n\t// Data URL\n\tif (/^data:/i.test(urlString)) {\n\t\treturn normalizeDataURL(urlString, options);\n\t}\n\n\tif (/^view-source:/i.test(urlString)) {\n\t\tthrow new Error('`view-source:` is not supported as it is a non-standard protocol');\n\t}\n\n\tconst hasRelativeProtocol = urlString.startsWith('//');\n\tconst isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\n\n\t// Prepend protocol\n\tif (!isRelativeUrl) {\n\t\turlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol);\n\t}\n\n\tconst urlObject = new URL(urlString);\n\n\tif (options.forceHttp && options.forceHttps) {\n\t\tthrow new Error('The `forceHttp` and `forceHttps` options cannot be used together');\n\t}\n\n\tif (options.forceHttp && urlObject.protocol === 'https:') {\n\t\turlObject.protocol = 'http:';\n\t}\n\n\tif (options.forceHttps && urlObject.protocol === 'http:') {\n\t\turlObject.protocol = 'https:';\n\t}\n\n\t// Remove auth\n\tif (options.stripAuthentication) {\n\t\turlObject.username = '';\n\t\turlObject.password = '';\n\t}\n\n\t// Remove hash\n\tif (options.stripHash) {\n\t\turlObject.hash = '';\n\t} else if (options.stripTextFragment) {\n\t\turlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, '');\n\t}\n\n\t// Remove duplicate slashes if not preceded by a protocol\n\t// NOTE: This could be implemented using a single negative lookbehind\n\t// regex, but we avoid that to maintain compatibility with older js engines\n\t// which do not have support for that feature.\n\tif (urlObject.pathname) {\n\t\t// TODO: Replace everything below with `urlObject.pathname = urlObject.pathname.replace(/(?<!\\b[a-z][a-z\\d+\\-.]{1,50}:)\\/{2,}/g, '/');` when Safari supports negative lookbehind.\n\n\t\t// Split the string by occurrences of this protocol regex, and perform\n\t\t// duplicate-slash replacement on the strings between those occurrences\n\t\t// (if any).\n\t\tconst protocolRegex = /\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g;\n\n\t\tlet lastIndex = 0;\n\t\tlet result = '';\n\t\tfor (;;) {\n\t\t\tconst match = protocolRegex.exec(urlObject.pathname);\n\t\t\tif (!match) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst protocol = match[0];\n\t\t\tconst protocolAtIndex = match.index;\n\t\t\tconst intermediate = urlObject.pathname.slice(lastIndex, protocolAtIndex);\n\n\t\t\tresult += intermediate.replace(/\\/{2,}/g, '/');\n\t\t\tresult += protocol;\n\t\t\tlastIndex = protocolAtIndex + protocol.length;\n\t\t}\n\n\t\tconst remnant = urlObject.pathname.slice(lastIndex, urlObject.pathname.length);\n\t\tresult += remnant.replace(/\\/{2,}/g, '/');\n\n\t\turlObject.pathname = result;\n\t}\n\n\t// Decode URI octets\n\tif (urlObject.pathname) {\n\t\ttry {\n\t\t\turlObject.pathname = decodeURI(urlObject.pathname);\n\t\t} catch {}\n\t}\n\n\t// Remove directory index\n\tif (options.removeDirectoryIndex === true) {\n\t\toptions.removeDirectoryIndex = [/^index\\.[a-z]+$/];\n\t}\n\n\tif (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\n\t\tlet pathComponents = urlObject.pathname.split('/');\n\t\tconst lastComponent = pathComponents[pathComponents.length - 1];\n\n\t\tif (testParameter(lastComponent, options.removeDirectoryIndex)) {\n\t\t\tpathComponents = pathComponents.slice(0, -1);\n\t\t\turlObject.pathname = pathComponents.slice(1).join('/') + '/';\n\t\t}\n\t}\n\n\tif (urlObject.hostname) {\n\t\t// Remove trailing dot\n\t\turlObject.hostname = urlObject.hostname.replace(/\\.$/, '');\n\n\t\t// Remove `www.`\n\t\tif (options.stripWWW && /^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(urlObject.hostname)) {\n\t\t\t// Each label should be max 63 at length (min: 1).\n\t\t\t// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\n\t\t\t// Each TLD should be up to 63 characters long (min: 2).\n\t\t\t// It is technically possible to have a single character TLD, but none currently exist.\n\t\t\turlObject.hostname = urlObject.hostname.replace(/^www\\./, '');\n\t\t}\n\t}\n\n\t// Remove query unwanted parameters\n\tif (Array.isArray(options.removeQueryParameters)) {\n\t\t// eslint-disable-next-line unicorn/no-useless-spread -- We are intentionally spreading to get a copy.\n\t\tfor (const key of [...urlObject.searchParams.keys()]) {\n\t\t\tif (testParameter(key, options.removeQueryParameters)) {\n\t\t\t\turlObject.searchParams.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (options.removeQueryParameters === true) {\n\t\turlObject.search = '';\n\t}\n\n\t// Sort query parameters\n\tif (options.sortQueryParameters) {\n\t\turlObject.searchParams.sort();\n\n\t\t// Calling `.sort()` encodes the search parameters, so we need to decode them again.\n\t\ttry {\n\t\t\turlObject.search = decodeURIComponent(urlObject.search);\n\t\t} catch {}\n\t}\n\n\tif (options.removeTrailingSlash) {\n\t\turlObject.pathname = urlObject.pathname.replace(/\\/$/, '');\n\t}\n\n\tconst oldUrlString = urlString;\n\n\t// Take advantage of many of the Node `url` normalizations\n\turlString = urlObject.toString();\n\n\tif (!options.removeSingleSlash && urlObject.pathname === '/' && !oldUrlString.endsWith('/') && urlObject.hash === '') {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Remove ending `/` unless removeSingleSlash is false\n\tif ((options.removeTrailingSlash || urlObject.pathname === '/') && urlObject.hash === '' && options.removeSingleSlash) {\n\t\turlString = urlString.replace(/\\/$/, '');\n\t}\n\n\t// Restore relative protocol, if applicable\n\tif (hasRelativeProtocol && !options.normalizeProtocol) {\n\t\turlString = urlString.replace(/^http:\\/\\//, '//');\n\t}\n\n\t// Remove http/https\n\tif (options.stripProtocol) {\n\t\turlString = urlString.replace(/^(?:https?:)?\\/\\//, '');\n\t}\n\n\treturn urlString;\n}\n\nvar normalizeUrl$1 = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\t'default': normalizeUrl\n});\n\nvar require$$0 = /*@__PURE__*/getAugmentedNamespace(normalizeUrl$1);\n\nObject.defineProperty(src, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; // Dependencies\n\nvar _normalizeUrl = require$$0;\n\nvar _normalizeUrl2 = _interopRequireDefault(_normalizeUrl);\n\nvar _parsePath = require$$1__default[\"default\"];\n\nvar _parsePath2 = _interopRequireDefault(_parsePath);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * parseUrl\n * Parses the input url.\n *\n * **Note**: This *throws* if invalid urls are provided.\n *\n * @name parseUrl\n * @function\n * @param {String} url The input url.\n * @param {Boolean|Object} normalize Whether to normalize the url or not.\n * Default is `false`. If `true`, the url will\n * be normalized. If an object, it will be the\n * options object sent to [`normalize-url`](https://github.com/sindresorhus/normalize-url).\n *\n * For SSH urls, normalize won't work.\n *\n * @return {Object} An object containing the following fields:\n *\n * - `protocols` (Array): An array with the url protocols (usually it has one element).\n * - `protocol` (String): The first protocol, `\"ssh\"` (if the url is a ssh url) or `\"file\"`.\n * - `port` (null|Number): The domain port.\n * - `resource` (String): The url domain (including subdomains).\n * - `host` (String): The fully qualified domain name of a network host, or its IP address.\n * - `user` (String): The authentication user (usually for ssh urls).\n * - `pathname` (String): The url pathname.\n * - `hash` (String): The url hash.\n * - `search` (String): The url querystring value.\n * - `href` (String): The input url.\n * - `query` (Object): The url querystring, parsed as object.\n * - `parse_failed` (Boolean): Whether the parsing failed or not.\n */\nvar parseUrl = function parseUrl(url) {\n var normalize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\n // Constants\n /**\n * ([a-zA-Z_][a-zA-Z0-9_-]{0,31}) Try to match the user\n * ([\\w\\.\\-@]+) Match the host/resource\n * (([\\~,\\.\\w,\\-,\\_,\\/,\\s]|%[0-9A-Fa-f]{2})+?(?:\\.git|\\/)?) Match the path, allowing spaces/white \n */\n var GIT_RE = /^(?:([a-zA-Z_][a-zA-Z0-9_-]{0,31})@|https?:\\/\\/)([\\w\\.\\-@]+)[\\/:](([\\~,\\.\\w,\\-,\\_,\\/,\\s]|%[0-9A-Fa-f]{2})+?(?:\\.git|\\/)?)$/;\n\n var throwErr = function throwErr(msg) {\n var err = new Error(msg);\n err.subject_url = url;\n throw err;\n };\n\n if (typeof url !== \"string\" || !url.trim()) {\n throwErr(\"Invalid url.\");\n }\n\n if (url.length > parseUrl.MAX_INPUT_LENGTH) {\n throwErr(\"Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.\");\n }\n\n if (normalize) {\n if ((typeof normalize === \"undefined\" ? \"undefined\" : _typeof(normalize)) !== \"object\") {\n normalize = {\n stripHash: false\n };\n }\n url = (0, _normalizeUrl2.default)(url, normalize);\n }\n\n var parsed = (0, _parsePath2.default)(url);\n\n // Potential git-ssh urls\n if (parsed.parse_failed) {\n var matched = parsed.href.match(GIT_RE);\n\n if (matched) {\n parsed.protocols = [\"ssh\"];\n parsed.protocol = \"ssh\";\n parsed.resource = matched[2];\n parsed.host = matched[2];\n parsed.user = matched[1];\n parsed.pathname = \"/\" + matched[3];\n parsed.parse_failed = false;\n } else {\n throwErr(\"URL parsing failed.\");\n }\n }\n\n return parsed;\n};\n\nparseUrl.MAX_INPUT_LENGTH = 2048;\n\nvar _default = src.default = parseUrl;\n\nmodule.exports = _default;\n","\"use strict\";\n\n// Dependencies\nvar protocols = require(\"protocols\");\n\n/**\n * isSsh\n * Checks if an input value is a ssh url or not.\n *\n * @name isSsh\n * @function\n * @param {String|Array} input The input url or an array of protocols.\n * @return {Boolean} `true` if the input is a ssh url, `false` otherwise.\n */\nfunction isSsh(input) {\n\n if (Array.isArray(input)) {\n return input.indexOf(\"ssh\") !== -1 || input.indexOf(\"rsync\") !== -1;\n }\n\n if (typeof input !== \"string\") {\n return false;\n }\n\n var prots = protocols(input);\n input = input.substring(input.indexOf(\"://\") + 3);\n if (isSsh(prots)) {\n return true;\n }\n\n // TODO This probably could be improved :)\n var urlPortPattern = new RegExp('\\.([a-zA-Z\\\\d]+):(\\\\d+)\\/');\n return !input.match(urlPortPattern) && input.indexOf(\"@\") < input.indexOf(\":\");\n}\n\nmodule.exports = isSsh;","\"use strict\";\n\n// Dependencies\nconst parseUrl = require(\"parse-url\")\n , isSsh = require(\"is-ssh\")\n ;\n\n/**\n * gitUp\n * Parses the input url.\n *\n * @name gitUp\n * @function\n * @param {String} input The input url.\n * @return {Object} An object containing the following fields:\n *\n * - `protocols` (Array): An array with the url protocols (usually it has one element).\n * - `port` (String): The domain port.\n * - `resource` (String): The url domain (including subdomains).\n * - `user` (String): The authentication user (usually for ssh urls).\n * - `pathname` (String): The url pathname.\n * - `hash` (String): The url hash.\n * - `search` (String): The url querystring value.\n * - `href` (String): The input url.\n * - `protocol` (String): The git url protocol.\n * - `token` (String): The oauth token (could appear in the https urls).\n */\nfunction gitUp(input) {\n let output = parseUrl(input);\n output.token = \"\";\n\n if (output.password === \"x-oauth-basic\") {\n output.token = output.user;\n } else if (output.user === \"x-token-auth\") {\n output.token = output.password\n }\n\n if (isSsh(output.protocols) || (output.protocols.length === 0 && isSsh(input))) {\n output.protocol = \"ssh\";\n } else if (output.protocols.length) {\n output.protocol = output.protocols[0];\n } else {\n output.protocol = \"file\";\n output.protocols = [\"file\"]\n }\n\n output.href = output.href.replace(/\\/$/, \"\")\n return output;\n}\n\nmodule.exports = gitUp;\n","\"use strict\";\n\nvar gitUp = require(\"git-up\");\n\n/**\n * gitUrlParse\n * Parses a Git url.\n *\n * @name gitUrlParse\n * @function\n * @param {String} url The Git url to parse.\n * @param {Array} refs An array of strings representing the refs. This is\n * helpful in the context of the URLs that contain branches with slashes.\n * If user wants to identify the branch, he should pass all branch names\n * of the project as part of refs parameter\n * @return {GitUrl} The `GitUrl` object containing:\n *\n * - `protocols` (Array): An array with the url protocols (usually it has one element).\n * - `port` (String): The domain port.\n * - `resource` (String): The url domain (including subdomains).\n * - `user` (String): The authentication user (usually for ssh urls).\n * - `pathname` (String): The url pathname.\n * - `hash` (String): The url hash.\n * - `search` (String): The url querystring value.\n * - `href` (String): The input url.\n * - `protocol` (String): The git url protocol.\n * - `token` (String): The oauth token (could appear in the https urls).\n * - `source` (String): The Git provider (e.g. `\"github.com\"`).\n * - `owner` (String): The repository owner.\n * - `name` (String): The repository name.\n * - `ref` (String): The repository ref (e.g., \"master\" or \"dev\").\n * - `filepath` (String): A filepath relative to the repository root.\n * - `filepathtype` (String): The type of filepath in the url (\"blob\" or \"tree\").\n * - `full_name` (String): The owner and name values in the `owner/name` format.\n * - `toString` (Function): A function to stringify the parsed url into another url type.\n * - `organization` (String): The organization the owner belongs to. This is CloudForge specific.\n * - `git_suffix` (Boolean): Whether to add the `.git` suffix or not.\n *\n */\nfunction gitUrlParse(url, refs) {\n refs = refs || [];\n\n if (typeof url !== \"string\") {\n throw new Error(\"The url must be a string.\");\n }\n\n if (!refs.every(function (item) {\n return typeof item === \"string\";\n })) {\n throw new Error(\"The refs should contain only strings\");\n }\n\n var shorthandRe = /^([a-z\\d-]{1,39})\\/([-\\.\\w]{1,100})$/i;\n\n if (shorthandRe.test(url)) {\n url = \"https://github.com/\" + url;\n }\n\n var urlInfo = gitUp(url),\n sourceParts = urlInfo.resource.split(\".\"),\n splits = null;\n\n urlInfo.toString = function (type) {\n return gitUrlParse.stringify(this, type);\n };\n\n urlInfo.source = sourceParts.length > 2 ? sourceParts.slice(1 - sourceParts.length).join(\".\") : urlInfo.source = urlInfo.resource;\n\n // Note: Some hosting services (e.g. Visual Studio Team Services) allow whitespace characters\n // in the repository and owner names so we decode the URL pieces to get the correct result\n urlInfo.git_suffix = /\\.git$/.test(urlInfo.pathname);\n urlInfo.name = decodeURIComponent((urlInfo.pathname || urlInfo.href).replace(/(^\\/)|(\\/$)/g, \"\").replace(/\\.git$/, \"\"));\n urlInfo.owner = decodeURIComponent(urlInfo.user);\n\n switch (urlInfo.source) {\n case \"git.cloudforge.com\":\n urlInfo.owner = urlInfo.user;\n urlInfo.organization = sourceParts[0];\n urlInfo.source = \"cloudforge.com\";\n break;\n case \"visualstudio.com\":\n // Handle VSTS SSH URLs\n if (urlInfo.resource === \"vs-ssh.visualstudio.com\") {\n splits = urlInfo.name.split(\"/\");\n if (splits.length === 4) {\n urlInfo.organization = splits[1];\n urlInfo.owner = splits[2];\n urlInfo.name = splits[3];\n urlInfo.full_name = splits[2] + \"/\" + splits[3];\n }\n break;\n } else {\n splits = urlInfo.name.split(\"/\");\n if (splits.length === 2) {\n urlInfo.owner = splits[1];\n urlInfo.name = splits[1];\n urlInfo.full_name = \"_git/\" + urlInfo.name;\n } else if (splits.length === 3) {\n urlInfo.name = splits[2];\n if (splits[0] === \"DefaultCollection\") {\n urlInfo.owner = splits[2];\n urlInfo.organization = splits[0];\n urlInfo.full_name = urlInfo.organization + \"/_git/\" + urlInfo.name;\n } else {\n urlInfo.owner = splits[0];\n urlInfo.full_name = urlInfo.owner + \"/_git/\" + urlInfo.name;\n }\n } else if (splits.length === 4) {\n urlInfo.organization = splits[0];\n urlInfo.owner = splits[1];\n urlInfo.name = splits[3];\n urlInfo.full_name = urlInfo.organization + \"/\" + urlInfo.owner + \"/_git/\" + urlInfo.name;\n }\n break;\n }\n\n // Azure DevOps (formerly Visual Studio Team Services)\n case \"dev.azure.com\":\n case \"azure.com\":\n if (urlInfo.resource === \"ssh.dev.azure.com\") {\n splits = urlInfo.name.split(\"/\");\n if (splits.length === 4) {\n urlInfo.organization = splits[1];\n urlInfo.owner = splits[2];\n urlInfo.name = splits[3];\n }\n break;\n } else {\n splits = urlInfo.name.split(\"/\");\n if (splits.length === 5) {\n urlInfo.organization = splits[0];\n urlInfo.owner = splits[1];\n urlInfo.name = splits[4];\n urlInfo.full_name = \"_git/\" + urlInfo.name;\n } else if (splits.length === 3) {\n urlInfo.name = splits[2];\n if (splits[0] === \"DefaultCollection\") {\n urlInfo.owner = splits[2];\n urlInfo.organization = splits[0];\n urlInfo.full_name = urlInfo.organization + \"/_git/\" + urlInfo.name;\n } else {\n urlInfo.owner = splits[0];\n urlInfo.full_name = urlInfo.owner + \"/_git/\" + urlInfo.name;\n }\n } else if (splits.length === 4) {\n urlInfo.organization = splits[0];\n urlInfo.owner = splits[1];\n urlInfo.name = splits[3];\n urlInfo.full_name = urlInfo.organization + \"/\" + urlInfo.owner + \"/_git/\" + urlInfo.name;\n }\n if (urlInfo.query && urlInfo.query[\"path\"]) {\n urlInfo.filepath = urlInfo.query[\"path\"].replace(/^\\/+/g, \"\"); // Strip leading slash (/)\n }\n if (urlInfo.query && urlInfo.query[\"version\"]) {\n // version=GB<branch>\n urlInfo.ref = urlInfo.query[\"version\"].replace(/^GB/, \"\"); // remove GB\n }\n break;\n }\n default:\n splits = urlInfo.name.split(\"/\");\n var nameIndex = splits.length - 1;\n if (splits.length >= 2) {\n var dashIndex = splits.indexOf(\"-\", 2);\n var blobIndex = splits.indexOf(\"blob\", 2);\n var treeIndex = splits.indexOf(\"tree\", 2);\n var commitIndex = splits.indexOf(\"commit\", 2);\n var issuesIndex = splits.indexOf(\"issues\", 2);\n var srcIndex = splits.indexOf(\"src\", 2);\n var rawIndex = splits.indexOf(\"raw\", 2);\n var editIndex = splits.indexOf(\"edit\", 2);\n nameIndex = dashIndex > 0 ? dashIndex - 1 : blobIndex > 0 && treeIndex > 0 ? Math.min(blobIndex - 1, treeIndex - 1) : blobIndex > 0 ? blobIndex - 1 : issuesIndex > 0 ? issuesIndex - 1 : treeIndex > 0 ? treeIndex - 1 : commitIndex > 0 ? commitIndex - 1 : srcIndex > 0 ? srcIndex - 1 : rawIndex > 0 ? rawIndex - 1 : editIndex > 0 ? editIndex - 1 : nameIndex;\n\n urlInfo.owner = splits.slice(0, nameIndex).join(\"/\");\n urlInfo.name = splits[nameIndex];\n if (commitIndex && issuesIndex < 0) {\n urlInfo.commit = splits[nameIndex + 2];\n }\n }\n\n urlInfo.ref = \"\";\n urlInfo.filepathtype = \"\";\n urlInfo.filepath = \"\";\n var offsetNameIndex = splits.length > nameIndex && splits[nameIndex + 1] === \"-\" ? nameIndex + 1 : nameIndex;\n\n if (splits.length > offsetNameIndex + 2 && [\"raw\", \"src\", \"blob\", \"tree\", \"edit\"].indexOf(splits[offsetNameIndex + 1]) >= 0) {\n urlInfo.filepathtype = splits[offsetNameIndex + 1];\n urlInfo.ref = splits[offsetNameIndex + 2];\n if (splits.length > offsetNameIndex + 3) {\n urlInfo.filepath = splits.slice(offsetNameIndex + 3).join(\"/\");\n }\n }\n urlInfo.organization = urlInfo.owner;\n break;\n }\n\n if (!urlInfo.full_name) {\n urlInfo.full_name = urlInfo.owner;\n if (urlInfo.name) {\n urlInfo.full_name && (urlInfo.full_name += \"/\");\n urlInfo.full_name += urlInfo.name;\n }\n }\n // Bitbucket Server\n if (urlInfo.owner.startsWith(\"scm/\")) {\n urlInfo.source = \"bitbucket-server\";\n urlInfo.owner = urlInfo.owner.replace(\"scm/\", \"\");\n urlInfo.organization = urlInfo.owner;\n urlInfo.full_name = urlInfo.owner + \"/\" + urlInfo.name;\n }\n\n var bitbucket = /(projects|users)\\/(.*?)\\/repos\\/(.*?)((\\/.*$)|$)/;\n var matches = bitbucket.exec(urlInfo.pathname);\n if (matches != null) {\n urlInfo.source = \"bitbucket-server\";\n if (matches[1] === \"users\") {\n urlInfo.owner = \"~\" + matches[2];\n } else {\n urlInfo.owner = matches[2];\n }\n\n urlInfo.organization = urlInfo.owner;\n urlInfo.name = matches[3];\n\n splits = matches[4].split(\"/\");\n if (splits.length > 1) {\n if ([\"raw\", \"browse\"].indexOf(splits[1]) >= 0) {\n urlInfo.filepathtype = splits[1];\n if (splits.length > 2) {\n urlInfo.filepath = splits.slice(2).join(\"/\");\n }\n } else if (splits[1] === \"commits\" && splits.length > 2) {\n urlInfo.commit = splits[2];\n }\n }\n urlInfo.full_name = urlInfo.owner + \"/\" + urlInfo.name;\n\n if (urlInfo.query.at) {\n urlInfo.ref = urlInfo.query.at;\n } else {\n urlInfo.ref = \"\";\n }\n }\n\n if (refs.length !== 0 && urlInfo.ref) {\n urlInfo.ref = findLongestMatchingSubstring(urlInfo.href, refs) || urlInfo.ref;\n urlInfo.filepath = urlInfo.href.split(urlInfo.ref + \"/\")[1];\n }\n\n return urlInfo;\n}\n\n/**\n * stringify\n * Stringifies a `GitUrl` object.\n *\n * @name stringify\n * @function\n * @param {GitUrl} obj The parsed Git url object.\n * @param {String} type The type of the stringified url (default `obj.protocol`).\n * @return {String} The stringified url.\n */\ngitUrlParse.stringify = function (obj, type) {\n type = type || (obj.protocols && obj.protocols.length ? obj.protocols.join(\"+\") : obj.protocol);\n var port = obj.port ? \":\" + obj.port : \"\";\n var user = obj.user || \"git\";\n var maybeGitSuffix = obj.git_suffix ? \".git\" : \"\";\n switch (type) {\n case \"ssh\":\n if (port) return \"ssh://\" + user + \"@\" + obj.resource + port + \"/\" + obj.full_name + maybeGitSuffix;else return user + \"@\" + obj.resource + \":\" + obj.full_name + maybeGitSuffix;\n case \"git+ssh\":\n case \"ssh+git\":\n case \"ftp\":\n case \"ftps\":\n return type + \"://\" + user + \"@\" + obj.resource + port + \"/\" + obj.full_name + maybeGitSuffix;\n case \"http\":\n case \"https\":\n var auth = obj.token ? buildToken(obj) : obj.user && (obj.protocols.includes(\"http\") || obj.protocols.includes(\"https\")) ? obj.user + \"@\" : \"\";\n return type + \"://\" + auth + obj.resource + port + \"/\" + buildPath(obj) + maybeGitSuffix;\n default:\n return obj.href;\n }\n};\n\n/*!\n * buildToken\n * Builds OAuth token prefix (helper function)\n *\n * @name buildToken\n * @function\n * @param {GitUrl} obj The parsed Git url object.\n * @return {String} token prefix\n */\nfunction buildToken(obj) {\n switch (obj.source) {\n case \"bitbucket.org\":\n return \"x-token-auth:\" + obj.token + \"@\";\n default:\n return obj.token + \"@\";\n }\n}\n\nfunction buildPath(obj) {\n switch (obj.source) {\n case \"bitbucket-server\":\n return \"scm/\" + obj.full_name;\n default:\n // Note: Re-encode the repository and owner names for hosting services that allow whitespace characters\n var encoded_full_name = obj.full_name.split(\"/\").map(function (x) {\n return encodeURIComponent(x);\n }).join(\"/\");\n\n return encoded_full_name;\n }\n}\n\nfunction findLongestMatchingSubstring(string, array) {\n var longestMatch = \"\";\n\n array.forEach(function (item) {\n if (string.includes(item) && item.length > longestMatch.length) {\n longestMatch = item;\n }\n });\n\n return longestMatch;\n}\n\nmodule.exports = gitUrlParse;","/**\n * Standalone stdio MCP server exposing the general local tools to the Codex\n * adapter. Spawned by codex-acp as an MCP server process. Reads its context\n * (cwd, taskId, token) from POSTHOG_LOCAL_TOOLS_CTX and the set of tools to\n * register from POSTHOG_LOCAL_TOOLS_ENABLED (both set by the parent, which has\n * already evaluated each tool's gate) — then registers those registry tools,\n * the same ones the Claude adapter exposes in-process.\n *\n * Usage:\n * POSTHOG_LOCAL_TOOLS_CTX=<base64> \\\n * POSTHOG_LOCAL_TOOLS_ENABLED=git_signed_commit \\\n * node local-tools-mcp-server.js\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { readGithubTokenFromEnv } from \"@posthog/git/signed-commit\";\nimport {\n LOCAL_TOOLS,\n LOCAL_TOOLS_MCP_NAME,\n type LocalToolCtx,\n} from \"../local-tools\";\n\nfunction die(message: string): never {\n process.stderr.write(`[local-tools-mcp-server] ${message}\\n`);\n process.exit(1);\n}\n\nconst ctxEnv = process.env.POSTHOG_LOCAL_TOOLS_CTX;\nif (!ctxEnv) {\n die(\"POSTHOG_LOCAL_TOOLS_CTX env var is required\");\n}\n\nlet parsed: { cwd: string; taskId?: string; token?: string };\ntry {\n parsed = JSON.parse(Buffer.from(ctxEnv, \"base64\").toString(\"utf-8\"));\n} catch (err) {\n die(`Failed to parse POSTHOG_LOCAL_TOOLS_CTX as base64-encoded JSON: ${err}`);\n}\n\nif (!parsed.cwd) {\n die(\"POSTHOG_LOCAL_TOOLS_CTX must include cwd\");\n}\n\nconst ctx: LocalToolCtx = {\n cwd: parsed.cwd,\n token: parsed.token ?? readGithubTokenFromEnv(),\n taskId: parsed.taskId,\n};\n\nconst enabledNames = (process.env.POSTHOG_LOCAL_TOOLS_ENABLED ?? \"\")\n .split(\",\")\n .filter(Boolean);\nconst tools = LOCAL_TOOLS.filter((t) => enabledNames.includes(t.name));\nif (tools.length === 0) {\n die(\"POSTHOG_LOCAL_TOOLS_ENABLED listed no known tools\");\n}\n\nconst server = new McpServer({\n name: LOCAL_TOOLS_MCP_NAME,\n version: \"1.0.0\",\n});\n\nfor (const t of tools) {\n server.tool(t.name, t.description, t.schema, async (args) =>\n t.handler(ctx, args),\n );\n}\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","// Namespace import (not `{ execFile }`) so the renderer's browser bundle can\n// resolve this node-only module against vite's `__vite-browser-external` stub,\n// which has no named exports. This module never runs in the browser.\nimport * as childProcess from \"node:child_process\";\nimport { mapWithConcurrency } from \"./concurrency\";\nimport { execGh, execGhWithRetry } from \"./gh\";\nimport { buildPostHogTrailers } from \"./trailers\";\nimport { parseGithubUrl } from \"./utils\";\n\n/**\n * Creates GitHub-signed (\"Verified\") commits without any local signing key, by\n * sending the staged changes through GitHub's GraphQL `createCommitOnBranch`\n * mutation. The mutation authors and signs the commit as the identity that owns\n * the token, so cloud-agent commits satisfy signed-commit branch protection.\n *\n * This is the deterministic replacement for the prompt-driven `gh api graphql`\n * flow: it passes the `FileChanges` payload as a real GraphQL object (not a\n * string scalar), fetches the branch tip so multi-commit diffs work, chunks\n * oversized payloads, and keeps the local checkout pointed at the new commit.\n */\n\nconst DEFAULT_MAX_PAYLOAD_BYTES = 35 * 1024 * 1024;\nconst MAX_GIT_BUFFER = 256 * 1024 * 1024;\n// Per-attempt cap for the GraphQL commit call; retried with backoff on timeout.\nconst GH_GRAPHQL_TIMEOUT_MS = 30_000;\n\nexport interface SignedCommitCtx {\n /** Working directory of the clone. */\n cwd: string;\n /** GitHub token used for the mutation; determines the signed author identity. */\n token: string;\n /** Appended as a `Task-Id` trailer when present. */\n taskId?: string;\n /**\n * Branch the tool refuses to commit directly onto. Defaults to the remote's\n * default branch (`origin/HEAD`), so an accidental commit straight onto `main`\n * is blocked even without an explicit value.\n */\n baseBranch?: string;\n}\n\nexport interface SignedCommitInput {\n /** Commit headline (first line). */\n message: string;\n /** Optional extended body; PostHog trailers are appended automatically. */\n body?: string;\n /** Target branch; defaults to the current branch. Created on the remote if missing. */\n branch?: string;\n /** Files to stage before committing; defaults to whatever is already staged. */\n paths?: string[];\n}\n\nexport interface SignedCommitResult {\n branch: string;\n /** One entry per chunk; >1 only when the payload was split. */\n commits: { sha: string; url: string }[];\n}\n\nexport class OversizedFileError extends Error {\n constructor(\n readonly path: string,\n readonly bytes: number,\n readonly maxBytes: number,\n ) {\n super(\n `File '${path}' (~${Math.round(bytes / 1024 / 1024)}MB once base64-encoded) ` +\n `exceeds the per-commit request limit (~${Math.round(maxBytes / 1024 / 1024)}MB). ` +\n `A single file cannot be split across createCommitOnBranch requests; use Git LFS ` +\n `or a local signing key for this change.`,\n );\n this.name = \"OversizedFileError\";\n }\n}\n\ninterface FileAddition {\n path: string;\n contents: string;\n}\ninterface FileDeletion {\n path: string;\n}\ninterface FileChanges {\n additions: FileAddition[];\n deletions: FileDeletion[];\n}\n\ninterface GitRunResult {\n stdout: Buffer;\n stderr: string;\n exitCode: number;\n}\n\nfunction runGit(args: string[], cwd: string): Promise<GitRunResult> {\n return new Promise((resolve) => {\n childProcess.execFile(\n \"git\",\n args,\n { cwd, maxBuffer: MAX_GIT_BUFFER, encoding: \"buffer\" },\n (error, stdout, stderr) => {\n const err = error as (Error & { code?: number | string }) | null;\n const exitCode =\n err && typeof err.code === \"number\" ? err.code : err ? 1 : 0;\n resolve({\n stdout: (stdout as unknown as Buffer) ?? Buffer.alloc(0),\n stderr: ((stderr as unknown as Buffer) ?? Buffer.alloc(0)).toString(\n \"utf8\",\n ),\n exitCode,\n });\n },\n );\n });\n}\n\nasync function gitText(args: string[], cwd: string): Promise<string> {\n const r = await runGit(args, cwd);\n if (r.exitCode !== 0) {\n throw new Error(`git ${args.join(\" \")} failed: ${r.stderr.trim()}`);\n }\n return r.stdout.toString(\"utf8\").trim();\n}\n\nasync function resolveRepoNameWithOwner(ctx: SignedCommitCtx): Promise<string> {\n const url = await gitText([\"remote\", \"get-url\", \"origin\"], ctx.cwd);\n const parsed = parseGithubUrl(url);\n if (!parsed) {\n throw new Error(`Could not parse owner/repo from origin remote: ${url}`);\n }\n return `${parsed.owner}/${parsed.repo}`;\n}\n\nasync function resolveBaseBranch(ctx: SignedCommitCtx): Promise<string | null> {\n if (ctx.baseBranch) return ctx.baseBranch;\n // Fall back to the remote's default branch so the guard still fires when no\n // explicit base is supplied. Best-effort: a clone without origin/HEAD just\n // leaves the guard inactive rather than failing the commit.\n const r = await runGit(\n [\"symbolic-ref\", \"--short\", \"refs/remotes/origin/HEAD\"],\n ctx.cwd,\n );\n if (r.exitCode !== 0) return null;\n return (\n r.stdout\n .toString(\"utf8\")\n .trim()\n .replace(/^origin\\//, \"\") || null\n );\n}\n\nasync function resolveBranchName(\n ctx: SignedCommitCtx,\n input: SignedCommitInput,\n): Promise<string> {\n const branch = input.branch\n ? input.branch.replace(/^refs\\/heads\\//, \"\")\n : await resolveCurrentBranch(ctx);\n\n // Guard both paths: an explicit `branch: \"main\"` must be refused the same as\n // landing on the base branch implicitly via HEAD.\n const baseBranch = await resolveBaseBranch(ctx);\n if (baseBranch && branch === baseBranch) {\n throw new Error(\n `Refusing to commit directly to base branch '${baseBranch}'. ` +\n `Pass a 'branch' name prefixed with posthog-code/.`,\n );\n }\n return branch;\n}\n\nasync function resolveCurrentBranch(ctx: SignedCommitCtx): Promise<string> {\n const current = await gitText([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], ctx.cwd);\n if (!current || current === \"HEAD\") {\n throw new Error(\n \"Detached HEAD — pass a `branch` to git_signed_commit (e.g. posthog-code/...).\",\n );\n }\n return current;\n}\n\nasync function remoteTip(\n ctx: SignedCommitCtx,\n branch: string,\n): Promise<string | null> {\n const out = await gitText(\n [\"ls-remote\", \"--heads\", \"origin\", branch],\n ctx.cwd,\n );\n if (!out) return null;\n return out.split(\"\\t\")[0]?.trim() || null;\n}\n\nasync function createRef(\n ctx: SignedCommitCtx,\n repo: string,\n branch: string,\n sha: string,\n): Promise<void> {\n const res = await execGh(\n [\n \"api\",\n \"-X\",\n \"POST\",\n `/repos/${repo}/git/refs`,\n \"-f\",\n `ref=refs/heads/${branch}`,\n \"-f\",\n `sha=${sha}`,\n ],\n { cwd: ctx.cwd, env: ghTokenEnv(ctx.token) },\n );\n if (res.exitCode !== 0) {\n throw new Error(\n `Failed to create branch '${branch}': ${res.stderr || res.error}`,\n );\n }\n}\n\n/** Env var names the GitHub CLI / git credential helper read a token from, in order. */\nexport const GITHUB_TOKEN_ENV_VARS = [\"GH_TOKEN\", \"GITHUB_TOKEN\"] as const;\n\n/** First GitHub token found in `env` (defaults to the process env), if any. */\nexport function readGithubTokenFromEnv(\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n for (const name of GITHUB_TOKEN_ENV_VARS) {\n if (env[name]) return env[name];\n }\n return undefined;\n}\n\nexport function ghTokenEnv(token: string): Record<string, string> {\n return Object.fromEntries(GITHUB_TOKEN_ENV_VARS.map((name) => [name, token]));\n}\n\n// Concurrency for staged-blob reads; bounds spawned `git show` processes while\n// still cutting wall-clock for multi-file commits.\nconst STAGED_READ_CONCURRENCY = 16;\n\nasync function buildFileChanges(\n ctx: SignedCommitCtx,\n baseOid: string,\n): Promise<FileChanges> {\n // One `--name-status -z` diff yields additions and deletions together; output\n // is `<status>\\0<path>\\0...` (no rename pairs, since `--no-renames`). Read raw\n // (no trim) so paths with leading/trailing spaces survive.\n const diff = await runGit(\n [\"diff\", \"--cached\", \"-z\", \"--no-renames\", \"--name-status\", baseOid],\n ctx.cwd,\n );\n if (diff.exitCode !== 0) {\n throw new Error(`git diff --cached failed: ${diff.stderr.trim()}`);\n }\n const tokens = diff.stdout.toString(\"utf8\").split(\"\\0\").filter(Boolean);\n\n const addPaths: string[] = [];\n const deletions: FileDeletion[] = [];\n for (let i = 0; i + 1 < tokens.length; i += 2) {\n const path = tokens[i + 1];\n if (tokens[i].startsWith(\"D\")) {\n deletions.push({ path });\n } else {\n addPaths.push(path);\n }\n }\n\n const additions = await mapWithConcurrency(\n addPaths,\n STAGED_READ_CONCURRENCY,\n async (path) => {\n // Read the *staged* blob (`:path`) so we commit exactly what was staged,\n // not any later unstaged edits in the working tree.\n const r = await runGit([\"show\", `:${path}`], ctx.cwd);\n if (r.exitCode !== 0) {\n throw new Error(\n `Failed to read staged file '${path}': ${r.stderr.trim()}`,\n );\n }\n return { path, contents: r.stdout.toString(\"base64\") };\n },\n );\n return { additions, deletions };\n}\n\nfunction additionBytes(a: FileAddition): number {\n // base64 contents dominate; add path + per-entry JSON envelope overhead.\n return a.contents.length + a.path.length + 32;\n}\n\nexport function chunkFileChanges(\n changes: FileChanges,\n maxBytes: number,\n): FileChanges[] {\n for (const a of changes.additions) {\n const bytes = additionBytes(a);\n if (bytes > maxBytes) throw new OversizedFileError(a.path, bytes, maxBytes);\n }\n\n if (changes.additions.length === 0) {\n return [{ additions: [], deletions: changes.deletions }];\n }\n\n const chunks: FileChanges[] = [];\n // Deletions are path-only (negligible); put them all in the first chunk.\n let cur: FileChanges = { additions: [], deletions: [...changes.deletions] };\n let curBytes = changes.deletions.reduce((n, d) => n + d.path.length + 16, 0);\n\n for (const a of changes.additions) {\n const bytes = additionBytes(a);\n if (cur.additions.length > 0 && curBytes + bytes > maxBytes) {\n chunks.push(cur);\n cur = { additions: [], deletions: [] };\n curBytes = 0;\n }\n cur.additions.push(a);\n curBytes += bytes;\n }\n chunks.push(cur);\n return chunks;\n}\n\nconst CREATE_COMMIT_MUTATION = `mutation($input: CreateCommitOnBranchInput!) {\n createCommitOnBranch(input: $input) { commit { oid url } }\n}`;\n\nasync function createCommitOnBranch(\n ctx: SignedCommitCtx,\n repo: string,\n branch: string,\n expectedHeadOid: string,\n headline: string,\n body: string,\n changes: FileChanges,\n): Promise<{ oid: string; url: string }> {\n const payload = JSON.stringify({\n query: CREATE_COMMIT_MUTATION,\n variables: {\n input: {\n branch: { repositoryNameWithOwner: repo, branchName: branch },\n expectedHeadOid,\n message: { headline, body },\n fileChanges: changes,\n },\n },\n });\n\n const res = await execGhWithRetry(\n [\"api\", \"graphql\", \"--input\", \"-\"],\n {\n cwd: ctx.cwd,\n input: payload,\n env: ghTokenEnv(ctx.token),\n // Bound each attempt so a stalled connection can't hang the tool forever.\n timeoutMs: GH_GRAPHQL_TIMEOUT_MS,\n },\n { maxAttempts: 3 },\n );\n if (res.exitCode !== 0) {\n throw new Error(\n `createCommitOnBranch failed: ${res.stderr || res.error || res.stdout}`,\n );\n }\n\n let parsed: {\n data?: { createCommitOnBranch?: { commit?: { oid: string; url: string } } };\n errors?: unknown;\n };\n try {\n parsed = JSON.parse(res.stdout);\n } catch {\n throw new Error(\n `createCommitOnBranch returned non-JSON: ${res.stdout.slice(0, 500)}`,\n );\n }\n if (parsed.errors) {\n throw new Error(\n `createCommitOnBranch errors: ${JSON.stringify(parsed.errors)}`,\n );\n }\n const commit = parsed.data?.createCommitOnBranch?.commit;\n if (!commit?.oid) {\n throw new Error(`createCommitOnBranch returned no commit: ${res.stdout}`);\n }\n return commit;\n}\n\nasync function syncLocalCheckout(\n ctx: SignedCommitCtx,\n branch: string,\n newOid: string,\n): Promise<void> {\n // Fetch the new tip object, point the local branch + HEAD at it, and reset\n // the index — all without touching the working tree, so unstaged work the\n // agent intends for a later commit is preserved. Best-effort: the commit is\n // already on the remote, and the next call re-resolves the tip via ls-remote,\n // so a sync failure isn't fatal — but warn rather than swallow it silently,\n // since a stale local checkout is otherwise painful to diagnose.\n const steps: [string, string[]][] = [\n [\"fetch\", [\"fetch\", \"--no-tags\", \"origin\", branch]],\n [\"update-ref\", [\"update-ref\", `refs/heads/${branch}`, newOid]],\n [\"symbolic-ref\", [\"symbolic-ref\", \"HEAD\", `refs/heads/${branch}`]],\n [\"reset\", [\"reset\", \"-q\"]],\n ];\n for (const [label, args] of steps) {\n const r = await runGit(args, ctx.cwd);\n if (r.exitCode !== 0) {\n process.stderr.write(\n `[signed-commit] local sync step '${label}' failed after committing ${newOid}: ${r.stderr.trim()}\\n`,\n );\n }\n }\n}\n\nexport async function createSignedCommit(\n ctx: SignedCommitCtx,\n input: SignedCommitInput,\n): Promise<SignedCommitResult> {\n // Repo (from origin remote) and branch (from HEAD) are independent reads.\n const [repo, branch] = await Promise.all([\n resolveRepoNameWithOwner(ctx),\n resolveBranchName(ctx, input),\n ]);\n\n if (input.paths && input.paths.length > 0) {\n const r = await runGit([\"add\", \"--\", ...input.paths], ctx.cwd);\n if (r.exitCode !== 0) {\n throw new Error(`git add failed: ${r.stderr.trim()}`);\n }\n }\n\n let tip = await remoteTip(ctx, branch);\n if (tip === null) {\n // New branch: create it from the local HEAD, which is already present —\n // no fetch needed to diff against it.\n const baseSha = await gitText([\"rev-parse\", \"HEAD\"], ctx.cwd);\n await createRef(ctx, repo, branch, baseSha);\n tip = baseSha;\n } else {\n // Existing branch: make its tip object local so the staged diff (and any\n // later reset) can resolve it.\n await runGit([\"fetch\", \"--no-tags\", \"origin\", branch], ctx.cwd);\n }\n\n const changes = await buildFileChanges(ctx, tip);\n if (changes.additions.length === 0 && changes.deletions.length === 0) {\n throw new Error(\n \"No staged changes to commit. Stage files with `git add` first (or pass `paths`).\",\n );\n }\n\n const chunks = chunkFileChanges(changes, DEFAULT_MAX_PAYLOAD_BYTES);\n const body = [input.body, buildPostHogTrailers(ctx.taskId).join(\"\\n\")]\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n const commits: { sha: string; url: string }[] = [];\n let expectedHeadOid = tip;\n for (let i = 0; i < chunks.length; i++) {\n const headline =\n chunks.length > 1\n ? `${input.message} — part ${i + 1}/${chunks.length}`\n : input.message;\n const commit = await createCommitOnBranch(\n ctx,\n repo,\n branch,\n expectedHeadOid,\n headline,\n body,\n chunks[i],\n );\n commits.push({ sha: commit.oid, url: commit.url });\n expectedHeadOid = commit.oid;\n }\n\n await syncLocalCheckout(ctx, branch, expectedHeadOid);\n return { branch, commits };\n}\n","/** Maps `items` through `mapper` with at most `concurrency` in flight, preserving\n * input order. Stops early if `options.signal` aborts. */\nexport async function mapWithConcurrency<T, R>(\n items: readonly T[],\n concurrency: number,\n mapper: (item: T) => Promise<R>,\n options?: { signal?: AbortSignal },\n): Promise<R[]> {\n if (items.length === 0) return [];\n const results = new Array<R>(items.length);\n let index = 0;\n const worker = async () => {\n while (index < items.length) {\n if (options?.signal?.aborted) return;\n const i = index++;\n results[i] = await mapper(items[i]);\n }\n };\n await Promise.all(\n Array.from({ length: Math.min(concurrency, items.length) }, () => worker()),\n );\n return results;\n}\n","// Namespace import (not `{ execFile }`) so the renderer's browser bundle can\n// resolve this node-only module against vite's `__vite-browser-external` stub,\n// which has no named exports. execGh never runs in the browser.\nimport * as childProcess from \"node:child_process\";\n\nexport interface GhExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n error?: string;\n}\n\nexport interface GhExecOptions {\n cwd?: string;\n env?: Record<string, string>;\n /**\n * Written to the child's stdin and then closed. Use with `gh api graphql\n * --input -` (or `gh api --input -`) to pass a JSON request body so complex\n * GraphQL variables are sent as real objects rather than `-F` string scalars.\n */\n input?: string;\n /**\n * Kill the `gh` subprocess after this many ms. Without it a stalled network\n * call (the symptom behind GitHub's `HTTP 499`) hangs the caller — and any\n * MCP tool awaiting it — indefinitely. Omit for no timeout.\n */\n timeoutMs?: number;\n}\n\nexport function execGh(\n args: string[],\n options: GhExecOptions = {},\n): Promise<GhExecResult> {\n const env = options.env ? { ...process.env, ...options.env } : process.env;\n\n return new Promise<GhExecResult>((resolve) => {\n const child = childProcess.execFile(\n \"gh\",\n args,\n { cwd: options.cwd, env, timeout: options.timeoutMs ?? 0 },\n (error, stdout, stderr) => {\n if (!error) {\n resolve({ stdout, stderr, exitCode: 0 });\n return;\n }\n\n const err = error as Error & {\n code?: number | string;\n killed?: boolean;\n stdout?: string;\n stderr?: string;\n };\n // execFile kills the child on timeout (`killed` set, `code` null);\n // surface a recognizable message so retries treat it as transient.\n const timedOut = err.killed === true && !!options.timeoutMs;\n const exitCode =\n typeof err.code === \"number\"\n ? err.code\n : err.code === \"ENOENT\"\n ? 127\n : 1;\n\n resolve({\n stdout: stdout ?? err.stdout ?? \"\",\n stderr: stderr ?? err.stderr ?? \"\",\n exitCode,\n error: timedOut\n ? `gh timed out after ${options.timeoutMs}ms`\n : err.message,\n });\n },\n );\n\n if (options.input !== undefined) {\n child.stdin?.end(options.input);\n }\n });\n}\n\n// Failures worth retrying: server-side blips (5xx), the proxy \"client closed\"\n// 499 we kept hitting from sandboxes, our own timeout, and transport-level\n// network errors. Deterministic failures (auth, 404, 422, GraphQL validation)\n// are intentionally excluded — retrying them only wastes time.\nconst TRANSIENT_GH_PATTERNS: readonly RegExp[] = [\n /HTTP 5\\d\\d/,\n /HTTP 499/,\n /\\btimed out\\b/i,\n /\\bETIMEDOUT\\b/,\n /\\bECONNRESET\\b/,\n /\\bECONNREFUSED\\b/,\n /\\bEAI_AGAIN\\b/,\n /connection reset/i,\n];\n\nexport function isTransientGhFailure(res: GhExecResult): boolean {\n if (res.exitCode === 0) {\n return false;\n }\n const text = `${res.stderr} ${res.error ?? \"\"} ${res.stdout}`;\n return TRANSIENT_GH_PATTERNS.some((re) => re.test(text));\n}\n\nexport interface GhRetryOptions {\n maxAttempts?: number;\n /** Base backoff; attempt N waits `backoffMs * 2^(N-2)` before retrying. */\n backoffMs?: number;\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Runs `execGh`, retrying only on transient failures with exponential backoff.\n * `exec` is injectable for tests; production callers use the default.\n */\nexport async function execGhWithRetry(\n args: string[],\n options: GhExecOptions = {},\n retry: GhRetryOptions = {},\n exec: typeof execGh = execGh,\n): Promise<GhExecResult> {\n const maxAttempts = retry.maxAttempts ?? 3;\n const backoffMs = retry.backoffMs ?? 500;\n\n let res = await exec(args, options);\n for (\n let attempt = 2;\n attempt <= maxAttempts && isTransientGhFailure(res);\n attempt++\n ) {\n await sleep(backoffMs * 2 ** (attempt - 2));\n res = await exec(args, options);\n }\n return res;\n}\n","// Standalone (no git-saga / simple-git imports) so signed-commit.ts can append\n// PostHog trailers without dragging the heavy git machinery into bundles that\n// reach it (e.g. the renderer's browser build).\nexport function buildPostHogTrailers(taskId?: string): string[] {\n const trailers = [\"Generated-By: PostHog Code\"];\n if (taskId) trailers.push(`Task-Id: ${taskId}`);\n return trailers;\n}\n","// Namespace import (not `{ execFile }`) so modules that transitively reach this\n// file stay bundle-safe for the renderer's browser build, where node builtins\n// resolve to vite's `__vite-browser-external` stub (no named exports).\nimport * as childProcess from \"node:child_process\";\nimport * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport gitUrlParse from \"git-url-parse\";\n\nexport type GitHubUrl =\n | { kind: \"repo\"; owner: string; repo: string }\n | { kind: \"issue\"; owner: string; repo: string; number: number }\n | { kind: \"pr\"; owner: string; repo: string; number: number };\n\nexport async function safeSymlink(\n source: string,\n target: string,\n type: \"file\" | \"dir\",\n): Promise<boolean> {\n if (path.resolve(source) === path.resolve(target)) {\n return false;\n }\n\n const sourceDir = path.dirname(path.resolve(source));\n const targetDir = path.dirname(path.resolve(target));\n if (\n sourceDir === targetDir &&\n path.basename(source) === path.basename(target)\n ) {\n return false;\n }\n\n try {\n await fs.access(source);\n } catch {\n return false;\n }\n\n try {\n if (os.platform() === \"win32\") {\n // On Windows, skip symlinks entirely — they need admin/Developer Mode.\n // Use junctions for directories and hard links for files instead,\n // matching the approach used by pnpm, Deno, and npm.\n if (type === \"dir\") {\n await fs.symlink(source, target, \"junction\");\n } else {\n try {\n await fs.link(source, target);\n } catch {\n // Hard link can fail across drives — copy as last resort\n await fs.copyFile(source, target);\n }\n }\n } else {\n await fs.symlink(source, target, type);\n }\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * copy file or directory, use copy-on-write, fall back to cp\n */\nexport async function clonePath(\n source: string,\n destination: string,\n): Promise<boolean> {\n try {\n await fs.access(source);\n } catch {\n return false;\n }\n\n const parentDir = path.dirname(destination);\n await fs.mkdir(parentDir, { recursive: true });\n\n const platform = os.platform();\n\n try {\n if (platform === \"darwin\") {\n await execFileAsync(\"cp\", [\"-c\", \"-a\", source, destination]);\n } else {\n await execFileAsync(\"cp\", [\"--reflink=auto\", \"-a\", source, destination]);\n }\n return true;\n } catch {\n // CoW not supported, fall back to regular copy\n }\n\n await fs.cp(source, destination, { recursive: true });\n return true;\n}\n\nfunction execFileAsync(\n command: string,\n args: string[],\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n childProcess.execFile(command, args, (error, stdout, stderr) => {\n if (error) {\n reject(error);\n return;\n }\n resolve({ stdout, stderr });\n });\n });\n}\n\nasync function chmodTreeWritable(target: string): Promise<void> {\n let stat: import(\"node:fs\").Stats;\n try {\n stat = await fs.lstat(target);\n } catch {\n return;\n }\n if (stat.isSymbolicLink()) return;\n try {\n await fs.chmod(target, stat.isDirectory() ? 0o700 : 0o600);\n } catch (error) {\n console.warn(`forceRemove: chmod failed on ${target}`, error);\n }\n if (!stat.isDirectory()) return;\n let entries: string[];\n try {\n entries = await fs.readdir(target);\n } catch (error) {\n console.warn(`forceRemove: readdir failed on ${target}`, error);\n return;\n }\n await Promise.all(\n entries.map((entry) => chmodTreeWritable(path.join(target, entry))),\n );\n}\n\n/**\n * Recursively remove a path, retrying after chmod'ing the tree writable when\n * the kernel rejects the initial removal with EACCES/EPERM. Worktrees commonly\n * contain read-only subtrees populated by Go's module cache (which marks every\n * cached directory mode 0555); plain `fs.rm` cannot unlink entries from those\n * parents until we restore the write bit.\n */\nexport async function forceRemove(target: string): Promise<void> {\n try {\n await fs.rm(target, { recursive: true, force: true, maxRetries: 3 });\n return;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EACCES\" && code !== \"EPERM\") throw error;\n }\n await chmodTreeWritable(target);\n await fs.rm(target, { recursive: true, force: true, maxRetries: 3 });\n}\n\nexport function parseGithubUrl(\n url: string | null | undefined,\n): GitHubUrl | null {\n if (!url) return null;\n let parsed: gitUrlParse.GitUrl;\n try {\n parsed = gitUrlParse(url.trim());\n } catch {\n return null;\n }\n // git-url-parse normalizes source to github.com for any *.github.com host,\n // so check resource to reject api.github.com etc. SSH uses ssh.github.com.\n const resource = parsed.resource.toLowerCase();\n if (resource !== \"github.com\" && resource !== \"ssh.github.com\") return null;\n\n // Read pathname directly: git-url-parse keeps /pull/N in full_name but\n // strips /issues/N, and stuffs unknown path segments into owner. Pathname\n // is consistent across HTTPS, SSH, and shorthand inputs.\n const raw = parsed.pathname.split(\"/\");\n if (raw[0] !== \"\") return null;\n const parts = raw[raw.length - 1] === \"\" ? raw.slice(1, -1) : raw.slice(1);\n if (parts.length < 2 || parts.some((p) => p === \"\")) return null;\n const [owner, repoRaw, segment, num] = parts;\n const repo = repoRaw.replace(/\\.git$/, \"\");\n\n if (segment === \"issues\" || segment === \"pull\") {\n const number = Number(num);\n if (!Number.isInteger(number) || number <= 0) return null;\n return {\n kind: segment === \"pull\" ? \"pr\" : \"issue\",\n owner,\n repo,\n number,\n };\n }\n\n return { kind: \"repo\", owner, repo };\n}\n","import { readGithubTokenFromEnv } from \"@posthog/git/signed-commit\";\nimport 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 const ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;\n\n/**\n * A cloud sandbox run, as opposed to a local desktop session. `taskRunId` is\n * used by both desktop and cloud for persistence, so it must not imply cloud.\n */\nexport function isCloudRun(\n meta: { environment?: \"local\" | \"cloud\" } | undefined,\n): boolean {\n if (meta?.environment) {\n return meta.environment === \"cloud\";\n }\n return !!process.env.IS_SANDBOX;\n}\n\n/** The GitHub token available to the sandbox, if any. */\nexport function resolveGithubToken(): string | undefined {\n return readGithubTokenFromEnv();\n}\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 {\n createSignedCommit,\n type SignedCommitCtx,\n type SignedCommitInput,\n type SignedCommitResult,\n} from \"@posthog/git/signed-commit\";\nimport { z } from \"zod\";\nimport { qualifiedLocalToolName } from \"./local-tools/registry\";\n\n/**\n * Shared definitions for the `git_signed_commit` tool, used by the local-tools\n * registry entry (which both adapters expose) so the tool name, schema,\n * description, and result formatting can't drift. The qualified name also\n * appears in the cloud system prompt and the PreToolUse guard message.\n */\n\nexport const SIGNED_COMMIT_TOOL_NAME = \"git_signed_commit\";\nexport const SIGNED_COMMIT_QUALIFIED_TOOL_NAME = qualifiedLocalToolName(\n SIGNED_COMMIT_TOOL_NAME,\n);\n\nexport const SIGNED_COMMIT_TOOL_DESCRIPTION =\n \"Create a GitHub-signed (Verified) commit on the branch. Stage files with `git add` \" +\n \"first (or pass `paths`), then call this instead of `git commit`/`git push` — those are \" +\n \"blocked because all commits must be signed. The commit is created via GitHub's API and \" +\n \"your local checkout is kept in sync. For a new branch, pass `branch` (prefixed with \" +\n \"`posthog-code/`) and the tool creates it on the remote.\";\n\nexport const signedCommitToolSchema = {\n message: z.string().describe(\"Commit headline (first line).\"),\n body: z.string().optional().describe(\"Optional extended commit body.\"),\n branch: z\n .string()\n .optional()\n .describe(\n \"Target branch; defaults to the current branch. Use a posthog-code/ prefix for new branches.\",\n ),\n paths: z\n .array(z.string())\n .optional()\n .describe(\n \"Files to stage before committing; defaults to already-staged files.\",\n ),\n};\n\nexport function formatSignedCommitResult(result: SignedCommitResult): string {\n const list = result.commits.map((c) => `- ${c.sha} ${c.url}`).join(\"\\n\");\n return `Created ${result.commits.length} signed commit(s) on ${result.branch}:\\n${list}`;\n}\n\nexport interface SignedCommitToolResult {\n content: { type: \"text\"; text: string }[];\n isError?: true;\n // Both SDKs' CallToolResult carries an open `_meta`/index signature; mirror it\n // so this shape is assignable to either adapter's tool-handler return type.\n [key: string]: unknown;\n}\n\n/**\n * Runs `git_signed_commit` and formats the MCP result. Shared by the Claude\n * in-process tool and the Codex stdio server so success/error formatting (and\n * the error-message prefix) can't drift between adapters.\n */\nexport async function runSignedCommitTool(\n ctx: SignedCommitCtx,\n args: SignedCommitInput,\n): Promise<SignedCommitToolResult> {\n try {\n const result = await createSignedCommit(ctx, args);\n return {\n content: [{ type: \"text\", text: formatSignedCommitResult(result) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n { type: \"text\", text: `${SIGNED_COMMIT_TOOL_NAME} failed: ${message}` },\n ],\n isError: true,\n };\n }\n}\n","import type { z } from \"zod\";\n\n/**\n * A single general-purpose local MCP server hosts every tool registered here,\n * for both adapters: the Claude in-process SDK server and the Codex stdio\n * server. Adding a tool means adding one entry to `LOCAL_TOOLS` (see\n * `./index.ts`) — no per-tool server file or adapter wiring. The name appears\n * in tool ids as `mcp__posthog-local__<tool>`.\n */\nexport const LOCAL_TOOLS_MCP_NAME = \"posthog-local\";\n\n/** Runtime context handed to every local tool's handler and gate. */\nexport interface LocalToolCtx {\n cwd: string;\n /** GitHub token available to the sandbox, if any. */\n token?: string;\n taskId?: string;\n}\n\n/** Minimal session-meta shape needed to gate tools (e.g. cloud-only). */\nexport interface LocalToolGateMeta {\n environment?: \"local\" | \"cloud\";\n}\n\n/**\n * MCP tool result shape. Carries an open index signature so the value is\n * assignable to either SDK's `CallToolResult` (the Claude SDK and the MCP SDK\n * both attach an open `_meta`).\n */\nexport interface LocalToolResult {\n content: { type: \"text\"; text: string }[];\n isError?: true;\n [key: string]: unknown;\n}\n\n/** Tool definition with its input schema's type preserved for the handler. */\nexport interface LocalToolDef<S extends z.ZodRawShape> {\n name: string;\n description: string;\n schema: S;\n /**\n * Keep the tool visible even though MCP tools are offloaded behind ToolSearch\n * by default in the Claude adapter (ENABLE_TOOL_SEARCH). Ignored by Codex.\n */\n alwaysLoad?: boolean;\n isEnabled(ctx: LocalToolCtx, meta: LocalToolGateMeta | undefined): boolean;\n handler(\n ctx: LocalToolCtx,\n args: z.infer<z.ZodObject<S>>,\n ): Promise<LocalToolResult>;\n}\n\n/** Schema-erased tool, the shape stored in the registry array. */\nexport interface LocalTool {\n name: string;\n description: string;\n schema: z.ZodRawShape;\n alwaysLoad?: boolean;\n isEnabled(ctx: LocalToolCtx, meta: LocalToolGateMeta | undefined): boolean;\n handler(\n ctx: LocalToolCtx,\n args: Record<string, unknown>,\n ): Promise<LocalToolResult>;\n}\n\n/**\n * Registers a tool, preserving its schema's inferred type at the definition\n * site. The returned value erases the schema generic so tools of different\n * shapes can live in one array; the cast is sound because both MCP SDKs\n * validate `args` against `schema` before dispatching to the handler.\n */\nexport function defineLocalTool<S extends z.ZodRawShape>(\n def: LocalToolDef<S>,\n): LocalTool {\n return def as unknown as LocalTool;\n}\n\n/** The qualified tool id as the model and tool guards see it. */\nexport function qualifiedLocalToolName(toolName: string): string {\n return `mcp__${LOCAL_TOOLS_MCP_NAME}__${toolName}`;\n}\n","import { isCloudRun } from \"../../../utils/common\";\nimport {\n runSignedCommitTool,\n SIGNED_COMMIT_TOOL_DESCRIPTION,\n SIGNED_COMMIT_TOOL_NAME,\n signedCommitToolSchema,\n} from \"../../signed-commit-shared\";\nimport { defineLocalTool } from \"../registry\";\n\n/**\n * `git_signed_commit` as a local tool. Cloud runs only, and only when a GitHub\n * token is available (the commit is created via GitHub's API, which also signs\n * it). Committing is core to cloud tasks, so keep it visible past ToolSearch.\n */\nexport const signedCommitTool = defineLocalTool({\n name: SIGNED_COMMIT_TOOL_NAME,\n description: SIGNED_COMMIT_TOOL_DESCRIPTION,\n schema: signedCommitToolSchema,\n alwaysLoad: true,\n isEnabled: (ctx, meta) => isCloudRun(meta) && !!ctx.token,\n handler: (ctx, args) =>\n runSignedCommitTool(\n { cwd: ctx.cwd, token: ctx.token ?? \"\", taskId: ctx.taskId },\n args,\n ),\n});\n","import type { LocalTool, LocalToolCtx, LocalToolGateMeta } from \"./registry\";\nimport { signedCommitTool } from \"./tools/signed-commit\";\n\nexport {\n LOCAL_TOOLS_MCP_NAME,\n type LocalTool,\n type LocalToolCtx,\n type LocalToolGateMeta,\n type LocalToolResult,\n qualifiedLocalToolName,\n} from \"./registry\";\n\n/** Every tool the general local MCP server can expose. Add new tools here. */\nexport const LOCAL_TOOLS: LocalTool[] = [signedCommitTool];\n\n/** Tools whose gate passes for the given context — the set to actually expose. */\nexport function enabledLocalTools(\n ctx: LocalToolCtx,\n meta: LocalToolGateMeta | undefined,\n): LocalTool[] {\n return LOCAL_TOOLS.filter((t) => t.isEnabled(ctx, meta));\n}\n"],"mappings":"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","names":["require_lib","parsed","a","parseUrl","throwErr","parsed","require_lib","require_lib","require_lib","gitUrlParse","childProcess","resolve","childProcess","parsed","gitUrlParse","path","resolve","ctx","parsed","ctx","ctx"]}
package/dist/agent.js CHANGED
@@ -4674,7 +4674,7 @@ import { v7 as uuidv7 } from "uuid";
4674
4674
  // package.json
4675
4675
  var package_default = {
4676
4676
  name: "@posthog/agent",
4677
- version: "2.3.663",
4677
+ version: "2.3.670",
4678
4678
  repository: "https://github.com/PostHog/code",
4679
4679
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
4680
4680
  exports: {
@@ -9397,7 +9397,10 @@ async function withTimeout(operation, timeoutMs) {
9397
9397
  var IS_ROOT = typeof process !== "undefined" && (process.geteuid?.() ?? process.getuid?.()) === 0;
9398
9398
  var ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;
9399
9399
  function isCloudRun(meta) {
9400
- return !!process.env.IS_SANDBOX || !!meta?.taskRunId;
9400
+ if (meta?.environment) {
9401
+ return meta.environment === "cloud";
9402
+ }
9403
+ return !!process.env.IS_SANDBOX;
9401
9404
  }
9402
9405
  function resolveGithubToken() {
9403
9406
  return readGithubTokenFromEnv();