@tridha643/hestia 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICES.md +10 -0
- package/README.md +194 -0
- package/dist/assets/portless/dist/chunk-SD2PIWJU.js +1030 -0
- package/dist/assets/portless/dist/cli.d.ts +1 -0
- package/dist/assets/portless/dist/cli.js +7231 -0
- package/dist/assets/portless/dist/index.d.ts +222 -0
- package/dist/assets/portless/dist/index.js +48 -0
- package/dist/assets/portless/hestia-hardening.patch +177 -0
- package/dist/assets/portless/package.json +63 -0
- package/dist/assets/portless/provenance.json +5 -0
- package/dist/cli.js +16396 -0
- package/dist/cli.js.map +146 -0
- package/dist/daemon.js +13785 -0
- package/dist/daemon.js.map +129 -0
- package/dist/proc-relay.js +117 -0
- package/dist/proc-relay.js.map +10 -0
- package/package.json +49 -0
- package/skills/hestia/SKILL.md +148 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/visit.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/directives.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/anchors.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/applyReviver.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/toJS.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Node.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Alias.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/createNode.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Collection.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyComment.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/foldFlowLines.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyString.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringify.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyPair.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/log.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/merge.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/addPairToJSMap.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Pair.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyCollection.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLMap.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/map.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLSeq.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/seq.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/string.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/null.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/bool.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyNumber.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/float.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/int.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/schema.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/json/schema.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/binary.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/pairs.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/omap.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/bool.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/float.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/int.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/set.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/schema.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/tags.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/Schema.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyDocument.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/errors.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-props.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-contains-newline.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-flow-indent-check.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-map-includes.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-map.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-seq.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-collection.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-scalar.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-scalar.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-empty-scalar-position.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/composer.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-scalar.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-visit.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/lexer.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/line-counter.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/parser.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/public-api.js", "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/index.js", "../packages/core/src/types.ts", "../packages/core/src/naming.ts", "../packages/core/src/index.ts", "../packages/engine/src/config.ts", "../packages/engine/src/git.ts", "../packages/engine/src/atomic-json-file.ts", "../packages/engine/src/proc/pidfile.ts", "../packages/engine/src/state.ts", "../packages/engine/src/wrangler/discover.ts", "../packages/engine/src/compose/override.ts", "../packages/engine/src/repository-config.ts", "../packages/engine/src/discovery.ts", "../packages/engine/src/endpoint-resolution.ts", "../packages/engine/src/compose/cli.ts", "../packages/engine/src/proc/lock.ts", "../packages/engine/src/proc/ports.ts", "../packages/engine/src/proc/shutdown.ts", "../packages/engine/src/proc/resolver.ts", "../packages/engine/src/proc/supervisor.ts", "../packages/engine/src/router/router-config.ts", "../packages/engine/src/daemon/slots.ts", "../packages/engine/src/daemon/client.ts", "../packages/engine/src/daemon/launchd.ts", "../packages/engine/src/daemon/routes.ts", "../packages/engine/src/daemon/ensure.ts", "../packages/engine/src/router/portless-payload.ts", "../packages/engine/src/router/portless-adapter.ts", "../packages/engine/src/router/local-http-router.ts", "../packages/engine/src/wrangler/adapter.ts", "../packages/engine/src/wrangler/verify.ts", "../packages/engine/src/tunnel/cloudflared.ts", "../packages/engine/src/tunnel/ingress.ts", "../packages/engine/src/tunnel/verify.ts", "../packages/engine/src/tunnel/registry.ts", "../packages/engine/src/logs/log-line-bounds.ts", "../packages/engine/src/logs/compose.ts", "../packages/engine/src/logs/tail.ts", "../packages/engine/src/logs/stream.ts", "../packages/engine/src/doctor.ts", "../packages/engine/src/daemon/fleet-monitor.ts", "../packages/engine/src/init-config.ts", "../packages/engine/src/index.ts", "../packages/tui/src/log-reconnect-deduper.ts", "../packages/tui/src/fleet-source.ts", "../packages/tui/src/fleet-controller.ts", "../packages/tui/src/terminal-text.ts", "../packages/tui/src/fleet-theme.ts", "../node_modules/.bun/ansi-regex@6.2.2/node_modules/ansi-regex/index.js", "../node_modules/.bun/strip-ansi@7.1.2/node_modules/strip-ansi/index.js", "../node_modules/.bun/get-east-asian-width@1.6.0/node_modules/get-east-asian-width/lookup-data.js", "../node_modules/.bun/get-east-asian-width@1.6.0/node_modules/get-east-asian-width/utilities.js", "../node_modules/.bun/get-east-asian-width@1.6.0/node_modules/get-east-asian-width/lookup.js", "../node_modules/.bun/get-east-asian-width@1.6.0/node_modules/get-east-asian-width/index.js", "../node_modules/.bun/emoji-regex@10.6.0/node_modules/emoji-regex/index.mjs", "../node_modules/.bun/string-width@7.2.0/node_modules/string-width/index.js", "../packages/tui/src/fleet-text.ts", "../packages/tui/src/components/StackSidebar.tsx", "../packages/tui/src/components/ServicePane.tsx", "../packages/tui/src/components/LogPane.tsx", "../packages/tui/src/components/FleetModal.tsx", "../packages/tui/src/FleetApp.tsx", "../packages/tui/src/job-control.ts", "../packages/tui/src/runtime.tsx", "../packages/tui/src/index.ts", "../packages/cli/src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"'use strict';\n\nconst ALIAS = Symbol.for('yaml.alias');\nconst DOC = Symbol.for('yaml.document');\nconst MAP = Symbol.for('yaml.map');\nconst PAIR = Symbol.for('yaml.pair');\nconst SCALAR = Symbol.for('yaml.scalar');\nconst SEQ = Symbol.for('yaml.seq');\nconst NODE_TYPE = Symbol.for('yaml.node.type');\nconst isAlias = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === ALIAS;\nconst isDocument = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === DOC;\nconst isMap = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === MAP;\nconst isPair = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === PAIR;\nconst isScalar = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SCALAR;\nconst isSeq = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SEQ;\nfunction isCollection(node) {\n if (node && typeof node === 'object')\n switch (node[NODE_TYPE]) {\n case MAP:\n case SEQ:\n return true;\n }\n return false;\n}\nfunction isNode(node) {\n if (node && typeof node === 'object')\n switch (node[NODE_TYPE]) {\n case ALIAS:\n case MAP:\n case SCALAR:\n case SEQ:\n return true;\n }\n return false;\n}\nconst hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor;\n\nexports.ALIAS = ALIAS;\nexports.DOC = DOC;\nexports.MAP = MAP;\nexports.NODE_TYPE = NODE_TYPE;\nexports.PAIR = PAIR;\nexports.SCALAR = SCALAR;\nexports.SEQ = SEQ;\nexports.hasAnchor = hasAnchor;\nexports.isAlias = isAlias;\nexports.isCollection = isCollection;\nexports.isDocument = isDocument;\nexports.isMap = isMap;\nexports.isNode = isNode;\nexports.isPair = isPair;\nexports.isScalar = isScalar;\nexports.isSeq = isSeq;\n",
|
|
6
|
+
"'use strict';\n\nvar identity = require('./nodes/identity.js');\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove node');\n/**\n * Apply a visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n * - `key`: For sequence values and map `Pair`, the node's index in the\n * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n * `null` for the root node.\n * - `node`: The current node.\n * - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this node, continue with next\n * sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current node, then continue with the next one\n * - `Node`: Replace the current node, then continue by visiting it\n * - `number`: While iterating the items of a sequence or map, set the index\n * of the next step. This is useful especially if the index of the current\n * node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nfunction visit(node, visitor) {\n const visitor_ = initVisitor(visitor);\n if (identity.isDocument(node)) {\n const cd = visit_(null, node.contents, visitor_, Object.freeze([node]));\n if (cd === REMOVE)\n node.contents = null;\n }\n else\n visit_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisit.SKIP = SKIP;\n/** Remove the current node */\nvisit.REMOVE = REMOVE;\nfunction visit_(key, node, visitor, path) {\n const ctrl = callVisitor(key, node, visitor, path);\n if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n replaceNode(key, path, ctrl);\n return visit_(key, ctrl, visitor, path);\n }\n if (typeof ctrl !== 'symbol') {\n if (identity.isCollection(node)) {\n path = Object.freeze(path.concat(node));\n for (let i = 0; i < node.items.length; ++i) {\n const ci = visit_(i, node.items[i], visitor, path);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n node.items.splice(i, 1);\n i -= 1;\n }\n }\n }\n else if (identity.isPair(node)) {\n path = Object.freeze(path.concat(node));\n const ck = visit_('key', node.key, visitor, path);\n if (ck === BREAK)\n return BREAK;\n else if (ck === REMOVE)\n node.key = null;\n const cv = visit_('value', node.value, visitor, path);\n if (cv === BREAK)\n return BREAK;\n else if (cv === REMOVE)\n node.value = null;\n }\n }\n return ctrl;\n}\n/**\n * Apply an async visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n * - `key`: For sequence values and map `Pair`, the node's index in the\n * collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n * `null` for the root node.\n * - `node`: The current node.\n * - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `Promise`: Must resolve to one of the following values\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this node, continue with next\n * sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current node, then continue with the next one\n * - `Node`: Replace the current node, then continue by visiting it\n * - `number`: While iterating the items of a sequence or map, set the index\n * of the next step. This is useful especially if the index of the current\n * node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nasync function visitAsync(node, visitor) {\n const visitor_ = initVisitor(visitor);\n if (identity.isDocument(node)) {\n const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node]));\n if (cd === REMOVE)\n node.contents = null;\n }\n else\n await visitAsync_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisitAsync.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisitAsync.SKIP = SKIP;\n/** Remove the current node */\nvisitAsync.REMOVE = REMOVE;\nasync function visitAsync_(key, node, visitor, path) {\n const ctrl = await callVisitor(key, node, visitor, path);\n if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n replaceNode(key, path, ctrl);\n return visitAsync_(key, ctrl, visitor, path);\n }\n if (typeof ctrl !== 'symbol') {\n if (identity.isCollection(node)) {\n path = Object.freeze(path.concat(node));\n for (let i = 0; i < node.items.length; ++i) {\n const ci = await visitAsync_(i, node.items[i], visitor, path);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n node.items.splice(i, 1);\n i -= 1;\n }\n }\n }\n else if (identity.isPair(node)) {\n path = Object.freeze(path.concat(node));\n const ck = await visitAsync_('key', node.key, visitor, path);\n if (ck === BREAK)\n return BREAK;\n else if (ck === REMOVE)\n node.key = null;\n const cv = await visitAsync_('value', node.value, visitor, path);\n if (cv === BREAK)\n return BREAK;\n else if (cv === REMOVE)\n node.value = null;\n }\n }\n return ctrl;\n}\nfunction initVisitor(visitor) {\n if (typeof visitor === 'object' &&\n (visitor.Collection || visitor.Node || visitor.Value)) {\n return Object.assign({\n Alias: visitor.Node,\n Map: visitor.Node,\n Scalar: visitor.Node,\n Seq: visitor.Node\n }, visitor.Value && {\n Map: visitor.Value,\n Scalar: visitor.Value,\n Seq: visitor.Value\n }, visitor.Collection && {\n Map: visitor.Collection,\n Seq: visitor.Collection\n }, visitor);\n }\n return visitor;\n}\nfunction callVisitor(key, node, visitor, path) {\n if (typeof visitor === 'function')\n return visitor(key, node, path);\n if (identity.isMap(node))\n return visitor.Map?.(key, node, path);\n if (identity.isSeq(node))\n return visitor.Seq?.(key, node, path);\n if (identity.isPair(node))\n return visitor.Pair?.(key, node, path);\n if (identity.isScalar(node))\n return visitor.Scalar?.(key, node, path);\n if (identity.isAlias(node))\n return visitor.Alias?.(key, node, path);\n return undefined;\n}\nfunction replaceNode(key, path, node) {\n const parent = path[path.length - 1];\n if (identity.isCollection(parent)) {\n parent.items[key] = node;\n }\n else if (identity.isPair(parent)) {\n if (key === 'key')\n parent.key = node;\n else\n parent.value = node;\n }\n else if (identity.isDocument(parent)) {\n parent.contents = node;\n }\n else {\n const pt = identity.isAlias(parent) ? 'alias' : 'scalar';\n throw new Error(`Cannot replace node with ${pt} parent`);\n }\n}\n\nexports.visit = visit;\nexports.visitAsync = visitAsync;\n",
|
|
7
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar visit = require('../visit.js');\n\nconst escapeChars = {\n '!': '%21',\n ',': '%2C',\n '[': '%5B',\n ']': '%5D',\n '{': '%7B',\n '}': '%7D'\n};\nconst escapeTagName = (tn) => tn.replace(/[!,[\\]{}]/g, ch => escapeChars[ch]);\nclass Directives {\n constructor(yaml, tags) {\n /**\n * The directives-end/doc-start marker `---`. If `null`, a marker may still be\n * included in the document's stringified representation.\n */\n this.docStart = null;\n /** The doc-end marker `...`. */\n this.docEnd = false;\n this.yaml = Object.assign({}, Directives.defaultYaml, yaml);\n this.tags = Object.assign({}, Directives.defaultTags, tags);\n }\n clone() {\n const copy = new Directives(this.yaml, this.tags);\n copy.docStart = this.docStart;\n return copy;\n }\n /**\n * During parsing, get a Directives instance for the current document and\n * update the stream state according to the current version's spec.\n */\n atDocument() {\n const res = new Directives(this.yaml, this.tags);\n switch (this.yaml.version) {\n case '1.1':\n this.atNextDocument = true;\n break;\n case '1.2':\n this.atNextDocument = false;\n this.yaml = {\n explicit: Directives.defaultYaml.explicit,\n version: '1.2'\n };\n this.tags = Object.assign({}, Directives.defaultTags);\n break;\n }\n return res;\n }\n /**\n * @param onError - May be called even if the action was successful\n * @returns `true` on success\n */\n add(line, onError) {\n if (this.atNextDocument) {\n this.yaml = { explicit: Directives.defaultYaml.explicit, version: '1.1' };\n this.tags = Object.assign({}, Directives.defaultTags);\n this.atNextDocument = false;\n }\n const parts = line.trim().split(/[ \\t]+/);\n const name = parts.shift();\n switch (name) {\n case '%TAG': {\n if (parts.length !== 2) {\n onError(0, '%TAG directive should contain exactly two parts');\n if (parts.length < 2)\n return false;\n }\n const [handle, prefix] = parts;\n this.tags[handle] = prefix;\n return true;\n }\n case '%YAML': {\n this.yaml.explicit = true;\n if (parts.length !== 1) {\n onError(0, '%YAML directive should contain exactly one part');\n return false;\n }\n const [version] = parts;\n if (version === '1.1' || version === '1.2') {\n this.yaml.version = version;\n return true;\n }\n else {\n const isValid = /^\\d+\\.\\d+$/.test(version);\n onError(6, `Unsupported YAML version ${version}`, isValid);\n return false;\n }\n }\n default:\n onError(0, `Unknown directive ${name}`, true);\n return false;\n }\n }\n /**\n * Resolves a tag, matching handles to those defined in %TAG directives.\n *\n * @returns Resolved tag, which may also be the non-specific tag `'!'` or a\n * `'!local'` tag, or `null` if unresolvable.\n */\n tagName(source, onError) {\n if (source === '!')\n return '!'; // non-specific tag\n if (source[0] !== '!') {\n onError(`Not a valid tag: ${source}`);\n return null;\n }\n if (source[1] === '<') {\n const verbatim = source.slice(2, -1);\n if (verbatim === '!' || verbatim === '!!') {\n onError(`Verbatim tags aren't resolved, so ${source} is invalid.`);\n return null;\n }\n if (source[source.length - 1] !== '>')\n onError('Verbatim tags must end with a >');\n return verbatim;\n }\n const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/s);\n if (!suffix)\n onError(`The ${source} tag has no suffix`);\n const prefix = this.tags[handle];\n if (prefix) {\n try {\n return prefix + decodeURIComponent(suffix);\n }\n catch (error) {\n onError(String(error));\n return null;\n }\n }\n if (handle === '!')\n return source; // local tag\n onError(`Could not resolve tag: ${source}`);\n return null;\n }\n /**\n * Given a fully resolved tag, returns its printable string form,\n * taking into account current tag prefixes and defaults.\n */\n tagString(tag) {\n for (const [handle, prefix] of Object.entries(this.tags)) {\n if (tag.startsWith(prefix))\n return handle + escapeTagName(tag.substring(prefix.length));\n }\n return tag[0] === '!' ? tag : `!<${tag}>`;\n }\n toString(doc) {\n const lines = this.yaml.explicit\n ? [`%YAML ${this.yaml.version || '1.2'}`]\n : [];\n const tagEntries = Object.entries(this.tags);\n let tagNames;\n if (doc && tagEntries.length > 0 && identity.isNode(doc.contents)) {\n const tags = {};\n visit.visit(doc.contents, (_key, node) => {\n if (identity.isNode(node) && node.tag)\n tags[node.tag] = true;\n });\n tagNames = Object.keys(tags);\n }\n else\n tagNames = [];\n for (const [handle, prefix] of tagEntries) {\n if (handle === '!!' && prefix === 'tag:yaml.org,2002:')\n continue;\n if (!doc || tagNames.some(tn => tn.startsWith(prefix)))\n lines.push(`%TAG ${handle} ${prefix}`);\n }\n return lines.join('\\n');\n }\n}\nDirectives.defaultYaml = { explicit: false, version: '1.2' };\nDirectives.defaultTags = { '!!': 'tag:yaml.org,2002:' };\n\nexports.Directives = Directives;\n",
|
|
8
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar visit = require('../visit.js');\n\n/**\n * Verify that the input string is a valid anchor.\n *\n * Will throw on errors.\n */\nfunction anchorIsValid(anchor) {\n if (/[\\x00-\\x19\\s,[\\]{}]/.test(anchor)) {\n const sa = JSON.stringify(anchor);\n const msg = `Anchor must not contain whitespace or control characters: ${sa}`;\n throw new Error(msg);\n }\n return true;\n}\nfunction anchorNames(root) {\n const anchors = new Set();\n visit.visit(root, {\n Value(_key, node) {\n if (node.anchor)\n anchors.add(node.anchor);\n }\n });\n return anchors;\n}\n/** Find a new anchor name with the given `prefix` and a one-indexed suffix. */\nfunction findNewAnchor(prefix, exclude) {\n for (let i = 1; true; ++i) {\n const name = `${prefix}${i}`;\n if (!exclude.has(name))\n return name;\n }\n}\nfunction createNodeAnchors(doc, prefix) {\n const aliasObjects = [];\n const sourceObjects = new Map();\n let prevAnchors = null;\n return {\n onAnchor: (source) => {\n aliasObjects.push(source);\n prevAnchors ?? (prevAnchors = anchorNames(doc));\n const anchor = findNewAnchor(prefix, prevAnchors);\n prevAnchors.add(anchor);\n return anchor;\n },\n /**\n * With circular references, the source node is only resolved after all\n * of its child nodes are. This is why anchors are set only after all of\n * the nodes have been created.\n */\n setAnchors: () => {\n for (const source of aliasObjects) {\n const ref = sourceObjects.get(source);\n if (typeof ref === 'object' &&\n ref.anchor &&\n (identity.isScalar(ref.node) || identity.isCollection(ref.node))) {\n ref.node.anchor = ref.anchor;\n }\n else {\n const error = new Error('Failed to resolve repeated object (this should not happen)');\n error.source = source;\n throw error;\n }\n }\n },\n sourceObjects\n };\n}\n\nexports.anchorIsValid = anchorIsValid;\nexports.anchorNames = anchorNames;\nexports.createNodeAnchors = createNodeAnchors;\nexports.findNewAnchor = findNewAnchor;\n",
|
|
9
|
+
"'use strict';\n\n/**\n * Applies the JSON.parse reviver algorithm as defined in the ECMA-262 spec,\n * in section 24.5.1.1 \"Runtime Semantics: InternalizeJSONProperty\" of the\n * 2021 edition: https://tc39.es/ecma262/#sec-json.parse\n *\n * Includes extensions for handling Map and Set objects.\n */\nfunction applyReviver(reviver, obj, key, val) {\n if (val && typeof val === 'object') {\n if (Array.isArray(val)) {\n for (let i = 0, len = val.length; i < len; ++i) {\n const v0 = val[i];\n const v1 = applyReviver(reviver, val, String(i), v0);\n // eslint-disable-next-line @typescript-eslint/no-array-delete\n if (v1 === undefined)\n delete val[i];\n else if (v1 !== v0)\n val[i] = v1;\n }\n }\n else if (val instanceof Map) {\n for (const k of Array.from(val.keys())) {\n const v0 = val.get(k);\n const v1 = applyReviver(reviver, val, k, v0);\n if (v1 === undefined)\n val.delete(k);\n else if (v1 !== v0)\n val.set(k, v1);\n }\n }\n else if (val instanceof Set) {\n for (const v0 of Array.from(val)) {\n const v1 = applyReviver(reviver, val, v0, v0);\n if (v1 === undefined)\n val.delete(v0);\n else if (v1 !== v0) {\n val.delete(v0);\n val.add(v1);\n }\n }\n }\n else {\n for (const [k, v0] of Object.entries(val)) {\n const v1 = applyReviver(reviver, val, k, v0);\n if (v1 === undefined)\n delete val[k];\n else if (v1 !== v0)\n val[k] = v1;\n }\n }\n }\n return reviver.call(obj, key, val);\n}\n\nexports.applyReviver = applyReviver;\n",
|
|
10
|
+
"'use strict';\n\nvar identity = require('./identity.js');\n\n/**\n * Recursively convert any node or its contents to native JavaScript\n *\n * @param value - The input value\n * @param arg - If `value` defines a `toJSON()` method, use this\n * as its first argument\n * @param ctx - Conversion context, originally set in Document#toJS(). If\n * `{ keep: true }` is not set, output should be suitable for JSON\n * stringification.\n */\nfunction toJS(value, arg, ctx) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n if (Array.isArray(value))\n return value.map((v, i) => toJS(v, String(i), ctx));\n if (value && typeof value.toJSON === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n if (!ctx || !identity.hasAnchor(value))\n return value.toJSON(arg, ctx);\n const data = { aliasCount: 0, count: 1, res: undefined };\n ctx.anchors.set(value, data);\n ctx.onCreate = res => {\n data.res = res;\n delete ctx.onCreate;\n };\n const res = value.toJSON(arg, ctx);\n if (ctx.onCreate)\n ctx.onCreate(res);\n return res;\n }\n if (typeof value === 'bigint' && !ctx?.keep)\n return Number(value);\n return value;\n}\n\nexports.toJS = toJS;\n",
|
|
11
|
+
"'use strict';\n\nvar applyReviver = require('../doc/applyReviver.js');\nvar identity = require('./identity.js');\nvar toJS = require('./toJS.js');\n\nclass NodeBase {\n constructor(type) {\n Object.defineProperty(this, identity.NODE_TYPE, { value: type });\n }\n /** Create a copy of this node. */\n clone() {\n const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /** A plain JavaScript representation of this node. */\n toJS(doc, { mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {\n if (!identity.isDocument(doc))\n throw new TypeError('A document argument is required');\n const ctx = {\n anchors: new Map(),\n doc,\n keep: true,\n mapAsMap: mapAsMap === true,\n mapKeyWarned: false,\n maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100\n };\n const res = toJS.toJS(this, '', ctx);\n if (typeof onAnchor === 'function')\n for (const { count, res } of ctx.anchors.values())\n onAnchor(res, count);\n return typeof reviver === 'function'\n ? applyReviver.applyReviver(reviver, { '': res }, '', res)\n : res;\n }\n}\n\nexports.NodeBase = NodeBase;\n",
|
|
12
|
+
"'use strict';\n\nvar anchors = require('../doc/anchors.js');\nvar visit = require('../visit.js');\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\nvar toJS = require('./toJS.js');\n\nclass Alias extends Node.NodeBase {\n constructor(source) {\n super(identity.ALIAS);\n this.source = source;\n Object.defineProperty(this, 'tag', {\n set() {\n throw new Error('Alias nodes cannot have tags');\n }\n });\n }\n /**\n * Resolve the value of this alias within `doc`, finding the last\n * instance of the `source` anchor before this node.\n */\n resolve(doc, ctx) {\n if (ctx?.maxAliasCount === 0)\n throw new ReferenceError('Alias resolution is disabled');\n let nodes;\n if (ctx?.aliasResolveCache) {\n nodes = ctx.aliasResolveCache;\n }\n else {\n nodes = [];\n visit.visit(doc, {\n Node: (_key, node) => {\n if (identity.isAlias(node) || identity.hasAnchor(node))\n nodes.push(node);\n }\n });\n if (ctx)\n ctx.aliasResolveCache = nodes;\n }\n let found = undefined;\n for (const node of nodes) {\n if (node === this)\n break;\n if (node.anchor === this.source)\n found = node;\n }\n return found;\n }\n toJSON(_arg, ctx) {\n if (!ctx)\n return { source: this.source };\n const { anchors, doc, maxAliasCount } = ctx;\n const source = this.resolve(doc, ctx);\n if (!source) {\n const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;\n throw new ReferenceError(msg);\n }\n let data = anchors.get(source);\n if (!data) {\n // Resolve anchors for Node.prototype.toJS()\n toJS.toJS(source, null, ctx);\n data = anchors.get(source);\n }\n /* istanbul ignore if */\n if (data?.res === undefined) {\n const msg = 'This should not happen: Alias anchor was not resolved?';\n throw new ReferenceError(msg);\n }\n if (maxAliasCount >= 0) {\n data.count += 1;\n if (data.aliasCount === 0)\n data.aliasCount = getAliasCount(doc, source, anchors);\n if (data.count * data.aliasCount > maxAliasCount) {\n const msg = 'Excessive alias count indicates a resource exhaustion attack';\n throw new ReferenceError(msg);\n }\n }\n return data.res;\n }\n toString(ctx, _onComment, _onChompKeep) {\n const src = `*${this.source}`;\n if (ctx) {\n anchors.anchorIsValid(this.source);\n if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) {\n const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;\n throw new Error(msg);\n }\n if (ctx.implicitKey)\n return `${src} `;\n }\n return src;\n }\n}\nfunction getAliasCount(doc, node, anchors) {\n if (identity.isAlias(node)) {\n const source = node.resolve(doc);\n const anchor = anchors && source && anchors.get(source);\n return anchor ? anchor.count * anchor.aliasCount : 0;\n }\n else if (identity.isCollection(node)) {\n let count = 0;\n for (const item of node.items) {\n const c = getAliasCount(doc, item, anchors);\n if (c > count)\n count = c;\n }\n return count;\n }\n else if (identity.isPair(node)) {\n const kc = getAliasCount(doc, node.key, anchors);\n const vc = getAliasCount(doc, node.value, anchors);\n return Math.max(kc, vc);\n }\n return 1;\n}\n\nexports.Alias = Alias;\n",
|
|
13
|
+
"'use strict';\n\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\nvar toJS = require('./toJS.js');\n\nconst isScalarValue = (value) => !value || (typeof value !== 'function' && typeof value !== 'object');\nclass Scalar extends Node.NodeBase {\n constructor(value) {\n super(identity.SCALAR);\n this.value = value;\n }\n toJSON(arg, ctx) {\n return ctx?.keep ? this.value : toJS.toJS(this.value, arg, ctx);\n }\n toString() {\n return String(this.value);\n }\n}\nScalar.BLOCK_FOLDED = 'BLOCK_FOLDED';\nScalar.BLOCK_LITERAL = 'BLOCK_LITERAL';\nScalar.PLAIN = 'PLAIN';\nScalar.QUOTE_DOUBLE = 'QUOTE_DOUBLE';\nScalar.QUOTE_SINGLE = 'QUOTE_SINGLE';\n\nexports.Scalar = Scalar;\nexports.isScalarValue = isScalarValue;\n",
|
|
14
|
+
"'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\n\nconst defaultTagPrefix = 'tag:yaml.org,2002:';\nfunction findTagObject(value, tagName, tags) {\n if (tagName) {\n const match = tags.filter(t => t.tag === tagName);\n const tagObj = match.find(t => !t.format) ?? match[0];\n if (!tagObj)\n throw new Error(`Tag ${tagName} not found`);\n return tagObj;\n }\n return tags.find(t => t.identify?.(value) && !t.format);\n}\nfunction createNode(value, tagName, ctx) {\n if (identity.isDocument(value))\n value = value.contents;\n if (identity.isNode(value))\n return value;\n if (identity.isPair(value)) {\n const map = ctx.schema[identity.MAP].createNode?.(ctx.schema, null, ctx);\n map.items.push(value);\n return map;\n }\n if (value instanceof String ||\n value instanceof Number ||\n value instanceof Boolean ||\n (typeof BigInt !== 'undefined' && value instanceof BigInt) // not supported everywhere\n ) {\n // https://tc39.es/ecma262/#sec-serializejsonproperty\n value = value.valueOf();\n }\n const { aliasDuplicateObjects, onAnchor, onTagObj, schema, sourceObjects } = ctx;\n // Detect duplicate references to the same object & use Alias nodes for all\n // after first. The `ref` wrapper allows for circular references to resolve.\n let ref = undefined;\n if (aliasDuplicateObjects && value && typeof value === 'object') {\n ref = sourceObjects.get(value);\n if (ref) {\n ref.anchor ?? (ref.anchor = onAnchor(value));\n return new Alias.Alias(ref.anchor);\n }\n else {\n ref = { anchor: null, node: null };\n sourceObjects.set(value, ref);\n }\n }\n if (tagName?.startsWith('!!'))\n tagName = defaultTagPrefix + tagName.slice(2);\n let tagObj = findTagObject(value, tagName, schema.tags);\n if (!tagObj) {\n if (value && typeof value.toJSON === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n value = value.toJSON();\n }\n if (!value || typeof value !== 'object') {\n const node = new Scalar.Scalar(value);\n if (ref)\n ref.node = node;\n return node;\n }\n tagObj =\n value instanceof Map\n ? schema[identity.MAP]\n : Symbol.iterator in Object(value)\n ? schema[identity.SEQ]\n : schema[identity.MAP];\n }\n if (onTagObj) {\n onTagObj(tagObj);\n delete ctx.onTagObj;\n }\n const node = tagObj?.createNode\n ? tagObj.createNode(ctx.schema, value, ctx)\n : typeof tagObj?.nodeClass?.from === 'function'\n ? tagObj.nodeClass.from(ctx.schema, value, ctx)\n : new Scalar.Scalar(value);\n if (tagName)\n node.tag = tagName;\n else if (!tagObj.default)\n node.tag = tagObj.tag;\n if (ref)\n ref.node = node;\n return node;\n}\n\nexports.createNode = createNode;\n",
|
|
15
|
+
"'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\n\nfunction collectionFromPath(schema, path, value) {\n let v = value;\n for (let i = path.length - 1; i >= 0; --i) {\n const k = path[i];\n if (typeof k === 'number' && Number.isInteger(k) && k >= 0) {\n const a = [];\n a[k] = v;\n v = a;\n }\n else {\n v = new Map([[k, v]]);\n }\n }\n return createNode.createNode(v, undefined, {\n aliasDuplicateObjects: false,\n keepUndefined: false,\n onAnchor: () => {\n throw new Error('This should not happen, please report a bug.');\n },\n schema,\n sourceObjects: new Map()\n });\n}\n// Type guard is intentionally a little wrong so as to be more useful,\n// as it does not cover untypable empty non-string iterables (e.g. []).\nconst isEmptyPath = (path) => path == null ||\n (typeof path === 'object' && !!path[Symbol.iterator]().next().done);\nclass Collection extends Node.NodeBase {\n constructor(type, schema) {\n super(type);\n Object.defineProperty(this, 'schema', {\n value: schema,\n configurable: true,\n enumerable: false,\n writable: true\n });\n }\n /**\n * Create a copy of this collection.\n *\n * @param schema - If defined, overwrites the original's schema\n */\n clone(schema) {\n const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));\n if (schema)\n copy.schema = schema;\n copy.items = copy.items.map(it => identity.isNode(it) || identity.isPair(it) ? it.clone(schema) : it);\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /**\n * Adds a value to the collection. For `!!map` and `!!omap` the value must\n * be a Pair instance or a `{ key, value }` object, which may not have a key\n * that already exists in the map.\n */\n addIn(path, value) {\n if (isEmptyPath(path))\n this.add(value);\n else {\n const [key, ...rest] = path;\n const node = this.get(key, true);\n if (identity.isCollection(node))\n node.addIn(rest, value);\n else if (node === undefined && this.schema)\n this.set(key, collectionFromPath(this.schema, rest, value));\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n }\n /**\n * Removes a value from the collection.\n * @returns `true` if the item was found and removed.\n */\n deleteIn(path) {\n const [key, ...rest] = path;\n if (rest.length === 0)\n return this.delete(key);\n const node = this.get(key, true);\n if (identity.isCollection(node))\n return node.deleteIn(rest);\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n /**\n * Returns item at `key`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n getIn(path, keepScalar) {\n const [key, ...rest] = path;\n const node = this.get(key, true);\n if (rest.length === 0)\n return !keepScalar && identity.isScalar(node) ? node.value : node;\n else\n return identity.isCollection(node) ? node.getIn(rest, keepScalar) : undefined;\n }\n hasAllNullValues(allowScalar) {\n return this.items.every(node => {\n if (!identity.isPair(node))\n return false;\n const n = node.value;\n return (n == null ||\n (allowScalar &&\n identity.isScalar(n) &&\n n.value == null &&\n !n.commentBefore &&\n !n.comment &&\n !n.tag));\n });\n }\n /**\n * Checks if the collection includes a value with the key `key`.\n */\n hasIn(path) {\n const [key, ...rest] = path;\n if (rest.length === 0)\n return this.has(key);\n const node = this.get(key, true);\n return identity.isCollection(node) ? node.hasIn(rest) : false;\n }\n /**\n * Sets a value in this collection. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n setIn(path, value) {\n const [key, ...rest] = path;\n if (rest.length === 0) {\n this.set(key, value);\n }\n else {\n const node = this.get(key, true);\n if (identity.isCollection(node))\n node.setIn(rest, value);\n else if (node === undefined && this.schema)\n this.set(key, collectionFromPath(this.schema, rest, value));\n else\n throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n }\n }\n}\n\nexports.Collection = Collection;\nexports.collectionFromPath = collectionFromPath;\nexports.isEmptyPath = isEmptyPath;\n",
|
|
16
|
+
"'use strict';\n\n/**\n * Stringifies a comment.\n *\n * Empty comment lines are left empty,\n * lines consisting of a single space are replaced by `#`,\n * and all other lines are prefixed with a `#`.\n */\nconst stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, '#');\nfunction indentComment(comment, indent) {\n if (/^\\n+$/.test(comment))\n return comment.substring(1);\n return indent ? comment.replace(/^(?! *$)/gm, indent) : comment;\n}\nconst lineComment = (str, indent, comment) => str.endsWith('\\n')\n ? indentComment(comment, indent)\n : comment.includes('\\n')\n ? '\\n' + indentComment(comment, indent)\n : (str.endsWith(' ') ? '' : ' ') + comment;\n\nexports.indentComment = indentComment;\nexports.lineComment = lineComment;\nexports.stringifyComment = stringifyComment;\n",
|
|
17
|
+
"'use strict';\n\nconst FOLD_FLOW = 'flow';\nconst FOLD_BLOCK = 'block';\nconst FOLD_QUOTED = 'quoted';\n/**\n * Tries to keep input at up to `lineWidth` characters, splitting only on spaces\n * not followed by newlines or spaces unless `mode` is `'quoted'`. Lines are\n * terminated with `\\n` and started with `indent`.\n */\nfunction foldFlowLines(text, indent, mode = 'flow', { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) {\n if (!lineWidth || lineWidth < 0)\n return text;\n if (lineWidth < minContentWidth)\n minContentWidth = 0;\n const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length);\n if (text.length <= endStep)\n return text;\n const folds = [];\n const escapedFolds = {};\n let end = lineWidth - indent.length;\n if (typeof indentAtStart === 'number') {\n if (indentAtStart > lineWidth - Math.max(2, minContentWidth))\n folds.push(0);\n else\n end = lineWidth - indentAtStart;\n }\n let split = undefined;\n let prev = undefined;\n let overflow = false;\n let i = -1;\n let escStart = -1;\n let escEnd = -1;\n if (mode === FOLD_BLOCK) {\n i = consumeMoreIndentedLines(text, i, indent.length);\n if (i !== -1)\n end = i + endStep;\n }\n for (let ch; (ch = text[(i += 1)]);) {\n if (mode === FOLD_QUOTED && ch === '\\\\') {\n escStart = i;\n switch (text[i + 1]) {\n case 'x':\n i += 3;\n break;\n case 'u':\n i += 5;\n break;\n case 'U':\n i += 9;\n break;\n default:\n i += 1;\n }\n escEnd = i;\n }\n if (ch === '\\n') {\n if (mode === FOLD_BLOCK)\n i = consumeMoreIndentedLines(text, i, indent.length);\n end = i + indent.length + endStep;\n split = undefined;\n }\n else {\n if (ch === ' ' &&\n prev &&\n prev !== ' ' &&\n prev !== '\\n' &&\n prev !== '\\t') {\n // space surrounded by non-space can be replaced with newline + indent\n const next = text[i + 1];\n if (next && next !== ' ' && next !== '\\n' && next !== '\\t')\n split = i;\n }\n if (i >= end) {\n if (split) {\n folds.push(split);\n end = split + endStep;\n split = undefined;\n }\n else if (mode === FOLD_QUOTED) {\n // white-space collected at end may stretch past lineWidth\n while (prev === ' ' || prev === '\\t') {\n prev = ch;\n ch = text[(i += 1)];\n overflow = true;\n }\n // Account for newline escape, but don't break preceding escape\n const j = i > escEnd + 1 ? i - 2 : escStart - 1;\n // Bail out if lineWidth & minContentWidth are shorter than an escape string\n if (escapedFolds[j])\n return text;\n folds.push(j);\n escapedFolds[j] = true;\n end = j + endStep;\n split = undefined;\n }\n else {\n overflow = true;\n }\n }\n }\n prev = ch;\n }\n if (overflow && onOverflow)\n onOverflow();\n if (folds.length === 0)\n return text;\n if (onFold)\n onFold();\n let res = text.slice(0, folds[0]);\n for (let i = 0; i < folds.length; ++i) {\n const fold = folds[i];\n const end = folds[i + 1] || text.length;\n if (fold === 0)\n res = `\\n${indent}${text.slice(0, end)}`;\n else {\n if (mode === FOLD_QUOTED && escapedFolds[fold])\n res += `${text[fold]}\\\\`;\n res += `\\n${indent}${text.slice(fold + 1, end)}`;\n }\n }\n return res;\n}\n/**\n * Presumes `i + 1` is at the start of a line\n * @returns index of last newline in more-indented block\n */\nfunction consumeMoreIndentedLines(text, i, indent) {\n let end = i;\n let start = i + 1;\n let ch = text[start];\n while (ch === ' ' || ch === '\\t') {\n if (i < start + indent) {\n ch = text[++i];\n }\n else {\n do {\n ch = text[++i];\n } while (ch && ch !== '\\n');\n end = i;\n start = i + 1;\n ch = text[start];\n }\n }\n return end;\n}\n\nexports.FOLD_BLOCK = FOLD_BLOCK;\nexports.FOLD_FLOW = FOLD_FLOW;\nexports.FOLD_QUOTED = FOLD_QUOTED;\nexports.foldFlowLines = foldFlowLines;\n",
|
|
18
|
+
"'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\nvar foldFlowLines = require('./foldFlowLines.js');\n\nconst getFoldOptions = (ctx, isBlock) => ({\n indentAtStart: isBlock ? ctx.indent.length : ctx.indentAtStart,\n lineWidth: ctx.options.lineWidth,\n minContentWidth: ctx.options.minContentWidth\n});\n// Also checks for lines starting with %, as parsing the output as YAML 1.1 will\n// presume that's starting a new document.\nconst containsDocumentMarker = (str) => /^(%|---|\\.\\.\\.)/m.test(str);\nfunction lineLengthOverLimit(str, lineWidth, indentLength) {\n if (!lineWidth || lineWidth < 0)\n return false;\n const limit = lineWidth - indentLength;\n const strLen = str.length;\n if (strLen <= limit)\n return false;\n for (let i = 0, start = 0; i < strLen; ++i) {\n if (str[i] === '\\n') {\n if (i - start > limit)\n return true;\n start = i + 1;\n if (strLen - start <= limit)\n return false;\n }\n }\n return true;\n}\nfunction doubleQuotedString(value, ctx) {\n const json = JSON.stringify(value);\n if (ctx.options.doubleQuotedAsJSON)\n return json;\n const { implicitKey } = ctx;\n const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength;\n const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '');\n let str = '';\n let start = 0;\n for (let i = 0, ch = json[i]; ch; ch = json[++i]) {\n if (ch === ' ' && json[i + 1] === '\\\\' && json[i + 2] === 'n') {\n // space before newline needs to be escaped to not be folded\n str += json.slice(start, i) + '\\\\ ';\n i += 1;\n start = i;\n ch = '\\\\';\n }\n if (ch === '\\\\')\n switch (json[i + 1]) {\n case 'u':\n {\n str += json.slice(start, i);\n const code = json.substr(i + 2, 4);\n switch (code) {\n case '0000':\n str += '\\\\0';\n break;\n case '0007':\n str += '\\\\a';\n break;\n case '000b':\n str += '\\\\v';\n break;\n case '001b':\n str += '\\\\e';\n break;\n case '0085':\n str += '\\\\N';\n break;\n case '00a0':\n str += '\\\\_';\n break;\n case '2028':\n str += '\\\\L';\n break;\n case '2029':\n str += '\\\\P';\n break;\n default:\n if (code.substr(0, 2) === '00')\n str += '\\\\x' + code.substr(2);\n else\n str += json.substr(i, 6);\n }\n i += 5;\n start = i + 1;\n }\n break;\n case 'n':\n if (implicitKey ||\n json[i + 2] === '\"' ||\n json.length < minMultiLineLength) {\n i += 1;\n }\n else {\n // folding will eat first newline\n str += json.slice(start, i) + '\\n\\n';\n while (json[i + 2] === '\\\\' &&\n json[i + 3] === 'n' &&\n json[i + 4] !== '\"') {\n str += '\\n';\n i += 2;\n }\n str += indent;\n // space after newline needs to be escaped to not be folded\n if (json[i + 2] === ' ')\n str += '\\\\';\n i += 1;\n start = i + 1;\n }\n break;\n default:\n i += 1;\n }\n }\n str = start ? str + json.slice(start) : json;\n return implicitKey\n ? str\n : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_QUOTED, getFoldOptions(ctx, false));\n}\nfunction singleQuotedString(value, ctx) {\n if (ctx.options.singleQuote === false ||\n (ctx.implicitKey && value.includes('\\n')) ||\n /[ \\t]\\n|\\n[ \\t]/.test(value) // single quoted string can't have leading or trailing whitespace around newline\n )\n return doubleQuotedString(value, ctx);\n const indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '');\n const res = \"'\" + value.replace(/'/g, \"''\").replace(/\\n+/g, `$&\\n${indent}`) + \"'\";\n return ctx.implicitKey\n ? res\n : foldFlowLines.foldFlowLines(res, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));\n}\nfunction quotedString(value, ctx) {\n const { singleQuote } = ctx.options;\n let qs;\n if (singleQuote === false)\n qs = doubleQuotedString;\n else {\n const hasDouble = value.includes('\"');\n const hasSingle = value.includes(\"'\");\n if (hasDouble && !hasSingle)\n qs = singleQuotedString;\n else if (hasSingle && !hasDouble)\n qs = doubleQuotedString;\n else\n qs = singleQuote ? singleQuotedString : doubleQuotedString;\n }\n return qs(value, ctx);\n}\n// The negative lookbehind avoids a polynomial search,\n// but isn't supported yet on Safari: https://caniuse.com/js-regexp-lookbehind\nlet blockEndNewlines;\ntry {\n blockEndNewlines = new RegExp('(^|(?<!\\n))\\n+(?!\\n|$)', 'g');\n}\ncatch {\n blockEndNewlines = /\\n+(?!\\n|$)/g;\n}\nfunction blockString({ comment, type, value }, ctx, onComment, onChompKeep) {\n const { blockQuote, commentString, lineWidth } = ctx.options;\n // 1. Block can't end in whitespace unless the last line is non-empty.\n // 2. Strings consisting of only whitespace are best rendered explicitly.\n if (!blockQuote || /\\n[\\t ]+$/.test(value)) {\n return quotedString(value, ctx);\n }\n const indent = ctx.indent ||\n (ctx.forceBlockIndent || containsDocumentMarker(value) ? ' ' : '');\n const literal = blockQuote === 'literal'\n ? true\n : blockQuote === 'folded' || type === Scalar.Scalar.BLOCK_FOLDED\n ? false\n : type === Scalar.Scalar.BLOCK_LITERAL\n ? true\n : !lineLengthOverLimit(value, lineWidth, indent.length);\n if (!value)\n return literal ? '|\\n' : '>\\n';\n // determine chomping from whitespace at value end\n let chomp;\n let endStart;\n for (endStart = value.length; endStart > 0; --endStart) {\n const ch = value[endStart - 1];\n if (ch !== '\\n' && ch !== '\\t' && ch !== ' ')\n break;\n }\n let end = value.substring(endStart);\n const endNlPos = end.indexOf('\\n');\n if (endNlPos === -1) {\n chomp = '-'; // strip\n }\n else if (value === end || endNlPos !== end.length - 1) {\n chomp = '+'; // keep\n if (onChompKeep)\n onChompKeep();\n }\n else {\n chomp = ''; // clip\n }\n if (end) {\n value = value.slice(0, -end.length);\n if (end[end.length - 1] === '\\n')\n end = end.slice(0, -1);\n end = end.replace(blockEndNewlines, `$&${indent}`);\n }\n // determine indent indicator from whitespace at value start\n let startWithSpace = false;\n let startEnd;\n let startNlPos = -1;\n for (startEnd = 0; startEnd < value.length; ++startEnd) {\n const ch = value[startEnd];\n if (ch === ' ')\n startWithSpace = true;\n else if (ch === '\\n')\n startNlPos = startEnd;\n else\n break;\n }\n let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd);\n if (start) {\n value = value.substring(start.length);\n start = start.replace(/\\n+/g, `$&${indent}`);\n }\n const indentSize = indent ? '2' : '1'; // root is at -1\n // Leading | or > is added later\n let header = (startWithSpace ? indentSize : '') + chomp;\n if (comment) {\n header += ' ' + commentString(comment.replace(/ ?[\\r\\n]+/g, ' '));\n if (onComment)\n onComment();\n }\n if (!literal) {\n const foldedValue = value\n .replace(/\\n+/g, '\\n$&')\n .replace(/(?:^|\\n)([\\t ].*)(?:([\\n\\t ]*)\\n(?![\\n\\t ]))?/g, '$1$2') // more-indented lines aren't folded\n // ^ more-ind. ^ empty ^ capture next empty lines only at end of indent\n .replace(/\\n+/g, `$&${indent}`);\n let literalFallback = false;\n const foldOptions = getFoldOptions(ctx, true);\n if (blockQuote !== 'folded' && type !== Scalar.Scalar.BLOCK_FOLDED) {\n foldOptions.onOverflow = () => {\n literalFallback = true;\n };\n }\n const body = foldFlowLines.foldFlowLines(`${start}${foldedValue}${end}`, indent, foldFlowLines.FOLD_BLOCK, foldOptions);\n if (!literalFallback)\n return `>${header}\\n${indent}${body}`;\n }\n value = value.replace(/\\n+/g, `$&${indent}`);\n return `|${header}\\n${indent}${start}${value}${end}`;\n}\nfunction plainString(item, ctx, onComment, onChompKeep) {\n const { type, value } = item;\n const { actualString, implicitKey, indent, indentStep, inFlow } = ctx;\n if ((implicitKey && value.includes('\\n')) ||\n (inFlow && /[[\\]{},]/.test(value))) {\n return quotedString(value, ctx);\n }\n if (/^[\\n\\t ,[\\]{}#&*!|>'\"%@`]|^[?-]$|^[?-][ \\t]|[\\n:][ \\t]|[ \\t]\\n|[\\n\\t ]#|[\\n\\t :]$/.test(value)) {\n // not allowed:\n // - '-' or '?'\n // - start with an indicator character (except [?:-]) or /[?-] /\n // - '\\n ', ': ' or ' \\n' anywhere\n // - '#' not preceded by a non-space char\n // - end with ' ' or ':'\n return implicitKey || inFlow || !value.includes('\\n')\n ? quotedString(value, ctx)\n : blockString(item, ctx, onComment, onChompKeep);\n }\n if (!implicitKey &&\n !inFlow &&\n type !== Scalar.Scalar.PLAIN &&\n value.includes('\\n')) {\n // Where allowed & type not set explicitly, prefer block style for multiline strings\n return blockString(item, ctx, onComment, onChompKeep);\n }\n if (containsDocumentMarker(value)) {\n if (indent === '') {\n ctx.forceBlockIndent = true;\n return blockString(item, ctx, onComment, onChompKeep);\n }\n else if (implicitKey && indent === indentStep) {\n return quotedString(value, ctx);\n }\n }\n const str = value.replace(/\\n+/g, `$&\\n${indent}`);\n // Verify that output will be parsed as a string, as e.g. plain numbers and\n // booleans get parsed with those types in v1.2 (e.g. '42', 'true' & '0.9e-3'),\n // and others in v1.1.\n if (actualString) {\n const test = (tag) => tag.default && tag.tag !== 'tag:yaml.org,2002:str' && tag.test?.test(str);\n const { compat, tags } = ctx.doc.schema;\n if (tags.some(test) || compat?.some(test))\n return quotedString(value, ctx);\n }\n return implicitKey\n ? str\n : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));\n}\nfunction stringifyString(item, ctx, onComment, onChompKeep) {\n const { implicitKey, inFlow } = ctx;\n const ss = typeof item.value === 'string'\n ? item\n : Object.assign({}, item, { value: String(item.value) });\n let { type } = item;\n if (type !== Scalar.Scalar.QUOTE_DOUBLE) {\n // force double quotes on control characters & unpaired surrogates\n if (/[\\x00-\\x08\\x0b-\\x1f\\x7f-\\x9f\\u{D800}-\\u{DFFF}]/u.test(ss.value))\n type = Scalar.Scalar.QUOTE_DOUBLE;\n }\n const _stringify = (_type) => {\n switch (_type) {\n case Scalar.Scalar.BLOCK_FOLDED:\n case Scalar.Scalar.BLOCK_LITERAL:\n return implicitKey || inFlow\n ? quotedString(ss.value, ctx) // blocks are not valid inside flow containers\n : blockString(ss, ctx, onComment, onChompKeep);\n case Scalar.Scalar.QUOTE_DOUBLE:\n return doubleQuotedString(ss.value, ctx);\n case Scalar.Scalar.QUOTE_SINGLE:\n return singleQuotedString(ss.value, ctx);\n case Scalar.Scalar.PLAIN:\n return plainString(ss, ctx, onComment, onChompKeep);\n default:\n return null;\n }\n };\n let res = _stringify(type);\n if (res === null) {\n const { defaultKeyType, defaultStringType } = ctx.options;\n const t = (implicitKey && defaultKeyType) || defaultStringType;\n res = _stringify(t);\n if (res === null)\n throw new Error(`Unsupported default string type ${t}`);\n }\n return res;\n}\n\nexports.stringifyString = stringifyString;\n",
|
|
19
|
+
"'use strict';\n\nvar anchors = require('../doc/anchors.js');\nvar identity = require('../nodes/identity.js');\nvar stringifyComment = require('./stringifyComment.js');\nvar stringifyString = require('./stringifyString.js');\n\nfunction createStringifyContext(doc, options) {\n const opt = Object.assign({\n blockQuote: true,\n commentString: stringifyComment.stringifyComment,\n defaultKeyType: null,\n defaultStringType: 'PLAIN',\n directives: null,\n doubleQuotedAsJSON: false,\n doubleQuotedMinMultiLineLength: 40,\n falseStr: 'false',\n flowCollectionPadding: true,\n indentSeq: true,\n lineWidth: 80,\n minContentWidth: 20,\n nullStr: 'null',\n simpleKeys: false,\n singleQuote: null,\n trailingComma: false,\n trueStr: 'true',\n verifyAliasOrder: true\n }, doc.schema.toStringOptions, options);\n let inFlow;\n switch (opt.collectionStyle) {\n case 'block':\n inFlow = false;\n break;\n case 'flow':\n inFlow = true;\n break;\n default:\n inFlow = null;\n }\n return {\n anchors: new Set(),\n doc,\n flowCollectionPadding: opt.flowCollectionPadding ? ' ' : '',\n indent: '',\n indentStep: typeof opt.indent === 'number' ? ' '.repeat(opt.indent) : ' ',\n inFlow,\n options: opt\n };\n}\nfunction getTagObject(tags, item) {\n if (item.tag) {\n const match = tags.filter(t => t.tag === item.tag);\n if (match.length > 0)\n return match.find(t => t.format === item.format) ?? match[0];\n }\n let tagObj = undefined;\n let obj;\n if (identity.isScalar(item)) {\n obj = item.value;\n let match = tags.filter(t => t.identify?.(obj));\n if (match.length > 1) {\n const testMatch = match.filter(t => t.test);\n if (testMatch.length > 0)\n match = testMatch;\n }\n tagObj =\n match.find(t => t.format === item.format) ?? match.find(t => !t.format);\n }\n else {\n obj = item;\n tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass);\n }\n if (!tagObj) {\n const name = obj?.constructor?.name ?? (obj === null ? 'null' : typeof obj);\n throw new Error(`Tag not resolved for ${name} value`);\n }\n return tagObj;\n}\n// needs to be called before value stringifier to allow for circular anchor refs\nfunction stringifyProps(node, tagObj, { anchors: anchors$1, doc }) {\n if (!doc.directives)\n return '';\n const props = [];\n const anchor = (identity.isScalar(node) || identity.isCollection(node)) && node.anchor;\n if (anchor && anchors.anchorIsValid(anchor)) {\n anchors$1.add(anchor);\n props.push(`&${anchor}`);\n }\n const tag = node.tag ?? (tagObj.default ? null : tagObj.tag);\n if (tag)\n props.push(doc.directives.tagString(tag));\n return props.join(' ');\n}\nfunction stringify(item, ctx, onComment, onChompKeep) {\n if (identity.isPair(item))\n return item.toString(ctx, onComment, onChompKeep);\n if (identity.isAlias(item)) {\n if (ctx.doc.directives)\n return item.toString(ctx);\n if (ctx.resolvedAliases?.has(item)) {\n throw new TypeError(`Cannot stringify circular structure without alias nodes`);\n }\n else {\n if (ctx.resolvedAliases)\n ctx.resolvedAliases.add(item);\n else\n ctx.resolvedAliases = new Set([item]);\n item = item.resolve(ctx.doc);\n }\n }\n let tagObj = undefined;\n const node = identity.isNode(item)\n ? item\n : ctx.doc.createNode(item, { onTagObj: o => (tagObj = o) });\n tagObj ?? (tagObj = getTagObject(ctx.doc.schema.tags, node));\n const props = stringifyProps(node, tagObj, ctx);\n if (props.length > 0)\n ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1;\n const str = typeof tagObj.stringify === 'function'\n ? tagObj.stringify(node, ctx, onComment, onChompKeep)\n : identity.isScalar(node)\n ? stringifyString.stringifyString(node, ctx, onComment, onChompKeep)\n : node.toString(ctx, onComment, onChompKeep);\n if (!props)\n return str;\n return identity.isScalar(node) || str[0] === '{' || str[0] === '['\n ? `${props} ${str}`\n : `${props}\\n${ctx.indent}${str}`;\n}\n\nexports.createStringifyContext = createStringifyContext;\nexports.stringify = stringify;\n",
|
|
20
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyPair({ key, value }, ctx, onComment, onChompKeep) {\n const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx;\n let keyComment = (identity.isNode(key) && key.comment) || null;\n if (simpleKeys) {\n if (keyComment) {\n throw new Error('With simple keys, key nodes cannot have comments');\n }\n if (identity.isCollection(key) || (!identity.isNode(key) && typeof key === 'object')) {\n const msg = 'With simple keys, collection cannot be used as a key value';\n throw new Error(msg);\n }\n }\n let explicitKey = !simpleKeys &&\n (!key ||\n (keyComment && value == null && !ctx.inFlow) ||\n identity.isCollection(key) ||\n (identity.isScalar(key)\n ? key.type === Scalar.Scalar.BLOCK_FOLDED || key.type === Scalar.Scalar.BLOCK_LITERAL\n : typeof key === 'object'));\n ctx = Object.assign({}, ctx, {\n allNullValues: false,\n implicitKey: !explicitKey && (simpleKeys || !allNullValues),\n indent: indent + indentStep\n });\n let keyCommentDone = false;\n let chompKeep = false;\n let str = stringify.stringify(key, ctx, () => (keyCommentDone = true), () => (chompKeep = true));\n if (!explicitKey && !ctx.inFlow && str.length > 1024) {\n if (simpleKeys)\n throw new Error('With simple keys, single line scalar must not span more than 1024 characters');\n explicitKey = true;\n }\n if (ctx.inFlow) {\n if (allNullValues || value == null) {\n if (keyCommentDone && onComment)\n onComment();\n return str === '' ? '?' : explicitKey ? `? ${str}` : str;\n }\n }\n else if ((allNullValues && !simpleKeys) || (value == null && explicitKey)) {\n str = `? ${str}`;\n if (keyComment && !keyCommentDone) {\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n }\n else if (chompKeep && onChompKeep)\n onChompKeep();\n return str;\n }\n if (keyCommentDone)\n keyComment = null;\n if (explicitKey) {\n if (keyComment)\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n str = `? ${str}\\n${indent}:`;\n }\n else {\n str = `${str}:`;\n if (keyComment)\n str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n }\n let vsb, vcb, valueComment;\n if (identity.isNode(value)) {\n vsb = !!value.spaceBefore;\n vcb = value.commentBefore;\n valueComment = value.comment;\n }\n else {\n vsb = false;\n vcb = null;\n valueComment = null;\n if (value && typeof value === 'object')\n value = doc.createNode(value);\n }\n ctx.implicitKey = false;\n if (!explicitKey && !keyComment && identity.isScalar(value))\n ctx.indentAtStart = str.length + 1;\n chompKeep = false;\n if (!indentSeq &&\n indentStep.length >= 2 &&\n !ctx.inFlow &&\n !explicitKey &&\n identity.isSeq(value) &&\n !value.flow &&\n !value.tag &&\n !value.anchor) {\n // If indentSeq === false, consider '- ' as part of indentation where possible\n ctx.indent = ctx.indent.substring(2);\n }\n let valueCommentDone = false;\n const valueStr = stringify.stringify(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true));\n let ws = ' ';\n if (keyComment || vsb || vcb) {\n ws = vsb ? '\\n' : '';\n if (vcb) {\n const cs = commentString(vcb);\n ws += `\\n${stringifyComment.indentComment(cs, ctx.indent)}`;\n }\n if (valueStr === '' && !ctx.inFlow) {\n if (ws === '\\n' && valueComment)\n ws = '\\n\\n';\n }\n else {\n ws += `\\n${ctx.indent}`;\n }\n }\n else if (!explicitKey && identity.isCollection(value)) {\n const vs0 = valueStr[0];\n const nl0 = valueStr.indexOf('\\n');\n const hasNewline = nl0 !== -1;\n const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0;\n if (hasNewline || !flow) {\n let hasPropsLine = false;\n if (hasNewline && (vs0 === '&' || vs0 === '!')) {\n let sp0 = valueStr.indexOf(' ');\n if (vs0 === '&' &&\n sp0 !== -1 &&\n sp0 < nl0 &&\n valueStr[sp0 + 1] === '!') {\n sp0 = valueStr.indexOf(' ', sp0 + 1);\n }\n if (sp0 === -1 || nl0 < sp0)\n hasPropsLine = true;\n }\n if (!hasPropsLine)\n ws = `\\n${ctx.indent}`;\n }\n }\n else if (valueStr === '' || valueStr[0] === '\\n') {\n ws = '';\n }\n str += ws + valueStr;\n if (ctx.inFlow) {\n if (valueCommentDone && onComment)\n onComment();\n }\n else if (valueComment && !valueCommentDone) {\n str += stringifyComment.lineComment(str, ctx.indent, commentString(valueComment));\n }\n else if (chompKeep && onChompKeep) {\n onChompKeep();\n }\n return str;\n}\n\nexports.stringifyPair = stringifyPair;\n",
|
|
21
|
+
"'use strict';\n\nvar node_process = require('process');\n\nfunction debug(logLevel, ...messages) {\n if (logLevel === 'debug')\n console.log(...messages);\n}\nfunction warn(logLevel, warning) {\n if (logLevel === 'debug' || logLevel === 'warn') {\n if (typeof node_process.emitWarning === 'function')\n node_process.emitWarning(warning);\n else\n console.warn(warning);\n }\n}\n\nexports.debug = debug;\nexports.warn = warn;\n",
|
|
22
|
+
"'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Scalar = require('../../nodes/Scalar.js');\n\n// If the value associated with a merge key is a single mapping node, each of\n// its key/value pairs is inserted into the current mapping, unless the key\n// already exists in it. If the value associated with the merge key is a\n// sequence, then this sequence is expected to contain mapping nodes and each\n// of these nodes is merged in turn according to its order in the sequence.\n// Keys in mapping nodes earlier in the sequence override keys specified in\n// later mapping nodes. -- http://yaml.org/type/merge.html\nconst MERGE_KEY = '<<';\nconst merge = {\n identify: value => value === MERGE_KEY ||\n (typeof value === 'symbol' && value.description === MERGE_KEY),\n default: 'key',\n tag: 'tag:yaml.org,2002:merge',\n test: /^<<$/,\n resolve: () => Object.assign(new Scalar.Scalar(Symbol(MERGE_KEY)), {\n addToJSMap: addMergeToJSMap\n }),\n stringify: () => MERGE_KEY\n};\nconst isMergeKey = (ctx, key) => (merge.identify(key) ||\n (identity.isScalar(key) &&\n (!key.type || key.type === Scalar.Scalar.PLAIN) &&\n merge.identify(key.value))) &&\n ctx?.doc.schema.tags.some(tag => tag.tag === merge.tag && tag.default);\nfunction addMergeToJSMap(ctx, map, value) {\n const source = resolveAliasValue(ctx, value);\n if (identity.isSeq(source))\n for (const it of source.items)\n mergeValue(ctx, map, it);\n else if (Array.isArray(source))\n for (const it of source)\n mergeValue(ctx, map, it);\n else\n mergeValue(ctx, map, source);\n}\nfunction mergeValue(ctx, map, value) {\n const source = resolveAliasValue(ctx, value);\n if (!identity.isMap(source))\n throw new Error('Merge sources must be maps or map aliases');\n const srcMap = source.toJSON(null, ctx, Map);\n for (const [key, value] of srcMap) {\n if (map instanceof Map) {\n if (!map.has(key))\n map.set(key, value);\n }\n else if (map instanceof Set) {\n map.add(key);\n }\n else if (!Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(map, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true\n });\n }\n }\n return map;\n}\nfunction resolveAliasValue(ctx, value) {\n return ctx && identity.isAlias(value) ? value.resolve(ctx.doc, ctx) : value;\n}\n\nexports.addMergeToJSMap = addMergeToJSMap;\nexports.isMergeKey = isMergeKey;\nexports.merge = merge;\n",
|
|
23
|
+
"'use strict';\n\nvar log = require('../log.js');\nvar merge = require('../schema/yaml-1.1/merge.js');\nvar stringify = require('../stringify/stringify.js');\nvar identity = require('./identity.js');\nvar toJS = require('./toJS.js');\n\nfunction addPairToJSMap(ctx, map, { key, value }) {\n if (identity.isNode(key) && key.addToJSMap)\n key.addToJSMap(ctx, map, value);\n // TODO: Should drop this special case for bare << handling\n else if (merge.isMergeKey(ctx, key))\n merge.addMergeToJSMap(ctx, map, value);\n else {\n const jsKey = toJS.toJS(key, '', ctx);\n if (map instanceof Map) {\n map.set(jsKey, toJS.toJS(value, jsKey, ctx));\n }\n else if (map instanceof Set) {\n map.add(jsKey);\n }\n else {\n const stringKey = stringifyKey(key, jsKey, ctx);\n const jsValue = toJS.toJS(value, stringKey, ctx);\n if (stringKey in map)\n Object.defineProperty(map, stringKey, {\n value: jsValue,\n writable: true,\n enumerable: true,\n configurable: true\n });\n else\n map[stringKey] = jsValue;\n }\n }\n return map;\n}\nfunction stringifyKey(key, jsKey, ctx) {\n if (jsKey === null)\n return '';\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n if (typeof jsKey !== 'object')\n return String(jsKey);\n if (identity.isNode(key) && ctx?.doc) {\n const strCtx = stringify.createStringifyContext(ctx.doc, {});\n strCtx.anchors = new Set();\n for (const node of ctx.anchors.keys())\n strCtx.anchors.add(node.anchor);\n strCtx.inFlow = true;\n strCtx.inStringifyKey = true;\n const strKey = key.toString(strCtx);\n if (!ctx.mapKeyWarned) {\n let jsonStr = JSON.stringify(strKey);\n if (jsonStr.length > 40)\n jsonStr = jsonStr.substring(0, 36) + '...\"';\n log.warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`);\n ctx.mapKeyWarned = true;\n }\n return strKey;\n }\n return JSON.stringify(jsKey);\n}\n\nexports.addPairToJSMap = addPairToJSMap;\n",
|
|
24
|
+
"'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar stringifyPair = require('../stringify/stringifyPair.js');\nvar addPairToJSMap = require('./addPairToJSMap.js');\nvar identity = require('./identity.js');\n\nfunction createPair(key, value, ctx) {\n const k = createNode.createNode(key, undefined, ctx);\n const v = createNode.createNode(value, undefined, ctx);\n return new Pair(k, v);\n}\nclass Pair {\n constructor(key, value = null) {\n Object.defineProperty(this, identity.NODE_TYPE, { value: identity.PAIR });\n this.key = key;\n this.value = value;\n }\n clone(schema) {\n let { key, value } = this;\n if (identity.isNode(key))\n key = key.clone(schema);\n if (identity.isNode(value))\n value = value.clone(schema);\n return new Pair(key, value);\n }\n toJSON(_, ctx) {\n const pair = ctx?.mapAsMap ? new Map() : {};\n return addPairToJSMap.addPairToJSMap(ctx, pair, this);\n }\n toString(ctx, onComment, onChompKeep) {\n return ctx?.doc\n ? stringifyPair.stringifyPair(this, ctx, onComment, onChompKeep)\n : JSON.stringify(this);\n }\n}\n\nexports.Pair = Pair;\nexports.createPair = createPair;\n",
|
|
25
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyCollection(collection, ctx, options) {\n const flow = ctx.inFlow ?? collection.flow;\n const stringify = flow ? stringifyFlowCollection : stringifyBlockCollection;\n return stringify(collection, ctx, options);\n}\nfunction stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) {\n const { indent, options: { commentString } } = ctx;\n const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null });\n let chompKeep = false; // flag for the preceding node's status\n const lines = [];\n for (let i = 0; i < items.length; ++i) {\n const item = items[i];\n let comment = null;\n if (identity.isNode(item)) {\n if (!chompKeep && item.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, item.commentBefore, chompKeep);\n if (item.comment)\n comment = item.comment;\n }\n else if (identity.isPair(item)) {\n const ik = identity.isNode(item.key) ? item.key : null;\n if (ik) {\n if (!chompKeep && ik.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, ik.commentBefore, chompKeep);\n }\n }\n chompKeep = false;\n let str = stringify.stringify(item, itemCtx, () => (comment = null), () => (chompKeep = true));\n if (comment)\n str += stringifyComment.lineComment(str, itemIndent, commentString(comment));\n if (chompKeep && comment)\n chompKeep = false;\n lines.push(blockItemPrefix + str);\n }\n let str;\n if (lines.length === 0) {\n str = flowChars.start + flowChars.end;\n }\n else {\n str = lines[0];\n for (let i = 1; i < lines.length; ++i) {\n const line = lines[i];\n str += line ? `\\n${indent}${line}` : '\\n';\n }\n }\n if (comment) {\n str += '\\n' + stringifyComment.indentComment(commentString(comment), indent);\n if (onComment)\n onComment();\n }\n else if (chompKeep && onChompKeep)\n onChompKeep();\n return str;\n}\nfunction stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) {\n const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx;\n itemIndent += indentStep;\n const itemCtx = Object.assign({}, ctx, {\n indent: itemIndent,\n inFlow: true,\n type: null\n });\n let reqNewline = false;\n let linesAtValue = 0;\n const lines = [];\n for (let i = 0; i < items.length; ++i) {\n const item = items[i];\n let comment = null;\n if (identity.isNode(item)) {\n if (item.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, item.commentBefore, false);\n if (item.comment)\n comment = item.comment;\n }\n else if (identity.isPair(item)) {\n const ik = identity.isNode(item.key) ? item.key : null;\n if (ik) {\n if (ik.spaceBefore)\n lines.push('');\n addCommentBefore(ctx, lines, ik.commentBefore, false);\n if (ik.comment)\n reqNewline = true;\n }\n const iv = identity.isNode(item.value) ? item.value : null;\n if (iv) {\n if (iv.comment)\n comment = iv.comment;\n if (iv.commentBefore)\n reqNewline = true;\n }\n else if (item.value == null && ik?.comment) {\n comment = ik.comment;\n }\n }\n if (comment)\n reqNewline = true;\n let str = stringify.stringify(item, itemCtx, () => (comment = null));\n reqNewline || (reqNewline = lines.length > linesAtValue || str.includes('\\n'));\n if (i < items.length - 1) {\n str += ',';\n }\n else if (ctx.options.trailingComma) {\n if (ctx.options.lineWidth > 0) {\n reqNewline || (reqNewline = lines.reduce((sum, line) => sum + line.length + 2, 2) +\n (str.length + 2) >\n ctx.options.lineWidth);\n }\n if (reqNewline) {\n str += ',';\n }\n }\n if (comment)\n str += stringifyComment.lineComment(str, itemIndent, commentString(comment));\n lines.push(str);\n linesAtValue = lines.length;\n }\n const { start, end } = flowChars;\n if (lines.length === 0) {\n return start + end;\n }\n else {\n if (!reqNewline) {\n const len = lines.reduce((sum, line) => sum + line.length + 2, 2);\n reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth;\n }\n if (reqNewline) {\n let str = start;\n for (const line of lines)\n str += line ? `\\n${indentStep}${indent}${line}` : '\\n';\n return `${str}\\n${indent}${end}`;\n }\n else {\n return `${start}${fcPadding}${lines.join(' ')}${fcPadding}${end}`;\n }\n }\n}\nfunction addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) {\n if (comment && chompKeep)\n comment = comment.replace(/^\\n+/, '');\n if (comment) {\n const ic = stringifyComment.indentComment(commentString(comment), indent);\n lines.push(ic.trimStart()); // Avoid double indent on first line\n }\n}\n\nexports.stringifyCollection = stringifyCollection;\n",
|
|
26
|
+
"'use strict';\n\nvar stringifyCollection = require('../stringify/stringifyCollection.js');\nvar addPairToJSMap = require('./addPairToJSMap.js');\nvar Collection = require('./Collection.js');\nvar identity = require('./identity.js');\nvar Pair = require('./Pair.js');\nvar Scalar = require('./Scalar.js');\n\nfunction findPair(items, key) {\n const k = identity.isScalar(key) ? key.value : key;\n for (const it of items) {\n if (identity.isPair(it)) {\n if (it.key === key || it.key === k)\n return it;\n if (identity.isScalar(it.key) && it.key.value === k)\n return it;\n }\n }\n return undefined;\n}\nclass YAMLMap extends Collection.Collection {\n static get tagName() {\n return 'tag:yaml.org,2002:map';\n }\n constructor(schema) {\n super(identity.MAP, schema);\n this.items = [];\n }\n /**\n * A generic collection parsing method that can be extended\n * to other node classes that inherit from YAMLMap\n */\n static from(schema, obj, ctx) {\n const { keepUndefined, replacer } = ctx;\n const map = new this(schema);\n const add = (key, value) => {\n if (typeof replacer === 'function')\n value = replacer.call(obj, key, value);\n else if (Array.isArray(replacer) && !replacer.includes(key))\n return;\n if (value !== undefined || keepUndefined)\n map.items.push(Pair.createPair(key, value, ctx));\n };\n if (obj instanceof Map) {\n for (const [key, value] of obj)\n add(key, value);\n }\n else if (obj && typeof obj === 'object') {\n for (const key of Object.keys(obj))\n add(key, obj[key]);\n }\n if (typeof schema.sortMapEntries === 'function') {\n map.items.sort(schema.sortMapEntries);\n }\n return map;\n }\n /**\n * Adds a value to the collection.\n *\n * @param overwrite - If not set `true`, using a key that is already in the\n * collection will throw. Otherwise, overwrites the previous value.\n */\n add(pair, overwrite) {\n let _pair;\n if (identity.isPair(pair))\n _pair = pair;\n else if (!pair || typeof pair !== 'object' || !('key' in pair)) {\n // In TypeScript, this never happens.\n _pair = new Pair.Pair(pair, pair?.value);\n }\n else\n _pair = new Pair.Pair(pair.key, pair.value);\n const prev = findPair(this.items, _pair.key);\n const sortEntries = this.schema?.sortMapEntries;\n if (prev) {\n if (!overwrite)\n throw new Error(`Key ${_pair.key} already set`);\n // For scalars, keep the old node & its comments and anchors\n if (identity.isScalar(prev.value) && Scalar.isScalarValue(_pair.value))\n prev.value.value = _pair.value;\n else\n prev.value = _pair.value;\n }\n else if (sortEntries) {\n const i = this.items.findIndex(item => sortEntries(_pair, item) < 0);\n if (i === -1)\n this.items.push(_pair);\n else\n this.items.splice(i, 0, _pair);\n }\n else {\n this.items.push(_pair);\n }\n }\n delete(key) {\n const it = findPair(this.items, key);\n if (!it)\n return false;\n const del = this.items.splice(this.items.indexOf(it), 1);\n return del.length > 0;\n }\n get(key, keepScalar) {\n const it = findPair(this.items, key);\n const node = it?.value;\n return (!keepScalar && identity.isScalar(node) ? node.value : node) ?? undefined;\n }\n has(key) {\n return !!findPair(this.items, key);\n }\n set(key, value) {\n this.add(new Pair.Pair(key, value), true);\n }\n /**\n * @param ctx - Conversion context, originally set in Document#toJS()\n * @param {Class} Type - If set, forces the returned collection type\n * @returns Instance of Type, Map, or Object\n */\n toJSON(_, ctx, Type) {\n const map = Type ? new Type() : ctx?.mapAsMap ? new Map() : {};\n if (ctx?.onCreate)\n ctx.onCreate(map);\n for (const item of this.items)\n addPairToJSMap.addPairToJSMap(ctx, map, item);\n return map;\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n for (const item of this.items) {\n if (!identity.isPair(item))\n throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`);\n }\n if (!ctx.allNullValues && this.hasAllNullValues(false))\n ctx = Object.assign({}, ctx, { allNullValues: true });\n return stringifyCollection.stringifyCollection(this, ctx, {\n blockItemPrefix: '',\n flowChars: { start: '{', end: '}' },\n itemIndent: ctx.indent || '',\n onChompKeep,\n onComment\n });\n }\n}\n\nexports.YAMLMap = YAMLMap;\nexports.findPair = findPair;\n",
|
|
27
|
+
"'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\n\nconst map = {\n collection: 'map',\n default: true,\n nodeClass: YAMLMap.YAMLMap,\n tag: 'tag:yaml.org,2002:map',\n resolve(map, onError) {\n if (!identity.isMap(map))\n onError('Expected a mapping for this tag');\n return map;\n },\n createNode: (schema, obj, ctx) => YAMLMap.YAMLMap.from(schema, obj, ctx)\n};\n\nexports.map = map;\n",
|
|
28
|
+
"'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar stringifyCollection = require('../stringify/stringifyCollection.js');\nvar Collection = require('./Collection.js');\nvar identity = require('./identity.js');\nvar Scalar = require('./Scalar.js');\nvar toJS = require('./toJS.js');\n\nclass YAMLSeq extends Collection.Collection {\n static get tagName() {\n return 'tag:yaml.org,2002:seq';\n }\n constructor(schema) {\n super(identity.SEQ, schema);\n this.items = [];\n }\n add(value) {\n this.items.push(value);\n }\n /**\n * Removes a value from the collection.\n *\n * `key` must contain a representation of an integer for this to succeed.\n * It may be wrapped in a `Scalar`.\n *\n * @returns `true` if the item was found and removed.\n */\n delete(key) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n return false;\n const del = this.items.splice(idx, 1);\n return del.length > 0;\n }\n get(key, keepScalar) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n return undefined;\n const it = this.items[idx];\n return !keepScalar && identity.isScalar(it) ? it.value : it;\n }\n /**\n * Checks if the collection includes a value with the key `key`.\n *\n * `key` must contain a representation of an integer for this to succeed.\n * It may be wrapped in a `Scalar`.\n */\n has(key) {\n const idx = asItemIndex(key);\n return typeof idx === 'number' && idx < this.items.length;\n }\n /**\n * Sets a value in this collection. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n *\n * If `key` does not contain a representation of an integer, this will throw.\n * It may be wrapped in a `Scalar`.\n */\n set(key, value) {\n const idx = asItemIndex(key);\n if (typeof idx !== 'number')\n throw new Error(`Expected a valid index, not ${key}.`);\n const prev = this.items[idx];\n if (identity.isScalar(prev) && Scalar.isScalarValue(value))\n prev.value = value;\n else\n this.items[idx] = value;\n }\n toJSON(_, ctx) {\n const seq = [];\n if (ctx?.onCreate)\n ctx.onCreate(seq);\n let i = 0;\n for (const item of this.items)\n seq.push(toJS.toJS(item, String(i++), ctx));\n return seq;\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n return stringifyCollection.stringifyCollection(this, ctx, {\n blockItemPrefix: '- ',\n flowChars: { start: '[', end: ']' },\n itemIndent: (ctx.indent || '') + ' ',\n onChompKeep,\n onComment\n });\n }\n static from(schema, obj, ctx) {\n const { replacer } = ctx;\n const seq = new this(schema);\n if (obj && Symbol.iterator in Object(obj)) {\n let i = 0;\n for (let it of obj) {\n if (typeof replacer === 'function') {\n const key = obj instanceof Set ? it : String(i++);\n it = replacer.call(obj, key, it);\n }\n seq.items.push(createNode.createNode(it, undefined, ctx));\n }\n }\n return seq;\n }\n}\nfunction asItemIndex(key) {\n let idx = identity.isScalar(key) ? key.value : key;\n if (idx && typeof idx === 'string')\n idx = Number(idx);\n return typeof idx === 'number' && Number.isInteger(idx) && idx >= 0\n ? idx\n : null;\n}\n\nexports.YAMLSeq = YAMLSeq;\n",
|
|
29
|
+
"'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\n\nconst seq = {\n collection: 'seq',\n default: true,\n nodeClass: YAMLSeq.YAMLSeq,\n tag: 'tag:yaml.org,2002:seq',\n resolve(seq, onError) {\n if (!identity.isSeq(seq))\n onError('Expected a sequence for this tag');\n return seq;\n },\n createNode: (schema, obj, ctx) => YAMLSeq.YAMLSeq.from(schema, obj, ctx)\n};\n\nexports.seq = seq;\n",
|
|
30
|
+
"'use strict';\n\nvar stringifyString = require('../../stringify/stringifyString.js');\n\nconst string = {\n identify: value => typeof value === 'string',\n default: true,\n tag: 'tag:yaml.org,2002:str',\n resolve: str => str,\n stringify(item, ctx, onComment, onChompKeep) {\n ctx = Object.assign({ actualString: true }, ctx);\n return stringifyString.stringifyString(item, ctx, onComment, onChompKeep);\n }\n};\n\nexports.string = string;\n",
|
|
31
|
+
"'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nconst nullTag = {\n identify: value => value == null,\n createNode: () => new Scalar.Scalar(null),\n default: true,\n tag: 'tag:yaml.org,2002:null',\n test: /^(?:~|[Nn]ull|NULL)?$/,\n resolve: () => new Scalar.Scalar(null),\n stringify: ({ source }, ctx) => typeof source === 'string' && nullTag.test.test(source)\n ? source\n : ctx.options.nullStr\n};\n\nexports.nullTag = nullTag;\n",
|
|
32
|
+
"'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nconst boolTag = {\n identify: value => typeof value === 'boolean',\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,\n resolve: str => new Scalar.Scalar(str[0] === 't' || str[0] === 'T'),\n stringify({ source, value }, ctx) {\n if (source && boolTag.test.test(source)) {\n const sv = source[0] === 't' || source[0] === 'T';\n if (value === sv)\n return source;\n }\n return value ? ctx.options.trueStr : ctx.options.falseStr;\n }\n};\n\nexports.boolTag = boolTag;\n",
|
|
33
|
+
"'use strict';\n\nfunction stringifyNumber({ format, minFractionDigits, tag, value }) {\n if (typeof value === 'bigint')\n return String(value);\n const num = typeof value === 'number' ? value : Number(value);\n if (!isFinite(num))\n return isNaN(num) ? '.nan' : num < 0 ? '-.inf' : '.inf';\n let n = Object.is(value, -0) ? '-0' : JSON.stringify(value);\n if (!format &&\n minFractionDigits &&\n (!tag || tag === 'tag:yaml.org,2002:float') &&\n /^-?\\d/.test(n) &&\n !n.includes('e')) {\n let i = n.indexOf('.');\n if (i < 0) {\n i = n.length;\n n += '.';\n }\n let d = minFractionDigits - (n.length - i - 1);\n while (d-- > 0)\n n += '0';\n }\n return n;\n}\n\nexports.stringifyNumber = stringifyNumber;\n",
|
|
34
|
+
"'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst floatNaN = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,\n resolve: str => str.slice(-3).toLowerCase() === 'nan'\n ? NaN\n : str[0] === '-'\n ? Number.NEGATIVE_INFINITY\n : Number.POSITIVE_INFINITY,\n stringify: stringifyNumber.stringifyNumber\n};\nconst floatExp = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'EXP',\n test: /^[-+]?(?:\\.[0-9]+|[0-9]+(?:\\.[0-9]*)?)[eE][-+]?[0-9]+$/,\n resolve: str => parseFloat(str),\n stringify(node) {\n const num = Number(node.value);\n return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node);\n }\n};\nconst float = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^[-+]?(?:\\.[0-9]+|[0-9]+\\.[0-9]*)$/,\n resolve(str) {\n const node = new Scalar.Scalar(parseFloat(str));\n const dot = str.indexOf('.');\n if (dot !== -1 && str[str.length - 1] === '0')\n node.minFractionDigits = str.length - dot - 1;\n return node;\n },\n stringify: stringifyNumber.stringifyNumber\n};\n\nexports.float = float;\nexports.floatExp = floatExp;\nexports.floatNaN = floatNaN;\n",
|
|
35
|
+
"'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value);\nconst intResolve = (str, offset, radix, { intAsBigInt }) => (intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix));\nfunction intStringify(node, radix, prefix) {\n const { value } = node;\n if (intIdentify(value) && value >= 0)\n return prefix + value.toString(radix);\n return stringifyNumber.stringifyNumber(node);\n}\nconst intOct = {\n identify: value => intIdentify(value) && value >= 0,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'OCT',\n test: /^0o[0-7]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt),\n stringify: node => intStringify(node, 8, '0o')\n};\nconst int = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^[-+]?[0-9]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),\n stringify: stringifyNumber.stringifyNumber\n};\nconst intHex = {\n identify: value => intIdentify(value) && value >= 0,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'HEX',\n test: /^0x[0-9a-fA-F]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),\n stringify: node => intStringify(node, 16, '0x')\n};\n\nexports.int = int;\nexports.intHex = intHex;\nexports.intOct = intOct;\n",
|
|
36
|
+
"'use strict';\n\nvar map = require('../common/map.js');\nvar _null = require('../common/null.js');\nvar seq = require('../common/seq.js');\nvar string = require('../common/string.js');\nvar bool = require('./bool.js');\nvar float = require('./float.js');\nvar int = require('./int.js');\n\nconst schema = [\n map.map,\n seq.seq,\n string.string,\n _null.nullTag,\n bool.boolTag,\n int.intOct,\n int.int,\n int.intHex,\n float.floatNaN,\n float.floatExp,\n float.float\n];\n\nexports.schema = schema;\n",
|
|
37
|
+
"'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar map = require('../common/map.js');\nvar seq = require('../common/seq.js');\n\nfunction intIdentify(value) {\n return typeof value === 'bigint' || Number.isInteger(value);\n}\nconst stringifyJSON = ({ value }) => JSON.stringify(value);\nconst jsonScalars = [\n {\n identify: value => typeof value === 'string',\n default: true,\n tag: 'tag:yaml.org,2002:str',\n resolve: str => str,\n stringify: stringifyJSON\n },\n {\n identify: value => value == null,\n createNode: () => new Scalar.Scalar(null),\n default: true,\n tag: 'tag:yaml.org,2002:null',\n test: /^null$/,\n resolve: () => null,\n stringify: stringifyJSON\n },\n {\n identify: value => typeof value === 'boolean',\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^true$|^false$/,\n resolve: str => str === 'true',\n stringify: stringifyJSON\n },\n {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^-?(?:0|[1-9][0-9]*)$/,\n resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10),\n stringify: ({ value }) => intIdentify(value) ? value.toString() : JSON.stringify(value)\n },\n {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,\n resolve: str => parseFloat(str),\n stringify: stringifyJSON\n }\n];\nconst jsonError = {\n default: true,\n tag: '',\n test: /^/,\n resolve(str, onError) {\n onError(`Unresolved plain scalar ${JSON.stringify(str)}`);\n return str;\n }\n};\nconst schema = [map.map, seq.seq].concat(jsonScalars, jsonError);\n\nexports.schema = schema;\n",
|
|
38
|
+
"'use strict';\n\nvar node_buffer = require('buffer');\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyString = require('../../stringify/stringifyString.js');\n\nconst binary = {\n identify: value => value instanceof Uint8Array, // Buffer inherits from Uint8Array\n default: false,\n tag: 'tag:yaml.org,2002:binary',\n /**\n * Returns a Buffer in node and an Uint8Array in browsers\n *\n * To use the resulting buffer as an image, you'll want to do something like:\n *\n * const blob = new Blob([buffer], { type: 'image/jpeg' })\n * document.querySelector('#photo').src = URL.createObjectURL(blob)\n */\n resolve(src, onError) {\n if (typeof node_buffer.Buffer === 'function') {\n return node_buffer.Buffer.from(src, 'base64');\n }\n else if (typeof atob === 'function') {\n // On IE 11, atob() can't handle newlines\n const str = atob(src.replace(/[\\n\\r]/g, ''));\n const buffer = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i)\n buffer[i] = str.charCodeAt(i);\n return buffer;\n }\n else {\n onError('This environment does not support reading binary tags; either Buffer or atob is required');\n return src;\n }\n },\n stringify({ comment, type, value }, ctx, onComment, onChompKeep) {\n if (!value)\n return '';\n const buf = value; // checked earlier by binary.identify()\n let str;\n if (typeof node_buffer.Buffer === 'function') {\n str =\n buf instanceof node_buffer.Buffer\n ? buf.toString('base64')\n : node_buffer.Buffer.from(buf.buffer).toString('base64');\n }\n else if (typeof btoa === 'function') {\n let s = '';\n for (let i = 0; i < buf.length; ++i)\n s += String.fromCharCode(buf[i]);\n str = btoa(s);\n }\n else {\n throw new Error('This environment does not support writing binary tags; either Buffer or btoa is required');\n }\n type ?? (type = Scalar.Scalar.BLOCK_LITERAL);\n if (type !== Scalar.Scalar.QUOTE_DOUBLE) {\n const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth);\n const n = Math.ceil(str.length / lineWidth);\n const lines = new Array(n);\n for (let i = 0, o = 0; i < n; ++i, o += lineWidth) {\n lines[i] = str.substr(o, lineWidth);\n }\n str = lines.join(type === Scalar.Scalar.BLOCK_LITERAL ? '\\n' : ' ');\n }\n return stringifyString.stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep);\n }\n};\n\nexports.binary = binary;\n",
|
|
39
|
+
"'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Pair = require('../../nodes/Pair.js');\nvar Scalar = require('../../nodes/Scalar.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\n\nfunction resolvePairs(seq, onError) {\n if (identity.isSeq(seq)) {\n for (let i = 0; i < seq.items.length; ++i) {\n let item = seq.items[i];\n if (identity.isPair(item))\n continue;\n else if (identity.isMap(item)) {\n if (item.items.length > 1)\n onError('Each pair must have its own sequence indicator');\n const pair = item.items[0] || new Pair.Pair(new Scalar.Scalar(null));\n if (item.commentBefore)\n pair.key.commentBefore = pair.key.commentBefore\n ? `${item.commentBefore}\\n${pair.key.commentBefore}`\n : item.commentBefore;\n if (item.comment) {\n const cn = pair.value ?? pair.key;\n cn.comment = cn.comment\n ? `${item.comment}\\n${cn.comment}`\n : item.comment;\n }\n item = pair;\n }\n seq.items[i] = identity.isPair(item) ? item : new Pair.Pair(item);\n }\n }\n else\n onError('Expected a sequence for this tag');\n return seq;\n}\nfunction createPairs(schema, iterable, ctx) {\n const { replacer } = ctx;\n const pairs = new YAMLSeq.YAMLSeq(schema);\n pairs.tag = 'tag:yaml.org,2002:pairs';\n let i = 0;\n if (iterable && Symbol.iterator in Object(iterable))\n for (let it of iterable) {\n if (typeof replacer === 'function')\n it = replacer.call(iterable, String(i++), it);\n let key, value;\n if (Array.isArray(it)) {\n if (it.length === 2) {\n key = it[0];\n value = it[1];\n }\n else\n throw new TypeError(`Expected [key, value] tuple: ${it}`);\n }\n else if (it && it instanceof Object) {\n const keys = Object.keys(it);\n if (keys.length === 1) {\n key = keys[0];\n value = it[key];\n }\n else {\n throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`);\n }\n }\n else {\n key = it;\n }\n pairs.items.push(Pair.createPair(key, value, ctx));\n }\n return pairs;\n}\nconst pairs = {\n collection: 'seq',\n default: false,\n tag: 'tag:yaml.org,2002:pairs',\n resolve: resolvePairs,\n createNode: createPairs\n};\n\nexports.createPairs = createPairs;\nexports.pairs = pairs;\nexports.resolvePairs = resolvePairs;\n",
|
|
40
|
+
"'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar toJS = require('../../nodes/toJS.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\nvar pairs = require('./pairs.js');\n\nclass YAMLOMap extends YAMLSeq.YAMLSeq {\n constructor() {\n super();\n this.add = YAMLMap.YAMLMap.prototype.add.bind(this);\n this.delete = YAMLMap.YAMLMap.prototype.delete.bind(this);\n this.get = YAMLMap.YAMLMap.prototype.get.bind(this);\n this.has = YAMLMap.YAMLMap.prototype.has.bind(this);\n this.set = YAMLMap.YAMLMap.prototype.set.bind(this);\n this.tag = YAMLOMap.tag;\n }\n /**\n * If `ctx` is given, the return type is actually `Map<unknown, unknown>`,\n * but TypeScript won't allow widening the signature of a child method.\n */\n toJSON(_, ctx) {\n if (!ctx)\n return super.toJSON(_);\n const map = new Map();\n if (ctx?.onCreate)\n ctx.onCreate(map);\n for (const pair of this.items) {\n let key, value;\n if (identity.isPair(pair)) {\n key = toJS.toJS(pair.key, '', ctx);\n value = toJS.toJS(pair.value, key, ctx);\n }\n else {\n key = toJS.toJS(pair, '', ctx);\n }\n if (map.has(key))\n throw new Error('Ordered maps must not include duplicate keys');\n map.set(key, value);\n }\n return map;\n }\n static from(schema, iterable, ctx) {\n const pairs$1 = pairs.createPairs(schema, iterable, ctx);\n const omap = new this();\n omap.items = pairs$1.items;\n return omap;\n }\n}\nYAMLOMap.tag = 'tag:yaml.org,2002:omap';\nconst omap = {\n collection: 'seq',\n identify: value => value instanceof Map,\n nodeClass: YAMLOMap,\n default: false,\n tag: 'tag:yaml.org,2002:omap',\n resolve(seq, onError) {\n const pairs$1 = pairs.resolvePairs(seq, onError);\n const seenKeys = [];\n for (const { key } of pairs$1.items) {\n if (identity.isScalar(key)) {\n if (seenKeys.includes(key.value)) {\n onError(`Ordered maps must not include duplicate keys: ${key.value}`);\n }\n else {\n seenKeys.push(key.value);\n }\n }\n }\n return Object.assign(new YAMLOMap(), pairs$1);\n },\n createNode: (schema, iterable, ctx) => YAMLOMap.from(schema, iterable, ctx)\n};\n\nexports.YAMLOMap = YAMLOMap;\nexports.omap = omap;\n",
|
|
41
|
+
"'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nfunction boolStringify({ value, source }, ctx) {\n const boolObj = value ? trueTag : falseTag;\n if (source && boolObj.test.test(source))\n return source;\n return value ? ctx.options.trueStr : ctx.options.falseStr;\n}\nconst trueTag = {\n identify: value => value === true,\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,\n resolve: () => new Scalar.Scalar(true),\n stringify: boolStringify\n};\nconst falseTag = {\n identify: value => value === false,\n default: true,\n tag: 'tag:yaml.org,2002:bool',\n test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,\n resolve: () => new Scalar.Scalar(false),\n stringify: boolStringify\n};\n\nexports.falseTag = falseTag;\nexports.trueTag = trueTag;\n",
|
|
42
|
+
"'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst floatNaN = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,\n resolve: (str) => str.slice(-3).toLowerCase() === 'nan'\n ? NaN\n : str[0] === '-'\n ? Number.NEGATIVE_INFINITY\n : Number.POSITIVE_INFINITY,\n stringify: stringifyNumber.stringifyNumber\n};\nconst floatExp = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'EXP',\n test: /^[-+]?(?:[0-9][0-9_]*)?(?:\\.[0-9_]*)?[eE][-+]?[0-9]+$/,\n resolve: (str) => parseFloat(str.replace(/_/g, '')),\n stringify(node) {\n const num = Number(node.value);\n return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node);\n }\n};\nconst float = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n test: /^[-+]?(?:[0-9][0-9_]*)?\\.[0-9_]*$/,\n resolve(str) {\n const node = new Scalar.Scalar(parseFloat(str.replace(/_/g, '')));\n const dot = str.indexOf('.');\n if (dot !== -1) {\n const f = str.substring(dot + 1).replace(/_/g, '');\n if (f[f.length - 1] === '0')\n node.minFractionDigits = f.length;\n }\n return node;\n },\n stringify: stringifyNumber.stringifyNumber\n};\n\nexports.float = float;\nexports.floatExp = floatExp;\nexports.floatNaN = floatNaN;\n",
|
|
43
|
+
"'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value);\nfunction intResolve(str, offset, radix, { intAsBigInt }) {\n const sign = str[0];\n if (sign === '-' || sign === '+')\n offset += 1;\n str = str.substring(offset).replace(/_/g, '');\n if (intAsBigInt) {\n switch (radix) {\n case 2:\n str = `0b${str}`;\n break;\n case 8:\n str = `0o${str}`;\n break;\n case 16:\n str = `0x${str}`;\n break;\n }\n const n = BigInt(str);\n return sign === '-' ? BigInt(-1) * n : n;\n }\n const n = parseInt(str, radix);\n return sign === '-' ? -1 * n : n;\n}\nfunction intStringify(node, radix, prefix) {\n const { value } = node;\n if (intIdentify(value)) {\n const str = value.toString(radix);\n return value < 0 ? '-' + prefix + str.substr(1) : prefix + str;\n }\n return stringifyNumber.stringifyNumber(node);\n}\nconst intBin = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'BIN',\n test: /^[-+]?0b[0-1_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt),\n stringify: node => intStringify(node, 2, '0b')\n};\nconst intOct = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'OCT',\n test: /^[-+]?0[0-7_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt),\n stringify: node => intStringify(node, 8, '0')\n};\nconst int = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n test: /^[-+]?[0-9][0-9_]*$/,\n resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),\n stringify: stringifyNumber.stringifyNumber\n};\nconst intHex = {\n identify: intIdentify,\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'HEX',\n test: /^[-+]?0x[0-9a-fA-F_]+$/,\n resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),\n stringify: node => intStringify(node, 16, '0x')\n};\n\nexports.int = int;\nexports.intBin = intBin;\nexports.intHex = intHex;\nexports.intOct = intOct;\n",
|
|
44
|
+
"'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Pair = require('../../nodes/Pair.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\n\nclass YAMLSet extends YAMLMap.YAMLMap {\n constructor(schema) {\n super(schema);\n this.tag = YAMLSet.tag;\n }\n add(key) {\n let pair;\n if (identity.isPair(key))\n pair = key;\n else if (key &&\n typeof key === 'object' &&\n 'key' in key &&\n 'value' in key &&\n key.value === null)\n pair = new Pair.Pair(key.key, null);\n else\n pair = new Pair.Pair(key, null);\n const prev = YAMLMap.findPair(this.items, pair.key);\n if (!prev)\n this.items.push(pair);\n }\n /**\n * If `keepPair` is `true`, returns the Pair matching `key`.\n * Otherwise, returns the value of that Pair's key.\n */\n get(key, keepPair) {\n const pair = YAMLMap.findPair(this.items, key);\n return !keepPair && identity.isPair(pair)\n ? identity.isScalar(pair.key)\n ? pair.key.value\n : pair.key\n : pair;\n }\n set(key, value) {\n if (typeof value !== 'boolean')\n throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);\n const prev = YAMLMap.findPair(this.items, key);\n if (prev && !value) {\n this.items.splice(this.items.indexOf(prev), 1);\n }\n else if (!prev && value) {\n this.items.push(new Pair.Pair(key));\n }\n }\n toJSON(_, ctx) {\n return super.toJSON(_, ctx, Set);\n }\n toString(ctx, onComment, onChompKeep) {\n if (!ctx)\n return JSON.stringify(this);\n if (this.hasAllNullValues(true))\n return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep);\n else\n throw new Error('Set items must all have null values');\n }\n static from(schema, iterable, ctx) {\n const { replacer } = ctx;\n const set = new this(schema);\n if (iterable && Symbol.iterator in Object(iterable))\n for (let value of iterable) {\n if (typeof replacer === 'function')\n value = replacer.call(iterable, value, value);\n set.items.push(Pair.createPair(value, null, ctx));\n }\n return set;\n }\n}\nYAMLSet.tag = 'tag:yaml.org,2002:set';\nconst set = {\n collection: 'map',\n identify: value => value instanceof Set,\n nodeClass: YAMLSet,\n default: false,\n tag: 'tag:yaml.org,2002:set',\n createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx),\n resolve(map, onError) {\n if (identity.isMap(map)) {\n if (map.hasAllNullValues(true))\n return Object.assign(new YAMLSet(), map);\n else\n onError('Set items must all have null values');\n }\n else\n onError('Expected a mapping for this tag');\n return map;\n }\n};\n\nexports.YAMLSet = YAMLSet;\nexports.set = set;\n",
|
|
45
|
+
"'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\n/** Internal types handle bigint as number, because TS can't figure it out. */\nfunction parseSexagesimal(str, asBigInt) {\n const sign = str[0];\n const parts = sign === '-' || sign === '+' ? str.substring(1) : str;\n const num = (n) => asBigInt ? BigInt(n) : Number(n);\n const res = parts\n .replace(/_/g, '')\n .split(':')\n .reduce((res, p) => res * num(60) + num(p), num(0));\n return (sign === '-' ? num(-1) * res : res);\n}\n/**\n * hhhh:mm:ss.sss\n *\n * Internal types handle bigint as number, because TS can't figure it out.\n */\nfunction stringifySexagesimal(node) {\n let { value } = node;\n let num = (n) => n;\n if (typeof value === 'bigint')\n num = n => BigInt(n);\n else if (isNaN(value) || !isFinite(value))\n return stringifyNumber.stringifyNumber(node);\n let sign = '';\n if (value < 0) {\n sign = '-';\n value *= num(-1);\n }\n const _60 = num(60);\n const parts = [value % _60]; // seconds, including ms\n if (value < 60) {\n parts.unshift(0); // at least one : is required\n }\n else {\n value = (value - parts[0]) / _60;\n parts.unshift(value % _60); // minutes\n if (value >= 60) {\n value = (value - parts[0]) / _60;\n parts.unshift(value); // hours\n }\n }\n return (sign +\n parts\n .map(n => String(n).padStart(2, '0'))\n .join(':')\n .replace(/000000\\d*$/, '') // % 60 may introduce error\n );\n}\nconst intTime = {\n identify: value => typeof value === 'bigint' || Number.isInteger(value),\n default: true,\n tag: 'tag:yaml.org,2002:int',\n format: 'TIME',\n test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,\n resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt),\n stringify: stringifySexagesimal\n};\nconst floatTime = {\n identify: value => typeof value === 'number',\n default: true,\n tag: 'tag:yaml.org,2002:float',\n format: 'TIME',\n test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*$/,\n resolve: str => parseSexagesimal(str, false),\n stringify: stringifySexagesimal\n};\nconst timestamp = {\n identify: value => value instanceof Date,\n default: true,\n tag: 'tag:yaml.org,2002:timestamp',\n // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part\n // may be omitted altogether, resulting in a date format. In such a case, the time part is\n // assumed to be 00:00:00Z (start of day, UTC).\n test: RegExp('^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})' + // YYYY-Mm-Dd\n '(?:' + // time is optional\n '(?:t|T|[ \\\\t]+)' + // t | T | whitespace\n '([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\\\.[0-9]+)?)' + // Hh:Mm:Ss(.ss)?\n '(?:[ \\\\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?' + // Z | +5 | -03:30\n ')?$'),\n resolve(str) {\n const match = str.match(timestamp.test);\n if (!match)\n throw new Error('!!timestamp expects a date, starting with yyyy-mm-dd');\n const [, year, month, day, hour, minute, second] = match.map(Number);\n const millisec = match[7] ? Number((match[7] + '00').substr(1, 3)) : 0;\n let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec);\n const tz = match[8];\n if (tz && tz !== 'Z') {\n let d = parseSexagesimal(tz, false);\n if (Math.abs(d) < 30)\n d *= 60;\n date -= 60000 * d;\n }\n return new Date(date);\n },\n stringify: ({ value }) => value?.toISOString().replace(/(T00:00:00)?\\.000Z$/, '') ?? ''\n};\n\nexports.floatTime = floatTime;\nexports.intTime = intTime;\nexports.timestamp = timestamp;\n",
|
|
46
|
+
"'use strict';\n\nvar map = require('../common/map.js');\nvar _null = require('../common/null.js');\nvar seq = require('../common/seq.js');\nvar string = require('../common/string.js');\nvar binary = require('./binary.js');\nvar bool = require('./bool.js');\nvar float = require('./float.js');\nvar int = require('./int.js');\nvar merge = require('./merge.js');\nvar omap = require('./omap.js');\nvar pairs = require('./pairs.js');\nvar set = require('./set.js');\nvar timestamp = require('./timestamp.js');\n\nconst schema = [\n map.map,\n seq.seq,\n string.string,\n _null.nullTag,\n bool.trueTag,\n bool.falseTag,\n int.intBin,\n int.intOct,\n int.int,\n int.intHex,\n float.floatNaN,\n float.floatExp,\n float.float,\n binary.binary,\n merge.merge,\n omap.omap,\n pairs.pairs,\n set.set,\n timestamp.intTime,\n timestamp.floatTime,\n timestamp.timestamp\n];\n\nexports.schema = schema;\n",
|
|
47
|
+
"'use strict';\n\nvar map = require('./common/map.js');\nvar _null = require('./common/null.js');\nvar seq = require('./common/seq.js');\nvar string = require('./common/string.js');\nvar bool = require('./core/bool.js');\nvar float = require('./core/float.js');\nvar int = require('./core/int.js');\nvar schema = require('./core/schema.js');\nvar schema$1 = require('./json/schema.js');\nvar binary = require('./yaml-1.1/binary.js');\nvar merge = require('./yaml-1.1/merge.js');\nvar omap = require('./yaml-1.1/omap.js');\nvar pairs = require('./yaml-1.1/pairs.js');\nvar schema$2 = require('./yaml-1.1/schema.js');\nvar set = require('./yaml-1.1/set.js');\nvar timestamp = require('./yaml-1.1/timestamp.js');\n\nconst schemas = new Map([\n ['core', schema.schema],\n ['failsafe', [map.map, seq.seq, string.string]],\n ['json', schema$1.schema],\n ['yaml11', schema$2.schema],\n ['yaml-1.1', schema$2.schema]\n]);\nconst tagsByName = {\n binary: binary.binary,\n bool: bool.boolTag,\n float: float.float,\n floatExp: float.floatExp,\n floatNaN: float.floatNaN,\n floatTime: timestamp.floatTime,\n int: int.int,\n intHex: int.intHex,\n intOct: int.intOct,\n intTime: timestamp.intTime,\n map: map.map,\n merge: merge.merge,\n null: _null.nullTag,\n omap: omap.omap,\n pairs: pairs.pairs,\n seq: seq.seq,\n set: set.set,\n timestamp: timestamp.timestamp\n};\nconst coreKnownTags = {\n 'tag:yaml.org,2002:binary': binary.binary,\n 'tag:yaml.org,2002:merge': merge.merge,\n 'tag:yaml.org,2002:omap': omap.omap,\n 'tag:yaml.org,2002:pairs': pairs.pairs,\n 'tag:yaml.org,2002:set': set.set,\n 'tag:yaml.org,2002:timestamp': timestamp.timestamp\n};\nfunction getTags(customTags, schemaName, addMergeTag) {\n const schemaTags = schemas.get(schemaName);\n if (schemaTags && !customTags) {\n return addMergeTag && !schemaTags.includes(merge.merge)\n ? schemaTags.concat(merge.merge)\n : schemaTags.slice();\n }\n let tags = schemaTags;\n if (!tags) {\n if (Array.isArray(customTags))\n tags = [];\n else {\n const keys = Array.from(schemas.keys())\n .filter(key => key !== 'yaml11')\n .map(key => JSON.stringify(key))\n .join(', ');\n throw new Error(`Unknown schema \"${schemaName}\"; use one of ${keys} or define customTags array`);\n }\n }\n if (Array.isArray(customTags)) {\n for (const tag of customTags)\n tags = tags.concat(tag);\n }\n else if (typeof customTags === 'function') {\n tags = customTags(tags.slice());\n }\n if (addMergeTag)\n tags = tags.concat(merge.merge);\n return tags.reduce((tags, tag) => {\n const tagObj = typeof tag === 'string' ? tagsByName[tag] : tag;\n if (!tagObj) {\n const tagName = JSON.stringify(tag);\n const keys = Object.keys(tagsByName)\n .map(key => JSON.stringify(key))\n .join(', ');\n throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`);\n }\n if (!tags.includes(tagObj))\n tags.push(tagObj);\n return tags;\n }, []);\n}\n\nexports.coreKnownTags = coreKnownTags;\nexports.getTags = getTags;\n",
|
|
48
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar map = require('./common/map.js');\nvar seq = require('./common/seq.js');\nvar string = require('./common/string.js');\nvar tags = require('./tags.js');\n\nconst sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0;\nclass Schema {\n constructor({ compat, customTags, merge, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) {\n this.compat = Array.isArray(compat)\n ? tags.getTags(compat, 'compat')\n : compat\n ? tags.getTags(null, compat)\n : null;\n this.name = (typeof schema === 'string' && schema) || 'core';\n this.knownTags = resolveKnownTags ? tags.coreKnownTags : {};\n this.tags = tags.getTags(customTags, this.name, merge);\n this.toStringOptions = toStringDefaults ?? null;\n Object.defineProperty(this, identity.MAP, { value: map.map });\n Object.defineProperty(this, identity.SCALAR, { value: string.string });\n Object.defineProperty(this, identity.SEQ, { value: seq.seq });\n // Used by createMap()\n this.sortMapEntries =\n typeof sortMapEntries === 'function'\n ? sortMapEntries\n : sortMapEntries === true\n ? sortMapEntriesByKey\n : null;\n }\n clone() {\n const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this));\n copy.tags = this.tags.slice();\n return copy;\n }\n}\n\nexports.Schema = Schema;\n",
|
|
49
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyDocument(doc, options) {\n const lines = [];\n let hasDirectives = options.directives === true;\n if (options.directives !== false && doc.directives) {\n const dir = doc.directives.toString(doc);\n if (dir) {\n lines.push(dir);\n hasDirectives = true;\n }\n else if (doc.directives.docStart)\n hasDirectives = true;\n }\n if (hasDirectives)\n lines.push('---');\n const ctx = stringify.createStringifyContext(doc, options);\n const { commentString } = ctx.options;\n if (doc.commentBefore) {\n if (lines.length !== 1)\n lines.unshift('');\n const cs = commentString(doc.commentBefore);\n lines.unshift(stringifyComment.indentComment(cs, ''));\n }\n let chompKeep = false;\n let contentComment = null;\n if (doc.contents) {\n if (identity.isNode(doc.contents)) {\n if (doc.contents.spaceBefore && hasDirectives)\n lines.push('');\n if (doc.contents.commentBefore) {\n const cs = commentString(doc.contents.commentBefore);\n lines.push(stringifyComment.indentComment(cs, ''));\n }\n // top-level block scalars need to be indented if followed by a comment\n ctx.forceBlockIndent = !!doc.comment;\n contentComment = doc.contents.comment;\n }\n const onChompKeep = contentComment ? undefined : () => (chompKeep = true);\n let body = stringify.stringify(doc.contents, ctx, () => (contentComment = null), onChompKeep);\n if (contentComment)\n body += stringifyComment.lineComment(body, '', commentString(contentComment));\n if ((body[0] === '|' || body[0] === '>') &&\n lines[lines.length - 1] === '---') {\n // Top-level block scalars with a preceding doc marker ought to use the\n // same line for their header.\n lines[lines.length - 1] = `--- ${body}`;\n }\n else\n lines.push(body);\n }\n else {\n lines.push(stringify.stringify(doc.contents, ctx));\n }\n if (doc.directives?.docEnd) {\n if (doc.comment) {\n const cs = commentString(doc.comment);\n if (cs.includes('\\n')) {\n lines.push('...');\n lines.push(stringifyComment.indentComment(cs, ''));\n }\n else {\n lines.push(`... ${cs}`);\n }\n }\n else {\n lines.push('...');\n }\n }\n else {\n let dc = doc.comment;\n if (dc && chompKeep)\n dc = dc.replace(/^\\n+/, '');\n if (dc) {\n if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '')\n lines.push('');\n lines.push(stringifyComment.indentComment(commentString(dc), ''));\n }\n }\n return lines.join('\\n') + '\\n';\n}\n\nexports.stringifyDocument = stringifyDocument;\n",
|
|
50
|
+
"'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar Collection = require('../nodes/Collection.js');\nvar identity = require('../nodes/identity.js');\nvar Pair = require('../nodes/Pair.js');\nvar toJS = require('../nodes/toJS.js');\nvar Schema = require('../schema/Schema.js');\nvar stringifyDocument = require('../stringify/stringifyDocument.js');\nvar anchors = require('./anchors.js');\nvar applyReviver = require('./applyReviver.js');\nvar createNode = require('./createNode.js');\nvar directives = require('./directives.js');\n\nclass Document {\n constructor(value, replacer, options) {\n /** A comment before this Document */\n this.commentBefore = null;\n /** A comment immediately after this Document */\n this.comment = null;\n /** Errors encountered during parsing. */\n this.errors = [];\n /** Warnings encountered during parsing. */\n this.warnings = [];\n Object.defineProperty(this, identity.NODE_TYPE, { value: identity.DOC });\n let _replacer = null;\n if (typeof replacer === 'function' || Array.isArray(replacer)) {\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n replacer = undefined;\n }\n const opt = Object.assign({\n intAsBigInt: false,\n keepSourceTokens: false,\n logLevel: 'warn',\n prettyErrors: true,\n strict: true,\n stringKeys: false,\n uniqueKeys: true,\n version: '1.2'\n }, options);\n this.options = opt;\n let { version } = opt;\n if (options?._directives) {\n this.directives = options._directives.atDocument();\n if (this.directives.yaml.explicit)\n version = this.directives.yaml.version;\n }\n else\n this.directives = new directives.Directives({ version });\n this.setSchema(version, options);\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents =\n value === undefined ? null : this.createNode(value, _replacer, options);\n }\n /**\n * Create a deep copy of this Document and its contents.\n *\n * Custom Node values that inherit from `Object` still refer to their original instances.\n */\n clone() {\n const copy = Object.create(Document.prototype, {\n [identity.NODE_TYPE]: { value: identity.DOC }\n });\n copy.commentBefore = this.commentBefore;\n copy.comment = this.comment;\n copy.errors = this.errors.slice();\n copy.warnings = this.warnings.slice();\n copy.options = Object.assign({}, this.options);\n if (this.directives)\n copy.directives = this.directives.clone();\n copy.schema = this.schema.clone();\n // @ts-expect-error We can't really know that this matches Contents.\n copy.contents = identity.isNode(this.contents)\n ? this.contents.clone(copy.schema)\n : this.contents;\n if (this.range)\n copy.range = this.range.slice();\n return copy;\n }\n /** Adds a value to the document. */\n add(value) {\n if (assertCollection(this.contents))\n this.contents.add(value);\n }\n /** Adds a value to the document. */\n addIn(path, value) {\n if (assertCollection(this.contents))\n this.contents.addIn(path, value);\n }\n /**\n * Create a new `Alias` node, ensuring that the target `node` has the required anchor.\n *\n * If `node` already has an anchor, `name` is ignored.\n * Otherwise, the `node.anchor` value will be set to `name`,\n * or if an anchor with that name is already present in the document,\n * `name` will be used as a prefix for a new unique anchor.\n * If `name` is undefined, the generated anchor will use 'a' as a prefix.\n */\n createAlias(node, name) {\n if (!node.anchor) {\n const prev = anchors.anchorNames(this);\n node.anchor =\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n !name || prev.has(name) ? anchors.findNewAnchor(name || 'a', prev) : name;\n }\n return new Alias.Alias(node.anchor);\n }\n createNode(value, replacer, options) {\n let _replacer = undefined;\n if (typeof replacer === 'function') {\n value = replacer.call({ '': value }, '', value);\n _replacer = replacer;\n }\n else if (Array.isArray(replacer)) {\n const keyToStr = (v) => typeof v === 'number' || v instanceof String || v instanceof Number;\n const asStr = replacer.filter(keyToStr).map(String);\n if (asStr.length > 0)\n replacer = replacer.concat(asStr);\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n replacer = undefined;\n }\n const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options ?? {};\n const { onAnchor, setAnchors, sourceObjects } = anchors.createNodeAnchors(this, \n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n anchorPrefix || 'a');\n const ctx = {\n aliasDuplicateObjects: aliasDuplicateObjects ?? true,\n keepUndefined: keepUndefined ?? false,\n onAnchor,\n onTagObj,\n replacer: _replacer,\n schema: this.schema,\n sourceObjects\n };\n const node = createNode.createNode(value, tag, ctx);\n if (flow && identity.isCollection(node))\n node.flow = true;\n setAnchors();\n return node;\n }\n /**\n * Convert a key and a value into a `Pair` using the current schema,\n * recursively wrapping all values as `Scalar` or `Collection` nodes.\n */\n createPair(key, value, options = {}) {\n const k = this.createNode(key, null, options);\n const v = this.createNode(value, null, options);\n return new Pair.Pair(k, v);\n }\n /**\n * Removes a value from the document.\n * @returns `true` if the item was found and removed.\n */\n delete(key) {\n return assertCollection(this.contents) ? this.contents.delete(key) : false;\n }\n /**\n * Removes a value from the document.\n * @returns `true` if the item was found and removed.\n */\n deleteIn(path) {\n if (Collection.isEmptyPath(path)) {\n if (this.contents == null)\n return false;\n // @ts-expect-error Presumed impossible if Strict extends false\n this.contents = null;\n return true;\n }\n return assertCollection(this.contents)\n ? this.contents.deleteIn(path)\n : false;\n }\n /**\n * Returns item at `key`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n get(key, keepScalar) {\n return identity.isCollection(this.contents)\n ? this.contents.get(key, keepScalar)\n : undefined;\n }\n /**\n * Returns item at `path`, or `undefined` if not found. By default unwraps\n * scalar values from their surrounding node; to disable set `keepScalar` to\n * `true` (collections are always returned intact).\n */\n getIn(path, keepScalar) {\n if (Collection.isEmptyPath(path))\n return !keepScalar && identity.isScalar(this.contents)\n ? this.contents.value\n : this.contents;\n return identity.isCollection(this.contents)\n ? this.contents.getIn(path, keepScalar)\n : undefined;\n }\n /**\n * Checks if the document includes a value with the key `key`.\n */\n has(key) {\n return identity.isCollection(this.contents) ? this.contents.has(key) : false;\n }\n /**\n * Checks if the document includes a value at `path`.\n */\n hasIn(path) {\n if (Collection.isEmptyPath(path))\n return this.contents !== undefined;\n return identity.isCollection(this.contents) ? this.contents.hasIn(path) : false;\n }\n /**\n * Sets a value in this document. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n set(key, value) {\n if (this.contents == null) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = Collection.collectionFromPath(this.schema, [key], value);\n }\n else if (assertCollection(this.contents)) {\n this.contents.set(key, value);\n }\n }\n /**\n * Sets a value in this document. For `!!set`, `value` needs to be a\n * boolean to add/remove the item from the set.\n */\n setIn(path, value) {\n if (Collection.isEmptyPath(path)) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = value;\n }\n else if (this.contents == null) {\n // @ts-expect-error We can't really know that this matches Contents.\n this.contents = Collection.collectionFromPath(this.schema, Array.from(path), value);\n }\n else if (assertCollection(this.contents)) {\n this.contents.setIn(path, value);\n }\n }\n /**\n * Change the YAML version and schema used by the document.\n * A `null` version disables support for directives, explicit tags, anchors, and aliases.\n * It also requires the `schema` option to be given as a `Schema` instance value.\n *\n * Overrides all previously set schema options.\n */\n setSchema(version, options = {}) {\n if (typeof version === 'number')\n version = String(version);\n let opt;\n switch (version) {\n case '1.1':\n if (this.directives)\n this.directives.yaml.version = '1.1';\n else\n this.directives = new directives.Directives({ version: '1.1' });\n opt = { resolveKnownTags: false, schema: 'yaml-1.1' };\n break;\n case '1.2':\n case 'next':\n if (this.directives)\n this.directives.yaml.version = version;\n else\n this.directives = new directives.Directives({ version });\n opt = { resolveKnownTags: true, schema: 'core' };\n break;\n case null:\n if (this.directives)\n delete this.directives;\n opt = null;\n break;\n default: {\n const sv = JSON.stringify(version);\n throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`);\n }\n }\n // Not using `instanceof Schema` to allow for duck typing\n if (options.schema instanceof Object)\n this.schema = options.schema;\n else if (opt)\n this.schema = new Schema.Schema(Object.assign(opt, options));\n else\n throw new Error(`With a null YAML version, the { schema: Schema } option is required`);\n }\n // json & jsonArg are only used from toJSON()\n toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {\n const ctx = {\n anchors: new Map(),\n doc: this,\n keep: !json,\n mapAsMap: mapAsMap === true,\n mapKeyWarned: false,\n maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100\n };\n const res = toJS.toJS(this.contents, jsonArg ?? '', ctx);\n if (typeof onAnchor === 'function')\n for (const { count, res } of ctx.anchors.values())\n onAnchor(res, count);\n return typeof reviver === 'function'\n ? applyReviver.applyReviver(reviver, { '': res }, '', res)\n : res;\n }\n /**\n * A JSON representation of the document `contents`.\n *\n * @param jsonArg Used by `JSON.stringify` to indicate the array index or\n * property name.\n */\n toJSON(jsonArg, onAnchor) {\n return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor });\n }\n /** A YAML representation of the document. */\n toString(options = {}) {\n if (this.errors.length > 0)\n throw new Error('Document with errors cannot be stringified');\n if ('indent' in options &&\n (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) {\n const s = JSON.stringify(options.indent);\n throw new Error(`\"indent\" option must be a positive integer, not ${s}`);\n }\n return stringifyDocument.stringifyDocument(this, options);\n }\n}\nfunction assertCollection(contents) {\n if (identity.isCollection(contents))\n return true;\n throw new Error('Expected a YAML collection as document contents');\n}\n\nexports.Document = Document;\n",
|
|
51
|
+
"'use strict';\n\nclass YAMLError extends Error {\n constructor(name, pos, code, message) {\n super();\n this.name = name;\n this.code = code;\n this.message = message;\n this.pos = pos;\n }\n}\nclass YAMLParseError extends YAMLError {\n constructor(pos, code, message) {\n super('YAMLParseError', pos, code, message);\n }\n}\nclass YAMLWarning extends YAMLError {\n constructor(pos, code, message) {\n super('YAMLWarning', pos, code, message);\n }\n}\nconst prettifyError = (src, lc) => (error) => {\n if (error.pos[0] === -1)\n return;\n error.linePos = error.pos.map(pos => lc.linePos(pos));\n const { line, col } = error.linePos[0];\n error.message += ` at line ${line}, column ${col}`;\n let ci = col - 1;\n let lineStr = src\n .substring(lc.lineStarts[line - 1], lc.lineStarts[line])\n .replace(/[\\n\\r]+$/, '');\n // Trim to max 80 chars, keeping col position near the middle\n if (ci >= 60 && lineStr.length > 80) {\n const trimStart = Math.min(ci - 39, lineStr.length - 79);\n lineStr = '…' + lineStr.substring(trimStart);\n ci -= trimStart - 1;\n }\n if (lineStr.length > 80)\n lineStr = lineStr.substring(0, 79) + '…';\n // Include previous line in context if pointing at line start\n if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) {\n // Regexp won't match if start is trimmed\n let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]);\n if (prev.length > 80)\n prev = prev.substring(0, 79) + '…\\n';\n lineStr = prev + lineStr;\n }\n if (/[^ ]/.test(lineStr)) {\n let count = 1;\n const end = error.linePos[1];\n if (end?.line === line && end.col > col) {\n count = Math.max(1, Math.min(end.col - col, 80 - ci));\n }\n const pointer = ' '.repeat(ci) + '^'.repeat(count);\n error.message += `:\\n\\n${lineStr}\\n${pointer}\\n`;\n }\n};\n\nexports.YAMLError = YAMLError;\nexports.YAMLParseError = YAMLParseError;\nexports.YAMLWarning = YAMLWarning;\nexports.prettifyError = prettifyError;\n",
|
|
52
|
+
"'use strict';\n\nfunction resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {\n let spaceBefore = false;\n let atNewline = startOnNewline;\n let hasSpace = startOnNewline;\n let comment = '';\n let commentSep = '';\n let hasNewline = false;\n let reqSpace = false;\n let tab = null;\n let anchor = null;\n let tag = null;\n let newlineAfterProp = null;\n let comma = null;\n let found = null;\n let start = null;\n for (const token of tokens) {\n if (reqSpace) {\n if (token.type !== 'space' &&\n token.type !== 'newline' &&\n token.type !== 'comma')\n onError(token.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');\n reqSpace = false;\n }\n if (tab) {\n if (atNewline && token.type !== 'comment' && token.type !== 'newline') {\n onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');\n }\n tab = null;\n }\n switch (token.type) {\n case 'space':\n // At the doc level, tabs at line start may be parsed\n // as leading white space rather than indentation.\n // In a flow collection, only the parser handles indent.\n if (!flow &&\n (indicator !== 'doc-start' || next?.type !== 'flow-collection') &&\n token.source.includes('\\t')) {\n tab = token;\n }\n hasSpace = true;\n break;\n case 'comment': {\n if (!hasSpace)\n onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');\n const cb = token.source.substring(1) || ' ';\n if (!comment)\n comment = cb;\n else\n comment += commentSep + cb;\n commentSep = '';\n atNewline = false;\n break;\n }\n case 'newline':\n if (atNewline) {\n if (comment)\n comment += token.source;\n else if (!found || indicator !== 'seq-item-ind')\n spaceBefore = true;\n }\n else\n commentSep += token.source;\n atNewline = true;\n hasNewline = true;\n if (anchor || tag)\n newlineAfterProp = token;\n hasSpace = true;\n break;\n case 'anchor':\n if (anchor)\n onError(token, 'MULTIPLE_ANCHORS', 'A node can have at most one anchor');\n if (token.source.endsWith(':'))\n onError(token.offset + token.source.length - 1, 'BAD_ALIAS', 'Anchor ending in : is ambiguous', true);\n anchor = token;\n start ?? (start = token.offset);\n atNewline = false;\n hasSpace = false;\n reqSpace = true;\n break;\n case 'tag': {\n if (tag)\n onError(token, 'MULTIPLE_TAGS', 'A node can have at most one tag');\n tag = token;\n start ?? (start = token.offset);\n atNewline = false;\n hasSpace = false;\n reqSpace = true;\n break;\n }\n case indicator:\n // Could here handle preceding comments differently\n if (anchor || tag)\n onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`);\n if (found)\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow ?? 'collection'}`);\n found = token;\n atNewline =\n indicator === 'seq-item-ind' || indicator === 'explicit-key-ind';\n hasSpace = false;\n break;\n case 'comma':\n if (flow) {\n if (comma)\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected , in ${flow}`);\n comma = token;\n atNewline = false;\n hasSpace = false;\n break;\n }\n // else fallthrough\n default:\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.type} token`);\n atNewline = false;\n hasSpace = false;\n }\n }\n const last = tokens[tokens.length - 1];\n const end = last ? last.offset + last.source.length : offset;\n if (reqSpace &&\n next &&\n next.type !== 'space' &&\n next.type !== 'newline' &&\n next.type !== 'comma' &&\n (next.type !== 'scalar' || next.source !== '')) {\n onError(next.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');\n }\n if (tab &&\n ((atNewline && tab.indent <= parentIndent) ||\n next?.type === 'block-map' ||\n next?.type === 'block-seq'))\n onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');\n return {\n comma,\n found,\n spaceBefore,\n comment,\n hasNewline,\n anchor,\n tag,\n newlineAfterProp,\n end,\n start: start ?? end\n };\n}\n\nexports.resolveProps = resolveProps;\n",
|
|
53
|
+
"'use strict';\n\nfunction containsNewline(key) {\n if (!key)\n return null;\n switch (key.type) {\n case 'alias':\n case 'scalar':\n case 'double-quoted-scalar':\n case 'single-quoted-scalar':\n if (key.source.includes('\\n'))\n return true;\n if (key.end)\n for (const st of key.end)\n if (st.type === 'newline')\n return true;\n return false;\n case 'flow-collection':\n for (const it of key.items) {\n for (const st of it.start)\n if (st.type === 'newline')\n return true;\n if (it.sep)\n for (const st of it.sep)\n if (st.type === 'newline')\n return true;\n if (containsNewline(it.key) || containsNewline(it.value))\n return true;\n }\n return false;\n default:\n return true;\n }\n}\n\nexports.containsNewline = containsNewline;\n",
|
|
54
|
+
"'use strict';\n\nvar utilContainsNewline = require('./util-contains-newline.js');\n\nfunction flowIndentCheck(indent, fc, onError) {\n if (fc?.type === 'flow-collection') {\n const end = fc.end[0];\n if (end.indent === indent &&\n (end.source === ']' || end.source === '}') &&\n utilContainsNewline.containsNewline(fc)) {\n const msg = 'Flow end indicator should be more indented than parent';\n onError(end, 'BAD_INDENT', msg, true);\n }\n }\n}\n\nexports.flowIndentCheck = flowIndentCheck;\n",
|
|
55
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\n\nfunction mapIncludes(ctx, items, search) {\n const { uniqueKeys } = ctx.options;\n if (uniqueKeys === false)\n return false;\n const isEqual = typeof uniqueKeys === 'function'\n ? uniqueKeys\n : (a, b) => a === b || (identity.isScalar(a) && identity.isScalar(b) && a.value === b.value);\n return items.some(pair => isEqual(pair.key, search));\n}\n\nexports.mapIncludes = mapIncludes;\n",
|
|
56
|
+
"'use strict';\n\nvar Pair = require('../nodes/Pair.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilContainsNewline = require('./util-contains-newline.js');\nvar utilFlowIndentCheck = require('./util-flow-indent-check.js');\nvar utilMapIncludes = require('./util-map-includes.js');\n\nconst startColMsg = 'All mapping items must start at the same column';\nfunction resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, tag) {\n const NodeClass = tag?.nodeClass ?? YAMLMap.YAMLMap;\n const map = new NodeClass(ctx.schema);\n if (ctx.atRoot)\n ctx.atRoot = false;\n let offset = bm.offset;\n let commentEnd = null;\n for (const collItem of bm.items) {\n const { start, key, sep, value } = collItem;\n // key properties\n const keyProps = resolveProps.resolveProps(start, {\n indicator: 'explicit-key-ind',\n next: key ?? sep?.[0],\n offset,\n onError,\n parentIndent: bm.indent,\n startOnNewline: true\n });\n const implicitKey = !keyProps.found;\n if (implicitKey) {\n if (key) {\n if (key.type === 'block-seq')\n onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'A block sequence may not be used as an implicit map key');\n else if ('indent' in key && key.indent !== bm.indent)\n onError(offset, 'BAD_INDENT', startColMsg);\n }\n if (!keyProps.anchor && !keyProps.tag && !sep) {\n commentEnd = keyProps.end;\n if (keyProps.comment) {\n if (map.comment)\n map.comment += '\\n' + keyProps.comment;\n else\n map.comment = keyProps.comment;\n }\n continue;\n }\n if (keyProps.newlineAfterProp || utilContainsNewline.containsNewline(key)) {\n onError(key ?? start[start.length - 1], 'MULTILINE_IMPLICIT_KEY', 'Implicit keys need to be on a single line');\n }\n }\n else if (keyProps.found?.indent !== bm.indent) {\n onError(offset, 'BAD_INDENT', startColMsg);\n }\n // key value\n ctx.atKey = true;\n const keyStart = keyProps.end;\n const keyNode = key\n ? composeNode(ctx, key, keyProps, onError)\n : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bm.indent, key, onError);\n ctx.atKey = false;\n if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))\n onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');\n // value properties\n const valueProps = resolveProps.resolveProps(sep ?? [], {\n indicator: 'map-value-ind',\n next: value,\n offset: keyNode.range[2],\n onError,\n parentIndent: bm.indent,\n startOnNewline: !key || key.type === 'block-scalar'\n });\n offset = valueProps.end;\n if (valueProps.found) {\n if (implicitKey) {\n if (value?.type === 'block-map' && !valueProps.hasNewline)\n onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'Nested mappings are not allowed in compact mappings');\n if (ctx.options.strict &&\n keyProps.start < valueProps.found.offset - 1024)\n onError(keyNode.range, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit block mapping key');\n }\n // value value\n const valueNode = value\n ? composeNode(ctx, value, valueProps, onError)\n : composeEmptyNode(ctx, offset, sep, null, valueProps, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError);\n offset = valueNode.range[2];\n const pair = new Pair.Pair(keyNode, valueNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n map.items.push(pair);\n }\n else {\n // key with no value\n if (implicitKey)\n onError(keyNode.range, 'MISSING_CHAR', 'Implicit map keys need to be followed by map values');\n if (valueProps.comment) {\n if (keyNode.comment)\n keyNode.comment += '\\n' + valueProps.comment;\n else\n keyNode.comment = valueProps.comment;\n }\n const pair = new Pair.Pair(keyNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n map.items.push(pair);\n }\n }\n if (commentEnd && commentEnd < offset)\n onError(commentEnd, 'IMPOSSIBLE', 'Map comment with trailing content');\n map.range = [bm.offset, offset, commentEnd ?? offset];\n return map;\n}\n\nexports.resolveBlockMap = resolveBlockMap;\n",
|
|
57
|
+
"'use strict';\n\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilFlowIndentCheck = require('./util-flow-indent-check.js');\n\nfunction resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) {\n const NodeClass = tag?.nodeClass ?? YAMLSeq.YAMLSeq;\n const seq = new NodeClass(ctx.schema);\n if (ctx.atRoot)\n ctx.atRoot = false;\n if (ctx.atKey)\n ctx.atKey = false;\n let offset = bs.offset;\n let commentEnd = null;\n for (const { start, value } of bs.items) {\n const props = resolveProps.resolveProps(start, {\n indicator: 'seq-item-ind',\n next: value,\n offset,\n onError,\n parentIndent: bs.indent,\n startOnNewline: true\n });\n if (!props.found) {\n if (props.anchor || props.tag || value) {\n if (value?.type === 'block-seq')\n onError(props.end, 'BAD_INDENT', 'All sequence items must start at the same column');\n else\n onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');\n }\n else {\n commentEnd = props.end;\n if (props.comment)\n seq.comment = props.comment;\n continue;\n }\n }\n const node = value\n ? composeNode(ctx, value, props, onError)\n : composeEmptyNode(ctx, props.end, start, null, props, onError);\n if (ctx.schema.compat)\n utilFlowIndentCheck.flowIndentCheck(bs.indent, value, onError);\n offset = node.range[2];\n seq.items.push(node);\n }\n seq.range = [bs.offset, offset, commentEnd ?? offset];\n return seq;\n}\n\nexports.resolveBlockSeq = resolveBlockSeq;\n",
|
|
58
|
+
"'use strict';\n\nfunction resolveEnd(end, offset, reqSpace, onError) {\n let comment = '';\n if (end) {\n let hasSpace = false;\n let sep = '';\n for (const token of end) {\n const { source, type } = token;\n switch (type) {\n case 'space':\n hasSpace = true;\n break;\n case 'comment': {\n if (reqSpace && !hasSpace)\n onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');\n const cb = source.substring(1) || ' ';\n if (!comment)\n comment = cb;\n else\n comment += sep + cb;\n sep = '';\n break;\n }\n case 'newline':\n if (comment)\n sep += source;\n hasSpace = true;\n break;\n default:\n onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${type} at node end`);\n }\n offset += source.length;\n }\n }\n return { comment, offset };\n}\n\nexports.resolveEnd = resolveEnd;\n",
|
|
59
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Pair = require('../nodes/Pair.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveEnd = require('./resolve-end.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilContainsNewline = require('./util-contains-newline.js');\nvar utilMapIncludes = require('./util-map-includes.js');\n\nconst blockMsg = 'Block collections are not allowed within flow collections';\nconst isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');\nfunction resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) {\n const isMap = fc.start.source === '{';\n const fcName = isMap ? 'flow map' : 'flow sequence';\n const NodeClass = (tag?.nodeClass ?? (isMap ? YAMLMap.YAMLMap : YAMLSeq.YAMLSeq));\n const coll = new NodeClass(ctx.schema);\n coll.flow = true;\n const atRoot = ctx.atRoot;\n if (atRoot)\n ctx.atRoot = false;\n if (ctx.atKey)\n ctx.atKey = false;\n let offset = fc.offset + fc.start.source.length;\n for (let i = 0; i < fc.items.length; ++i) {\n const collItem = fc.items[i];\n const { start, key, sep, value } = collItem;\n const props = resolveProps.resolveProps(start, {\n flow: fcName,\n indicator: 'explicit-key-ind',\n next: key ?? sep?.[0],\n offset,\n onError,\n parentIndent: fc.indent,\n startOnNewline: false\n });\n if (!props.found) {\n if (!props.anchor && !props.tag && !sep && !value) {\n if (i === 0 && props.comma)\n onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);\n else if (i < fc.items.length - 1)\n onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);\n if (props.comment) {\n if (coll.comment)\n coll.comment += '\\n' + props.comment;\n else\n coll.comment = props.comment;\n }\n offset = props.end;\n continue;\n }\n if (!isMap && ctx.options.strict && utilContainsNewline.containsNewline(key))\n onError(key, // checked by containsNewline()\n 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');\n }\n if (i === 0) {\n if (props.comma)\n onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);\n }\n else {\n if (!props.comma)\n onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);\n if (props.comment) {\n let prevItemComment = '';\n loop: for (const st of start) {\n switch (st.type) {\n case 'comma':\n case 'space':\n break;\n case 'comment':\n prevItemComment = st.source.substring(1);\n break loop;\n default:\n break loop;\n }\n }\n if (prevItemComment) {\n let prev = coll.items[coll.items.length - 1];\n if (identity.isPair(prev))\n prev = prev.value ?? prev.key;\n if (prev.comment)\n prev.comment += '\\n' + prevItemComment;\n else\n prev.comment = prevItemComment;\n props.comment = props.comment.substring(prevItemComment.length + 1);\n }\n }\n }\n if (!isMap && !sep && !props.found) {\n // item is a value in a seq\n // → key & sep are empty, start does not include ? or :\n const valueNode = value\n ? composeNode(ctx, value, props, onError)\n : composeEmptyNode(ctx, props.end, sep, null, props, onError);\n coll.items.push(valueNode);\n offset = valueNode.range[2];\n if (isBlock(value))\n onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);\n }\n else {\n // item is a key+value pair\n // key value\n ctx.atKey = true;\n const keyStart = props.end;\n const keyNode = key\n ? composeNode(ctx, key, props, onError)\n : composeEmptyNode(ctx, keyStart, start, null, props, onError);\n if (isBlock(key))\n onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);\n ctx.atKey = false;\n // value properties\n const valueProps = resolveProps.resolveProps(sep ?? [], {\n flow: fcName,\n indicator: 'map-value-ind',\n next: value,\n offset: keyNode.range[2],\n onError,\n parentIndent: fc.indent,\n startOnNewline: false\n });\n if (valueProps.found) {\n if (!isMap && !props.found && ctx.options.strict) {\n if (sep)\n for (const st of sep) {\n if (st === valueProps.found)\n break;\n if (st.type === 'newline') {\n onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');\n break;\n }\n }\n if (props.start < valueProps.found.offset - 1024)\n onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');\n }\n }\n else if (value) {\n if ('source' in value && value.source?.[0] === ':')\n onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);\n else\n onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);\n }\n // value value\n const valueNode = value\n ? composeNode(ctx, value, valueProps, onError)\n : valueProps.found\n ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)\n : null;\n if (valueNode) {\n if (isBlock(value))\n onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);\n }\n else if (valueProps.comment) {\n if (keyNode.comment)\n keyNode.comment += '\\n' + valueProps.comment;\n else\n keyNode.comment = valueProps.comment;\n }\n const pair = new Pair.Pair(keyNode, valueNode);\n if (ctx.options.keepSourceTokens)\n pair.srcToken = collItem;\n if (isMap) {\n const map = coll;\n if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))\n onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');\n map.items.push(pair);\n }\n else {\n const map = new YAMLMap.YAMLMap(ctx.schema);\n map.flow = true;\n map.items.push(pair);\n const endRange = (valueNode ?? keyNode).range;\n map.range = [keyNode.range[0], endRange[1], endRange[2]];\n coll.items.push(map);\n }\n offset = valueNode ? valueNode.range[2] : valueProps.end;\n }\n }\n const expectedEnd = isMap ? '}' : ']';\n const [ce, ...ee] = fc.end;\n let cePos = offset;\n if (ce?.source === expectedEnd)\n cePos = ce.offset + ce.source.length;\n else {\n const name = fcName[0].toUpperCase() + fcName.substring(1);\n const msg = atRoot\n ? `${name} must end with a ${expectedEnd}`\n : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;\n onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg);\n if (ce && ce.source.length !== 1)\n ee.unshift(ce);\n }\n if (ee.length > 0) {\n const end = resolveEnd.resolveEnd(ee, cePos, ctx.options.strict, onError);\n if (end.comment) {\n if (coll.comment)\n coll.comment += '\\n' + end.comment;\n else\n coll.comment = end.comment;\n }\n coll.range = [fc.offset, cePos, end.offset];\n }\n else {\n coll.range = [fc.offset, cePos, cePos];\n }\n return coll;\n}\n\nexports.resolveFlowCollection = resolveFlowCollection;\n",
|
|
60
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveBlockMap = require('./resolve-block-map.js');\nvar resolveBlockSeq = require('./resolve-block-seq.js');\nvar resolveFlowCollection = require('./resolve-flow-collection.js');\n\nfunction resolveCollection(CN, ctx, token, onError, tagName, tag) {\n const coll = token.type === 'block-map'\n ? resolveBlockMap.resolveBlockMap(CN, ctx, token, onError, tag)\n : token.type === 'block-seq'\n ? resolveBlockSeq.resolveBlockSeq(CN, ctx, token, onError, tag)\n : resolveFlowCollection.resolveFlowCollection(CN, ctx, token, onError, tag);\n const Coll = coll.constructor;\n // If we got a tagName matching the class, or the tag name is '!',\n // then use the tagName from the node class used to create it.\n if (tagName === '!' || tagName === Coll.tagName) {\n coll.tag = Coll.tagName;\n return coll;\n }\n if (tagName)\n coll.tag = tagName;\n return coll;\n}\nfunction composeCollection(CN, ctx, token, props, onError) {\n const tagToken = props.tag;\n const tagName = !tagToken\n ? null\n : ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg));\n if (token.type === 'block-seq') {\n const { anchor, newlineAfterProp: nl } = props;\n const lastProp = anchor && tagToken\n ? anchor.offset > tagToken.offset\n ? anchor\n : tagToken\n : (anchor ?? tagToken);\n if (lastProp && (!nl || nl.offset < lastProp.offset)) {\n const message = 'Missing newline after block sequence props';\n onError(lastProp, 'MISSING_CHAR', message);\n }\n }\n const expType = token.type === 'block-map'\n ? 'map'\n : token.type === 'block-seq'\n ? 'seq'\n : token.start.source === '{'\n ? 'map'\n : 'seq';\n // shortcut: check if it's a generic YAMLMap or YAMLSeq\n // before jumping into the custom tag logic.\n if (!tagToken ||\n !tagName ||\n tagName === '!' ||\n (tagName === YAMLMap.YAMLMap.tagName && expType === 'map') ||\n (tagName === YAMLSeq.YAMLSeq.tagName && expType === 'seq')) {\n return resolveCollection(CN, ctx, token, onError, tagName);\n }\n let tag = ctx.schema.tags.find(t => t.tag === tagName && t.collection === expType);\n if (!tag) {\n const kt = ctx.schema.knownTags[tagName];\n if (kt?.collection === expType) {\n ctx.schema.tags.push(Object.assign({}, kt, { default: false }));\n tag = kt;\n }\n else {\n if (kt) {\n onError(tagToken, 'BAD_COLLECTION_TYPE', `${kt.tag} used for ${expType} collection, but expects ${kt.collection ?? 'scalar'}`, true);\n }\n else {\n onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, true);\n }\n return resolveCollection(CN, ctx, token, onError, tagName);\n }\n }\n const coll = resolveCollection(CN, ctx, token, onError, tagName, tag);\n const res = tag.resolve?.(coll, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg), ctx.options) ?? coll;\n const node = identity.isNode(res)\n ? res\n : new Scalar.Scalar(res);\n node.range = coll.range;\n node.tag = tagName;\n if (tag?.format)\n node.format = tag.format;\n return node;\n}\n\nexports.composeCollection = composeCollection;\n",
|
|
61
|
+
"'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\n\nfunction resolveBlockScalar(ctx, scalar, onError) {\n const start = scalar.offset;\n const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError);\n if (!header)\n return { value: '', type: null, comment: '', range: [start, start, start] };\n const type = header.mode === '>' ? Scalar.Scalar.BLOCK_FOLDED : Scalar.Scalar.BLOCK_LITERAL;\n const lines = scalar.source ? splitLines(scalar.source) : [];\n // determine the end of content & start of chomping\n let chompStart = lines.length;\n for (let i = lines.length - 1; i >= 0; --i) {\n const content = lines[i][1];\n if (content === '' || content === '\\r')\n chompStart = i;\n else\n break;\n }\n // shortcut for empty contents\n if (chompStart === 0) {\n const value = header.chomp === '+' && lines.length > 0\n ? '\\n'.repeat(Math.max(1, lines.length - 1))\n : '';\n let end = start + header.length;\n if (scalar.source)\n end += scalar.source.length;\n return { value, type, comment: header.comment, range: [start, end, end] };\n }\n // find the indentation level to trim from start\n let trimIndent = scalar.indent + header.indent;\n let offset = scalar.offset + header.length;\n let contentStart = 0;\n for (let i = 0; i < chompStart; ++i) {\n const [indent, content] = lines[i];\n if (content === '' || content === '\\r') {\n if (header.indent === 0 && indent.length > trimIndent)\n trimIndent = indent.length;\n }\n else {\n if (indent.length < trimIndent) {\n const message = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator';\n onError(offset + indent.length, 'MISSING_CHAR', message);\n }\n if (header.indent === 0)\n trimIndent = indent.length;\n contentStart = i;\n if (trimIndent === 0 && !ctx.atRoot) {\n const message = 'Block scalar values in collections must be indented';\n onError(offset, 'BAD_INDENT', message);\n }\n break;\n }\n offset += indent.length + content.length + 1;\n }\n // include trailing more-indented empty lines in content\n for (let i = lines.length - 1; i >= chompStart; --i) {\n if (lines[i][0].length > trimIndent)\n chompStart = i + 1;\n }\n let value = '';\n let sep = '';\n let prevMoreIndented = false;\n // leading whitespace is kept intact\n for (let i = 0; i < contentStart; ++i)\n value += lines[i][0].slice(trimIndent) + '\\n';\n for (let i = contentStart; i < chompStart; ++i) {\n let [indent, content] = lines[i];\n offset += indent.length + content.length + 1;\n const crlf = content[content.length - 1] === '\\r';\n if (crlf)\n content = content.slice(0, -1);\n /* istanbul ignore if already caught in lexer */\n if (content && indent.length < trimIndent) {\n const src = header.indent\n ? 'explicit indentation indicator'\n : 'first line';\n const message = `Block scalar lines must not be less indented than their ${src}`;\n onError(offset - content.length - (crlf ? 2 : 1), 'BAD_INDENT', message);\n indent = '';\n }\n if (type === Scalar.Scalar.BLOCK_LITERAL) {\n value += sep + indent.slice(trimIndent) + content;\n sep = '\\n';\n }\n else if (indent.length > trimIndent || content[0] === '\\t') {\n // more-indented content within a folded block\n if (sep === ' ')\n sep = '\\n';\n else if (!prevMoreIndented && sep === '\\n')\n sep = '\\n\\n';\n value += sep + indent.slice(trimIndent) + content;\n sep = '\\n';\n prevMoreIndented = true;\n }\n else if (content === '') {\n // empty line\n if (sep === '\\n')\n value += '\\n';\n else\n sep = '\\n';\n }\n else {\n value += sep + content;\n sep = ' ';\n prevMoreIndented = false;\n }\n }\n switch (header.chomp) {\n case '-':\n break;\n case '+':\n for (let i = chompStart; i < lines.length; ++i)\n value += '\\n' + lines[i][0].slice(trimIndent);\n if (value[value.length - 1] !== '\\n')\n value += '\\n';\n break;\n default:\n value += '\\n';\n }\n const end = start + header.length + scalar.source.length;\n return { value, type, comment: header.comment, range: [start, end, end] };\n}\nfunction parseBlockScalarHeader({ offset, props }, strict, onError) {\n /* istanbul ignore if should not happen */\n if (props[0].type !== 'block-scalar-header') {\n onError(props[0], 'IMPOSSIBLE', 'Block scalar header not found');\n return null;\n }\n const { source } = props[0];\n const mode = source[0];\n let indent = 0;\n let chomp = '';\n let error = -1;\n for (let i = 1; i < source.length; ++i) {\n const ch = source[i];\n if (!chomp && (ch === '-' || ch === '+'))\n chomp = ch;\n else {\n const n = Number(ch);\n if (!indent && n)\n indent = n;\n else if (error === -1)\n error = offset + i;\n }\n }\n if (error !== -1)\n onError(error, 'UNEXPECTED_TOKEN', `Block scalar header includes extra characters: ${source}`);\n let hasSpace = false;\n let comment = '';\n let length = source.length;\n for (let i = 1; i < props.length; ++i) {\n const token = props[i];\n switch (token.type) {\n case 'space':\n hasSpace = true;\n // fallthrough\n case 'newline':\n length += token.source.length;\n break;\n case 'comment':\n if (strict && !hasSpace) {\n const message = 'Comments must be separated from other tokens by white space characters';\n onError(token, 'MISSING_CHAR', message);\n }\n length += token.source.length;\n comment = token.source.substring(1);\n break;\n case 'error':\n onError(token, 'UNEXPECTED_TOKEN', token.message);\n length += token.source.length;\n break;\n /* istanbul ignore next should not happen */\n default: {\n const message = `Unexpected token in block scalar header: ${token.type}`;\n onError(token, 'UNEXPECTED_TOKEN', message);\n const ts = token.source;\n if (ts && typeof ts === 'string')\n length += ts.length;\n }\n }\n }\n return { mode, indent, chomp, comment, length };\n}\n/** @returns Array of lines split up as `[indent, content]` */\nfunction splitLines(source) {\n const split = source.split(/\\n( *)/);\n const first = split[0];\n const m = first.match(/^( *)/);\n const line0 = m?.[1]\n ? [m[1], first.slice(m[1].length)]\n : ['', first];\n const lines = [line0];\n for (let i = 1; i < split.length; i += 2)\n lines.push([split[i], split[i + 1]]);\n return lines;\n}\n\nexports.resolveBlockScalar = resolveBlockScalar;\n",
|
|
62
|
+
"'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\nvar resolveEnd = require('./resolve-end.js');\n\nfunction resolveFlowScalar(scalar, strict, onError) {\n const { offset, type, source, end } = scalar;\n let _type;\n let value;\n const _onError = (rel, code, msg) => onError(offset + rel, code, msg);\n switch (type) {\n case 'scalar':\n _type = Scalar.Scalar.PLAIN;\n value = plainValue(source, _onError);\n break;\n case 'single-quoted-scalar':\n _type = Scalar.Scalar.QUOTE_SINGLE;\n value = singleQuotedValue(source, _onError);\n break;\n case 'double-quoted-scalar':\n _type = Scalar.Scalar.QUOTE_DOUBLE;\n value = doubleQuotedValue(source, _onError);\n break;\n /* istanbul ignore next should not happen */\n default:\n onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`);\n return {\n value: '',\n type: null,\n comment: '',\n range: [offset, offset + source.length, offset + source.length]\n };\n }\n const valueEnd = offset + source.length;\n const re = resolveEnd.resolveEnd(end, valueEnd, strict, onError);\n return {\n value,\n type: _type,\n comment: re.comment,\n range: [offset, valueEnd, re.offset]\n };\n}\nfunction plainValue(source, onError) {\n let badChar = '';\n switch (source[0]) {\n /* istanbul ignore next should not happen */\n case '\\t':\n badChar = 'a tab character';\n break;\n case ',':\n badChar = 'flow indicator character ,';\n break;\n case '%':\n badChar = 'directive indicator character %';\n break;\n case '|':\n case '>': {\n badChar = `block scalar indicator ${source[0]}`;\n break;\n }\n case '@':\n case '`': {\n badChar = `reserved character ${source[0]}`;\n break;\n }\n }\n if (badChar)\n onError(0, 'BAD_SCALAR_START', `Plain value cannot start with ${badChar}`);\n return foldLines(source);\n}\nfunction singleQuotedValue(source, onError) {\n if (source[source.length - 1] !== \"'\" || source.length === 1)\n onError(source.length, 'MISSING_CHAR', \"Missing closing 'quote\");\n return foldLines(source.slice(1, -1)).replace(/''/g, \"'\");\n}\nfunction foldLines(source) {\n /**\n * The negative lookbehind here and in the `re` RegExp is to\n * prevent causing a polynomial search time in certain cases.\n *\n * The try-catch is for Safari, which doesn't support this yet:\n * https://caniuse.com/js-regexp-lookbehind\n */\n let first, line;\n try {\n first = new RegExp('(.*?)(?<![ \\t])[ \\t]*\\r?\\n', 'sy');\n line = new RegExp('[ \\t]*(.*?)(?:(?<![ \\t])[ \\t]*)?\\r?\\n', 'sy');\n }\n catch {\n first = /(.*?)[ \\t]*\\r?\\n/sy;\n line = /[ \\t]*(.*?)[ \\t]*\\r?\\n/sy;\n }\n let match = first.exec(source);\n if (!match)\n return source;\n let res = match[1];\n let sep = ' ';\n let pos = first.lastIndex;\n line.lastIndex = pos;\n while ((match = line.exec(source))) {\n if (match[1] === '') {\n if (sep === '\\n')\n res += sep;\n else\n sep = '\\n';\n }\n else {\n res += sep + match[1];\n sep = ' ';\n }\n pos = line.lastIndex;\n }\n const last = /[ \\t]*(.*)/sy;\n last.lastIndex = pos;\n match = last.exec(source);\n return res + sep + (match?.[1] ?? '');\n}\nfunction doubleQuotedValue(source, onError) {\n let res = '';\n for (let i = 1; i < source.length - 1; ++i) {\n const ch = source[i];\n if (ch === '\\r' && source[i + 1] === '\\n')\n continue;\n if (ch === '\\n') {\n const { fold, offset } = foldNewline(source, i);\n res += fold;\n i = offset;\n }\n else if (ch === '\\\\') {\n let next = source[++i];\n const cc = escapeCodes[next];\n if (cc)\n res += cc;\n else if (next === '\\n') {\n // skip escaped newlines, but still trim the following line\n next = source[i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n }\n else if (next === '\\r' && source[i + 1] === '\\n') {\n // skip escaped CRLF newlines, but still trim the following line\n next = source[++i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n }\n else if (next === 'x' || next === 'u' || next === 'U') {\n const length = next === 'x' ? 2 : next === 'u' ? 4 : 8;\n res += parseCharCode(source, i + 1, length, onError);\n i += length;\n }\n else {\n const raw = source.substr(i - 1, 2);\n onError(i - 1, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);\n res += raw;\n }\n }\n else if (ch === ' ' || ch === '\\t') {\n // trim trailing whitespace\n const wsStart = i;\n let next = source[i + 1];\n while (next === ' ' || next === '\\t')\n next = source[++i + 1];\n if (next !== '\\n' && !(next === '\\r' && source[i + 2] === '\\n'))\n res += i > wsStart ? source.slice(wsStart, i + 1) : ch;\n }\n else {\n res += ch;\n }\n }\n if (source[source.length - 1] !== '\"' || source.length === 1)\n onError(source.length, 'MISSING_CHAR', 'Missing closing \"quote');\n return res;\n}\n/**\n * Fold a single newline into a space, multiple newlines to N - 1 newlines.\n * Presumes `source[offset] === '\\n'`\n */\nfunction foldNewline(source, offset) {\n let fold = '';\n let ch = source[offset + 1];\n while (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n if (ch === '\\r' && source[offset + 2] !== '\\n')\n break;\n if (ch === '\\n')\n fold += '\\n';\n offset += 1;\n ch = source[offset + 1];\n }\n if (!fold)\n fold = ' ';\n return { fold, offset };\n}\nconst escapeCodes = {\n '0': '\\0', // null character\n a: '\\x07', // bell character\n b: '\\b', // backspace\n e: '\\x1b', // escape character\n f: '\\f', // form feed\n n: '\\n', // line feed\n r: '\\r', // carriage return\n t: '\\t', // horizontal tab\n v: '\\v', // vertical tab\n N: '\\u0085', // Unicode next line\n _: '\\u00a0', // Unicode non-breaking space\n L: '\\u2028', // Unicode line separator\n P: '\\u2029', // Unicode paragraph separator\n ' ': ' ',\n '\"': '\"',\n '/': '/',\n '\\\\': '\\\\',\n '\\t': '\\t'\n};\nfunction parseCharCode(source, offset, length, onError) {\n const cc = source.substr(offset, length);\n const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);\n const code = ok ? parseInt(cc, 16) : NaN;\n try {\n return String.fromCodePoint(code);\n }\n catch {\n const raw = source.substr(offset - 2, length + 2);\n onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);\n return raw;\n }\n}\n\nexports.resolveFlowScalar = resolveFlowScalar;\n",
|
|
63
|
+
"'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar resolveBlockScalar = require('./resolve-block-scalar.js');\nvar resolveFlowScalar = require('./resolve-flow-scalar.js');\n\nfunction composeScalar(ctx, token, tagToken, onError) {\n const { value, type, comment, range } = token.type === 'block-scalar'\n ? resolveBlockScalar.resolveBlockScalar(ctx, token, onError)\n : resolveFlowScalar.resolveFlowScalar(token, ctx.options.strict, onError);\n const tagName = tagToken\n ? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg))\n : null;\n let tag;\n if (ctx.options.stringKeys && ctx.atKey) {\n tag = ctx.schema[identity.SCALAR];\n }\n else if (tagName)\n tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError);\n else if (token.type === 'scalar')\n tag = findScalarTagByTest(ctx, value, token, onError);\n else\n tag = ctx.schema[identity.SCALAR];\n let scalar;\n try {\n const res = tag.resolve(value, msg => onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg), ctx.options);\n scalar = identity.isScalar(res) ? res : new Scalar.Scalar(res);\n }\n catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg);\n scalar = new Scalar.Scalar(value);\n }\n scalar.range = range;\n scalar.source = value;\n if (type)\n scalar.type = type;\n if (tagName)\n scalar.tag = tagName;\n if (tag.format)\n scalar.format = tag.format;\n if (comment)\n scalar.comment = comment;\n return scalar;\n}\nfunction findScalarTagByName(schema, value, tagName, tagToken, onError) {\n if (tagName === '!')\n return schema[identity.SCALAR]; // non-specific tag\n const matchWithTest = [];\n for (const tag of schema.tags) {\n if (!tag.collection && tag.tag === tagName) {\n if (tag.default && tag.test)\n matchWithTest.push(tag);\n else\n return tag;\n }\n }\n for (const tag of matchWithTest)\n if (tag.test?.test(value))\n return tag;\n const kt = schema.knownTags[tagName];\n if (kt && !kt.collection) {\n // Ensure that the known tag is available for stringifying,\n // but does not get used by default.\n schema.tags.push(Object.assign({}, kt, { default: false, test: undefined }));\n return kt;\n }\n onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str');\n return schema[identity.SCALAR];\n}\nfunction findScalarTagByTest({ atKey, directives, schema }, value, token, onError) {\n const tag = schema.tags.find(tag => (tag.default === true || (atKey && tag.default === 'key')) &&\n tag.test?.test(value)) || schema[identity.SCALAR];\n if (schema.compat) {\n const compat = schema.compat.find(tag => tag.default && tag.test?.test(value)) ??\n schema[identity.SCALAR];\n if (tag.tag !== compat.tag) {\n const ts = directives.tagString(tag.tag);\n const cs = directives.tagString(compat.tag);\n const msg = `Value may be parsed as either ${ts} or ${cs}`;\n onError(token, 'TAG_RESOLVE_FAILED', msg, true);\n }\n }\n return tag;\n}\n\nexports.composeScalar = composeScalar;\n",
|
|
64
|
+
"'use strict';\n\nfunction emptyScalarPosition(offset, before, pos) {\n if (before) {\n pos ?? (pos = before.length);\n for (let i = pos - 1; i >= 0; --i) {\n let st = before[i];\n switch (st.type) {\n case 'space':\n case 'comment':\n case 'newline':\n offset -= st.source.length;\n continue;\n }\n // Technically, an empty scalar is immediately after the last non-empty\n // node, but it's more useful to place it after any whitespace.\n st = before[++i];\n while (st?.type === 'space') {\n offset += st.source.length;\n st = before[++i];\n }\n break;\n }\n }\n return offset;\n}\n\nexports.emptyScalarPosition = emptyScalarPosition;\n",
|
|
65
|
+
"'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar identity = require('../nodes/identity.js');\nvar composeCollection = require('./compose-collection.js');\nvar composeScalar = require('./compose-scalar.js');\nvar resolveEnd = require('./resolve-end.js');\nvar utilEmptyScalarPosition = require('./util-empty-scalar-position.js');\n\nconst CN = { composeNode, composeEmptyNode };\nfunction composeNode(ctx, token, props, onError) {\n const atKey = ctx.atKey;\n const { spaceBefore, comment, anchor, tag } = props;\n let node;\n let isSrcToken = true;\n switch (token.type) {\n case 'alias':\n node = composeAlias(ctx, token, onError);\n if (anchor || tag)\n onError(token, 'ALIAS_PROPS', 'An alias node must not specify any properties');\n break;\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n case 'block-scalar':\n node = composeScalar.composeScalar(ctx, token, tag, onError);\n if (anchor)\n node.anchor = anchor.source.substring(1);\n break;\n case 'block-map':\n case 'block-seq':\n case 'flow-collection':\n try {\n node = composeCollection.composeCollection(CN, ctx, token, props, onError);\n if (anchor)\n node.anchor = anchor.source.substring(1);\n }\n catch (error) {\n // Almost certainly here due to a stack overflow\n const message = error instanceof Error ? error.message : String(error);\n onError(token, 'RESOURCE_EXHAUSTION', message);\n }\n break;\n default: {\n const message = token.type === 'error'\n ? token.message\n : `Unsupported token (type: ${token.type})`;\n onError(token, 'UNEXPECTED_TOKEN', message);\n isSrcToken = false;\n }\n }\n node ?? (node = composeEmptyNode(ctx, token.offset, undefined, null, props, onError));\n if (anchor && node.anchor === '')\n onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');\n if (atKey &&\n ctx.options.stringKeys &&\n (!identity.isScalar(node) ||\n typeof node.value !== 'string' ||\n (node.tag && node.tag !== 'tag:yaml.org,2002:str'))) {\n const msg = 'With stringKeys, all keys must be strings';\n onError(tag ?? token, 'NON_STRING_KEY', msg);\n }\n if (spaceBefore)\n node.spaceBefore = true;\n if (comment) {\n if (token.type === 'scalar' && token.source === '')\n node.comment = comment;\n else\n node.commentBefore = comment;\n }\n // @ts-expect-error Type checking misses meaning of isSrcToken\n if (ctx.options.keepSourceTokens && isSrcToken)\n node.srcToken = token;\n return node;\n}\nfunction composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag, end }, onError) {\n const token = {\n type: 'scalar',\n offset: utilEmptyScalarPosition.emptyScalarPosition(offset, before, pos),\n indent: -1,\n source: ''\n };\n const node = composeScalar.composeScalar(ctx, token, tag, onError);\n if (anchor) {\n node.anchor = anchor.source.substring(1);\n if (node.anchor === '')\n onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');\n }\n if (spaceBefore)\n node.spaceBefore = true;\n if (comment) {\n node.comment = comment;\n node.range[2] = end;\n }\n return node;\n}\nfunction composeAlias({ options }, { offset, source, end }, onError) {\n const alias = new Alias.Alias(source.substring(1));\n if (alias.source === '')\n onError(offset, 'BAD_ALIAS', 'Alias cannot be an empty string');\n if (alias.source.endsWith(':'))\n onError(offset + source.length - 1, 'BAD_ALIAS', 'Alias ending in : is ambiguous', true);\n const valueEnd = offset + source.length;\n const re = resolveEnd.resolveEnd(end, valueEnd, options.strict, onError);\n alias.range = [offset, valueEnd, re.offset];\n if (re.comment)\n alias.comment = re.comment;\n return alias;\n}\n\nexports.composeEmptyNode = composeEmptyNode;\nexports.composeNode = composeNode;\n",
|
|
66
|
+
"'use strict';\n\nvar Document = require('../doc/Document.js');\nvar composeNode = require('./compose-node.js');\nvar resolveEnd = require('./resolve-end.js');\nvar resolveProps = require('./resolve-props.js');\n\nfunction composeDoc(options, directives, { offset, start, value, end }, onError) {\n const opts = Object.assign({ _directives: directives }, options);\n const doc = new Document.Document(undefined, opts);\n const ctx = {\n atKey: false,\n atRoot: true,\n directives: doc.directives,\n options: doc.options,\n schema: doc.schema\n };\n const props = resolveProps.resolveProps(start, {\n indicator: 'doc-start',\n next: value ?? end?.[0],\n offset,\n onError,\n parentIndent: 0,\n startOnNewline: true\n });\n if (props.found) {\n doc.directives.docStart = true;\n if (value &&\n (value.type === 'block-map' || value.type === 'block-seq') &&\n !props.hasNewline)\n onError(props.end, 'MISSING_CHAR', 'Block collection cannot start on same line with directives-end marker');\n }\n // @ts-expect-error If Contents is set, let's trust the user\n doc.contents = value\n ? composeNode.composeNode(ctx, value, props, onError)\n : composeNode.composeEmptyNode(ctx, props.end, start, null, props, onError);\n const contentEnd = doc.contents.range[2];\n const re = resolveEnd.resolveEnd(end, contentEnd, false, onError);\n if (re.comment)\n doc.comment = re.comment;\n doc.range = [offset, contentEnd, re.offset];\n return doc;\n}\n\nexports.composeDoc = composeDoc;\n",
|
|
67
|
+
"'use strict';\n\nvar node_process = require('process');\nvar directives = require('../doc/directives.js');\nvar Document = require('../doc/Document.js');\nvar errors = require('../errors.js');\nvar identity = require('../nodes/identity.js');\nvar composeDoc = require('./compose-doc.js');\nvar resolveEnd = require('./resolve-end.js');\n\nfunction getErrorPos(src) {\n if (typeof src === 'number')\n return [src, src + 1];\n if (Array.isArray(src))\n return src.length === 2 ? src : [src[0], src[1]];\n const { offset, source } = src;\n return [offset, offset + (typeof source === 'string' ? source.length : 1)];\n}\nfunction parsePrelude(prelude) {\n let comment = '';\n let atComment = false;\n let afterEmptyLine = false;\n for (let i = 0; i < prelude.length; ++i) {\n const source = prelude[i];\n switch (source[0]) {\n case '#':\n comment +=\n (comment === '' ? '' : afterEmptyLine ? '\\n\\n' : '\\n') +\n (source.substring(1) || ' ');\n atComment = true;\n afterEmptyLine = false;\n break;\n case '%':\n if (prelude[i + 1]?.[0] !== '#')\n i += 1;\n atComment = false;\n break;\n default:\n // This may be wrong after doc-end, but in that case it doesn't matter\n if (!atComment)\n afterEmptyLine = true;\n atComment = false;\n }\n }\n return { comment, afterEmptyLine };\n}\n/**\n * Compose a stream of CST nodes into a stream of YAML Documents.\n *\n * ```ts\n * import { Composer, Parser } from 'yaml'\n *\n * const src: string = ...\n * const tokens = new Parser().parse(src)\n * const docs = new Composer().compose(tokens)\n * ```\n */\nclass Composer {\n constructor(options = {}) {\n this.doc = null;\n this.atDirectives = false;\n this.prelude = [];\n this.errors = [];\n this.warnings = [];\n this.onError = (source, code, message, warning) => {\n const pos = getErrorPos(source);\n if (warning)\n this.warnings.push(new errors.YAMLWarning(pos, code, message));\n else\n this.errors.push(new errors.YAMLParseError(pos, code, message));\n };\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n this.directives = new directives.Directives({ version: options.version || '1.2' });\n this.options = options;\n }\n decorate(doc, afterDoc) {\n const { comment, afterEmptyLine } = parsePrelude(this.prelude);\n //console.log({ dc: doc.comment, prelude, comment })\n if (comment) {\n const dc = doc.contents;\n if (afterDoc) {\n doc.comment = doc.comment ? `${doc.comment}\\n${comment}` : comment;\n }\n else if (afterEmptyLine || doc.directives.docStart || !dc) {\n doc.commentBefore = comment;\n }\n else if (identity.isCollection(dc) && !dc.flow && dc.items.length > 0) {\n let it = dc.items[0];\n if (identity.isPair(it))\n it = it.key;\n const cb = it.commentBefore;\n it.commentBefore = cb ? `${comment}\\n${cb}` : comment;\n }\n else {\n const cb = dc.commentBefore;\n dc.commentBefore = cb ? `${comment}\\n${cb}` : comment;\n }\n }\n if (afterDoc) {\n for (let i = 0; i < this.errors.length; ++i)\n doc.errors.push(this.errors[i]);\n for (let i = 0; i < this.warnings.length; ++i)\n doc.warnings.push(this.warnings[i]);\n }\n else {\n doc.errors = this.errors;\n doc.warnings = this.warnings;\n }\n this.prelude = [];\n this.errors = [];\n this.warnings = [];\n }\n /**\n * Current stream status information.\n *\n * Mostly useful at the end of input for an empty stream.\n */\n streamInfo() {\n return {\n comment: parsePrelude(this.prelude).comment,\n directives: this.directives,\n errors: this.errors,\n warnings: this.warnings\n };\n }\n /**\n * Compose tokens into documents.\n *\n * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.\n * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.\n */\n *compose(tokens, forceDoc = false, endOffset = -1) {\n for (const token of tokens)\n yield* this.next(token);\n yield* this.end(forceDoc, endOffset);\n }\n /** Advance the composer by one CST token. */\n *next(token) {\n if (node_process.env.LOG_STREAM)\n console.dir(token, { depth: null });\n switch (token.type) {\n case 'directive':\n this.directives.add(token.source, (offset, message, warning) => {\n const pos = getErrorPos(token);\n pos[0] += offset;\n this.onError(pos, 'BAD_DIRECTIVE', message, warning);\n });\n this.prelude.push(token.source);\n this.atDirectives = true;\n break;\n case 'document': {\n const doc = composeDoc.composeDoc(this.options, this.directives, token, this.onError);\n if (this.atDirectives && !doc.directives.docStart)\n this.onError(token, 'MISSING_CHAR', 'Missing directives-end/doc-start indicator line');\n this.decorate(doc, false);\n if (this.doc)\n yield this.doc;\n this.doc = doc;\n this.atDirectives = false;\n break;\n }\n case 'byte-order-mark':\n case 'space':\n break;\n case 'comment':\n case 'newline':\n this.prelude.push(token.source);\n break;\n case 'error': {\n const msg = token.source\n ? `${token.message}: ${JSON.stringify(token.source)}`\n : token.message;\n const error = new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg);\n if (this.atDirectives || !this.doc)\n this.errors.push(error);\n else\n this.doc.errors.push(error);\n break;\n }\n case 'doc-end': {\n if (!this.doc) {\n const msg = 'Unexpected doc-end without preceding document';\n this.errors.push(new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg));\n break;\n }\n this.doc.directives.docEnd = true;\n const end = resolveEnd.resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError);\n this.decorate(this.doc, true);\n if (end.comment) {\n const dc = this.doc.comment;\n this.doc.comment = dc ? `${dc}\\n${end.comment}` : end.comment;\n }\n this.doc.range[2] = end.offset;\n break;\n }\n default:\n this.errors.push(new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', `Unsupported token ${token.type}`));\n }\n }\n /**\n * Call at end of input to yield any remaining document.\n *\n * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.\n * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.\n */\n *end(forceDoc = false, endOffset = -1) {\n if (this.doc) {\n this.decorate(this.doc, true);\n yield this.doc;\n this.doc = null;\n }\n else if (forceDoc) {\n const opts = Object.assign({ _directives: this.directives }, this.options);\n const doc = new Document.Document(undefined, opts);\n if (this.atDirectives)\n this.onError(endOffset, 'MISSING_CHAR', 'Missing directives-end indicator line');\n doc.range = [0, endOffset, endOffset];\n this.decorate(doc, false);\n yield doc;\n }\n }\n}\n\nexports.Composer = Composer;\n",
|
|
68
|
+
"'use strict';\n\nvar resolveBlockScalar = require('../compose/resolve-block-scalar.js');\nvar resolveFlowScalar = require('../compose/resolve-flow-scalar.js');\nvar errors = require('../errors.js');\nvar stringifyString = require('../stringify/stringifyString.js');\n\nfunction resolveAsScalar(token, strict = true, onError) {\n if (token) {\n const _onError = (pos, code, message) => {\n const offset = typeof pos === 'number' ? pos : Array.isArray(pos) ? pos[0] : pos.offset;\n if (onError)\n onError(offset, code, message);\n else\n throw new errors.YAMLParseError([offset, offset + 1], code, message);\n };\n switch (token.type) {\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return resolveFlowScalar.resolveFlowScalar(token, strict, _onError);\n case 'block-scalar':\n return resolveBlockScalar.resolveBlockScalar({ options: { strict } }, token, _onError);\n }\n }\n return null;\n}\n/**\n * Create a new scalar token with `value`\n *\n * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`,\n * as this function does not support any schema operations and won't check for such conflicts.\n *\n * @param value The string representation of the value, which will have its content properly indented.\n * @param context.end Comments and whitespace after the end of the value, or after the block scalar header. If undefined, a newline will be added.\n * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value.\n * @param context.indent The indent level of the token.\n * @param context.inFlow Is this scalar within a flow collection? This may affect the resolved type of the token's value.\n * @param context.offset The offset position of the token.\n * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`.\n */\nfunction createScalarToken(value, context) {\n const { implicitKey = false, indent, inFlow = false, offset = -1, type = 'PLAIN' } = context;\n const source = stringifyString.stringifyString({ type, value }, {\n implicitKey,\n indent: indent > 0 ? ' '.repeat(indent) : '',\n inFlow,\n options: { blockQuote: true, lineWidth: -1 }\n });\n const end = context.end ?? [\n { type: 'newline', offset: -1, indent, source: '\\n' }\n ];\n switch (source[0]) {\n case '|':\n case '>': {\n const he = source.indexOf('\\n');\n const head = source.substring(0, he);\n const body = source.substring(he + 1) + '\\n';\n const props = [\n { type: 'block-scalar-header', offset, indent, source: head }\n ];\n if (!addEndtoBlockProps(props, end))\n props.push({ type: 'newline', offset: -1, indent, source: '\\n' });\n return { type: 'block-scalar', offset, indent, props, source: body };\n }\n case '\"':\n return { type: 'double-quoted-scalar', offset, indent, source, end };\n case \"'\":\n return { type: 'single-quoted-scalar', offset, indent, source, end };\n default:\n return { type: 'scalar', offset, indent, source, end };\n }\n}\n/**\n * Set the value of `token` to the given string `value`, overwriting any previous contents and type that it may have.\n *\n * Best efforts are made to retain any comments previously associated with the `token`,\n * though all contents within a collection's `items` will be overwritten.\n *\n * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`,\n * as this function does not support any schema operations and won't check for such conflicts.\n *\n * @param token Any token. If it does not include an `indent` value, the value will be stringified as if it were an implicit key.\n * @param value The string representation of the value, which will have its content properly indented.\n * @param context.afterKey In most cases, values after a key should have an additional level of indentation.\n * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value.\n * @param context.inFlow Being within a flow collection may affect the resolved type of the token's value.\n * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`.\n */\nfunction setScalarValue(token, value, context = {}) {\n let { afterKey = false, implicitKey = false, inFlow = false, type } = context;\n let indent = 'indent' in token ? token.indent : null;\n if (afterKey && typeof indent === 'number')\n indent += 2;\n if (!type)\n switch (token.type) {\n case 'single-quoted-scalar':\n type = 'QUOTE_SINGLE';\n break;\n case 'double-quoted-scalar':\n type = 'QUOTE_DOUBLE';\n break;\n case 'block-scalar': {\n const header = token.props[0];\n if (header.type !== 'block-scalar-header')\n throw new Error('Invalid block scalar header');\n type = header.source[0] === '>' ? 'BLOCK_FOLDED' : 'BLOCK_LITERAL';\n break;\n }\n default:\n type = 'PLAIN';\n }\n const source = stringifyString.stringifyString({ type, value }, {\n implicitKey: implicitKey || indent === null,\n indent: indent !== null && indent > 0 ? ' '.repeat(indent) : '',\n inFlow,\n options: { blockQuote: true, lineWidth: -1 }\n });\n switch (source[0]) {\n case '|':\n case '>':\n setBlockScalarValue(token, source);\n break;\n case '\"':\n setFlowScalarValue(token, source, 'double-quoted-scalar');\n break;\n case \"'\":\n setFlowScalarValue(token, source, 'single-quoted-scalar');\n break;\n default:\n setFlowScalarValue(token, source, 'scalar');\n }\n}\nfunction setBlockScalarValue(token, source) {\n const he = source.indexOf('\\n');\n const head = source.substring(0, he);\n const body = source.substring(he + 1) + '\\n';\n if (token.type === 'block-scalar') {\n const header = token.props[0];\n if (header.type !== 'block-scalar-header')\n throw new Error('Invalid block scalar header');\n header.source = head;\n token.source = body;\n }\n else {\n const { offset } = token;\n const indent = 'indent' in token ? token.indent : -1;\n const props = [\n { type: 'block-scalar-header', offset, indent, source: head }\n ];\n if (!addEndtoBlockProps(props, 'end' in token ? token.end : undefined))\n props.push({ type: 'newline', offset: -1, indent, source: '\\n' });\n for (const key of Object.keys(token))\n if (key !== 'type' && key !== 'offset')\n delete token[key];\n Object.assign(token, { type: 'block-scalar', indent, props, source: body });\n }\n}\n/** @returns `true` if last token is a newline */\nfunction addEndtoBlockProps(props, end) {\n if (end)\n for (const st of end)\n switch (st.type) {\n case 'space':\n case 'comment':\n props.push(st);\n break;\n case 'newline':\n props.push(st);\n return true;\n }\n return false;\n}\nfunction setFlowScalarValue(token, source, type) {\n switch (token.type) {\n case 'scalar':\n case 'double-quoted-scalar':\n case 'single-quoted-scalar':\n token.type = type;\n token.source = source;\n break;\n case 'block-scalar': {\n const end = token.props.slice(1);\n let oa = source.length;\n if (token.props[0].type === 'block-scalar-header')\n oa -= token.props[0].source.length;\n for (const tok of end)\n tok.offset += oa;\n delete token.props;\n Object.assign(token, { type, source, end });\n break;\n }\n case 'block-map':\n case 'block-seq': {\n const offset = token.offset + source.length;\n const nl = { type: 'newline', offset, indent: token.indent, source: '\\n' };\n delete token.items;\n Object.assign(token, { type, source, end: [nl] });\n break;\n }\n default: {\n const indent = 'indent' in token ? token.indent : -1;\n const end = 'end' in token && Array.isArray(token.end)\n ? token.end.filter(st => st.type === 'space' ||\n st.type === 'comment' ||\n st.type === 'newline')\n : [];\n for (const key of Object.keys(token))\n if (key !== 'type' && key !== 'offset')\n delete token[key];\n Object.assign(token, { type, indent, source, end });\n }\n }\n}\n\nexports.createScalarToken = createScalarToken;\nexports.resolveAsScalar = resolveAsScalar;\nexports.setScalarValue = setScalarValue;\n",
|
|
69
|
+
"'use strict';\n\n/**\n * Stringify a CST document, token, or collection item\n *\n * Fair warning: This applies no validation whatsoever, and\n * simply concatenates the sources in their logical order.\n */\nconst stringify = (cst) => 'type' in cst ? stringifyToken(cst) : stringifyItem(cst);\nfunction stringifyToken(token) {\n switch (token.type) {\n case 'block-scalar': {\n let res = '';\n for (const tok of token.props)\n res += stringifyToken(tok);\n return res + token.source;\n }\n case 'block-map':\n case 'block-seq': {\n let res = '';\n for (const item of token.items)\n res += stringifyItem(item);\n return res;\n }\n case 'flow-collection': {\n let res = token.start.source;\n for (const item of token.items)\n res += stringifyItem(item);\n for (const st of token.end)\n res += st.source;\n return res;\n }\n case 'document': {\n let res = stringifyItem(token);\n if (token.end)\n for (const st of token.end)\n res += st.source;\n return res;\n }\n default: {\n let res = token.source;\n if ('end' in token && token.end)\n for (const st of token.end)\n res += st.source;\n return res;\n }\n }\n}\nfunction stringifyItem({ start, key, sep, value }) {\n let res = '';\n for (const st of start)\n res += st.source;\n if (key)\n res += stringifyToken(key);\n if (sep)\n for (const st of sep)\n res += st.source;\n if (value)\n res += stringifyToken(value);\n return res;\n}\n\nexports.stringify = stringify;\n",
|
|
70
|
+
"'use strict';\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove item');\n/**\n * Apply a visitor to a CST document or item.\n *\n * Walks through the tree (depth-first) starting from the root, calling a\n * `visitor` function with two arguments when entering each item:\n * - `item`: The current item, which included the following members:\n * - `start: SourceToken[]` – Source tokens before the key or value,\n * possibly including its anchor or tag.\n * - `key?: Token | null` – Set for pair values. May then be `null`, if\n * the key before the `:` separator is empty.\n * - `sep?: SourceToken[]` – Source tokens between the key and the value,\n * which should include the `:` map value indicator if `value` is set.\n * - `value?: Token` – The value of a sequence item, or of a map pair.\n * - `path`: The steps from the root to the current node, as an array of\n * `['key' | 'value', number]` tuples.\n *\n * The return value of the visitor may be used to control the traversal:\n * - `undefined` (default): Do nothing and continue\n * - `visit.SKIP`: Do not visit the children of this token, continue with\n * next sibling\n * - `visit.BREAK`: Terminate traversal completely\n * - `visit.REMOVE`: Remove the current item, then continue with the next one\n * - `number`: Set the index of the next step. This is useful especially if\n * the index of the current token has changed.\n * - `function`: Define the next visitor for this item. After the original\n * visitor is called on item entry, next visitors are called after handling\n * a non-empty `key` and when exiting the item.\n */\nfunction visit(cst, visitor) {\n if ('type' in cst && cst.type === 'document')\n cst = { start: cst.start, value: cst.value };\n _visit(Object.freeze([]), cst, visitor);\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current item */\nvisit.SKIP = SKIP;\n/** Remove the current item */\nvisit.REMOVE = REMOVE;\n/** Find the item at `path` from `cst` as the root */\nvisit.itemAtPath = (cst, path) => {\n let item = cst;\n for (const [field, index] of path) {\n const tok = item?.[field];\n if (tok && 'items' in tok) {\n item = tok.items[index];\n }\n else\n return undefined;\n }\n return item;\n};\n/**\n * Get the immediate parent collection of the item at `path` from `cst` as the root.\n *\n * Throws an error if the collection is not found, which should never happen if the item itself exists.\n */\nvisit.parentCollection = (cst, path) => {\n const parent = visit.itemAtPath(cst, path.slice(0, -1));\n const field = path[path.length - 1][0];\n const coll = parent?.[field];\n if (coll && 'items' in coll)\n return coll;\n throw new Error('Parent collection not found');\n};\nfunction _visit(path, item, visitor) {\n let ctrl = visitor(item, path);\n if (typeof ctrl === 'symbol')\n return ctrl;\n for (const field of ['key', 'value']) {\n const token = item[field];\n if (token && 'items' in token) {\n for (let i = 0; i < token.items.length; ++i) {\n const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor);\n if (typeof ci === 'number')\n i = ci - 1;\n else if (ci === BREAK)\n return BREAK;\n else if (ci === REMOVE) {\n token.items.splice(i, 1);\n i -= 1;\n }\n }\n if (typeof ctrl === 'function' && field === 'key')\n ctrl = ctrl(item, path);\n }\n }\n return typeof ctrl === 'function' ? ctrl(item, path) : ctrl;\n}\n\nexports.visit = visit;\n",
|
|
71
|
+
"'use strict';\n\nvar cstScalar = require('./cst-scalar.js');\nvar cstStringify = require('./cst-stringify.js');\nvar cstVisit = require('./cst-visit.js');\n\n/** The byte order mark */\nconst BOM = '\\u{FEFF}';\n/** Start of doc-mode */\nconst DOCUMENT = '\\x02'; // C0: Start of Text\n/** Unexpected end of flow-mode */\nconst FLOW_END = '\\x18'; // C0: Cancel\n/** Next token is a scalar value */\nconst SCALAR = '\\x1f'; // C0: Unit Separator\n/** @returns `true` if `token` is a flow or block collection */\nconst isCollection = (token) => !!token && 'items' in token;\n/** @returns `true` if `token` is a flow or block scalar; not an alias */\nconst isScalar = (token) => !!token &&\n (token.type === 'scalar' ||\n token.type === 'single-quoted-scalar' ||\n token.type === 'double-quoted-scalar' ||\n token.type === 'block-scalar');\n/* istanbul ignore next */\n/** Get a printable representation of a lexer token */\nfunction prettyToken(token) {\n switch (token) {\n case BOM:\n return '<BOM>';\n case DOCUMENT:\n return '<DOC>';\n case FLOW_END:\n return '<FLOW_END>';\n case SCALAR:\n return '<SCALAR>';\n default:\n return JSON.stringify(token);\n }\n}\n/** Identify the type of a lexer token. May return `null` for unknown tokens. */\nfunction tokenType(source) {\n switch (source) {\n case BOM:\n return 'byte-order-mark';\n case DOCUMENT:\n return 'doc-mode';\n case FLOW_END:\n return 'flow-error-end';\n case SCALAR:\n return 'scalar';\n case '---':\n return 'doc-start';\n case '...':\n return 'doc-end';\n case '':\n case '\\n':\n case '\\r\\n':\n return 'newline';\n case '-':\n return 'seq-item-ind';\n case '?':\n return 'explicit-key-ind';\n case ':':\n return 'map-value-ind';\n case '{':\n return 'flow-map-start';\n case '}':\n return 'flow-map-end';\n case '[':\n return 'flow-seq-start';\n case ']':\n return 'flow-seq-end';\n case ',':\n return 'comma';\n }\n switch (source[0]) {\n case ' ':\n case '\\t':\n return 'space';\n case '#':\n return 'comment';\n case '%':\n return 'directive-line';\n case '*':\n return 'alias';\n case '&':\n return 'anchor';\n case '!':\n return 'tag';\n case \"'\":\n return 'single-quoted-scalar';\n case '\"':\n return 'double-quoted-scalar';\n case '|':\n case '>':\n return 'block-scalar-header';\n }\n return null;\n}\n\nexports.createScalarToken = cstScalar.createScalarToken;\nexports.resolveAsScalar = cstScalar.resolveAsScalar;\nexports.setScalarValue = cstScalar.setScalarValue;\nexports.stringify = cstStringify.stringify;\nexports.visit = cstVisit.visit;\nexports.BOM = BOM;\nexports.DOCUMENT = DOCUMENT;\nexports.FLOW_END = FLOW_END;\nexports.SCALAR = SCALAR;\nexports.isCollection = isCollection;\nexports.isScalar = isScalar;\nexports.prettyToken = prettyToken;\nexports.tokenType = tokenType;\n",
|
|
72
|
+
"'use strict';\n\nvar cst = require('./cst.js');\n\n/*\nSTART -> stream\n\nstream\n directive -> line-end -> stream\n indent + line-end -> stream\n [else] -> line-start\n\nline-end\n comment -> line-end\n newline -> .\n input-end -> END\n\nline-start\n doc-start -> doc\n doc-end -> stream\n [else] -> indent -> block-start\n\nblock-start\n seq-item-start -> block-start\n explicit-key-start -> block-start\n map-value-start -> block-start\n [else] -> doc\n\ndoc\n line-end -> line-start\n spaces -> doc\n anchor -> doc\n tag -> doc\n flow-start -> flow -> doc\n flow-end -> error -> doc\n seq-item-start -> error -> doc\n explicit-key-start -> error -> doc\n map-value-start -> doc\n alias -> doc\n quote-start -> quoted-scalar -> doc\n block-scalar-header -> line-end -> block-scalar(min) -> line-start\n [else] -> plain-scalar(false, min) -> doc\n\nflow\n line-end -> flow\n spaces -> flow\n anchor -> flow\n tag -> flow\n flow-start -> flow -> flow\n flow-end -> .\n seq-item-start -> error -> flow\n explicit-key-start -> flow\n map-value-start -> flow\n alias -> flow\n quote-start -> quoted-scalar -> flow\n comma -> flow\n [else] -> plain-scalar(true, 0) -> flow\n\nquoted-scalar\n quote-end -> .\n [else] -> quoted-scalar\n\nblock-scalar(min)\n newline + peek(indent < min) -> .\n [else] -> block-scalar(min)\n\nplain-scalar(is-flow, min)\n scalar-end(is-flow) -> .\n peek(newline + (indent < min)) -> .\n [else] -> plain-scalar(min)\n*/\nfunction isEmpty(ch) {\n switch (ch) {\n case undefined:\n case ' ':\n case '\\n':\n case '\\r':\n case '\\t':\n return true;\n default:\n return false;\n }\n}\nconst hexDigits = new Set('0123456789ABCDEFabcdef');\nconst tagChars = new Set(\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()\");\nconst flowIndicatorChars = new Set(',[]{}');\nconst invalidAnchorChars = new Set(' ,[]{}\\n\\r\\t');\nconst isNotAnchorChar = (ch) => !ch || invalidAnchorChars.has(ch);\n/**\n * Splits an input string into lexical tokens, i.e. smaller strings that are\n * easily identifiable by `tokens.tokenType()`.\n *\n * Lexing starts always in a \"stream\" context. Incomplete input may be buffered\n * until a complete token can be emitted.\n *\n * In addition to slices of the original input, the following control characters\n * may also be emitted:\n *\n * - `\\x02` (Start of Text): A document starts with the next token\n * - `\\x18` (Cancel): Unexpected end of flow-mode (indicates an error)\n * - `\\x1f` (Unit Separator): Next token is a scalar value\n * - `\\u{FEFF}` (Byte order mark): Emitted separately outside documents\n */\nclass Lexer {\n constructor() {\n /**\n * Flag indicating whether the end of the current buffer marks the end of\n * all input\n */\n this.atEnd = false;\n /**\n * Explicit indent set in block scalar header, as an offset from the current\n * minimum indent, so e.g. set to 1 from a header `|2+`. Set to -1 if not\n * explicitly set.\n */\n this.blockScalarIndent = -1;\n /**\n * Block scalars that include a + (keep) chomping indicator in their header\n * include trailing empty lines, which are otherwise excluded from the\n * scalar's contents.\n */\n this.blockScalarKeep = false;\n /** Current input */\n this.buffer = '';\n /**\n * Flag noting whether the map value indicator : can immediately follow this\n * node within a flow context.\n */\n this.flowKey = false;\n /** Count of surrounding flow collection levels. */\n this.flowLevel = 0;\n /**\n * Minimum level of indentation required for next lines to be parsed as a\n * part of the current scalar value.\n */\n this.indentNext = 0;\n /** Indentation level of the current line. */\n this.indentValue = 0;\n /** Position of the next \\n character. */\n this.lineEndPos = null;\n /** Stores the state of the lexer if reaching the end of incpomplete input */\n this.next = null;\n /** A pointer to `buffer`; the current position of the lexer. */\n this.pos = 0;\n }\n /**\n * Generate YAML tokens from the `source` string. If `incomplete`,\n * a part of the last line may be left as a buffer for the next call.\n *\n * @returns A generator of lexical tokens\n */\n *lex(source, incomplete = false) {\n if (source) {\n if (typeof source !== 'string')\n throw TypeError('source is not a string');\n this.buffer = this.buffer ? this.buffer + source : source;\n this.lineEndPos = null;\n }\n this.atEnd = !incomplete;\n let next = this.next ?? 'stream';\n while (next && (incomplete || this.hasChars(1)))\n next = yield* this.parseNext(next);\n }\n atLineEnd() {\n let i = this.pos;\n let ch = this.buffer[i];\n while (ch === ' ' || ch === '\\t')\n ch = this.buffer[++i];\n if (!ch || ch === '#' || ch === '\\n')\n return true;\n if (ch === '\\r')\n return this.buffer[i + 1] === '\\n';\n return false;\n }\n charAt(n) {\n return this.buffer[this.pos + n];\n }\n continueScalar(offset) {\n let ch = this.buffer[offset];\n if (this.indentNext > 0) {\n let indent = 0;\n while (ch === ' ')\n ch = this.buffer[++indent + offset];\n if (ch === '\\r') {\n const next = this.buffer[indent + offset + 1];\n if (next === '\\n' || (!next && !this.atEnd))\n return offset + indent + 1;\n }\n return ch === '\\n' || indent >= this.indentNext || (!ch && !this.atEnd)\n ? offset + indent\n : -1;\n }\n if (ch === '-' || ch === '.') {\n const dt = this.buffer.substr(offset, 3);\n if ((dt === '---' || dt === '...') && isEmpty(this.buffer[offset + 3]))\n return -1;\n }\n return offset;\n }\n getLine() {\n let end = this.lineEndPos;\n if (typeof end !== 'number' || (end !== -1 && end < this.pos)) {\n end = this.buffer.indexOf('\\n', this.pos);\n this.lineEndPos = end;\n }\n if (end === -1)\n return this.atEnd ? this.buffer.substring(this.pos) : null;\n if (this.buffer[end - 1] === '\\r')\n end -= 1;\n return this.buffer.substring(this.pos, end);\n }\n hasChars(n) {\n return this.pos + n <= this.buffer.length;\n }\n setNext(state) {\n this.buffer = this.buffer.substring(this.pos);\n this.pos = 0;\n this.lineEndPos = null;\n this.next = state;\n return null;\n }\n peek(n) {\n return this.buffer.substr(this.pos, n);\n }\n *parseNext(next) {\n switch (next) {\n case 'stream':\n return yield* this.parseStream();\n case 'line-start':\n return yield* this.parseLineStart();\n case 'block-start':\n return yield* this.parseBlockStart();\n case 'doc':\n return yield* this.parseDocument();\n case 'flow':\n return yield* this.parseFlowCollection();\n case 'quoted-scalar':\n return yield* this.parseQuotedScalar();\n case 'block-scalar':\n return yield* this.parseBlockScalar();\n case 'plain-scalar':\n return yield* this.parsePlainScalar();\n }\n }\n *parseStream() {\n let line = this.getLine();\n if (line === null)\n return this.setNext('stream');\n if (line[0] === cst.BOM) {\n yield* this.pushCount(1);\n line = line.substring(1);\n }\n if (line[0] === '%') {\n let dirEnd = line.length;\n let cs = line.indexOf('#');\n while (cs !== -1) {\n const ch = line[cs - 1];\n if (ch === ' ' || ch === '\\t') {\n dirEnd = cs - 1;\n break;\n }\n else {\n cs = line.indexOf('#', cs + 1);\n }\n }\n while (true) {\n const ch = line[dirEnd - 1];\n if (ch === ' ' || ch === '\\t')\n dirEnd -= 1;\n else\n break;\n }\n const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true));\n yield* this.pushCount(line.length - n); // possible comment\n this.pushNewline();\n return 'stream';\n }\n if (this.atLineEnd()) {\n const sp = yield* this.pushSpaces(true);\n yield* this.pushCount(line.length - sp);\n yield* this.pushNewline();\n return 'stream';\n }\n yield cst.DOCUMENT;\n return yield* this.parseLineStart();\n }\n *parseLineStart() {\n const ch = this.charAt(0);\n if (!ch && !this.atEnd)\n return this.setNext('line-start');\n if (ch === '-' || ch === '.') {\n if (!this.atEnd && !this.hasChars(4))\n return this.setNext('line-start');\n const s = this.peek(3);\n if ((s === '---' || s === '...') && isEmpty(this.charAt(3))) {\n yield* this.pushCount(3);\n this.indentValue = 0;\n this.indentNext = 0;\n return s === '---' ? 'doc' : 'stream';\n }\n }\n this.indentValue = yield* this.pushSpaces(false);\n if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1)))\n this.indentNext = this.indentValue;\n return yield* this.parseBlockStart();\n }\n *parseBlockStart() {\n const [ch0, ch1] = this.peek(2);\n if (!ch1 && !this.atEnd)\n return this.setNext('block-start');\n if ((ch0 === '-' || ch0 === '?' || ch0 === ':') && isEmpty(ch1)) {\n const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true));\n this.indentNext = this.indentValue + 1;\n this.indentValue += n;\n return 'block-start';\n }\n return 'doc';\n }\n *parseDocument() {\n yield* this.pushSpaces(true);\n const line = this.getLine();\n if (line === null)\n return this.setNext('doc');\n let n = yield* this.pushIndicators();\n switch (line[n]) {\n case '#':\n yield* this.pushCount(line.length - n);\n // fallthrough\n case undefined:\n yield* this.pushNewline();\n return yield* this.parseLineStart();\n case '{':\n case '[':\n yield* this.pushCount(1);\n this.flowKey = false;\n this.flowLevel = 1;\n return 'flow';\n case '}':\n case ']':\n // this is an error\n yield* this.pushCount(1);\n return 'doc';\n case '*':\n yield* this.pushUntil(isNotAnchorChar);\n return 'doc';\n case '\"':\n case \"'\":\n return yield* this.parseQuotedScalar();\n case '|':\n case '>':\n n += yield* this.parseBlockScalarHeader();\n n += yield* this.pushSpaces(true);\n yield* this.pushCount(line.length - n);\n yield* this.pushNewline();\n return yield* this.parseBlockScalar();\n default:\n return yield* this.parsePlainScalar();\n }\n }\n *parseFlowCollection() {\n let nl, sp;\n let indent = -1;\n do {\n nl = yield* this.pushNewline();\n if (nl > 0) {\n sp = yield* this.pushSpaces(false);\n this.indentValue = indent = sp;\n }\n else {\n sp = 0;\n }\n sp += yield* this.pushSpaces(true);\n } while (nl + sp > 0);\n const line = this.getLine();\n if (line === null)\n return this.setNext('flow');\n if ((indent !== -1 && indent < this.indentNext && line[0] !== '#') ||\n (indent === 0 &&\n (line.startsWith('---') || line.startsWith('...')) &&\n isEmpty(line[3]))) {\n // Allowing for the terminal ] or } at the same (rather than greater)\n // indent level as the initial [ or { is technically invalid, but\n // failing here would be surprising to users.\n const atFlowEndMarker = indent === this.indentNext - 1 &&\n this.flowLevel === 1 &&\n (line[0] === ']' || line[0] === '}');\n if (!atFlowEndMarker) {\n // this is an error\n this.flowLevel = 0;\n yield cst.FLOW_END;\n return yield* this.parseLineStart();\n }\n }\n let n = 0;\n while (line[n] === ',') {\n n += yield* this.pushCount(1);\n n += yield* this.pushSpaces(true);\n this.flowKey = false;\n }\n n += yield* this.pushIndicators();\n switch (line[n]) {\n case undefined:\n return 'flow';\n case '#':\n yield* this.pushCount(line.length - n);\n return 'flow';\n case '{':\n case '[':\n yield* this.pushCount(1);\n this.flowKey = false;\n this.flowLevel += 1;\n return 'flow';\n case '}':\n case ']':\n yield* this.pushCount(1);\n this.flowKey = true;\n this.flowLevel -= 1;\n return this.flowLevel ? 'flow' : 'doc';\n case '*':\n yield* this.pushUntil(isNotAnchorChar);\n return 'flow';\n case '\"':\n case \"'\":\n this.flowKey = true;\n return yield* this.parseQuotedScalar();\n case ':': {\n const next = this.charAt(1);\n if (this.flowKey || isEmpty(next) || next === ',') {\n this.flowKey = false;\n yield* this.pushCount(1);\n yield* this.pushSpaces(true);\n return 'flow';\n }\n }\n // fallthrough\n default:\n this.flowKey = false;\n return yield* this.parsePlainScalar();\n }\n }\n *parseQuotedScalar() {\n const quote = this.charAt(0);\n let end = this.buffer.indexOf(quote, this.pos + 1);\n if (quote === \"'\") {\n while (end !== -1 && this.buffer[end + 1] === \"'\")\n end = this.buffer.indexOf(\"'\", end + 2);\n }\n else {\n // double-quote\n while (end !== -1) {\n let n = 0;\n while (this.buffer[end - 1 - n] === '\\\\')\n n += 1;\n if (n % 2 === 0)\n break;\n end = this.buffer.indexOf('\"', end + 1);\n }\n }\n // Only looking for newlines within the quotes\n const qb = this.buffer.substring(0, end);\n let nl = qb.indexOf('\\n', this.pos);\n if (nl !== -1) {\n while (nl !== -1) {\n const cs = this.continueScalar(nl + 1);\n if (cs === -1)\n break;\n nl = qb.indexOf('\\n', cs);\n }\n if (nl !== -1) {\n // this is an error caused by an unexpected unindent\n end = nl - (qb[nl - 1] === '\\r' ? 2 : 1);\n }\n }\n if (end === -1) {\n if (!this.atEnd)\n return this.setNext('quoted-scalar');\n end = this.buffer.length;\n }\n yield* this.pushToIndex(end + 1, false);\n return this.flowLevel ? 'flow' : 'doc';\n }\n *parseBlockScalarHeader() {\n this.blockScalarIndent = -1;\n this.blockScalarKeep = false;\n let i = this.pos;\n while (true) {\n const ch = this.buffer[++i];\n if (ch === '+')\n this.blockScalarKeep = true;\n else if (ch > '0' && ch <= '9')\n this.blockScalarIndent = Number(ch) - 1;\n else if (ch !== '-')\n break;\n }\n return yield* this.pushUntil(ch => isEmpty(ch) || ch === '#');\n }\n *parseBlockScalar() {\n let nl = this.pos - 1; // may be -1 if this.pos === 0\n let indent = 0;\n let ch;\n loop: for (let i = this.pos; (ch = this.buffer[i]); ++i) {\n switch (ch) {\n case ' ':\n indent += 1;\n break;\n case '\\n':\n nl = i;\n indent = 0;\n break;\n case '\\r': {\n const next = this.buffer[i + 1];\n if (!next && !this.atEnd)\n return this.setNext('block-scalar');\n if (next === '\\n')\n break;\n } // fallthrough\n default:\n break loop;\n }\n }\n if (!ch && !this.atEnd)\n return this.setNext('block-scalar');\n if (indent >= this.indentNext) {\n if (this.blockScalarIndent === -1)\n this.indentNext = indent;\n else {\n this.indentNext =\n this.blockScalarIndent + (this.indentNext === 0 ? 1 : this.indentNext);\n }\n do {\n const cs = this.continueScalar(nl + 1);\n if (cs === -1)\n break;\n nl = this.buffer.indexOf('\\n', cs);\n } while (nl !== -1);\n if (nl === -1) {\n if (!this.atEnd)\n return this.setNext('block-scalar');\n nl = this.buffer.length;\n }\n }\n // Trailing insufficiently indented tabs are invalid.\n // To catch that during parsing, we include them in the block scalar value.\n let i = nl + 1;\n ch = this.buffer[i];\n while (ch === ' ')\n ch = this.buffer[++i];\n if (ch === '\\t') {\n while (ch === '\\t' || ch === ' ' || ch === '\\r' || ch === '\\n')\n ch = this.buffer[++i];\n nl = i - 1;\n }\n else if (!this.blockScalarKeep) {\n do {\n let i = nl - 1;\n let ch = this.buffer[i];\n if (ch === '\\r')\n ch = this.buffer[--i];\n const lastChar = i; // Drop the line if last char not more indented\n while (ch === ' ')\n ch = this.buffer[--i];\n if (ch === '\\n' && i >= this.pos && i + 1 + indent > lastChar)\n nl = i;\n else\n break;\n } while (true);\n }\n yield cst.SCALAR;\n yield* this.pushToIndex(nl + 1, true);\n return yield* this.parseLineStart();\n }\n *parsePlainScalar() {\n const inFlow = this.flowLevel > 0;\n let end = this.pos - 1;\n let i = this.pos - 1;\n let ch;\n while ((ch = this.buffer[++i])) {\n if (ch === ':') {\n const next = this.buffer[i + 1];\n if (isEmpty(next) || (inFlow && flowIndicatorChars.has(next)))\n break;\n end = i;\n }\n else if (isEmpty(ch)) {\n let next = this.buffer[i + 1];\n if (ch === '\\r') {\n if (next === '\\n') {\n i += 1;\n ch = '\\n';\n next = this.buffer[i + 1];\n }\n else\n end = i;\n }\n if (next === '#' || (inFlow && flowIndicatorChars.has(next)))\n break;\n if (ch === '\\n') {\n const cs = this.continueScalar(i + 1);\n if (cs === -1)\n break;\n i = Math.max(i, cs - 2); // to advance, but still account for ' #'\n }\n }\n else {\n if (inFlow && flowIndicatorChars.has(ch))\n break;\n end = i;\n }\n }\n if (!ch && !this.atEnd)\n return this.setNext('plain-scalar');\n yield cst.SCALAR;\n yield* this.pushToIndex(end + 1, true);\n return inFlow ? 'flow' : 'doc';\n }\n *pushCount(n) {\n if (n > 0) {\n yield this.buffer.substr(this.pos, n);\n this.pos += n;\n return n;\n }\n return 0;\n }\n *pushToIndex(i, allowEmpty) {\n const s = this.buffer.slice(this.pos, i);\n if (s) {\n yield s;\n this.pos += s.length;\n return s.length;\n }\n else if (allowEmpty)\n yield '';\n return 0;\n }\n *pushIndicators() {\n let n = 0;\n loop: while (true) {\n switch (this.charAt(0)) {\n case '!':\n n += yield* this.pushTag();\n n += yield* this.pushSpaces(true);\n continue loop;\n case '&':\n n += yield* this.pushUntil(isNotAnchorChar);\n n += yield* this.pushSpaces(true);\n continue loop;\n case '-': // this is an error\n case '?': // this is an error outside flow collections\n case ':': {\n const inFlow = this.flowLevel > 0;\n const ch1 = this.charAt(1);\n if (isEmpty(ch1) || (inFlow && flowIndicatorChars.has(ch1))) {\n if (!inFlow)\n this.indentNext = this.indentValue + 1;\n else if (this.flowKey)\n this.flowKey = false;\n n += yield* this.pushCount(1);\n n += yield* this.pushSpaces(true);\n continue loop;\n }\n }\n }\n break loop;\n }\n return n;\n }\n *pushTag() {\n if (this.charAt(1) === '<') {\n let i = this.pos + 2;\n let ch = this.buffer[i];\n while (!isEmpty(ch) && ch !== '>')\n ch = this.buffer[++i];\n return yield* this.pushToIndex(ch === '>' ? i + 1 : i, false);\n }\n else {\n let i = this.pos + 1;\n let ch = this.buffer[i];\n while (ch) {\n if (tagChars.has(ch))\n ch = this.buffer[++i];\n else if (ch === '%' &&\n hexDigits.has(this.buffer[i + 1]) &&\n hexDigits.has(this.buffer[i + 2])) {\n ch = this.buffer[(i += 3)];\n }\n else\n break;\n }\n return yield* this.pushToIndex(i, false);\n }\n }\n *pushNewline() {\n const ch = this.buffer[this.pos];\n if (ch === '\\n')\n return yield* this.pushCount(1);\n else if (ch === '\\r' && this.charAt(1) === '\\n')\n return yield* this.pushCount(2);\n else\n return 0;\n }\n *pushSpaces(allowTabs) {\n let i = this.pos - 1;\n let ch;\n do {\n ch = this.buffer[++i];\n } while (ch === ' ' || (allowTabs && ch === '\\t'));\n const n = i - this.pos;\n if (n > 0) {\n yield this.buffer.substr(this.pos, n);\n this.pos = i;\n }\n return n;\n }\n *pushUntil(test) {\n let i = this.pos;\n let ch = this.buffer[i];\n while (!test(ch))\n ch = this.buffer[++i];\n return yield* this.pushToIndex(i, false);\n }\n}\n\nexports.Lexer = Lexer;\n",
|
|
73
|
+
"'use strict';\n\n/**\n * Tracks newlines during parsing in order to provide an efficient API for\n * determining the one-indexed `{ line, col }` position for any offset\n * within the input.\n */\nclass LineCounter {\n constructor() {\n this.lineStarts = [];\n /**\n * Should be called in ascending order. Otherwise, call\n * `lineCounter.lineStarts.sort()` before calling `linePos()`.\n */\n this.addNewLine = (offset) => this.lineStarts.push(offset);\n /**\n * Performs a binary search and returns the 1-indexed { line, col }\n * position of `offset`. If `line === 0`, `addNewLine` has never been\n * called or `offset` is before the first known newline.\n */\n this.linePos = (offset) => {\n let low = 0;\n let high = this.lineStarts.length;\n while (low < high) {\n const mid = (low + high) >> 1; // Math.floor((low + high) / 2)\n if (this.lineStarts[mid] < offset)\n low = mid + 1;\n else\n high = mid;\n }\n if (this.lineStarts[low] === offset)\n return { line: low + 1, col: 1 };\n if (low === 0)\n return { line: 0, col: offset };\n const start = this.lineStarts[low - 1];\n return { line: low, col: offset - start + 1 };\n };\n }\n}\n\nexports.LineCounter = LineCounter;\n",
|
|
74
|
+
"'use strict';\n\nvar node_process = require('process');\nvar cst = require('./cst.js');\nvar lexer = require('./lexer.js');\n\nfunction includesToken(list, type) {\n for (let i = 0; i < list.length; ++i)\n if (list[i].type === type)\n return true;\n return false;\n}\nfunction findNonEmptyIndex(list) {\n for (let i = 0; i < list.length; ++i) {\n switch (list[i].type) {\n case 'space':\n case 'comment':\n case 'newline':\n break;\n default:\n return i;\n }\n }\n return -1;\n}\nfunction isFlowToken(token) {\n switch (token?.type) {\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n case 'flow-collection':\n return true;\n default:\n return false;\n }\n}\nfunction getPrevProps(parent) {\n switch (parent.type) {\n case 'document':\n return parent.start;\n case 'block-map': {\n const it = parent.items[parent.items.length - 1];\n return it.sep ?? it.start;\n }\n case 'block-seq':\n return parent.items[parent.items.length - 1].start;\n /* istanbul ignore next should not happen */\n default:\n return [];\n }\n}\n/** Note: May modify input array */\nfunction getFirstKeyStartProps(prev) {\n if (prev.length === 0)\n return [];\n let i = prev.length;\n loop: while (--i >= 0) {\n switch (prev[i].type) {\n case 'doc-start':\n case 'explicit-key-ind':\n case 'map-value-ind':\n case 'seq-item-ind':\n case 'newline':\n break loop;\n }\n }\n while (prev[++i]?.type === 'space') {\n /* loop */\n }\n return prev.splice(i, prev.length);\n}\nfunction arrayPushArray(target, source) {\n // May exhaust call stack with large `source` array\n if (source.length < 1e5)\n Array.prototype.push.apply(target, source);\n else\n for (let i = 0; i < source.length; ++i)\n target.push(source[i]);\n}\nfunction fixFlowSeqItems(fc) {\n if (fc.start.type === 'flow-seq-start') {\n for (const it of fc.items) {\n if (it.sep &&\n !it.value &&\n !includesToken(it.start, 'explicit-key-ind') &&\n !includesToken(it.sep, 'map-value-ind')) {\n if (it.key)\n it.value = it.key;\n delete it.key;\n if (isFlowToken(it.value)) {\n if (it.value.end)\n arrayPushArray(it.value.end, it.sep);\n else\n it.value.end = it.sep;\n }\n else\n arrayPushArray(it.start, it.sep);\n delete it.sep;\n }\n }\n }\n}\n/**\n * A YAML concrete syntax tree (CST) parser\n *\n * ```ts\n * const src: string = ...\n * for (const token of new Parser().parse(src)) {\n * // token: Token\n * }\n * ```\n *\n * To use the parser with a user-provided lexer:\n *\n * ```ts\n * function* parse(source: string, lexer: Lexer) {\n * const parser = new Parser()\n * for (const lexeme of lexer.lex(source))\n * yield* parser.next(lexeme)\n * yield* parser.end()\n * }\n *\n * const src: string = ...\n * const lexer = new Lexer()\n * for (const token of parse(src, lexer)) {\n * // token: Token\n * }\n * ```\n */\nclass Parser {\n /**\n * @param onNewLine - If defined, called separately with the start position of\n * each new line (in `parse()`, including the start of input).\n */\n constructor(onNewLine) {\n /** If true, space and sequence indicators count as indentation */\n this.atNewLine = true;\n /** If true, next token is a scalar value */\n this.atScalar = false;\n /** Current indentation level */\n this.indent = 0;\n /** Current offset since the start of parsing */\n this.offset = 0;\n /** On the same line with a block map key */\n this.onKeyLine = false;\n /** Top indicates the node that's currently being built */\n this.stack = [];\n /** The source of the current token, set in parse() */\n this.source = '';\n /** The type of the current token, set in parse() */\n this.type = '';\n // Must be defined after `next()`\n this.lexer = new lexer.Lexer();\n this.onNewLine = onNewLine;\n }\n /**\n * Parse `source` as a YAML stream.\n * If `incomplete`, a part of the last line may be left as a buffer for the next call.\n *\n * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens.\n *\n * @returns A generator of tokens representing each directive, document, and other structure.\n */\n *parse(source, incomplete = false) {\n if (this.onNewLine && this.offset === 0)\n this.onNewLine(0);\n for (const lexeme of this.lexer.lex(source, incomplete))\n yield* this.next(lexeme);\n if (!incomplete)\n yield* this.end();\n }\n /**\n * Advance the parser by the `source` of one lexical token.\n */\n *next(source) {\n this.source = source;\n if (node_process.env.LOG_TOKENS)\n console.log('|', cst.prettyToken(source));\n if (this.atScalar) {\n this.atScalar = false;\n yield* this.step();\n this.offset += source.length;\n return;\n }\n const type = cst.tokenType(source);\n if (!type) {\n const message = `Not a YAML token: ${source}`;\n yield* this.pop({ type: 'error', offset: this.offset, message, source });\n this.offset += source.length;\n }\n else if (type === 'scalar') {\n this.atNewLine = false;\n this.atScalar = true;\n this.type = 'scalar';\n }\n else {\n this.type = type;\n yield* this.step();\n switch (type) {\n case 'newline':\n this.atNewLine = true;\n this.indent = 0;\n if (this.onNewLine)\n this.onNewLine(this.offset + source.length);\n break;\n case 'space':\n if (this.atNewLine && source[0] === ' ')\n this.indent += source.length;\n break;\n case 'explicit-key-ind':\n case 'map-value-ind':\n case 'seq-item-ind':\n if (this.atNewLine)\n this.indent += source.length;\n break;\n case 'doc-mode':\n case 'flow-error-end':\n return;\n default:\n this.atNewLine = false;\n }\n this.offset += source.length;\n }\n }\n /** Call at end of input to push out any remaining constructions */\n *end() {\n while (this.stack.length > 0)\n yield* this.pop();\n }\n get sourceToken() {\n const st = {\n type: this.type,\n offset: this.offset,\n indent: this.indent,\n source: this.source\n };\n return st;\n }\n *step() {\n const top = this.peek(1);\n if (this.type === 'doc-end' && top?.type !== 'doc-end') {\n while (this.stack.length > 0)\n yield* this.pop();\n this.stack.push({\n type: 'doc-end',\n offset: this.offset,\n source: this.source\n });\n return;\n }\n if (!top)\n return yield* this.stream();\n switch (top.type) {\n case 'document':\n return yield* this.document(top);\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return yield* this.scalar(top);\n case 'block-scalar':\n return yield* this.blockScalar(top);\n case 'block-map':\n return yield* this.blockMap(top);\n case 'block-seq':\n return yield* this.blockSequence(top);\n case 'flow-collection':\n return yield* this.flowCollection(top);\n case 'doc-end':\n return yield* this.documentEnd(top);\n }\n /* istanbul ignore next should not happen */\n yield* this.pop();\n }\n peek(n) {\n return this.stack[this.stack.length - n];\n }\n *pop(error) {\n const token = error ?? this.stack.pop();\n /* istanbul ignore if should not happen */\n if (!token) {\n const message = 'Tried to pop an empty stack';\n yield { type: 'error', offset: this.offset, source: '', message };\n }\n else if (this.stack.length === 0) {\n yield token;\n }\n else {\n const top = this.peek(1);\n if (token.type === 'block-scalar') {\n // Block scalars use their parent rather than header indent\n token.indent = 'indent' in top ? top.indent : 0;\n }\n else if (token.type === 'flow-collection' && top.type === 'document') {\n // Ignore all indent for top-level flow collections\n token.indent = 0;\n }\n if (token.type === 'flow-collection')\n fixFlowSeqItems(token);\n switch (top.type) {\n case 'document':\n top.value = token;\n break;\n case 'block-scalar':\n top.props.push(token); // error\n break;\n case 'block-map': {\n const it = top.items[top.items.length - 1];\n if (it.value) {\n top.items.push({ start: [], key: token, sep: [] });\n this.onKeyLine = true;\n return;\n }\n else if (it.sep) {\n it.value = token;\n }\n else {\n Object.assign(it, { key: token, sep: [] });\n this.onKeyLine = !it.explicitKey;\n return;\n }\n break;\n }\n case 'block-seq': {\n const it = top.items[top.items.length - 1];\n if (it.value)\n top.items.push({ start: [], value: token });\n else\n it.value = token;\n break;\n }\n case 'flow-collection': {\n const it = top.items[top.items.length - 1];\n if (!it || it.value)\n top.items.push({ start: [], key: token, sep: [] });\n else if (it.sep)\n it.value = token;\n else\n Object.assign(it, { key: token, sep: [] });\n return;\n }\n /* istanbul ignore next should not happen */\n default:\n yield* this.pop();\n yield* this.pop(token);\n }\n if ((top.type === 'document' ||\n top.type === 'block-map' ||\n top.type === 'block-seq') &&\n (token.type === 'block-map' || token.type === 'block-seq')) {\n const last = token.items[token.items.length - 1];\n if (last &&\n !last.sep &&\n !last.value &&\n last.start.length > 0 &&\n findNonEmptyIndex(last.start) === -1 &&\n (token.indent === 0 ||\n last.start.every(st => st.type !== 'comment' || st.indent < token.indent))) {\n if (top.type === 'document')\n top.end = last.start;\n else\n top.items.push({ start: last.start });\n token.items.splice(-1, 1);\n }\n }\n }\n }\n *stream() {\n switch (this.type) {\n case 'directive-line':\n yield { type: 'directive', offset: this.offset, source: this.source };\n return;\n case 'byte-order-mark':\n case 'space':\n case 'comment':\n case 'newline':\n yield this.sourceToken;\n return;\n case 'doc-mode':\n case 'doc-start': {\n const doc = {\n type: 'document',\n offset: this.offset,\n start: []\n };\n if (this.type === 'doc-start')\n doc.start.push(this.sourceToken);\n this.stack.push(doc);\n return;\n }\n }\n yield {\n type: 'error',\n offset: this.offset,\n message: `Unexpected ${this.type} token in YAML stream`,\n source: this.source\n };\n }\n *document(doc) {\n if (doc.value)\n return yield* this.lineEnd(doc);\n switch (this.type) {\n case 'doc-start': {\n if (findNonEmptyIndex(doc.start) !== -1) {\n yield* this.pop();\n yield* this.step();\n }\n else\n doc.start.push(this.sourceToken);\n return;\n }\n case 'anchor':\n case 'tag':\n case 'space':\n case 'comment':\n case 'newline':\n doc.start.push(this.sourceToken);\n return;\n }\n const bv = this.startBlockValue(doc);\n if (bv)\n this.stack.push(bv);\n else {\n yield {\n type: 'error',\n offset: this.offset,\n message: `Unexpected ${this.type} token in YAML document`,\n source: this.source\n };\n }\n }\n *scalar(scalar) {\n if (this.type === 'map-value-ind') {\n const prev = getPrevProps(this.peek(2));\n const start = getFirstKeyStartProps(prev);\n let sep;\n if (scalar.end) {\n sep = scalar.end;\n sep.push(this.sourceToken);\n delete scalar.end;\n }\n else\n sep = [this.sourceToken];\n const map = {\n type: 'block-map',\n offset: scalar.offset,\n indent: scalar.indent,\n items: [{ start, key: scalar, sep }]\n };\n this.onKeyLine = true;\n this.stack[this.stack.length - 1] = map;\n }\n else\n yield* this.lineEnd(scalar);\n }\n *blockScalar(scalar) {\n switch (this.type) {\n case 'space':\n case 'comment':\n case 'newline':\n scalar.props.push(this.sourceToken);\n return;\n case 'scalar':\n scalar.source = this.source;\n // block-scalar source includes trailing newline\n this.atNewLine = true;\n this.indent = 0;\n if (this.onNewLine) {\n let nl = this.source.indexOf('\\n') + 1;\n while (nl !== 0) {\n this.onNewLine(this.offset + nl);\n nl = this.source.indexOf('\\n', nl) + 1;\n }\n }\n yield* this.pop();\n break;\n /* istanbul ignore next should not happen */\n default:\n yield* this.pop();\n yield* this.step();\n }\n }\n *blockMap(map) {\n const it = map.items[map.items.length - 1];\n // it.sep is true-ish if pair already has key or : separator\n switch (this.type) {\n case 'newline':\n this.onKeyLine = false;\n if (it.value) {\n const end = 'end' in it.value ? it.value.end : undefined;\n const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n if (last?.type === 'comment')\n end?.push(this.sourceToken);\n else\n map.items.push({ start: [this.sourceToken] });\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n it.start.push(this.sourceToken);\n }\n return;\n case 'space':\n case 'comment':\n if (it.value) {\n map.items.push({ start: [this.sourceToken] });\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n if (this.atIndentedComment(it.start, map.indent)) {\n const prev = map.items[map.items.length - 2];\n const end = prev?.value?.end;\n if (Array.isArray(end)) {\n arrayPushArray(end, it.start);\n end.push(this.sourceToken);\n map.items.pop();\n return;\n }\n }\n it.start.push(this.sourceToken);\n }\n return;\n }\n if (this.indent >= map.indent) {\n const atMapIndent = !this.onKeyLine && this.indent === map.indent;\n const atNextItem = atMapIndent &&\n (it.sep || it.explicitKey) &&\n this.type !== 'seq-item-ind';\n // For empty nodes, assign newline-separated not indented empty tokens to following node\n let start = [];\n if (atNextItem && it.sep && !it.value) {\n const nl = [];\n for (let i = 0; i < it.sep.length; ++i) {\n const st = it.sep[i];\n switch (st.type) {\n case 'newline':\n nl.push(i);\n break;\n case 'space':\n break;\n case 'comment':\n if (st.indent > map.indent)\n nl.length = 0;\n break;\n default:\n nl.length = 0;\n }\n }\n if (nl.length >= 2)\n start = it.sep.splice(nl[1]);\n }\n switch (this.type) {\n case 'anchor':\n case 'tag':\n if (atNextItem || it.value) {\n start.push(this.sourceToken);\n map.items.push({ start });\n this.onKeyLine = true;\n }\n else if (it.sep) {\n it.sep.push(this.sourceToken);\n }\n else {\n it.start.push(this.sourceToken);\n }\n return;\n case 'explicit-key-ind':\n if (!it.sep && !it.explicitKey) {\n it.start.push(this.sourceToken);\n it.explicitKey = true;\n }\n else if (atNextItem || it.value) {\n start.push(this.sourceToken);\n map.items.push({ start, explicitKey: true });\n }\n else {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [this.sourceToken], explicitKey: true }]\n });\n }\n this.onKeyLine = true;\n return;\n case 'map-value-ind':\n if (it.explicitKey) {\n if (!it.sep) {\n if (includesToken(it.start, 'newline')) {\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n }\n else {\n const start = getFirstKeyStartProps(it.start);\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n });\n }\n }\n else if (it.value) {\n map.items.push({ start: [], key: null, sep: [this.sourceToken] });\n }\n else if (includesToken(it.sep, 'map-value-ind')) {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n });\n }\n else if (isFlowToken(it.key) &&\n !includesToken(it.sep, 'newline')) {\n const start = getFirstKeyStartProps(it.start);\n const key = it.key;\n const sep = it.sep;\n sep.push(this.sourceToken);\n // @ts-expect-error type guard is wrong here\n delete it.key;\n // @ts-expect-error type guard is wrong here\n delete it.sep;\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key, sep }]\n });\n }\n else if (start.length > 0) {\n // Not actually at next item\n it.sep = it.sep.concat(start, this.sourceToken);\n }\n else {\n it.sep.push(this.sourceToken);\n }\n }\n else {\n if (!it.sep) {\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n }\n else if (it.value || atNextItem) {\n map.items.push({ start, key: null, sep: [this.sourceToken] });\n }\n else if (includesToken(it.sep, 'map-value-ind')) {\n this.stack.push({\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [], key: null, sep: [this.sourceToken] }]\n });\n }\n else {\n it.sep.push(this.sourceToken);\n }\n }\n this.onKeyLine = true;\n return;\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar': {\n const fs = this.flowScalar(this.type);\n if (atNextItem || it.value) {\n map.items.push({ start, key: fs, sep: [] });\n this.onKeyLine = true;\n }\n else if (it.sep) {\n this.stack.push(fs);\n }\n else {\n Object.assign(it, { key: fs, sep: [] });\n this.onKeyLine = true;\n }\n return;\n }\n default: {\n const bv = this.startBlockValue(map);\n if (bv) {\n if (bv.type === 'block-seq') {\n if (!it.explicitKey &&\n it.sep &&\n !includesToken(it.sep, 'newline')) {\n yield* this.pop({\n type: 'error',\n offset: this.offset,\n message: 'Unexpected block-seq-ind on same line with key',\n source: this.source\n });\n return;\n }\n }\n else if (atMapIndent) {\n map.items.push({ start });\n }\n this.stack.push(bv);\n return;\n }\n }\n }\n }\n yield* this.pop();\n yield* this.step();\n }\n *blockSequence(seq) {\n const it = seq.items[seq.items.length - 1];\n switch (this.type) {\n case 'newline':\n if (it.value) {\n const end = 'end' in it.value ? it.value.end : undefined;\n const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n if (last?.type === 'comment')\n end?.push(this.sourceToken);\n else\n seq.items.push({ start: [this.sourceToken] });\n }\n else\n it.start.push(this.sourceToken);\n return;\n case 'space':\n case 'comment':\n if (it.value)\n seq.items.push({ start: [this.sourceToken] });\n else {\n if (this.atIndentedComment(it.start, seq.indent)) {\n const prev = seq.items[seq.items.length - 2];\n const end = prev?.value?.end;\n if (Array.isArray(end)) {\n arrayPushArray(end, it.start);\n end.push(this.sourceToken);\n seq.items.pop();\n return;\n }\n }\n it.start.push(this.sourceToken);\n }\n return;\n case 'anchor':\n case 'tag':\n if (it.value || this.indent <= seq.indent)\n break;\n it.start.push(this.sourceToken);\n return;\n case 'seq-item-ind':\n if (this.indent !== seq.indent)\n break;\n if (it.value || includesToken(it.start, 'seq-item-ind'))\n seq.items.push({ start: [this.sourceToken] });\n else\n it.start.push(this.sourceToken);\n return;\n }\n if (this.indent > seq.indent) {\n const bv = this.startBlockValue(seq);\n if (bv) {\n this.stack.push(bv);\n return;\n }\n }\n yield* this.pop();\n yield* this.step();\n }\n *flowCollection(fc) {\n const it = fc.items[fc.items.length - 1];\n if (this.type === 'flow-error-end') {\n let top;\n do {\n yield* this.pop();\n top = this.peek(1);\n } while (top?.type === 'flow-collection');\n }\n else if (fc.end.length === 0) {\n switch (this.type) {\n case 'comma':\n case 'explicit-key-ind':\n if (!it || it.sep)\n fc.items.push({ start: [this.sourceToken] });\n else\n it.start.push(this.sourceToken);\n return;\n case 'map-value-ind':\n if (!it || it.value)\n fc.items.push({ start: [], key: null, sep: [this.sourceToken] });\n else if (it.sep)\n it.sep.push(this.sourceToken);\n else\n Object.assign(it, { key: null, sep: [this.sourceToken] });\n return;\n case 'space':\n case 'comment':\n case 'newline':\n case 'anchor':\n case 'tag':\n if (!it || it.value)\n fc.items.push({ start: [this.sourceToken] });\n else if (it.sep)\n it.sep.push(this.sourceToken);\n else\n it.start.push(this.sourceToken);\n return;\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar': {\n const fs = this.flowScalar(this.type);\n if (!it || it.value)\n fc.items.push({ start: [], key: fs, sep: [] });\n else if (it.sep)\n this.stack.push(fs);\n else\n Object.assign(it, { key: fs, sep: [] });\n return;\n }\n case 'flow-map-end':\n case 'flow-seq-end':\n fc.end.push(this.sourceToken);\n return;\n }\n const bv = this.startBlockValue(fc);\n /* istanbul ignore else should not happen */\n if (bv)\n this.stack.push(bv);\n else {\n yield* this.pop();\n yield* this.step();\n }\n }\n else {\n const parent = this.peek(2);\n if (parent.type === 'block-map' &&\n ((this.type === 'map-value-ind' && parent.indent === fc.indent) ||\n (this.type === 'newline' &&\n !parent.items[parent.items.length - 1].sep))) {\n yield* this.pop();\n yield* this.step();\n }\n else if (this.type === 'map-value-ind' &&\n parent.type !== 'flow-collection') {\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n fixFlowSeqItems(fc);\n const sep = fc.end.splice(1, fc.end.length);\n sep.push(this.sourceToken);\n const map = {\n type: 'block-map',\n offset: fc.offset,\n indent: fc.indent,\n items: [{ start, key: fc, sep }]\n };\n this.onKeyLine = true;\n this.stack[this.stack.length - 1] = map;\n }\n else {\n yield* this.lineEnd(fc);\n }\n }\n }\n flowScalar(type) {\n if (this.onNewLine) {\n let nl = this.source.indexOf('\\n') + 1;\n while (nl !== 0) {\n this.onNewLine(this.offset + nl);\n nl = this.source.indexOf('\\n', nl) + 1;\n }\n }\n return {\n type,\n offset: this.offset,\n indent: this.indent,\n source: this.source\n };\n }\n startBlockValue(parent) {\n switch (this.type) {\n case 'alias':\n case 'scalar':\n case 'single-quoted-scalar':\n case 'double-quoted-scalar':\n return this.flowScalar(this.type);\n case 'block-scalar-header':\n return {\n type: 'block-scalar',\n offset: this.offset,\n indent: this.indent,\n props: [this.sourceToken],\n source: ''\n };\n case 'flow-map-start':\n case 'flow-seq-start':\n return {\n type: 'flow-collection',\n offset: this.offset,\n indent: this.indent,\n start: this.sourceToken,\n items: [],\n end: []\n };\n case 'seq-item-ind':\n return {\n type: 'block-seq',\n offset: this.offset,\n indent: this.indent,\n items: [{ start: [this.sourceToken] }]\n };\n case 'explicit-key-ind': {\n this.onKeyLine = true;\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n start.push(this.sourceToken);\n return {\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, explicitKey: true }]\n };\n }\n case 'map-value-ind': {\n this.onKeyLine = true;\n const prev = getPrevProps(parent);\n const start = getFirstKeyStartProps(prev);\n return {\n type: 'block-map',\n offset: this.offset,\n indent: this.indent,\n items: [{ start, key: null, sep: [this.sourceToken] }]\n };\n }\n }\n return null;\n }\n atIndentedComment(start, indent) {\n if (this.type !== 'comment')\n return false;\n if (this.indent <= indent)\n return false;\n return start.every(st => st.type === 'newline' || st.type === 'space');\n }\n *documentEnd(docEnd) {\n if (this.type !== 'doc-mode') {\n if (docEnd.end)\n docEnd.end.push(this.sourceToken);\n else\n docEnd.end = [this.sourceToken];\n if (this.type === 'newline')\n yield* this.pop();\n }\n }\n *lineEnd(token) {\n switch (this.type) {\n case 'comma':\n case 'doc-start':\n case 'doc-end':\n case 'flow-seq-end':\n case 'flow-map-end':\n case 'map-value-ind':\n yield* this.pop();\n yield* this.step();\n break;\n case 'newline':\n this.onKeyLine = false;\n // fallthrough\n case 'space':\n case 'comment':\n default:\n // all other values are errors\n if (token.end)\n token.end.push(this.sourceToken);\n else\n token.end = [this.sourceToken];\n if (this.type === 'newline')\n yield* this.pop();\n }\n }\n}\n\nexports.Parser = Parser;\n",
|
|
75
|
+
"'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar errors = require('./errors.js');\nvar log = require('./log.js');\nvar identity = require('./nodes/identity.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\n\nfunction parseOptions(options) {\n const prettyErrors = options.prettyErrors !== false;\n const lineCounter$1 = options.lineCounter || (prettyErrors && new lineCounter.LineCounter()) || null;\n return { lineCounter: lineCounter$1, prettyErrors };\n}\n/**\n * Parse the input as a stream of YAML documents.\n *\n * Documents should be separated from each other by `...` or `---` marker lines.\n *\n * @returns If an empty `docs` array is returned, it will be of type\n * EmptyStream and contain additional stream information. In\n * TypeScript, you should use `'empty' in docs` as a type guard for it.\n */\nfunction parseAllDocuments(source, options = {}) {\n const { lineCounter, prettyErrors } = parseOptions(options);\n const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n const composer$1 = new composer.Composer(options);\n const docs = Array.from(composer$1.compose(parser$1.parse(source)));\n if (prettyErrors && lineCounter)\n for (const doc of docs) {\n doc.errors.forEach(errors.prettifyError(source, lineCounter));\n doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n }\n if (docs.length > 0)\n return docs;\n return Object.assign([], { empty: true }, composer$1.streamInfo());\n}\n/** Parse an input string into a single YAML.Document */\nfunction parseDocument(source, options = {}) {\n const { lineCounter, prettyErrors } = parseOptions(options);\n const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n const composer$1 = new composer.Composer(options);\n // `doc` is always set by compose.end(true) at the very latest\n let doc = null;\n for (const _doc of composer$1.compose(parser$1.parse(source), true, source.length)) {\n if (!doc)\n doc = _doc;\n else if (doc.options.logLevel !== 'silent') {\n doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0, 2), 'MULTIPLE_DOCS', 'Source contains multiple documents; please use YAML.parseAllDocuments()'));\n break;\n }\n }\n if (prettyErrors && lineCounter) {\n doc.errors.forEach(errors.prettifyError(source, lineCounter));\n doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n }\n return doc;\n}\nfunction parse(src, reviver, options) {\n let _reviver = undefined;\n if (typeof reviver === 'function') {\n _reviver = reviver;\n }\n else if (options === undefined && reviver && typeof reviver === 'object') {\n options = reviver;\n }\n const doc = parseDocument(src, options);\n if (!doc)\n return null;\n doc.warnings.forEach(warning => log.warn(doc.options.logLevel, warning));\n if (doc.errors.length > 0) {\n if (doc.options.logLevel !== 'silent')\n throw doc.errors[0];\n else\n doc.errors = [];\n }\n return doc.toJS(Object.assign({ reviver: _reviver }, options));\n}\nfunction stringify(value, replacer, options) {\n let _replacer = null;\n if (typeof replacer === 'function' || Array.isArray(replacer)) {\n _replacer = replacer;\n }\n else if (options === undefined && replacer) {\n options = replacer;\n }\n if (typeof options === 'string')\n options = options.length;\n if (typeof options === 'number') {\n const indent = Math.round(options);\n options = indent < 1 ? undefined : indent > 8 ? { indent: 8 } : { indent };\n }\n if (value === undefined) {\n const { keepUndefined } = options ?? replacer ?? {};\n if (!keepUndefined)\n return undefined;\n }\n if (identity.isDocument(value) && !_replacer)\n return value.toString(options);\n return new Document.Document(value, _replacer, options).toString(options);\n}\n\nexports.parse = parse;\nexports.parseAllDocuments = parseAllDocuments;\nexports.parseDocument = parseDocument;\nexports.stringify = stringify;\n",
|
|
76
|
+
"'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar Schema = require('./schema/Schema.js');\nvar errors = require('./errors.js');\nvar Alias = require('./nodes/Alias.js');\nvar identity = require('./nodes/identity.js');\nvar Pair = require('./nodes/Pair.js');\nvar Scalar = require('./nodes/Scalar.js');\nvar YAMLMap = require('./nodes/YAMLMap.js');\nvar YAMLSeq = require('./nodes/YAMLSeq.js');\nvar cst = require('./parse/cst.js');\nvar lexer = require('./parse/lexer.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\nvar publicApi = require('./public-api.js');\nvar visit = require('./visit.js');\n\n\n\nexports.Composer = composer.Composer;\nexports.Document = Document.Document;\nexports.Schema = Schema.Schema;\nexports.YAMLError = errors.YAMLError;\nexports.YAMLParseError = errors.YAMLParseError;\nexports.YAMLWarning = errors.YAMLWarning;\nexports.Alias = Alias.Alias;\nexports.isAlias = identity.isAlias;\nexports.isCollection = identity.isCollection;\nexports.isDocument = identity.isDocument;\nexports.isMap = identity.isMap;\nexports.isNode = identity.isNode;\nexports.isPair = identity.isPair;\nexports.isScalar = identity.isScalar;\nexports.isSeq = identity.isSeq;\nexports.Pair = Pair.Pair;\nexports.Scalar = Scalar.Scalar;\nexports.YAMLMap = YAMLMap.YAMLMap;\nexports.YAMLSeq = YAMLSeq.YAMLSeq;\nexports.CST = cst;\nexports.Lexer = lexer.Lexer;\nexports.LineCounter = lineCounter.LineCounter;\nexports.Parser = parser.Parser;\nexports.parse = publicApi.parse;\nexports.parseAllDocuments = publicApi.parseAllDocuments;\nexports.parseDocument = publicApi.parseDocument;\nexports.stringify = publicApi.stringify;\nexports.visit = visit.visit;\nexports.visitAsync = visit.visitAsync;\n",
|
|
77
|
+
"// Shared types + the engine seam. Fixed once here so the MVP CLI (now) and a\n// future daemon (later) both drive the same IsolationEngine without a rewrite.\n\nexport type ServiceBackend = \"docker\" | \"proc\" | \"wrangler\" | \"tunnel\";\nexport type ServiceState =\n | \"pending\"\n | \"starting\"\n | \"healthy\"\n | \"unhealthy\"\n | \"stopped\"\n | \"exited\";\nexport type StackState =\n | \"queued\"\n | \"starting\"\n | \"up\"\n | \"degraded\"\n | \"stopping\"\n | \"stopped\";\n\n/** Stable identity for one physical git repository, shared by all its worktrees. */\nexport type RepoId = string & { readonly __repoId: unique symbol };\n\n/** Current on-disk state schema. Bump only with an explicit compatibility policy. */\nexport const STATE_SCHEMA_VERSION = 1 as const;\n\n/** Complete repository-scoped stack identity carried through daemon admission. */\nexport interface StackIdentity {\n project: string;\n repoId: RepoId;\n repo: string;\n branch: string;\n worktree: string;\n}\n\nexport interface Endpoint {\n /** Logical name, e.g. the service name. */\n name: string;\n host: string;\n port: number;\n url?: string;\n /** Stable Hestia-managed HTTPS URL for a selected HTTP service. */\n localUrl?: string;\n /** Deterministic local hostname reserved before its optional route activates. */\n reservedName?: string;\n /**\n * Public URL once the service is exposed through a cloudflare tunnel\n * (named: https://<hostname>; quick: the *.trycloudflare.com URL).\n * Enriches the existing endpoint entry — never a second same-name entry.\n */\n publicUrl?: string;\n /** User-facing endpoint alias; defaults to name on legacy records. */\n alias?: string;\n /** Owning workload name. */\n workload?: string;\n /** Canonical target/protocol selector, e.g. 3000/tcp or main/tcp. */\n binding?: string;\n kind?: \"http\" | \"tcp\" | \"udp\";\n /** Portable or machine-local default route intent from configuration. */\n local?: boolean;\n}\n\n/** One concrete published socket owned by a workload. */\nexport interface PortBinding {\n id: string;\n target: string;\n protocol: \"tcp\" | \"udp\";\n publishedPort: number;\n}\n\n/** Sticky per-worktree request to publish one service through the local HTTPS router. */\nexport interface LocalRouteIntent {\n service: string;\n selector?: string;\n alias?: string;\n}\n\nexport interface ServiceRecord {\n name: string;\n backend: ServiceBackend;\n state: ServiceState;\n /** Container-side port that was published (docker backend). */\n containerPort?: number;\n /** Host port where the service is reachable (docker-assigned or proc bind-probed). */\n publishedPort?: number;\n containerId?: string;\n /** proc/wrangler backends: supervised process identity. */\n pid?: number;\n /** Process group id (== pid: detached spawn makes the child its own group leader). */\n pgid?: number;\n /** Verbatim `ps -o lstart=` output captured post-spawn — the PID-reuse guard. */\n startTime?: string;\n /** wrangler backend: probed inspector port injected via --inspector-port. */\n inspectorPort?: number;\n /** proc/wrangler backends: stdout+stderr log file. */\n logPath?: string;\n /** wrangler backend: the wrangler config this worker was started from. */\n configPath?: string;\n /** tunnel backend (quick mode): the stack service this tunnel fronts. */\n originService?: string;\n /** tunnel backend: endpoint alias independently selected from the workload. */\n originEndpoint?: string;\n /** Every published socket; legacy scalar port fields mirror a unique binding. */\n bindings?: PortBinding[];\n}\n\n/** Spec for a supervised host process (`hestia run` / the wrangler adapter). */\nexport interface ProcSpec {\n /** Required, deterministic identity within the stack. */\n name: string;\n /** Command argv. `{port}` tokens are substituted; `{{port}}` escapes a literal. */\n argv: string[];\n /** Working directory relative to the worktree root (default: the root). */\n cwd?: string;\n /** Extra env — highest precedence, agent intent always wins. */\n env?: Record<string, string>;\n /** \"auto\" (default): bind-probe a port, inject PORT + tokens. \"none\": skip. */\n port?: \"auto\" | \"none\";\n /** Shutdown signal for the process group. Default \"term\"; wrangler uses \"int\". */\n signal?: \"term\" | \"int\";\n readyTimeoutMs?: number;\n /** Prefix the spawn with the repo's varlock resolver (composition, not integration). */\n varlock?: boolean;\n backend?: \"proc\" | \"wrangler\" | \"tunnel\";\n /** wrangler backend metadata carried into the ServiceRecord. */\n inspectorPort?: number;\n configPath?: string;\n /** tunnel backend (quick mode): the stack service this tunnel fronts. */\n originService?: string;\n originEndpoint?: string;\n}\n\n/** One public hostname → local origin rule owned by a stack (named mode). */\nexport interface TunnelExposure {\n /** Stack service this rule fronts. */\n service: string;\n /** User-facing endpoint name used for URL/env projection and gateway authority. */\n alias?: string;\n /** Exact target/protocol binding; absent only on legacy single-port records. */\n binding?: string;\n /** Single-label public hostname under the zone, e.g. tri-salem-slack.modem.codes. */\n hostname: string;\n /** Origin port the rule pointed at when last generated — rotation detector. */\n originPort: number;\n /** Forward the public hostname as Host instead of rewriting to the origin. */\n keepHostHeader?: boolean;\n}\n\n/**\n * A stack's adoption of the (machine-global) named tunnel. The tunnel itself\n * is never created or deleted by hestia — it adopts an existing one by name,\n * and every mutating cloudflared call targets `uuid`, never the name.\n */\nexport interface TunnelRef {\n name: string;\n uuid: string;\n zone: string;\n credFile: string;\n exposures: TunnelExposure[];\n}\n\n/**\n * Identity of the CLI process holding a stack's admission slot while its\n * first services start (provisional `state: \"starting\"` records). A dead\n * holder (pid+lstart mismatch) is how the daemon sweep frees slots leaked by\n * a CLI crash mid-`up` — the same identity scheme as pidfiles.\n */\nexport interface StackStarter {\n pid: number;\n startTime: string;\n}\n\nexport interface StackRecord {\n /** Missing only on legacy records, which are inspection/down-only. */\n schemaVersion?: typeof STATE_SCHEMA_VERSION;\n /** Deterministic compose project name, e.g. \"modem-salem\". */\n project: string;\n /** Added in daemon protocol v2; absent only on legacy mirrors. */\n repoId?: RepoId;\n repo: string;\n branch: string;\n worktree: string;\n state: StackState;\n /** Present only on provisional (state: \"starting\") records. */\n starter?: StackStarter;\n services: ServiceRecord[];\n /** Hestia helpers never occupy the user workload namespace. */\n auxiliary?: ServiceRecord[];\n /** Resolved env block agents consume (DATABASE_URL, etc.). */\n env: Record<string, string>;\n endpoints: Endpoint[];\n /** Explicit CLI route selections; repository defaults remain in machine config. */\n localRoutes?: LocalRouteIntent[];\n disabledLocalRoutes?: LocalRouteIntent[];\n createdAt: string;\n /**\n * Absent on procs-only stacks (a compose file is not required to `run`).\n * When present, `down` uses them; the ~/.hestia mirror keeps copies so\n * teardown works even if the worktree is deleted.\n */\n composeFile?: string;\n overrideFile?: string;\n /** Sticky named-tunnel adoption + this stack's public ingress rules. */\n tunnel?: TunnelRef;\n}\n\nexport interface ExposeOptions {\n /** Named tunnel to adopt. Sticky: persisted, later calls may omit it. */\n tunnel?: string;\n /** Zone for public hostnames (default: inferred from the base rules). */\n zone?: string;\n /** Keep the public hostname as Host (default rewrites to 127.0.0.1:<port>). */\n keepHostHeader?: boolean;\n /** Proceed despite foreign connectors on the tunnel (replica risk). */\n force?: boolean;\n /** Re-point an existing DNS record hestia has no ledger memory of. */\n overwriteDns?: boolean;\n readyTimeoutMs?: number;\n}\n\n/** Daemon admission knobs shared by `up` and `run`. */\nexport interface AdmitOptions {\n /** ms to wait in the daemon's FIFO queue at the cap. Default 0 = fail fast. */\n wait?: number;\n /** Skip daemon ensure + admission entirely — capless escape hatch. */\n noDaemon?: boolean;\n}\n\nexport interface UpOptions extends AdmitOptions {\n /** Restrict to a subset of the configured services. */\n services?: string[];\n /** Auto-discover wrangler configs and supervise `wrangler dev` per config.\n * `true` = all discovered; string[] filters by path substring or worker name. */\n workers?: boolean | string[];\n /** Allow workers whose config declares `remote: true` bindings. */\n allowRemote?: boolean;\n /** Skip the foreign-process (global dev registry) preflight. */\n force?: boolean;\n /** Disable the automatic varlock env-resolution wrapper for workers. */\n noVarlock?: boolean;\n}\n\nexport interface DownOptions {\n /** Also remove named volumes (data loss). Default keeps them. */\n destroy?: boolean;\n /** Refuse teardown if this named project has since been recreated. */\n expectedStack?: Pick<StackRecord, \"repoId\" | \"worktree\" | \"createdAt\">;\n}\n\n/** hestiad `/health` view (broker health merged with hestia's capabilities). */\nexport interface DaemonHealth {\n ok: boolean;\n pid: number;\n protocolVersion: number;\n maxStacks: number;\n live: number;\n queued: number;\n startedAt: string;\n /** Unprivileged loopback port receiving traffic from the Portless TLS proxy. */\n routerPort: number;\n /** Stable ownership-verifying public ingress socket. */\n gatewaySocket: string;\n /** e.g. an invalid HESTIA_MAX_STACKS that fell back to the default. */\n warnings: string[];\n}\n\n/** hestiad `/hestia/state` view — feeds `daemon status`, doctor, the future TUI. */\nexport interface DaemonStateView {\n maxStacks: number;\n /** Projects with ≥1 live non-tunnel service (derived from mirrors). */\n live: string[];\n /** Granted-but-not-yet-live projects (persisted reservations). */\n reserved: string[];\n /** FIFO of projects waiting for a slot. */\n queued: string[];\n warnings: string[];\n}\n\n/** Fleet-observed lifecycle, including daemon-only reservation and unknown states. */\nexport type FleetStackPhase =\n | \"queued\"\n | \"reserved\"\n | \"starting\"\n | \"up\"\n | \"degraded\"\n | \"stopped\"\n | \"unknown\";\n\n/** Sanitized endpoint data safe to expose to an authenticated local TUI. */\nexport interface FleetEndpointView {\n name: string;\n workload?: string;\n binding?: string;\n kind?: \"http\" | \"tcp\" | \"udp\";\n host: string;\n port: number;\n url?: string;\n localUrl?: string;\n publicUrl?: string;\n}\n\n/** Sanitized service observation; process identities and filesystem paths are omitted. */\nexport interface FleetServiceView {\n name: string;\n backend: ServiceBackend;\n state: ServiceState | \"unknown\";\n publishedPort?: number;\n endpoint?: FleetEndpointView;\n endpoints?: FleetEndpointView[];\n}\n\n/** One Hestia-managed stack in a repository-scoped Fleet snapshot. */\nexport interface FleetStackView extends StackIdentity {\n phase: FleetStackPhase;\n services: FleetServiceView[];\n createdAt?: string;\n warning?: string;\n}\n\n/** Machine-wide cap counts shown alongside one repository's managed stacks. */\nexport interface FleetCapacityView {\n maxStacks: number;\n live: number;\n reserved: number;\n queued: number;\n}\n\n/** Full-state Fleet projection; clients replace prior state rather than applying patches. */\nexport interface FleetSnapshot {\n repoId: RepoId;\n observedAt: string;\n capacity: FleetCapacityView;\n stacks: FleetStackView[];\n warnings: string[];\n}\n\n/** NDJSON full-state frame emitted when the semantic Fleet snapshot changes. */\nexport interface FleetSnapshotEnvelope {\n type: \"snapshot\";\n sequence: number;\n snapshot: FleetSnapshot;\n}\n\n/** NDJSON liveness frame emitted while a Fleet subscription is otherwise idle. */\nexport interface FleetHeartbeatEnvelope {\n type: \"heartbeat\";\n sequence: number;\n at: string;\n}\n\n/** Every frame accepted by the daemon Fleet stream. */\nexport type FleetEnvelope = FleetSnapshotEnvelope | FleetHeartbeatEnvelope;\n\n/** One arrival-ordered log line; application ANSI bytes are preserved verbatim. */\nexport interface LogLine {\n project: string;\n service: string;\n source: ServiceBackend;\n /** One line without its trailing newline; application ANSI is not sanitized. */\n text: string;\n /** True when Hestia synthesized this notice instead of reading application output. */\n meta?: boolean;\n /** True when Hestia bounded an oversized source line before delivery. */\n truncated?: boolean;\n /** Reserved for a future source timestamp; unset while ordering is arrival-only. */\n at?: string;\n}\n\n/** Selection and cancellation controls for the pull-based stack log stream. */\nexport interface LogsOptions {\n /** Service names to stream; defaults to every service in the stack record. */\n services?: string[];\n /** Keep streaming new output after the initial backfill. Default false. */\n follow?: boolean;\n /** Initial lines per source. Default 50; zero disables backfill. */\n tail?: number;\n /** Cooperative cancellation in addition to AsyncIterator.return(). */\n signal?: AbortSignal;\n}\n\nexport interface EngineHooks {\n onServiceState?(project: string, service: string, state: ServiceState): void;\n onEndpoint?(project: string, endpoint: Endpoint): void;\n}\n\n/**\n * The stable contract. The MVP implements up/down/status for the docker\n * compose backend; the rest are reserved for later efforts (proc/wrangler\n * backends, the daemon, the TUI) and throw NotImplemented until then.\n */\nexport interface IsolationEngine {\n up(worktree: string, opts?: UpOptions): Promise<StackRecord>;\n down(worktree: string, opts?: DownOptions): Promise<void>;\n status(worktree: string): Promise<StackRecord | null>;\n /** Supervise a host process as part of this worktree's stack. */\n run(worktree: string, spec: ProcSpec, admit?: AdmitOptions): Promise<StackRecord>;\n /** Stop one supervised proc. Idempotent: unknown/dead names succeed. */\n stopService(worktree: string, name: string): Promise<void>;\n /** Add sticky local HTTPS route intent for services in this worktree. */\n addLocalRoutes(worktree: string, services: string[]): Promise<StackRecord>;\n /** Remove sticky local HTTPS route intent for services in this worktree. */\n removeLocalRoutes(worktree: string, services: string[]): Promise<StackRecord>;\n /** Mask repository or machine route defaults for this worktree. */\n disableLocalRoutes?(worktree: string, services: string[]): Promise<StackRecord>;\n /** Remove the per-worktree override and reveal configured defaults. */\n resetLocalRoutes?(worktree: string, services: string[]): Promise<StackRecord>;\n /** Publish running stack services through a cloudflare tunnel. */\n expose(\n worktree: string,\n services: string[],\n opts?: ExposeOptions,\n ): Promise<StackRecord>;\n /** Tear down by project name from the ~/.hestia mirror — works with the worktree gone. */\n downProject?(project: string, opts?: DownOptions): Promise<void>;\n /** Pull an arrival-ordered stream of docker and supervised-process log lines. */\n logs?(worktree: string, opts?: LogsOptions): AsyncIterable<LogLine>;\n /** Pull logs by mirrored project name after its worktree has been deleted. */\n logsProject?(project: string, opts?: LogsOptions): AsyncIterable<LogLine>;\n\n // Reserved — declared so later work slots in without changing callers.\n restartService?(worktree: string, service: string): Promise<void>;\n adopt?(record: StackRecord): Promise<void>;\n probe?(worktree: string): Promise<ServiceRecord[]>;\n discoverOrphans?(): Promise<StackRecord[]>;\n}\n\nexport class NotImplemented extends Error {\n constructor(what: string) {\n super(`${what} is not implemented in the MVP`);\n this.name = \"NotImplemented\";\n }\n}\n\n/**\n * Codes are the stable CLI contract (`--json` emits `{error: {code, message}}`).\n * Compose: config-missing · compose-failed · service-exited · ready-timeout.\n * Proc: lock-timeout · port-allocation-failed · proc-spawn-failed ·\n * proc-ready-timeout · proc-exited · name-conflict · ownership-tool-missing ·\n * varlock-missing. Wrangler: no-workers-found · wrangler-missing ·\n * worktree-busy · remote-binding-blocked · registry-leak.\n * Tunnel: cloudflared-missing · tunnel-not-found · tunnel-auth-missing ·\n * tunnel-busy · tunnel-ready-timeout · dns-route-failed · dns-record-conflict ·\n * hostname-conflict · service-not-found.\n * Logs: no-stack · service-not-found.\n * Daemon: stack-limit · daemon-start-failed · daemon-unreachable.\n * Router: router-setup-required · router-privilege-required ·\n * router-port-busy · router-version-unsupported · router-unreachable ·\n * route-origin-unavailable.\n */\nexport class HestiaError extends Error {\n code: string;\n details?: Record<string, unknown>;\n constructor(code: string, message: string, details?: Record<string, unknown>) {\n super(message);\n this.name = \"HestiaError\";\n this.code = code;\n this.details = details;\n }\n}\n",
|
|
78
|
+
"import { createHash } from \"node:crypto\";\n\nconst REPO_MAX = 20;\nconst BRANCH_MAX = 30;\n\n/**\n * Lowercase, collapse any run of non-[a-z0-9] to a single \"-\", trim \"-\", and\n * guarantee a leading alphanumeric (compose project + DNS label requirement).\n * `feat/foo_bar` -> `feat-foo-bar`.\n */\nexport function slug(input: string): string {\n let s = input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (s === \"\" || !/^[a-z0-9]/.test(s)) s = `x${s}`;\n return s;\n}\n\nfunction routeHash(worktreePath: string, branch: string): string {\n return createHash(\"sha256\")\n .update(`${worktreePath}\\0${branch}`)\n .digest(\"hex\")\n .slice(0, 6);\n}\n\nfunction dnsServiceLabel(service: string): string {\n const full = slug(service);\n if (full.length <= 50) return full;\n const hash = createHash(\"sha256\").update(service).digest(\"hex\").slice(0, 6);\n return `${full.slice(0, 43)}-${hash}`;\n}\n\n/** Build collision-safe service, branch, and repository labels for local URLs. */\nexport function localRouteLabels(\n service: string,\n repo: string,\n branch: string,\n worktreePath: string,\n): { service: string; branch: string; repo: string } {\n const repoFull = slug(repo);\n const branchFull = slug(branch);\n const repoLabel = repoFull.slice(0, REPO_MAX);\n let branchLabel = branchFull.slice(0, BRANCH_MAX);\n if (repoLabel !== repoFull || branchLabel !== branchFull) {\n branchLabel = `${branchLabel}-${routeHash(worktreePath, branch)}`;\n }\n return { service: dnsServiceLabel(service), branch: branchLabel, repo: repoLabel };\n}\n\n/**\n * Collision-safe compose project identity. The readable prefix is bounded,\n * while the hash always covers the exact repository identity, branch, and\n * canonical worktree path. Always hashing is intentional: distinct clones,\n * normalized branch slugs, and short names must not collide either.\n */\nexport function projectName(\n repoId: string,\n repo: string,\n branch: string,\n worktreePath: string,\n): string {\n const repoFull = slug(repo);\n const branchFull = slug(branch);\n const repoPart = repoFull.slice(0, REPO_MAX);\n const branchPart = branchFull.slice(0, BRANCH_MAX);\n const hash = createHash(\"sha256\")\n .update(repoId)\n .update(\"\\0\")\n .update(branch)\n .update(\"\\0\")\n .update(worktreePath)\n .digest(\"hex\")\n .slice(0, 10);\n return `${repoPart}-${branchPart}-${hash}`;\n}\n\nexport const LABELS = {\n stack: \"dev.hestia.stack\",\n repo: \"dev.hestia.repo\",\n branch: \"dev.hestia.branch\",\n worktree: \"dev.hestia.worktree\",\n} as const;\n",
|
|
79
|
+
"export * from \"./types.ts\";\nexport * from \"./naming.ts\";\n",
|
|
80
|
+
"import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { HestiaError } from \"@hestia/core\";\n\nexport interface StackConfig {\n /** Absolute path to the repo's compose file. */\n composeFile: string;\n /** All services declared in the compose file. */\n services: string[];\n}\n\nconst COMPOSE_FILES = [\n \"docker-compose.yml\",\n \"docker-compose.yaml\",\n \"compose.yml\",\n \"compose.yaml\",\n];\n\nfunction firstExisting(root: string, names: string[]): string | undefined {\n for (const n of names) {\n const p = join(root, n);\n if (existsSync(p)) return p;\n }\n return undefined;\n}\n\nfunction serviceNames(composeFile: string): string[] {\n const doc = parseYaml(readFileSync(composeFile, \"utf8\")) as {\n services?: Record<string, unknown>;\n } | null;\n return Object.keys(doc?.services ?? {});\n}\n\n/**\n * Single interface: zero-config. Detect the repo's compose file and read its\n * services. hestia never requires a config file of its own — the caller reads\n * the ephemeral ports back from `up` and wires whatever URLs it needs.\n */\nexport function loadConfig(worktreeRoot: string): StackConfig {\n const cfg = tryLoadConfig(worktreeRoot);\n if (cfg === null) {\n throw new HestiaError(\n \"config-missing\",\n `no compose file found in ${worktreeRoot}`,\n );\n }\n return cfg;\n}\n\n/** Procs-only stacks are legal — a missing compose file is not an error here. */\nexport function tryLoadConfig(worktreeRoot: string): StackConfig | null {\n const composeFile = firstExisting(worktreeRoot, COMPOSE_FILES);\n if (composeFile === undefined) return null;\n return { composeFile, services: serviceNames(composeFile) };\n}\n",
|
|
81
|
+
"import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { basename, dirname, isAbsolute, resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { realpathSync } from \"node:fs\";\nimport type { RepoId } from \"@hestia/core\";\n\nconst pexec = promisify(execFile);\n\nexport interface RepoInfo {\n repo: string;\n repoId: RepoId;\n branch: string;\n worktreeRoot: string;\n}\n\n/** Hash a canonical git common directory into the stable repository ID used by Fleet. */\nexport function createRepoId(commonDirectory: string): RepoId {\n let canonical = resolve(commonDirectory);\n try {\n canonical = realpathSync.native(canonical);\n } catch {\n // Non-git fallback paths may not exist yet; the resolved path is still stable.\n }\n return `repo-${createHash(\"sha256\").update(canonical).digest(\"hex\").slice(0, 16)}` as RepoId;\n}\n\nasync function git(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await pexec(\"git\", args, { cwd, timeout: 10_000 });\n return stdout.trim();\n}\n\n/**\n * Resolve (repo, branch, worktreeRoot) for a worktree. `repo` is derived from\n * the *common* git dir so every worktree of one repo shares a repo name; only\n * the branch differs. Falls back to the directory name if not a git repo.\n */\nexport async function getRepoInfo(cwd: string): Promise<RepoInfo> {\n try {\n const worktreeRoot = await git(cwd, [\"rev-parse\", \"--show-toplevel\"]);\n let branch = await git(cwd, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n if (branch === \"HEAD\" || branch === \"\") {\n // detached — use the short SHA so the name is still stable & unique\n branch = await git(cwd, [\"rev-parse\", \"--short\", \"HEAD\"]);\n }\n let commonDir = await git(cwd, [\"rev-parse\", \"--git-common-dir\"]);\n // Git reports --git-common-dir relative to the caller's cwd, not relative\n // to the worktree root. Resolving against cwd keeps nested invocations on\n // the same repository identity as root-level invocations.\n if (!isAbsolute(commonDir)) commonDir = resolve(cwd, commonDir);\n // commonDir is \".../<repo>/.git\" -> repo = basename(dirname(commonDir))\n const repo =\n basename(commonDir) === \".git\"\n ? basename(dirname(commonDir))\n : basename(worktreeRoot);\n return { repo, repoId: createRepoId(commonDir), branch, worktreeRoot };\n } catch {\n const worktreeRoot = resolve(cwd);\n return {\n repo: basename(worktreeRoot),\n repoId: createRepoId(worktreeRoot),\n branch: \"nobranch\",\n worktreeRoot,\n };\n }\n}\n",
|
|
82
|
+
"import {\n chmodSync,\n closeSync,\n fsyncSync,\n mkdirSync,\n openSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n/** Publish a JSON file atomically so readers observe either the old or complete new value. */\nexport function writeAtomicJsonFile(\n path: string,\n value: unknown,\n options: { mode?: number; pretty?: boolean } = {},\n): void {\n mkdirSync(dirname(path), { recursive: true });\n const temporaryPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n const mode = options.mode ?? 0o600;\n const fd = openSync(temporaryPath, \"wx\", mode);\n try {\n writeFileSync(fd, JSON.stringify(value, null, options.pretty === false ? 0 : 2));\n fsyncSync(fd);\n } catch (error) {\n closeSync(fd);\n rmSync(temporaryPath, { force: true });\n throw error;\n }\n closeSync(fd);\n try {\n chmodSync(temporaryPath, mode);\n renameSync(temporaryPath, path);\n } catch (error) {\n rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n\n/** Atomically publish private UTF-8 text (TOML, YAML, or other generated config). */\nexport function writeAtomicTextFile(path: string, source: string, mode = 0o600): void {\n mkdirSync(dirname(path), { recursive: true });\n const temporaryPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n const fd = openSync(temporaryPath, \"wx\", mode);\n try {\n writeFileSync(fd, source);\n fsyncSync(fd);\n } catch (error) {\n closeSync(fd);\n rmSync(temporaryPath, { force: true });\n throw error;\n }\n closeSync(fd);\n try {\n chmodSync(temporaryPath, mode);\n renameSync(temporaryPath, path);\n } catch (error) {\n rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n",
|
|
83
|
+
"import {\n existsSync,\n readFileSync,\n readdirSync,\n rmSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { HestiaError, STATE_SCHEMA_VERSION, type ProcSpec } from \"@hestia/core\";\nimport { writeAtomicJsonFile } from \"../atomic-json-file.ts\";\n\n/** On-disk record for one supervised proc: `<worktree>/.hestia/procs/<name>.json`. */\nexport interface Pidfile {\n schemaVersion?: typeof STATE_SCHEMA_VERSION;\n name: string;\n pid: number;\n /** == pid: detached spawn makes the child its own process-group leader. */\n pgid: number;\n /** Verbatim `ps -o lstart=` output — compared string-equal as the PID-reuse guard. */\n startTime: string;\n /** SHA-256 of spawn intent; raw argv environment values are never persisted. */\n specFingerprint: string;\n /** Legacy-only fields accepted for inspection/teardown, never written by v1. */\n argv?: string[];\n env?: Record<string, string>;\n port?: number;\n inspectorPort?: number;\n logPath: string;\n signal: \"term\" | \"int\";\n backend: \"proc\" | \"wrangler\" | \"tunnel\";\n configPath?: string;\n /**\n * Descendant snapshot taken at ready time. Wrapper runners (varlock) start\n * their child in a NEW process group, so teardown must know every group in\n * the tree — and if the root dies first, these identities (pid + verbatim\n * start time) let orphan groups be killed without pid-reuse risk.\n */\n children?: Array<{ pid: number; pgid: number; startTime: string }>;\n}\n\nexport function procsDir(worktreeRoot: string): string {\n return join(worktreeRoot, \".hestia\", \"procs\");\n}\n\nexport function pidfilePath(worktreeRoot: string, name: string): string {\n return join(procsDir(worktreeRoot), `${name}.json`);\n}\n\nexport function writePidfile(worktreeRoot: string, pf: Pidfile): void {\n pf.schemaVersion = STATE_SCHEMA_VERSION;\n delete pf.argv;\n delete pf.env;\n writeAtomicJsonFile(pidfilePath(worktreeRoot, pf.name), pf);\n}\n\nfunction parsePidfile(source: string, path: string): Pidfile {\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch (error) {\n throw new HestiaError(\"state-corrupt\", `invalid pidfile ${path}: ${(error as Error).message}`, { path });\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new HestiaError(\"state-corrupt\", `invalid pidfile ${path}: expected an object`, { path });\n }\n const pidfile = value as Record<string, unknown>;\n if (pidfile.schemaVersion !== undefined && pidfile.schemaVersion !== STATE_SCHEMA_VERSION) {\n throw new HestiaError(\"state-corrupt\", `invalid pidfile ${path}: unsupported schemaVersion`, { path });\n }\n if (typeof pidfile.name !== \"string\" || !Number.isInteger(pidfile.pid) ||\n typeof pidfile.startTime !== \"string\" || typeof pidfile.logPath !== \"string\") {\n throw new HestiaError(\"state-corrupt\", `invalid pidfile ${path}: missing process identity`, { path });\n }\n if (pidfile.schemaVersion === STATE_SCHEMA_VERSION && typeof pidfile.specFingerprint !== \"string\") {\n throw new HestiaError(\"state-corrupt\", `invalid pidfile ${path}: missing specFingerprint`, { path });\n }\n return pidfile as unknown as Pidfile;\n}\n\nexport function readPidfile(\n worktreeRoot: string,\n name: string,\n): Pidfile | null {\n const p = pidfilePath(worktreeRoot, name);\n if (!existsSync(p)) return null;\n return parsePidfile(readFileSync(p, \"utf8\"), p);\n}\n\nexport function removePidfile(worktreeRoot: string, name: string): void {\n rmSync(pidfilePath(worktreeRoot, name), { force: true });\n}\n\nexport function listPidfiles(dir: string): Pidfile[] {\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n const path = join(dir, f);\n return parsePidfile(readFileSync(path, \"utf8\"), path);\n });\n}\n\n/** Stable spawn-intent hash used for idempotent replacement without persisting secrets. */\nexport function procSpecFingerprint(spec: ProcSpec): string {\n const env = Object.entries(spec.env ?? {}).sort(([left], [right]) => left.localeCompare(right));\n const canonical = JSON.stringify({\n argv: spec.argv,\n cwd: spec.cwd ?? \".\",\n env,\n port: spec.port ?? \"auto\",\n signal: spec.signal ?? \"term\",\n backend: spec.backend ?? \"proc\",\n resolver: spec.varlock ? \"varlock\" : \"direct\",\n inspectorPort: spec.inspectorPort ?? null,\n configPath: spec.configPath ?? null,\n originService: spec.originService ?? null,\n originEndpoint: spec.originEndpoint ?? null,\n });\n return createHash(\"sha256\").update(canonical).digest(\"hex\");\n}\n\n/**\n * Verbatim process start time, or null if the pid is gone. Captured once\n * post-spawn and re-read on every liveness check; both reads run on the same\n * host so the platform's `lstart` format never has to be parsed.\n */\nfunction readProcessStartTime(\n pid: number,\n env: NodeJS.ProcessEnv,\n): string | null {\n try {\n const out = execFileSync(\"ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n env,\n }).trim();\n return out === \"\" ? null : out;\n } catch {\n return null;\n }\n}\n\nexport function startTimeOf(pid: number): string | null {\n // BSD ps localizes lstart. Daemons launched from a TUI and later inspected\n // from a shell can otherwise render the same instant differently, defeating\n // the verbatim identity guard and allowing duplicate supervisors.\n return readProcessStartTime(pid, { ...process.env, LC_ALL: \"C\", LANG: \"C\" });\n}\n\nlet installedProcessLocales: string[] | undefined;\nconst legacyStartTimeMatches = new Map<string, boolean>();\nconst legacyMacosProcessLocales = [\n \"en_US.UTF-8\",\n \"fr_FR.UTF-8\",\n \"de_DE.UTF-8\",\n \"es_ES.UTF-8\",\n \"it_IT.UTF-8\",\n \"pt_BR.UTF-8\",\n \"ja_JP.UTF-8\",\n \"ko_KR.UTF-8\",\n \"zh_CN.UTF-8\",\n];\n\nfunction processLocales(): string[] {\n if (installedProcessLocales !== undefined) return installedProcessLocales;\n try {\n const output = execFileSync(\"locale\", [\"-a\"], { encoding: \"utf8\" });\n installedProcessLocales = [...new Set([\n process.env.LC_ALL,\n process.env.LC_TIME,\n process.env.LANG,\n \"C\",\n ...legacyMacosProcessLocales,\n ...output.split(\"\\n\"),\n ].filter((locale): locale is string => locale !== undefined && locale !== \"\"))];\n } catch {\n installedProcessLocales = [\"C\"];\n }\n return installedProcessLocales;\n}\n\nfunction normalizedLocaleText(value: string): string {\n return value.normalize(\"NFKD\").replace(/\\p{M}/gu, \"\").toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction plausibleProcessLocales(\n canonicalStartTime: string,\n recordedStartTime: string,\n): string[] {\n const date = new Date(canonicalStartTime);\n const recorded = normalizedLocaleText(recordedStartTime);\n const preferred = [process.env.LC_ALL, process.env.LC_TIME, process.env.LANG, \"C\"];\n const legacyMacosLocales = new Set(legacyMacosProcessLocales);\n if (Number.isNaN(date.getTime())) {\n return [...new Set(preferred.filter((locale): locale is string => locale !== undefined))];\n }\n const plausible = processLocales().filter((locale) => {\n // BSD ps abbreviations do not always match Intl (for example French\n // `jul` versus `juil.`). The bounded migration list is cheap to try, and\n // safety still comes from exact reproduction of the full lstart string.\n if (preferred.includes(locale) || legacyMacosLocales.has(locale)) return true;\n try {\n const languageTag = locale.replace(/\\..*$/, \"\").replace(/@.*$/, \"\").replaceAll(\"_\", \"-\");\n const parts = new Intl.DateTimeFormat(languageTag, {\n weekday: \"short\",\n month: \"short\",\n }).formatToParts(date);\n const words = parts\n .filter((part) => part.type === \"weekday\" || part.type === \"month\")\n .map((part) => normalizedLocaleText(part.value))\n .filter(Boolean);\n return words.length === 2 && words.every((word) => recorded.includes(word));\n } catch {\n return false;\n }\n });\n return [...new Set(plausible)];\n}\n\nfunction legacyLocalizedStartTimeMatches(\n pid: number,\n canonicalStartTime: string,\n recordedStartTime: string,\n): boolean {\n const cacheKey = `${pid}\\0${canonicalStartTime}\\0${recordedStartTime}`;\n const cached = legacyStartTimeMatches.get(cacheKey);\n if (cached !== undefined) return cached;\n let matched = false;\n for (const locale of plausibleProcessLocales(canonicalStartTime, recordedStartTime)) {\n const localized = readProcessStartTime(pid, {\n ...process.env,\n LC_ALL: locale,\n LANG: locale,\n });\n if (localized !== null && processStartTimeMatches(localized, recordedStartTime)) {\n matched = true;\n break;\n }\n }\n if (legacyStartTimeMatches.size >= 512) {\n const oldest = legacyStartTimeMatches.keys().next().value;\n if (oldest !== undefined) legacyStartTimeMatches.delete(oldest);\n }\n legacyStartTimeMatches.set(cacheKey, matched);\n return matched;\n}\n\nfunction processStartTimeMatches(current: string, recorded: string): boolean {\n if (current === recorded) return true;\n // Pre-normalization pidfiles can contain the same BSD lstart fields in a\n // locale-dependent order (`Sat 11 Jul` instead of `Sat Jul 11`). Preserve\n // upgrade safety without accepting a different instant: every complete\n // token must still match, and future writes always use the canonical form.\n const currentTokens = current.split(/\\s+/);\n const recordedTokens = recorded.split(/\\s+/);\n if (currentTokens.length !== 5 || recordedTokens.length !== 5) return false;\n return currentTokens.toSorted().join(\"\\0\") === recordedTokens.toSorted().join(\"\\0\");\n}\n\n/** Live means: pid exists AND it is still the same process we spawned. */\nexport function isLive(pf: Pick<Pidfile, \"pid\" | \"startTime\">): boolean {\n try {\n process.kill(pf.pid, 0);\n } catch {\n return false;\n }\n const current = startTimeOf(pf.pid);\n if (current !== null && processStartTimeMatches(current, pf.startTime)) return true;\n return current !== null &&\n legacyLocalizedStartTimeMatches(pf.pid, current, pf.startTime);\n}\n",
|
|
84
|
+
"import {\n chmodSync,\n copyFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { HestiaError, STATE_SCHEMA_VERSION, type StackRecord } from \"@hestia/core\";\nimport { procsDir, type Pidfile } from \"./proc/pidfile.ts\";\nimport { writeAtomicJsonFile } from \"./atomic-json-file.ts\";\n\nconst STATE_FILE = \"stack.json\";\n\n/**\n * Machine-global hestia root (mirrors, tunnel singleton, daemon). Evaluated at\n * call time so tests can point a spawned CLI/daemon at a temp dir via\n * HESTIA_HOME — cap accounting is machine-global, so the daemon e2e must not\n * see (or pollute) the real ~/.hestia.\n */\nexport function hestiaHome(): string {\n return process.env.HESTIA_HOME ?? join(homedir(), \".hestia\");\n}\n\nexport function hestiaDir(worktreeRoot: string): string {\n return join(worktreeRoot, \".hestia\");\n}\n\nfunction statePath(worktreeRoot: string): string {\n return join(hestiaDir(worktreeRoot), STATE_FILE);\n}\n\nexport function mirrorDir(project: string): string {\n return join(hestiaHome(), \"stacks\", project);\n}\n\nexport function mirrorProcsDir(project: string): string {\n return join(mirrorDir(project), \"procs\");\n}\n\nexport function ensureDir(dir: string): void {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n chmodSync(dir, 0o700);\n}\n\nfunction corruptState(path: string, reason: string): HestiaError {\n return new HestiaError(\n \"state-corrupt\",\n `invalid Hestia state at ${path}: ${reason}; recover with hestia down --project <project>`,\n { path, recovery: \"hestia down --project <project>\" },\n );\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) &&\n Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\n/** Parse persisted stack state without trusting a JSON cast. */\nexport function parseStackRecord(source: string, path: string): StackRecord {\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch (error) {\n throw corruptState(path, `malformed JSON (${(error as Error).message})`);\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw corruptState(path, \"expected an object\");\n }\n const record = value as Record<string, unknown>;\n if (record.schemaVersion !== undefined && record.schemaVersion !== STATE_SCHEMA_VERSION) {\n throw corruptState(path, `unsupported schemaVersion ${String(record.schemaVersion)}`);\n }\n for (const key of [\"project\", \"repo\", \"branch\", \"worktree\", \"state\", \"createdAt\"] as const) {\n if (typeof record[key] !== \"string\" || record[key] === \"\") {\n throw corruptState(path, `expected non-empty ${key}`);\n }\n }\n if (!Array.isArray(record.services) || !Array.isArray(record.endpoints)) {\n throw corruptState(path, \"services and endpoints must be arrays\");\n }\n if (!isStringRecord(record.env)) throw corruptState(path, \"env must contain only string values\");\n return record as unknown as StackRecord;\n}\n\n/** Reject mutation of legacy state while preserving inspection and teardown. */\nexport function assertMutableStackRecord(record: StackRecord, path: string): void {\n if (record.schemaVersion !== STATE_SCHEMA_VERSION) {\n throw new HestiaError(\n \"migration-required\",\n `legacy Hestia state at ${path} is inspection/down-only; run hestia down before starting it again`,\n { path, recovery: `hestia down --project ${record.project}` },\n );\n }\n}\n\n/**\n * Persist state in the worktree and mirror FULL COPIES (stack.json + every\n * pidfile) to ~/.hestia, so `down --project` can kill procs and tear down\n * containers after the worktree itself has been deleted.\n */\nexport function writeState(worktreeRoot: string, record: StackRecord): void {\n assertMutableStackRecord(record, statePath(worktreeRoot));\n ensureDir(hestiaDir(worktreeRoot));\n writeAtomicJsonFile(statePath(worktreeRoot), record);\n const mdir = mirrorDir(record.project);\n ensureDir(mdir);\n writeAtomicJsonFile(join(mdir, STATE_FILE), record);\n syncMirrorPidfiles(worktreeRoot, record.project);\n}\n\n/** Refresh the mirror's pidfile copies from the worktree (full replace). */\nexport function syncMirrorPidfiles(\n worktreeRoot: string,\n project: string,\n): void {\n const src = procsDir(worktreeRoot);\n const dst = mirrorProcsDir(project);\n rmSync(dst, { recursive: true, force: true });\n if (!existsSync(src)) return;\n ensureDir(dst);\n for (const f of readdirSync(src)) {\n copyFileSync(join(src, f), join(dst, f));\n }\n}\n\n/** Copy one pidfile into the mirror immediately (pre-ready crash safety). */\nexport function mirrorPidfile(project: string, pf: Pidfile): void {\n const dst = mirrorProcsDir(project);\n ensureDir(dst);\n writeAtomicJsonFile(join(dst, `${pf.name}.json`), pf);\n}\n\nexport function readState(worktreeRoot: string): StackRecord | null {\n const p = statePath(worktreeRoot);\n if (!existsSync(p)) return null;\n const record = parseStackRecord(readFileSync(p, \"utf8\"), p);\n chmodSync(p, 0o600);\n return record;\n}\n\nexport function readMirrorState(project: string): StackRecord | null {\n const p = join(mirrorDir(project), STATE_FILE);\n if (!existsSync(p)) return null;\n const record = parseStackRecord(readFileSync(p, \"utf8\"), p);\n chmodSync(p, 0o600);\n return record;\n}\n\nexport function clearState(worktreeRoot: string, project: string): void {\n const p = statePath(worktreeRoot);\n if (existsSync(p)) rmSync(p);\n const mdir = mirrorDir(project);\n if (existsSync(mdir)) rmSync(mdir, { recursive: true, force: true });\n}\n",
|
|
85
|
+
"import { readFileSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\n\nexport interface WorkerConfig {\n /** Absolute path to the wrangler config. */\n configPath: string;\n /** Top-level worker name; null when absent (redirected/inherited configs). */\n name: string | null;\n /** `remote: true` appears anywhere in the config — conservatively includes\n * env.* blocks, since `wrangler dev -c` runs the top-level env but a remote\n * binding anywhere signals real-Cloudflare traffic worth an explicit opt-in. */\n hasRemote: boolean;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\", \".hestia\"]);\n\n/**\n * Strip JSONC down to JSON: // and /* *\\/ comments plus trailing commas,\n * tracked through string literals so URLs and quoted braces survive.\n */\nexport function stripJsonc(text: string): string {\n let out = \"\";\n let i = 0;\n let inString = false;\n while (i < text.length) {\n const c = text[i]!;\n if (inString) {\n out += c;\n if (c === \"\\\\\") {\n out += text[i + 1] ?? \"\";\n i += 2;\n continue;\n }\n if (c === '\"') inString = false;\n i++;\n continue;\n }\n if (c === '\"') {\n inString = true;\n out += c;\n i++;\n continue;\n }\n if (c === \"/\" && text[i + 1] === \"/\") {\n while (i < text.length && text[i] !== \"\\n\") i++;\n continue;\n }\n if (c === \"/\" && text[i + 1] === \"*\") {\n i += 2;\n while (i < text.length && !(text[i] === \"*\" && text[i + 1] === \"/\")) i++;\n i += 2;\n continue;\n }\n out += c;\n i++;\n }\n\n // Comments must be gone before trailing-comma detection: current modem\n // configs legitimately place explanatory comments between the final comma\n // and closing bracket. A second string-aware pass handles that JSONC shape.\n let json = \"\";\n inString = false;\n for (i = 0; i < out.length; i++) {\n const c = out[i]!;\n if (inString) {\n json += c;\n if (c === \"\\\\\") json += out[++i] ?? \"\";\n else if (c === '\"') inString = false;\n continue;\n }\n if (c === '\"') {\n inString = true;\n json += c;\n continue;\n }\n if (c === \",\") {\n let next = i + 1;\n while (next < out.length && /\\s/.test(out[next]!)) next++;\n if (out[next] === \"}\" || out[next] === \"]\") continue;\n }\n json += c;\n }\n return json;\n}\n\nfunction parseName(configPath: string, text: string): string | null {\n if (configPath.endsWith(\".toml\")) {\n // top-level only: stop at the first [section] header\n const topLevel = text.split(/^\\s*\\[/m)[0]!;\n const m = topLevel.match(/^\\s*name\\s*=\\s*\"([^\"]+)\"/m);\n return m ? m[1]! : null;\n }\n try {\n const doc = JSON.parse(stripJsonc(text)) as { name?: unknown };\n return typeof doc.name === \"string\" ? doc.name : null;\n } catch {\n return null;\n }\n}\n\nfunction detectRemote(configPath: string, text: string): boolean {\n return configPath.endsWith(\".toml\")\n ? /^\\s*remote\\s*=\\s*true/m.test(text)\n : /\"remote\"\\s*:\\s*true/.test(text);\n}\n\n/** All wrangler configs in the worktree, skipping vendored/hidden trees. */\nexport function discoverWorkers(worktreeRoot: string): WorkerConfig[] {\n const glob = new Bun.Glob(\"**/wrangler.{jsonc,json,toml}\");\n const configs: WorkerConfig[] = [];\n for (const rel of glob.scanSync({ cwd: worktreeRoot, onlyFiles: true })) {\n if (rel.split(\"/\").some((part) => SKIP_DIRS.has(part))) continue;\n const configPath = join(worktreeRoot, rel);\n const text = readFileSync(configPath, \"utf8\");\n configs.push({\n configPath,\n name: parseName(configPath, text),\n hasRemote: detectRemote(configPath, text),\n });\n }\n configs.sort((a, b) => a.configPath.localeCompare(b.configPath));\n return configs;\n}\n\n/** `--workers a,b` filter: match by worker name or path substring. */\nexport function filterWorkers(\n configs: WorkerConfig[],\n worktreeRoot: string,\n filter: string[],\n): WorkerConfig[] {\n if (filter.length === 0) return configs;\n return configs.filter((c) => {\n const rel = relative(worktreeRoot, c.configPath);\n return filter.some((f) => c.name === f || rel.includes(f));\n });\n}\n",
|
|
86
|
+
"import { LABELS } from \"@hestia/core\";\n\nexport interface OverrideInput {\n /** Parsed user compose file (the object form). */\n userCompose: unknown;\n project: string;\n repo: string;\n branch: string;\n worktree: string;\n /** Services to isolate; must exist in userCompose.services. */\n services: string[];\n}\n\nexport interface OverrideResult {\n yaml: string;\n /** service -> container ports we published (first is the canonical `.port`). */\n servicePorts: Record<string, number[]>;\n serviceBindings: Record<string, Array<{ target: number; protocol: \"tcp\" | \"udp\" }>>;\n}\n\n/** YAML double-quote a scalar. */\nfunction q(s: string): string {\n return `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\n/**\n * Pull the container-side port(s) out of a compose `ports:` entry, which may be\n * `\"54322:5432\"`, `\"127.0.0.1:54322:5432\"`, `\"5432\"`, `5432`, or the long form\n * `{ target: 5432, published: 54322 }`.\n */\nexport function composeContainerBindings(\n portsEntry: unknown,\n): Array<{ target: number; protocol: \"tcp\" | \"udp\" }> {\n if (!Array.isArray(portsEntry)) return [];\n const out: Array<{ target: number; protocol: \"tcp\" | \"udp\" }> = [];\n const validPort = (value: number): boolean => Number.isInteger(value) && value > 0 && value <= 65535;\n for (const p of portsEntry) {\n if (typeof p === \"number\" && validPort(p)) {\n out.push({ target: p, protocol: \"tcp\" });\n } else if (typeof p === \"string\") {\n const [spec, rawProtocol = \"tcp\"] = p.split(\"/\");\n const parts = spec.split(\":\");\n const last = parts[parts.length - 1]!;\n const n = /^\\d+$/.test(last) ? Number(last) : Number.NaN;\n if (validPort(n) && (rawProtocol === \"tcp\" || rawProtocol === \"udp\")) {\n out.push({ target: n, protocol: rawProtocol });\n }\n } else if (p && typeof p === \"object\" && \"target\" in p) {\n const n = Number((p as { target: unknown }).target);\n const rawProtocol = (p as { protocol?: unknown }).protocol ?? \"tcp\";\n if (validPort(n) && (rawProtocol === \"tcp\" || rawProtocol === \"udp\")) {\n out.push({ target: n, protocol: rawProtocol });\n }\n }\n }\n return out;\n}\n\n/**\n * Generate the compose override that isolates the selected services:\n * - `ports: !override` replaces the user's host mappings with ephemeral\n * loopback publishes (`127.0.0.1:0:<container>`), so Docker assigns a free\n * host port and nothing collides across worktrees.\n * - `container_name` is always rewritten (a pinned name collides even under -p).\n * - `restart: \"no\"` so Docker never restarts a container behind us and hands\n * it a *new* ephemeral port our injected env wouldn't know about.\n * - `dev.hestia.*` labels make every container discoverable for status/gc.\n *\n * Networks and unnamed/named volumes are isolated automatically by `-p`, so the\n * override deliberately touches services only.\n */\nexport function generateOverride(input: OverrideInput): OverrideResult {\n const { userCompose, project, repo, branch, worktree, services } = input;\n const composeServices =\n (userCompose as { services?: Record<string, unknown> } | null)?.services ??\n {};\n\n const servicePorts: Record<string, number[]> = {};\n const serviceBindings: Record<string, Array<{ target: number; protocol: \"tcp\" | \"udp\" }>> = {};\n const blocks: string[] = [];\n\n for (const svc of services) {\n const def = composeServices[svc] as { ports?: unknown } | undefined;\n if (def === undefined) {\n throw new Error(\n `service \"${svc}\" is not defined in the compose file (have: ${Object.keys(\n composeServices,\n ).join(\", \") || \"none\"})`,\n );\n }\n const bindings = composeContainerBindings(def.ports);\n const cports = bindings.map((binding) => binding.target);\n servicePorts[svc] = cports;\n serviceBindings[svc] = bindings;\n\n const lines: string[] = [];\n lines.push(` ${q(svc)}:`);\n lines.push(` container_name: ${q(`hestia-${project}-${svc}`)}`);\n lines.push(` restart: \"no\"`);\n if (cports.length > 0) {\n lines.push(` ports: !override`);\n for (const binding of bindings) {\n lines.push(` - ${q(`127.0.0.1:0:${binding.target}/${binding.protocol}`)}`);\n }\n }\n lines.push(` labels:`);\n lines.push(` ${q(LABELS.stack)}: ${q(project)}`);\n lines.push(` ${q(LABELS.repo)}: ${q(repo)}`);\n lines.push(` ${q(LABELS.branch)}: ${q(branch)}`);\n lines.push(` ${q(LABELS.worktree)}: ${q(worktree)}`);\n blocks.push(lines.join(\"\\n\"));\n }\n\n const yaml = `# generated by hestia — do not edit\\nservices:\\n${blocks.join(\n \"\\n\",\n )}\\n`;\n return { yaml, servicePorts, serviceBindings };\n}\n",
|
|
87
|
+
"import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { HestiaError, type RepoId } from \"@hestia/core\";\nimport { hestiaHome } from \"./state.ts\";\n\nexport type WorkloadSource = \"compose\" | \"dockerfile\" | \"proc\" | \"wrangler\";\nexport type EndpointKind = \"http\" | \"tcp\" | \"udp\";\n\nexport interface ConfiguredEndpoint {\n binding: string;\n kind: EndpointKind;\n local?: boolean;\n}\n\nexport interface ConfiguredWorkload {\n source: WorkloadSource;\n composeService?: string;\n dockerfile?: string;\n command?: string[];\n wranglerConfig?: string;\n port?: \"auto\" | \"none\";\n endpoints: Record<string, ConfiguredEndpoint>;\n}\n\nexport interface RepositoryWorkloadConfig {\n version: 1;\n workloads: Record<string, ConfiguredWorkload>;\n}\n\nexport interface ConfigLayerReadResult {\n path: string;\n exists: boolean;\n config: RepositoryWorkloadConfig;\n}\n\nconst WORKLOAD_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst BINDING = /^(?:main|[1-9][0-9]{0,4})\\/(?:tcp|udp)$/;\n\nfunction emptyConfig(): RepositoryWorkloadConfig {\n return { version: 1, workloads: {} };\n}\n\nfunction table(value: unknown, path: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be a table`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction knownKeys(value: Record<string, unknown>, allowed: string[], path: string): void {\n const allowedSet = new Set(allowed);\n const unknown = Object.keys(value).find((key) => !allowedSet.has(key));\n if (unknown !== undefined) throw new Error(`${path} has unknown key ${JSON.stringify(unknown)}`);\n}\n\nfunction parseEndpoints(value: unknown, path: string): Record<string, ConfiguredEndpoint> {\n if (value === undefined) return {};\n const endpoints: Record<string, ConfiguredEndpoint> = {};\n for (const [name, rawEndpoint] of Object.entries(table(value, path))) {\n if (!WORKLOAD_NAME.test(name)) throw new Error(`${path} has invalid endpoint name ${JSON.stringify(name)}`);\n const endpoint = table(rawEndpoint, `${path}.${name}`);\n knownKeys(endpoint, [\"binding\", \"kind\", \"local\"], `${path}.${name}`);\n if (typeof endpoint.binding !== \"string\" || !BINDING.test(endpoint.binding)) {\n throw new Error(`${path}.${name}.binding must be main/tcp or <port>/tcp|udp`);\n }\n if (!([\"http\", \"tcp\", \"udp\"] as unknown[]).includes(endpoint.kind)) {\n throw new Error(`${path}.${name}.kind must be http, tcp, or udp`);\n }\n if (endpoint.kind === \"http\" && endpoint.binding.endsWith(\"/udp\")) {\n throw new Error(`${path}.${name}: HTTP endpoints require a TCP binding`);\n }\n if (endpoint.local !== undefined && typeof endpoint.local !== \"boolean\") {\n throw new Error(`${path}.${name}.local must be a boolean`);\n }\n if (endpoint.local === true && endpoint.kind !== \"http\") {\n throw new Error(`${path}.${name}: local routes require an HTTP endpoint`);\n }\n endpoints[name] = {\n binding: endpoint.binding,\n kind: endpoint.kind as EndpointKind,\n local: endpoint.local as boolean | undefined,\n };\n }\n return endpoints;\n}\n\n/** Strictly validate one repository or machine-overlay workload document. */\nexport function parseRepositoryWorkloadConfig(source: string, path: string): RepositoryWorkloadConfig {\n let raw: Record<string, unknown>;\n try {\n raw = table(Bun.TOML.parse(source), \"config\");\n knownKeys(raw, [\"version\", \"workloads\"], \"config\");\n if (raw.version !== 1) throw new Error(\"version must equal 1\");\n const workloads: Record<string, ConfiguredWorkload> = {};\n for (const [name, rawWorkload] of Object.entries(table(raw.workloads ?? {}, \"workloads\"))) {\n if (!WORKLOAD_NAME.test(name)) throw new Error(`invalid workload name ${JSON.stringify(name)}`);\n const workload = table(rawWorkload, `workloads.${name}`);\n knownKeys(\n workload,\n [\"source\", \"compose_service\", \"dockerfile\", \"command\", \"wrangler_config\", \"port\", \"endpoints\"],\n `workloads.${name}`,\n );\n if (!([\"compose\", \"dockerfile\", \"proc\", \"wrangler\"] as unknown[]).includes(workload.source)) {\n throw new Error(`workloads.${name}.source must be compose, dockerfile, proc, or wrangler`);\n }\n const sourceKind = workload.source as WorkloadSource;\n if (workload.command !== undefined &&\n (!Array.isArray(workload.command) || !workload.command.every((part) => typeof part === \"string\"))) {\n throw new Error(`workloads.${name}.command must be an array of strings`);\n }\n if (workload.port !== undefined && workload.port !== \"auto\" && workload.port !== \"none\") {\n throw new Error(`workloads.${name}.port must be auto or none`);\n }\n for (const key of [\"compose_service\", \"dockerfile\", \"wrangler_config\"] as const) {\n if (workload[key] !== undefined && typeof workload[key] !== \"string\") {\n throw new Error(`workloads.${name}.${key} must be a string`);\n }\n }\n if (sourceKind === \"compose\" && typeof workload.compose_service !== \"string\") {\n throw new Error(`workloads.${name}.compose_service is required for compose`);\n }\n if (sourceKind === \"proc\" && !Array.isArray(workload.command)) {\n throw new Error(`workloads.${name}.command is required for proc`);\n }\n workloads[name] = {\n source: sourceKind,\n composeService: workload.compose_service as string | undefined,\n dockerfile: workload.dockerfile as string | undefined,\n command: workload.command as string[] | undefined,\n wranglerConfig: workload.wrangler_config as string | undefined,\n port: workload.port as \"auto\" | \"none\" | undefined,\n endpoints: parseEndpoints(workload.endpoints, `workloads.${name}.endpoints`),\n };\n }\n return { version: 1, workloads };\n } catch (error) {\n if (error instanceof HestiaError) throw error;\n throw new HestiaError(\"config-invalid\", `invalid ${path}: ${(error as Error).message}`, { path });\n }\n}\n\nexport function repositoryConfigPath(worktreeRoot: string): string {\n return join(worktreeRoot, \"hestia.toml\");\n}\n\nexport function machineRepositoryConfigPath(repoId: RepoId): string {\n return join(hestiaHome(), \"repositories\", `${repoId}.toml`);\n}\n\nexport function readConfigLayer(path: string): ConfigLayerReadResult {\n if (!existsSync(path)) return { path, exists: false, config: emptyConfig() };\n return {\n path,\n exists: true,\n config: parseRepositoryWorkloadConfig(readFileSync(path, \"utf8\"), path),\n };\n}\n\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\n/** Deterministic TOML rendering used by explicit `hestia init --write`. */\nexport function renderRepositoryWorkloadConfig(config: RepositoryWorkloadConfig): string {\n const lines = [\"version = 1\", \"\"];\n for (const name of Object.keys(config.workloads).sort()) {\n const workload = config.workloads[name]!;\n const prefix = `workloads.${quote(name)}`;\n lines.push(`[${prefix}]`, `source = ${quote(workload.source)}`);\n if (workload.composeService !== undefined) lines.push(`compose_service = ${quote(workload.composeService)}`);\n if (workload.dockerfile !== undefined) lines.push(`dockerfile = ${quote(workload.dockerfile)}`);\n if (workload.command !== undefined) lines.push(`command = [${workload.command.map(quote).join(\", \")}]`);\n if (workload.wranglerConfig !== undefined) lines.push(`wrangler_config = ${quote(workload.wranglerConfig)}`);\n if (workload.port !== undefined) lines.push(`port = ${quote(workload.port)}`);\n lines.push(\"\");\n for (const alias of Object.keys(workload.endpoints).sort()) {\n const endpoint = workload.endpoints[alias]!;\n lines.push(\n `[${prefix}.endpoints.${quote(alias)}]`,\n `binding = ${quote(endpoint.binding)}`,\n `kind = ${quote(endpoint.kind)}`,\n );\n if (endpoint.local !== undefined) lines.push(`local = ${endpoint.local}`);\n lines.push(\"\");\n }\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n",
|
|
88
|
+
"import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, join, relative } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { HestiaError } from \"@hestia/core\";\nimport { getRepoInfo } from \"./git.ts\";\nimport { readState } from \"./state.ts\";\nimport { discoverWorkers } from \"./wrangler/discover.ts\";\nimport { tryLoadConfig } from \"./config.ts\";\nimport { composeContainerBindings } from \"./compose/override.ts\";\nimport {\n machineRepositoryConfigPath,\n readConfigLayer,\n repositoryConfigPath,\n type ConfiguredEndpoint,\n type ConfiguredWorkload,\n type RepositoryWorkloadConfig,\n type WorkloadSource,\n} from \"./repository-config.ts\";\n\nconst pexec = promisify(execFile);\n\nexport type DiscoverySource = \"discovery\" | \"repository\" | \"machine\" | \"worktree\";\n\nexport interface DiscoveredBinding {\n target: string;\n protocol: \"tcp\" | \"udp\";\n configuredEndpoints: string[];\n}\n\nexport interface DiscoveredWorkload {\n name: string;\n source: WorkloadSource;\n runnable: boolean;\n configured: boolean;\n decisionSource: DiscoverySource;\n definitionPath?: string;\n bindings: DiscoveredBinding[];\n endpoints: Array<ConfiguredEndpoint & { alias: string; source: DiscoverySource }>;\n notes: string[];\n}\n\nexport interface DiscoveryReport {\n version: 1;\n repository: {\n repo: string;\n repoId: string;\n branch: string;\n worktree: string;\n };\n layers: Array<{ source: DiscoverySource; path?: string; present: boolean }>;\n runnableWorkloads: DiscoveredWorkload[];\n candidateWorkloads: DiscoveredWorkload[];\n missingDecisions: string[];\n conflicts: string[];\n suggestions: string[];\n existingStack: { project: string; state: string; schemaVersion?: number } | null;\n}\n\ninterface ResolvedComposePort {\n target: string;\n protocol: \"tcp\" | \"udp\";\n}\n\ninterface ResolvedComposeService {\n name: string;\n ports: ResolvedComposePort[];\n}\n\nasync function resolveComposeServices(composeFile: string, cwd: string): Promise<ResolvedComposeService[]> {\n try {\n const { stdout } = await pexec(\n \"docker\",\n [\"compose\", \"-f\", composeFile, \"config\", \"--format\", \"json\"],\n { cwd, timeout: 30_000, maxBuffer: 16 * 1024 * 1024 },\n );\n const model = JSON.parse(stdout) as {\n services?: Record<string, { ports?: Array<{ target?: number; protocol?: string }> }>;\n };\n return Object.entries(model.services ?? {}).map(([name, service]) => ({\n name,\n ports: (service.ports ?? []).flatMap((port) =>\n Number.isInteger(port.target) && (port.protocol === undefined || port.protocol === \"tcp\" || port.protocol === \"udp\")\n ? [{ target: String(port.target), protocol: (port.protocol ?? \"tcp\") as \"tcp\" | \"udp\" }]\n : []\n ),\n }));\n } catch {\n const config = tryLoadConfig(cwd);\n if (config === null) return [];\n try {\n const model = parseYaml(readFileSync(config.composeFile, \"utf8\")) as {\n services?: Record<string, { ports?: unknown }>;\n } | null;\n return Object.entries(model?.services ?? {}).map(([name, service]) => ({\n name,\n ports: composeContainerBindings(service.ports).map((port) => ({\n target: String(port.target),\n protocol: port.protocol,\n })),\n }));\n } catch {\n return config.services.map((name) => ({ name, ports: [] }));\n }\n }\n}\n\nfunction sameEndpoint(left: ConfiguredEndpoint, right: ConfiguredEndpoint): boolean {\n return left.binding === right.binding && left.kind === right.kind && left.local === right.local;\n}\n\nfunction cloneWorkload(workload: ConfiguredWorkload): ConfiguredWorkload {\n return { ...workload, command: workload.command?.slice(), endpoints: { ...workload.endpoints } };\n}\n\nfunction mergeConfigLayers(\n repository: RepositoryWorkloadConfig,\n machine: RepositoryWorkloadConfig,\n): {\n workloads: Record<string, ConfiguredWorkload>;\n sources: Map<string, DiscoverySource>;\n endpointSources: Map<string, DiscoverySource>;\n conflicts: string[];\n} {\n const workloads: Record<string, ConfiguredWorkload> = {};\n const sources = new Map<string, DiscoverySource>();\n const endpointSources = new Map<string, DiscoverySource>();\n const conflicts: string[] = [];\n for (const [name, workload] of Object.entries(repository.workloads)) {\n workloads[name] = cloneWorkload(workload);\n sources.set(name, \"repository\");\n for (const alias of Object.keys(workload.endpoints)) endpointSources.set(`${name}\\0${alias}`, \"repository\");\n }\n for (const [name, overlay] of Object.entries(machine.workloads)) {\n const committed = workloads[name];\n if (committed === undefined) {\n workloads[name] = cloneWorkload(overlay);\n sources.set(name, \"machine\");\n for (const alias of Object.keys(overlay.endpoints)) endpointSources.set(`${name}\\0${alias}`, \"machine\");\n continue;\n }\n if (overlay.source !== committed.source) {\n conflicts.push(`machine workload ${name} cannot replace committed source ${committed.source} with ${overlay.source}`);\n continue;\n }\n for (const [alias, endpoint] of Object.entries(overlay.endpoints)) {\n const existing = committed.endpoints[alias];\n if (existing !== undefined && !sameEndpoint(existing, endpoint)) {\n conflicts.push(`endpoint alias ${alias} for workload ${name} differs between repository and machine config`);\n } else {\n committed.endpoints[alias] = endpoint;\n endpointSources.set(`${name}\\0${alias}`, \"machine\");\n }\n }\n }\n return { workloads, sources, endpointSources, conflicts };\n}\n\n/** Resolve committed plus machine-local workload configuration for lifecycle commands. */\nexport async function resolveConfiguredWorkloads(cwd: string): Promise<{\n repository: Awaited<ReturnType<typeof getRepoInfo>>;\n workloads: Record<string, ConfiguredWorkload>;\n conflicts: string[];\n}> {\n const repository = await getRepoInfo(cwd);\n const repositoryLayer = readConfigLayer(repositoryConfigPath(repository.worktreeRoot));\n const machineLayer = readConfigLayer(machineRepositoryConfigPath(repository.repoId));\n const merged = mergeConfigLayers(repositoryLayer.config, machineLayer.config);\n return { repository, workloads: merged.workloads, conflicts: merged.conflicts };\n}\n\nfunction configuredBindings(workload: ConfiguredWorkload): DiscoveredBinding[] {\n const bindings = new Map<string, DiscoveredBinding>();\n for (const [alias, endpoint] of Object.entries(workload.endpoints)) {\n const [target, protocol] = endpoint.binding.split(\"/\") as [string, \"tcp\" | \"udp\"];\n const key = `${target}/${protocol}`;\n const binding = bindings.get(key) ?? { target, protocol, configuredEndpoints: [] };\n binding.configuredEndpoints.push(alias);\n bindings.set(key, binding);\n }\n return [...bindings.values()];\n}\n\nfunction packageScriptCandidates(worktreeRoot: string): string[] {\n const path = join(worktreeRoot, \"package.json\");\n if (!existsSync(path)) return [];\n try {\n const pkg = JSON.parse(readFileSync(path, \"utf8\")) as { scripts?: Record<string, unknown> };\n return Object.keys(pkg.scripts ?? {}).filter((name) => /^(dev|start|serve)(:|$)/.test(name));\n } catch {\n return [];\n }\n}\n\n/** Read-only, source-attributed repository discovery for humans and agents. */\nexport async function discoverRepository(cwd: string): Promise<DiscoveryReport> {\n const repo = await getRepoInfo(cwd);\n const repositoryLayer = readConfigLayer(repositoryConfigPath(repo.worktreeRoot));\n const machineLayer = readConfigLayer(machineRepositoryConfigPath(repo.repoId));\n const merged = mergeConfigLayers(repositoryLayer.config, machineLayer.config);\n const compose = tryLoadConfig(repo.worktreeRoot);\n const composeServices = compose === null ? [] : await resolveComposeServices(compose.composeFile, repo.worktreeRoot);\n const automatic = new Map<string, DiscoveredWorkload>();\n for (const service of composeServices) {\n automatic.set(service.name, {\n name: service.name,\n source: \"compose\",\n runnable: true,\n configured: false,\n decisionSource: \"discovery\",\n definitionPath: compose?.composeFile,\n bindings: service.ports.map((port) => ({ ...port, configuredEndpoints: [] })),\n endpoints: [],\n notes: [],\n });\n }\n for (const worker of discoverWorkers(repo.worktreeRoot)) {\n const workerRelativePath = relative(repo.worktreeRoot, worker.configPath);\n if (/^(?:test|tests)\\/fixtures\\//.test(workerRelativePath) || workerRelativePath.includes(\"/fixtures/\")) {\n continue;\n }\n const name = worker.name ?? basename(worker.configPath).replace(/^wrangler\\.|\\.(?:jsonc|json|toml)$/g, \"\");\n if (!automatic.has(name)) {\n automatic.set(name, {\n name,\n source: \"wrangler\",\n runnable: true,\n configured: false,\n decisionSource: \"discovery\",\n definitionPath: worker.configPath,\n bindings: [{ target: \"main\", protocol: \"tcp\", configuredEndpoints: [] }],\n endpoints: [],\n notes: worker.hasRemote ? [\"declares remote bindings; up requires --allow-remote\"] : [],\n });\n }\n }\n\n const workloads = new Map(automatic);\n for (const [name, config] of Object.entries(merged.workloads)) {\n const discovered = workloads.get(name);\n const bindings = configuredBindings(config);\n if (discovered !== undefined && discovered.source !== config.source) {\n merged.conflicts.push(\n `configured workload ${name} uses ${config.source}, but automatic discovery found ${discovered.source}`,\n );\n }\n workloads.set(name, {\n name,\n source: config.source,\n runnable:\n config.source === \"proc\" ? (config.command?.length ?? 0) > 0 :\n config.source === \"dockerfile\" ? existsSync(join(repo.worktreeRoot, config.dockerfile ?? \"Dockerfile\")) :\n config.source === \"wrangler\" ? existsSync(join(repo.worktreeRoot, config.wranglerConfig ?? \"wrangler.toml\")) :\n composeServices.some((service) => service.name === config.composeService),\n configured: true,\n decisionSource: merged.sources.get(name) ?? \"repository\",\n definitionPath:\n config.source === \"dockerfile\" ? join(repo.worktreeRoot, config.dockerfile ?? \"Dockerfile\") :\n config.source === \"wrangler\" ? join(repo.worktreeRoot, config.wranglerConfig ?? \"wrangler.toml\") :\n config.source === \"compose\" ? compose?.composeFile : undefined,\n bindings: bindings.length > 0 ? bindings : discovered?.bindings ?? [],\n endpoints: Object.entries(config.endpoints).map(([alias, endpoint]) => ({\n alias,\n ...endpoint,\n source: merged.endpointSources.get(`${name}\\0${alias}`) ?? merged.sources.get(name) ?? \"repository\",\n })),\n notes: discovered?.notes ?? [],\n });\n }\n\n const candidates: DiscoveredWorkload[] = [];\n for (const file of [\"Dockerfile\", \"dockerfile\"]) {\n const path = join(repo.worktreeRoot, file);\n if (existsSync(path) && ![...workloads.values()].some((workload) => workload.source === \"dockerfile\")) {\n candidates.push({\n name: \"web\",\n source: \"dockerfile\",\n runnable: false,\n configured: false,\n decisionSource: \"discovery\",\n definitionPath: path,\n bindings: [],\n endpoints: [],\n notes: [\"Dockerfile is a candidate; choose a workload name and endpoint semantics\"],\n });\n }\n }\n for (const script of packageScriptCandidates(repo.worktreeRoot)) {\n candidates.push({\n name: script,\n source: \"proc\",\n runnable: false,\n configured: false,\n decisionSource: \"discovery\",\n bindings: [],\n endpoints: [],\n notes: [\"package scripts are suggestions and are never executed automatically\"],\n });\n }\n\n const missingDecisions = candidates.map((candidate) =>\n `${candidate.source} candidate ${candidate.name} requires explicit setup`\n );\n const suggestions = [\n ...candidates.map((candidate) => candidate.source === \"dockerfile\"\n ? `hestia init dockerfile ${candidate.name} ${relative(repo.worktreeRoot, candidate.definitionPath!)} --scope repository`\n : `hestia init proc ${candidate.name} --scope repository -- bun run ${candidate.name}`),\n ...[...workloads.values()].flatMap((workload) => workload.bindings.length > 1 && workload.endpoints.length === 0\n ? [`hestia init endpoint <alias> ${workload.name} <target/tcp|udp> <http|tcp|udp> --scope repository`]\n : []),\n ];\n const state = readState(repo.worktreeRoot);\n return {\n version: 1,\n repository: {\n repo: repo.repo,\n repoId: repo.repoId,\n branch: repo.branch,\n worktree: repo.worktreeRoot,\n },\n layers: [\n { source: \"discovery\", present: automatic.size > 0 || candidates.length > 0 },\n { source: \"repository\", path: repositoryLayer.path, present: repositoryLayer.exists },\n { source: \"machine\", path: machineLayer.path, present: machineLayer.exists },\n { source: \"worktree\", path: join(repo.worktreeRoot, \".hestia\"), present: state !== null },\n ],\n runnableWorkloads: [...workloads.values()].filter((workload) => workload.runnable)\n .sort((left, right) => left.name.localeCompare(right.name)),\n candidateWorkloads: [\n ...[...workloads.values()].filter((workload) => !workload.runnable),\n ...candidates,\n ].sort((left, right) => left.name.localeCompare(right.name)),\n missingDecisions,\n conflicts: merged.conflicts,\n suggestions,\n existingStack: state === null\n ? null\n : { project: state.project, state: state.state, schemaVersion: state.schemaVersion },\n };\n}\n\nexport function assertDiscoveryRunnable(report: DiscoveryReport): void {\n if (report.conflicts.length > 0) {\n throw new HestiaError(\"config-conflict\", report.conflicts.join(\"; \"), { conflicts: report.conflicts });\n }\n if (report.runnableWorkloads.length === 0 && report.missingDecisions.length > 0) {\n throw new HestiaError(\n \"setup-required\",\n `repository setup is incomplete; run hestia discover --json for suggestions`,\n { missingDecisions: report.missingDecisions, suggestions: report.suggestions },\n );\n }\n}\n",
|
|
89
|
+
"import { HestiaError, type Endpoint, type StackRecord } from \"@hestia/core\";\n\nexport interface ResolvedEndpointSelection {\n endpoint: Endpoint;\n workload: string;\n binding: string;\n}\n\nfunction fromBinding(\n record: StackRecord,\n workload: string,\n bindingSelector: string,\n): ResolvedEndpointSelection | null {\n const service = record.services.find((candidate) => candidate.name === workload);\n const binding = service?.bindings?.find((candidate) =>\n `${candidate.target}/${candidate.protocol}` === bindingSelector\n );\n if (binding === undefined) return null;\n const configured = record.endpoints.find((endpoint) =>\n (endpoint.workload ?? endpoint.name) === workload && endpoint.binding === bindingSelector\n );\n return {\n workload,\n binding: bindingSelector,\n endpoint: configured ?? {\n name: `${workload}:${bindingSelector}`,\n workload,\n binding: bindingSelector,\n kind: binding.protocol === \"udp\" ? \"udp\" : \"tcp\",\n host: \"127.0.0.1\",\n port: binding.publishedPort,\n },\n };\n}\n\n/** Alias → canonical selector → unique workload resolution with typed ambiguity. */\nexport function resolveEndpointSelection(\n record: StackRecord,\n input: string,\n): ResolvedEndpointSelection {\n const exactAlias = record.endpoints.find((endpoint) => endpoint.name === input || endpoint.alias === input);\n if (exactAlias !== undefined) {\n const workload = exactAlias.workload ?? exactAlias.name;\n const binding = exactAlias.binding ?? \"main/tcp\";\n return { endpoint: exactAlias, workload, binding };\n }\n\n const selector = input.match(/^([^:]+):((?:main|[1-9][0-9]{0,4})\\/(?:tcp|udp))$/);\n if (selector !== null) {\n const resolved = fromBinding(record, selector[1]!, selector[2]!);\n if (resolved !== null) return resolved;\n }\n\n const service = record.services.find((candidate) => candidate.name === input);\n if (service !== undefined) {\n const bindings = service.bindings ?? (service.publishedPort === undefined ? [] : [{\n id: `${service.name}:main/tcp`,\n target: \"main\",\n protocol: \"tcp\" as const,\n publishedPort: service.publishedPort,\n }]);\n if (bindings.length !== 1) {\n throw new HestiaError(\n \"service-port-ambiguous\",\n `workload ${input} has ${bindings.length} bindings; select ${input}:<target>/<protocol> or an endpoint alias`,\n { selectors: bindings.map((binding) => `${input}:${binding.target}/${binding.protocol}`) },\n );\n }\n const bindingSelector = `${bindings[0]!.target}/${bindings[0]!.protocol}`;\n const resolved = fromBinding(record, input, bindingSelector);\n if (resolved !== null) return resolved;\n }\n\n throw new HestiaError(\"service-not-found\", `endpoint or workload ${JSON.stringify(input)} was not found`);\n}\n",
|
|
90
|
+
"import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { HestiaError } from \"@hestia/core\";\n\nconst pexec = promisify(execFile);\n\nexport interface ComposeCtx {\n project: string;\n baseFile: string;\n overrideFile: string;\n cwd: string;\n}\n\nexport interface ResolvedComposePort {\n target: number | string;\n published?: string;\n protocol?: string;\n host_ip?: string;\n mode?: string;\n}\n\nexport interface ResolvedComposeService {\n ports?: ResolvedComposePort[];\n depends_on?: Record<string, unknown>;\n network_mode?: string;\n pid?: string;\n ipc?: string;\n volumes?: Array<{ type?: string; source?: string; target?: string; read_only?: boolean }>;\n}\n\nexport interface ResolvedComposeModel {\n services: Record<string, ResolvedComposeService>;\n networks?: Record<string, { name?: string; external?: boolean }>;\n volumes?: Record<string, { name?: string; external?: boolean }>;\n}\n\n/** compose service row from `ps --format json`. */\nexport interface PsService {\n ID?: string;\n Service: string;\n State: string;\n Health: string;\n Publishers?: Array<{\n URL?: string;\n TargetPort: number;\n PublishedPort: number;\n Protocol?: string;\n }>;\n}\n\nfunction composeArgs(ctx: ComposeCtx, rest: string[]): string[] {\n return [\n \"compose\",\n \"-p\",\n ctx.project,\n \"-f\",\n ctx.baseFile,\n \"-f\",\n ctx.overrideFile,\n ...rest,\n ];\n}\n\nasync function docker(\n ctx: ComposeCtx,\n rest: string[],\n timeoutMs = 180_000,\n): Promise<{ stdout: string; stderr: string }> {\n try {\n return await pexec(\"docker\", composeArgs(ctx, rest), {\n cwd: ctx.cwd,\n timeout: timeoutMs,\n maxBuffer: 32 * 1024 * 1024,\n });\n } catch (err) {\n const e = err as { stderr?: string; message?: string };\n throw new HestiaError(\n \"compose-failed\",\n `docker compose ${rest.join(\" \")} failed: ${\n (e.stderr || e.message || \"\").trim() || \"unknown error\"\n }`,\n );\n }\n}\n\nexport async function dockerAvailable(): Promise<boolean> {\n try {\n await pexec(\"docker\", [\"version\", \"--format\", \"{{.Server.Version}}\"], {\n timeout: 10_000,\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Resolve interpolation, profiles, dependencies, ports, and resource names before overrides. */\nexport async function resolveComposeModel(\n project: string,\n baseFile: string,\n cwd: string,\n): Promise<ResolvedComposeModel> {\n try {\n const { stdout } = await pexec(\n \"docker\",\n [\"compose\", \"-p\", project, \"-f\", baseFile, \"config\", \"--format\", \"json\"],\n { cwd, timeout: 30_000, maxBuffer: 32 * 1024 * 1024 },\n );\n const value = JSON.parse(stdout) as Partial<ResolvedComposeModel>;\n if (typeof value.services !== \"object\" || value.services === null) {\n throw new Error(\"resolved model has no services table\");\n }\n return value as ResolvedComposeModel;\n } catch (error) {\n if (error instanceof HestiaError) throw error;\n const err = error as { stderr?: string; message?: string };\n throw new HestiaError(\n \"compose-failed\",\n `docker compose config --format json failed: ${(err.stderr || err.message || \"unknown error\").trim()}`,\n );\n }\n}\n\n/** Validate the merged compose model before creating anything. */\nexport async function composeConfig(ctx: ComposeCtx): Promise<void> {\n await docker(ctx, [\"config\", \"--quiet\"], 30_000);\n}\n\nexport async function composeUp(ctx: ComposeCtx, services: string[]): Promise<void> {\n await docker(ctx, [\"up\", \"-d\", ...services]);\n}\n\nexport async function composeDown(\n ctx: ComposeCtx,\n destroy: boolean,\n): Promise<void> {\n const rest = [\"down\", \"--remove-orphans\"];\n if (destroy) rest.push(\"-v\");\n await docker(ctx, rest);\n}\n\n/** Parse `ps --format json`, tolerating both a JSON array and NDJSON. */\nexport async function composePs(ctx: ComposeCtx): Promise<PsService[]> {\n const { stdout } = await docker(ctx, [\"ps\", \"--all\", \"--format\", \"json\"], 30_000);\n const text = stdout.trim();\n if (text === \"\") return [];\n try {\n const parsed = JSON.parse(text);\n if (Array.isArray(parsed)) return parsed as PsService[];\n return [parsed as PsService];\n } catch {\n return text\n .split(\"\\n\")\n .filter((l) => l.trim() !== \"\")\n .map((l) => JSON.parse(l) as PsService);\n }\n}\n\nfunction serviceReady(row: PsService): boolean {\n if (row.Health === \"healthy\") return true;\n // no healthcheck -> \"ready\" once running\n if ((row.Health ?? \"\") === \"\" && row.State === \"running\") return true;\n return false;\n}\n\n/** Poll until every required service is ready, or throw on timeout. */\nexport async function waitReady(\n ctx: ComposeCtx,\n services: string[],\n timeoutMs = 120_000,\n): Promise<PsService[]> {\n const deadline = Date.now() + timeoutMs;\n let last: PsService[] = [];\n while (Date.now() < deadline) {\n last = await composePs(ctx);\n const byName = new Map(last.map((r) => [r.Service, r]));\n const allReady = services.every((s) => {\n const row = byName.get(s);\n return row !== undefined && serviceReady(row);\n });\n if (allReady) return last;\n const failed = services.find((s) => byName.get(s)?.State === \"exited\");\n if (failed) {\n throw new HestiaError(\n \"service-exited\",\n `service \"${failed}\" exited before becoming ready`,\n );\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n throw new HestiaError(\n \"ready-timeout\",\n `services did not become ready within ${Math.round(\n timeoutMs / 1000,\n )}s: ${services\n .map((s) => {\n const row = last.find((r) => r.Service === s);\n return `${s}=${row ? row.Health || row.State : \"missing\"}`;\n })\n .join(\", \")}`,\n );\n}\n\n/**\n * Read back the Docker-assigned host port for a service's container port.\n * With no containerPort, returns the first publisher's port.\n */\nexport function publishedPortFor(\n row: PsService | undefined,\n containerPort?: number,\n protocol?: \"tcp\" | \"udp\",\n): number | undefined {\n const pubs = (row?.Publishers ?? []).filter((p) => p.PublishedPort > 0);\n if (pubs.length === 0) return undefined;\n if (containerPort !== undefined) {\n const match = pubs.find((p) =>\n p.TargetPort === containerPort &&\n (protocol === undefined || (p.Protocol ?? \"tcp\").toLowerCase() === protocol)\n );\n if (match) return match.PublishedPort;\n }\n return pubs[0]!.PublishedPort;\n}\n",
|
|
91
|
+
"import { chmodSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { HestiaError } from \"@hestia/core\";\nimport { isLive, startTimeOf } from \"./pidfile.ts\";\n\n/**\n * Advisory per-worktree mutation lock. Parallel agents in one worktree are the\n * product premise; unserialized read-modify-write of stack.json loses records.\n * Held across every state-mutating command (up/run/stop/down).\n */\n\nconst RETRY_MS = 100;\n\nfunction lockPath(worktreeRoot: string): string {\n return join(worktreeRoot, \".hestia\", \"lock\");\n}\n\nexport async function withLock<T>(\n worktreeRoot: string,\n fn: () => Promise<T>,\n timeoutMs = 30_000,\n): Promise<T> {\n const path = lockPath(worktreeRoot);\n const privateDirectory = join(worktreeRoot, \".hestia\");\n mkdirSync(privateDirectory, { recursive: true, mode: 0o700 });\n chmodSync(privateDirectory, 0o700);\n const me = JSON.stringify({\n pid: process.pid,\n startTime: startTimeOf(process.pid),\n });\n\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n try {\n writeFileSync(path, me, { flag: \"wx\", mode: 0o600 });\n break;\n } catch {\n // Held — break it if the holder is dead (crashed CLI), else wait.\n try {\n const holder = JSON.parse(readFileSync(path, \"utf8\")) as {\n pid: number;\n startTime: string;\n };\n if (!isLive(holder)) {\n rmSync(path, { force: true });\n continue;\n }\n } catch {\n // unreadable/corrupt lock — treat as stale\n rmSync(path, { force: true });\n continue;\n }\n if (Date.now() >= deadline) {\n throw new HestiaError(\n \"lock-timeout\",\n `could not acquire ${path} within ${Math.round(timeoutMs / 1000)}s`,\n );\n }\n await new Promise((r) => setTimeout(r, RETRY_MS));\n }\n }\n\n try {\n return await fn();\n } finally {\n rmSync(path, { force: true });\n }\n}\n",
|
|
92
|
+
"import { createServer } from \"node:net\";\nimport { execFile, execFileSync } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { HestiaError } from \"@hestia/core\";\n\nconst pexec = promisify(execFile);\n\n/** Bind-probe 127.0.0.1:0, close, hand the freed port to the proc. */\nexport function allocatePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = createServer();\n srv.once(\"error\", reject);\n srv.listen(0, \"127.0.0.1\", () => {\n const addr = srv.address();\n const port = typeof addr === \"object\" && addr !== null ? addr.port : 0;\n srv.close(() => resolve(port));\n });\n });\n}\n\ninterface PsRow {\n pid: number;\n pgid: number;\n ppid: number;\n}\n\nfunction psSnapshot(): PsRow[] {\n try {\n const out = execFileSync(\"ps\", [\"-A\", \"-o\", \"pid=,pgid=,ppid=\"], {\n encoding: \"utf8\",\n maxBuffer: 8 * 1024 * 1024,\n });\n const rows: PsRow[] = [];\n for (const line of out.split(\"\\n\")) {\n const m = line.trim().match(/^(\\d+)\\s+(\\d+)\\s+(\\d+)$/);\n if (m) rows.push({ pid: Number(m[1]), pgid: Number(m[2]), ppid: Number(m[3]) });\n }\n return rows;\n } catch {\n return [];\n }\n}\n\n/**\n * The spawned root plus every live descendant, with pgids. Membership is\n * ancestry, NOT process group: env-resolver wrappers (varlock's runner) put\n * their child in a fresh group, so the group id alone loses the subtree.\n */\nexport function processTree(rootPid: number): PsRow[] {\n const rows = psSnapshot();\n const byParent = new Map<number, PsRow[]>();\n for (const r of rows) {\n const list = byParent.get(r.ppid) ?? [];\n list.push(r);\n byParent.set(r.ppid, list);\n }\n const tree: PsRow[] = [];\n const queue = [rootPid];\n const seen = new Set<number>();\n while (queue.length > 0) {\n const pid = queue.shift()!;\n if (seen.has(pid)) continue;\n seen.add(pid);\n const self = rows.find((r) => r.pid === pid);\n if (self !== undefined) tree.push(self);\n for (const child of byParent.get(pid) ?? []) queue.push(child.pid);\n }\n return tree;\n}\n\nexport interface Listener {\n pid: number;\n port: number;\n}\n\n/** `lsof -F` machine output: `p<pid>` lines then `n<addr>` lines per socket. */\nfunction parseLsof(out: string): Listener[] {\n const listeners: Listener[] = [];\n let pid = 0;\n for (const line of out.split(\"\\n\")) {\n if (line.startsWith(\"p\")) pid = Number(line.slice(1));\n else if (line.startsWith(\"n\")) {\n const m = line.match(/:(\\d+)(?:->|$| )/);\n if (m) listeners.push({ pid, port: Number(m[1]) });\n }\n }\n return listeners;\n}\n\n/** `ss -tlnp`: local addr in col 4, `pid=` inside the users:(...) column. */\nfunction parseSs(out: string): Listener[] {\n const listeners: Listener[] = [];\n for (const line of out.split(\"\\n\")) {\n const pidM = line.match(/pid=(\\d+)/);\n const portM = line.match(/[\\s:]\\S*:(\\d+)\\s+\\S+:\\*/);\n if (pidM && portM) {\n listeners.push({ pid: Number(pidM[1]), port: Number(portM[1]) });\n }\n }\n return listeners;\n}\n\nlet tool: \"lsof\" | \"ss\" | undefined;\n\nexport async function allListeners(): Promise<Listener[]> {\n if (tool !== \"ss\") {\n try {\n const { stdout } = await pexec(\n \"lsof\",\n [\"-nP\", \"-iTCP\", \"-sTCP:LISTEN\", \"-Fpn\"],\n { maxBuffer: 8 * 1024 * 1024 },\n );\n tool = \"lsof\";\n return parseLsof(stdout);\n } catch (err) {\n const e = err as { code?: string; stdout?: string };\n // lsof exits 1 when nothing matches but still prints what it found\n if (typeof e.stdout === \"string\" && e.code !== \"ENOENT\") {\n tool = \"lsof\";\n return parseLsof(e.stdout);\n }\n if (tool === \"lsof\") return [];\n }\n }\n try {\n const { stdout } = await pexec(\"ss\", [\"-tlnp\"], {\n maxBuffer: 8 * 1024 * 1024,\n });\n tool = \"ss\";\n return parseSs(stdout);\n } catch {\n throw new HestiaError(\n \"ownership-tool-missing\",\n \"neither lsof nor ss is available — cannot verify port ownership \" +\n \"(required: tools like next dev silently bind a different port when \" +\n \"theirs is taken, so a bare listen-check would report the wrong port healthy)\",\n );\n }\n}\n\n/**\n * The readiness oracle. Who owns the assigned port decides:\n * - a process in our spawned tree listens on it → ready\n * - a process OUTSIDE the tree listens on it → definitive steal (this is\n * precisely the condition that makes next/vite silently auto-increment)\n * → kill + retry\n * - nobody yet → still booting; on timeout the tree's actual listening ports\n * are reported so \"bound 3001, not the assigned port\" is visible.\n * Tree ancestry (not \"listens elsewhere\") is the discriminator because dev\n * trees open legitimate extra sockets (workerd control sockets, inspectors).\n */\nexport interface PortView {\n /** Listener on the given port, if any. */\n owner: Listener | undefined;\n ownerIsMember: boolean;\n /** All ports the process tree currently listens on (for diagnostics). */\n memberPorts: number[];\n groupAlive: boolean;\n}\n\nexport async function inspectPort(\n rootPid: number,\n port: number,\n): Promise<PortView> {\n const members = new Set(processTree(rootPid).map((r) => r.pid));\n const listeners = await allListeners();\n const owner = listeners.find((l) => l.port === port);\n // A freshly spawned relay can fork the target between the ps snapshot and\n // lsof. Re-snapshot before declaring a listener foreign; a false steal\n // would kill a correctly bound dev server and churn through all retries.\n if (owner !== undefined && !members.has(owner.pid)) {\n for (const member of processTree(rootPid)) members.add(member.pid);\n }\n return {\n owner,\n ownerIsMember: owner !== undefined && members.has(owner.pid),\n memberPorts: listeners.filter((l) => members.has(l.pid)).map((l) => l.port),\n groupAlive: members.size > 0,\n };\n}\n",
|
|
93
|
+
"import { isLive, type Pidfile } from \"./pidfile.ts\";\nimport { processTree } from \"./ports.ts\";\n\nconst GRACE_MS = 10_000;\nconst POLL_MS = 200;\n\ntype StopTarget = Pick<\n Pidfile,\n \"pid\" | \"pgid\" | \"startTime\" | \"signal\" | \"children\"\n>;\n\nfunction signalGroups(pgids: Set<number>, sig: NodeJS.Signals): void {\n for (const pgid of pgids) {\n try {\n process.kill(-pgid, sig);\n } catch {\n // group already gone\n }\n }\n}\n\n/**\n * Every process group in the spawned tree. Live root → walk the real tree\n * (exact). Dead root → fall back to the ready-time child snapshot, keeping\n * only identities that still match (pid + verbatim start time), so a recycled\n * pid never gets an innocent group killed.\n */\nfunction groupsOf(t: StopTarget): Set<number> {\n const groups = new Set<number>([t.pgid]);\n if (isLive(t)) {\n for (const row of processTree(t.pid)) groups.add(row.pgid);\n } else {\n for (const c of t.children ?? []) {\n if (isLive(c)) groups.add(c.pgid);\n }\n }\n return groups;\n}\n\nfunction liveIdentities(\n t: StopTarget,\n): Array<{ pid: number; startTime: string }> {\n return [\n { pid: t.pid, startTime: t.startTime },\n ...(t.children ?? []),\n ].filter(isLive);\n}\n\nasync function waitAllDead(t: StopTarget, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (liveIdentities(t).length === 0) return true;\n await new Promise((r) => setTimeout(r, POLL_MS));\n }\n return liveIdentities(t).length === 0;\n}\n\n/**\n * Stop a supervised process tree: signal every group in it (SIGINT for\n * wrangler — its verified clean-shutdown signal — SIGTERM otherwise), grace,\n * then SIGKILL whatever identity still matches. Idempotent: an already-dead\n * (or pid-reused) tree is a successful no-op.\n */\nexport async function stopProcTree(\n t: StopTarget,\n graceMs = GRACE_MS,\n): Promise<void> {\n const groups = groupsOf(t);\n if (liveIdentities(t).length === 0) return;\n signalGroups(groups, t.signal === \"int\" ? \"SIGINT\" : \"SIGTERM\");\n if (await waitAllDead(t, graceMs)) return;\n signalGroups(groupsOf(t), \"SIGKILL\");\n await waitAllDead(t, 2_000);\n}\n",
|
|
94
|
+
"import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { HestiaError } from \"@hestia/core\";\n\n/**\n * Env resolution by argv composition, not integration: when the repo uses\n * varlock (.env.schema + a local binary), prefix the spawn with\n * `varlock run --no-redact-stdout --` — the repo's own dev pattern. varlock\n * resolves the schema env into the child while values already present in the\n * process env win (verified against varlock 1.1.0), so hestia's injected\n * PORT, HESTIA_* and --env overrides pass through untouched.\n */\nexport function detectVarlock(worktreeRoot: string): string | null {\n const schema = join(worktreeRoot, \".env.schema\");\n const bin = join(worktreeRoot, \"node_modules\", \".bin\", \"varlock\");\n return existsSync(schema) && existsSync(bin) ? bin : null;\n}\n\nexport function wrapWithVarlock(bin: string, argv: string[]): string[] {\n return [bin, \"run\", \"--no-redact-stdout\", \"--\", ...argv];\n}\n\nexport function requireVarlock(worktreeRoot: string): string {\n const bin = detectVarlock(worktreeRoot);\n if (bin === null) {\n throw new HestiaError(\n \"varlock-missing\",\n `--varlock requires both ${join(worktreeRoot, \".env.schema\")} and a local ` +\n `node_modules/.bin/varlock in the worktree`,\n );\n }\n return bin;\n}\n",
|
|
95
|
+
"import { appendFileSync, closeSync, existsSync, mkdirSync, openSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { HestiaError, type ProcSpec, type ServiceRecord } from \"@hestia/core\";\nimport { allocatePort, inspectPort, processTree } from \"./ports.ts\";\nimport {\n type Pidfile,\n isLive,\n removePidfile,\n procSpecFingerprint,\n startTimeOf,\n writePidfile,\n} from \"./pidfile.ts\";\nimport { stopProcTree } from \"./shutdown.ts\";\nimport { requireVarlock, wrapWithVarlock } from \"./resolver.ts\";\n\nconst READY_TIMEOUT_MS = 60_000;\nconst NO_PORT_GRACE_MS = 2_000;\nconst POLL_MS = 300;\nconst MAX_ATTEMPTS = 3;\nconst PROC_RESTART_SENTINEL = \"--- hestia: proc restarted (port stolen) ---\\n\";\nconst RELAY_SPEC_ENV = \"HESTIA_PROC_RELAY_SPEC\";\nconst PROC_RELAY_ENTRYPOINT = existsSync(join(import.meta.dir, \"proc-relay.js\"))\n ? join(import.meta.dir, \"proc-relay.js\")\n : join(import.meta.dir, \"proc-relay.ts\");\n\nexport function envKey(name: string): string {\n return name.toUpperCase().replace(/[^A-Z0-9]+/g, \"_\");\n}\n\nconst PORT_TOKEN = \"{port}\";\nconst ESCAPED = \"{{port}}\";\n// round-trip placeholder for escaped braces; NUL cannot appear in argv text\nconst SENTINEL = \"\\u0000\";\n\nexport function substitutePort(argv: string[], port: number): string[] {\n return argv.map((a) =>\n a\n .replaceAll(ESCAPED, SENTINEL)\n .replaceAll(PORT_TOKEN, String(port))\n .replaceAll(SENTINEL, PORT_TOKEN),\n );\n}\n\nexport interface ProcStartResult {\n record: ServiceRecord;\n pidfile: Pidfile;\n /** Set for ready-timeout: the proc is left running for inspection. */\n error?: HestiaError;\n}\n\nfunction validateName(name: string): void {\n if (!/^[a-z0-9][a-z0-9_-]*$/i.test(name)) {\n throw new HestiaError(\n \"name-conflict\",\n `invalid proc name \"${name}\" (use letters, digits, - and _)`,\n );\n }\n}\n\nfunction spawnOnce(\n argv: string[],\n cwd: string,\n env: Record<string, string | undefined>,\n logPath: string,\n attempt: number,\n): Promise<number> {\n closeSync(openProcAttemptLog(logPath, attempt));\n const relaySpec = Buffer.from(JSON.stringify({ argv, cwd, env, logPath })).toString(\"base64\");\n const relayFd = openSync(logPath, \"a\", 0o600);\n return new Promise((resolve, reject) => {\n // The relay is the supervised process-group root. It keeps target env in\n // memory, captures both streams, and bounds the log family by rotation.\n const child = spawn(process.execPath, [PROC_RELAY_ENTRYPOINT], {\n cwd,\n env: { ...process.env, [RELAY_SPEC_ENV]: relaySpec },\n detached: true,\n stdio: [\"ignore\", relayFd, relayFd],\n });\n child.once(\"error\", (err) => {\n closeSync(relayFd);\n reject(\n new HestiaError(\n \"proc-spawn-failed\",\n `failed to spawn ${argv[0]}: ${err.message}`,\n ),\n );\n });\n child.once(\"spawn\", () => {\n closeSync(relayFd);\n child.unref();\n resolve(child.pid!);\n });\n });\n}\n\n/** Open a fresh first-attempt proc log or append a visible port-steal retry sentinel. */\nexport function openProcAttemptLog(logPath: string, attempt: number): number {\n if (attempt > 1) appendFileSync(logPath, PROC_RESTART_SENTINEL);\n return openSync(logPath, attempt > 1 ? \"a\" : \"w\");\n}\n\n/**\n * Spawn + supervise one host process until it proves ready (see inspectPort\n * for the ownership oracle). Retries only on definitive evidence of a stolen\n * port; a silent timeout never retries — the proc is left running and the\n * error tells the caller where the logs are.\n */\nexport async function startProc(\n worktreeRoot: string,\n spec: ProcSpec,\n stackEnv: Record<string, string>,\n mirrorPidfile?: (pf: Pidfile) => void,\n): Promise<ProcStartResult> {\n validateName(spec.name);\n const logsDir = join(worktreeRoot, \".hestia\", \"logs\");\n mkdirSync(logsDir, { recursive: true });\n const logPath = join(logsDir, `${spec.name}.log`);\n const cwd = spec.cwd ? join(worktreeRoot, spec.cwd) : worktreeRoot;\n const wantPort = spec.port !== \"none\";\n const readyTimeoutMs = spec.readyTimeoutMs ?? READY_TIMEOUT_MS;\n const varlockBin = spec.varlock ? requireVarlock(worktreeRoot) : null;\n\n let lastFailure = \"\";\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n const port = wantPort ? await allocatePort() : undefined;\n let argv = port === undefined ? spec.argv : substitutePort(spec.argv, port);\n if (varlockBin !== null) argv = wrapWithVarlock(varlockBin, argv);\n\n const env: Record<string, string | undefined> = {\n ...process.env,\n ...stackEnv,\n ...(port !== undefined\n ? { PORT: String(port), [`HESTIA_${envKey(spec.name)}_PORT`]: String(port) }\n : {}),\n ...spec.env,\n };\n\n const pid = await spawnOnce(argv, cwd, env, logPath, attempt);\n const startTime = startTimeOf(pid) ?? \"\";\n const pf: Pidfile = {\n schemaVersion: 1,\n name: spec.name,\n pid,\n pgid: pid,\n startTime,\n specFingerprint: procSpecFingerprint(spec),\n port,\n inspectorPort: spec.inspectorPort,\n logPath,\n signal: spec.signal ?? \"term\",\n backend: spec.backend ?? \"proc\",\n configPath: spec.configPath,\n };\n // Written (and mirrored) before the ready wait so a crashed CLI still\n // leaves enough on disk for `down` to clean up.\n writePidfile(worktreeRoot, pf);\n mirrorPidfile?.(pf);\n\n const outcome = await waitUntilReady(pf, port, readyTimeoutMs);\n const record: ServiceRecord = {\n name: spec.name,\n backend: pf.backend,\n state: \"healthy\",\n publishedPort: port,\n pid,\n pgid: pid,\n startTime,\n inspectorPort: spec.inspectorPort,\n logPath,\n configPath: spec.configPath,\n originService: spec.originService,\n originEndpoint: spec.originEndpoint,\n };\n\n switch (outcome.kind) {\n case \"ready\": {\n // Descendant snapshot for teardown: wrapper runners (varlock) start\n // their child in a new process group, so record every subtree\n // identity while it can still be walked exactly.\n pf.children = processTree(pid)\n .filter((r) => r.pid !== pid)\n .map((r) => ({\n pid: r.pid,\n pgid: r.pgid,\n startTime: startTimeOf(r.pid) ?? \"\",\n }))\n .filter((c) => c.startTime !== \"\");\n writePidfile(worktreeRoot, pf);\n mirrorPidfile?.(pf);\n return { record, pidfile: pf };\n }\n case \"exited\":\n removePidfile(worktreeRoot, spec.name);\n throw new HestiaError(\n \"proc-exited\",\n `\"${spec.name}\" exited before becoming ready — logs: ${logPath}`,\n );\n case \"stolen\":\n // Definitive: a process outside our group owns the assigned port —\n // the exact condition that makes next/vite auto-increment. Kill the\n // group (it may be serving on the wrong port) and try a fresh port.\n lastFailure = `port ${port} taken by pid ${outcome.byPid}`;\n await stopProcTree(pf, 2_000);\n removePidfile(worktreeRoot, spec.name);\n continue;\n case \"timeout\": {\n record.state = \"unhealthy\";\n const bound =\n outcome.memberPorts.length > 0\n ? `it is listening on port(s) ${outcome.memberPorts.join(\", \")} instead`\n : `it never opened a listening socket (if it isn't a server, use --no-port)`;\n return {\n record,\n pidfile: pf,\n error: new HestiaError(\n \"proc-ready-timeout\",\n `\"${spec.name}\" did not listen on port ${port} within ` +\n `${Math.round(readyTimeoutMs / 1000)}s — ${bound}; left running, logs: ${logPath}`,\n ),\n };\n }\n }\n }\n throw new HestiaError(\n \"port-allocation-failed\",\n `could not hold a port for \"${spec.name}\" after ${MAX_ATTEMPTS} attempts (${lastFailure})`,\n );\n}\n\ntype ReadyOutcome =\n | { kind: \"ready\" }\n | { kind: \"exited\" }\n | { kind: \"stolen\"; byPid: number }\n | { kind: \"timeout\"; memberPorts: number[] };\n\nasync function waitUntilReady(\n pf: Pidfile,\n port: number | undefined,\n timeoutMs: number,\n): Promise<ReadyOutcome> {\n const deadline = Date.now() + timeoutMs;\n\n if (port === undefined) {\n // No port contract — alive after a short grace is the whole check.\n await new Promise((r) => setTimeout(r, NO_PORT_GRACE_MS));\n return isLive(pf) ? { kind: \"ready\" } : { kind: \"exited\" };\n }\n\n let memberPorts: number[] = [];\n while (Date.now() < deadline) {\n if (!isLive(pf)) return { kind: \"exited\" };\n const view = await inspectPort(pf.pgid, port);\n memberPorts = view.memberPorts;\n if (view.ownerIsMember) return { kind: \"ready\" };\n if (view.owner !== undefined) {\n return { kind: \"stolen\", byPid: view.owner.pid };\n }\n await new Promise((r) => setTimeout(r, POLL_MS));\n }\n return { kind: \"timeout\", memberPorts };\n}\n",
|
|
96
|
+
"import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { slug, type RepoId, type StackRecord } from \"@hestia/core\";\nimport { hestiaHome } from \"../state.ts\";\nimport { writeAtomicTextFile } from \"../atomic-json-file.ts\";\nimport { HestiaError } from \"@hestia/core\";\n\nexport const DEFAULT_LOCAL_HOSTNAME_TEMPLATE = \"{alias}.{branch}.{repo}.localhost\";\n\nexport interface RouterRepositoryConfig {\n name?: string;\n services: string[];\n}\n\nexport interface HestiaRouterConfig {\n hostnameTemplate: string;\n repositories: Partial<Record<RepoId, RouterRepositoryConfig>>;\n}\n\nexport interface HestiaMachineConfig {\n version: 1;\n maxStacks?: number;\n router: HestiaRouterConfig;\n}\n\nexport interface HestiaConfigReadResult {\n config: HestiaMachineConfig;\n warnings: string[];\n valid: boolean;\n path: string;\n}\n\n/** Return the canonical machine-local TOML configuration path. */\nexport function hestiaConfigTomlPath(): string {\n return join(hestiaHome(), \"config.toml\");\n}\n\n/** Explicitly migrate the legacy maxStacks JSON into strict machine TOML. */\nexport function migrateHestiaMachineConfig(): { migrated: boolean; from: string; to: string } {\n const from = join(hestiaHome(), \"config.json\");\n const to = hestiaConfigTomlPath();\n if (existsSync(to)) return { migrated: false, from, to };\n if (!existsSync(from)) throw new HestiaError(\"config-missing\", `legacy config not found at ${from}`);\n let value: unknown;\n try {\n value = JSON.parse(readFileSync(from, \"utf8\"));\n } catch (error) {\n throw new HestiaError(\"config-invalid\", `invalid ${from}: ${(error as Error).message}`);\n }\n const maxStacks = (value as { maxStacks?: unknown })?.maxStacks;\n if (!Number.isInteger(maxStacks) || (maxStacks as number) <= 0) {\n throw new HestiaError(\"config-invalid\", `${from}.maxStacks must be a positive integer`);\n }\n writeAtomicTextFile(\n to,\n `version = 1\\nmax_stacks = ${maxStacks}\\n\\n[router]\\nhostname_template = ${JSON.stringify(DEFAULT_LOCAL_HOSTNAME_TEMPLATE)}\\n`,\n );\n readHestiaMachineConfig(to);\n return { migrated: true, from, to };\n}\n\nfunction emptyMachineConfig(): HestiaMachineConfig {\n return {\n version: 1,\n router: {\n hostnameTemplate: DEFAULT_LOCAL_HOSTNAME_TEMPLATE,\n repositories: {},\n },\n };\n}\n\nfunction assertKnownKeys(table: Record<string, unknown>, allowed: string[], path: string): void {\n const allowedKeys = new Set(allowed);\n const unknown = Object.keys(table).find((key) => !allowedKeys.has(key));\n if (unknown !== undefined) throw new Error(`${path} has unknown key ${JSON.stringify(unknown)}`);\n}\n\nfunction validateHostnameTemplate(value: unknown): string {\n const template = value === undefined ? DEFAULT_LOCAL_HOSTNAME_TEMPLATE : value;\n if (typeof template !== \"string\") throw new Error(\"router.hostname_template must be a string\");\n for (const token of [\"{branch}\", \"{repo}\"]) {\n if (!template.includes(token)) throw new Error(`router.hostname_template must contain ${token}`);\n }\n if (![\"{alias}\", \"{workload}\", \"{service}\"].some((token) => template.includes(token))) {\n throw new Error(\"router.hostname_template must contain {alias}, {workload}, or legacy {service}\");\n }\n if (!template.endsWith(\".localhost\")) {\n throw new Error(\"router.hostname_template must end in .localhost\");\n }\n const unknown = template.match(/\\{[^}]+\\}/g)?.filter(\n (token) => ![\"{alias}\", \"{workload}\", \"{service}\", \"{branch}\", \"{repo}\"].includes(token),\n );\n if (unknown?.length) throw new Error(`router.hostname_template has unknown token ${unknown[0]}`);\n const worstCase = template.replaceAll(/\\{(?:alias|workload|service|branch|repo)\\}/g, \"x\".repeat(63));\n if (worstCase.length > 253) {\n throw new Error(\"router.hostname_template can exceed the 253-character DNS hostname limit\");\n }\n return template;\n}\n\nfunction localHostnameLabel(value: string): string {\n const normalized = slug(value);\n const normalizationIsLossy = value !== normalized;\n if (!normalizationIsLossy && normalized.length <= 63) return normalized;\n const hash = createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 6);\n return `${normalized.slice(0, Math.min(56, normalized.length))}-${hash}`;\n}\n\n/** Stable lookup key for one stack-local service route. */\nexport function localRouteKey(record: Pick<StackRecord, \"project\">, service: string): string {\n return `${record.project}\\0${service}`;\n}\n\nfunction identityDisambiguatedHostname(hostname: string, record: StackRecord): string {\n const labels = hostname.split(\".\");\n const first = labels[0] ?? \"service\";\n const identity = `${record.repoId ?? record.repo}\\0${record.worktree}`;\n const hash = createHash(\"sha256\").update(identity).digest(\"hex\").slice(0, 6);\n labels[0] = `${first.slice(0, Math.min(56, first.length))}-${hash}`;\n return labels.join(\".\");\n}\n\nfunction parseRepositoryConfigs(value: unknown): HestiaRouterConfig[\"repositories\"] {\n if (value === undefined) return {};\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"router.repositories must be a table\");\n }\n const repositories: HestiaRouterConfig[\"repositories\"] = {};\n for (const [repoId, raw] of Object.entries(value)) {\n if (!/^repo-[a-f0-9]{16}$/.test(repoId)) {\n throw new Error(`router.repositories key ${JSON.stringify(repoId)} is not a RepoId`);\n }\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new Error(`router.repositories.${repoId} must be a table`);\n }\n const table = raw as Record<string, unknown>;\n assertKnownKeys(table, [\"name\", \"services\"], `router.repositories.${repoId}`);\n if (!Array.isArray(table.services) || !table.services.every(\n (service) => typeof service === \"string\" && /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(service),\n )) {\n throw new Error(`router.repositories.${repoId}.services must be an array of service names`);\n }\n if (table.name !== undefined && typeof table.name !== \"string\") {\n throw new Error(`router.repositories.${repoId}.name must be a string`);\n }\n repositories[repoId as RepoId] = {\n name: table.name as string | undefined,\n services: [...new Set(table.services as string[])],\n };\n }\n return repositories;\n}\n\n/** Strictly parse machine TOML; invalid router defaults are disabled with warnings. */\nexport function readHestiaMachineConfig(path = hestiaConfigTomlPath()): HestiaConfigReadResult {\n const fallback = emptyMachineConfig();\n if (!existsSync(path)) return { config: fallback, warnings: [], valid: true, path };\n try {\n const raw = Bun.TOML.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n assertKnownKeys(raw, [\"version\", \"max_stacks\", \"router\"], \"config\");\n if (raw.version !== 1) throw new Error(\"version must equal 1\");\n const maxStacks = raw.max_stacks;\n if (maxStacks !== undefined && (!Number.isInteger(maxStacks) || (maxStacks as number) <= 0)) {\n throw new Error(\"max_stacks must be a positive integer\");\n }\n const router = raw.router;\n const config = { ...fallback, maxStacks: maxStacks as number | undefined };\n try {\n if (router !== undefined && (typeof router !== \"object\" || router === null || Array.isArray(router))) {\n throw new Error(\"router must be a table\");\n }\n const routerTable = (router ?? {}) as Record<string, unknown>;\n assertKnownKeys(routerTable, [\"hostname_template\", \"repositories\"], \"router\");\n config.router = {\n hostnameTemplate: validateHostnameTemplate(routerTable.hostname_template),\n repositories: parseRepositoryConfigs(routerTable.repositories),\n };\n } catch (error) {\n return {\n config,\n warnings: [`invalid router section in ${path}: ${(error as Error).message} — configured routes disabled`],\n valid: false,\n path,\n };\n }\n return {\n config,\n warnings: [],\n valid: true,\n path,\n };\n } catch (error) {\n return {\n config: fallback,\n warnings: [`invalid ${path}: ${(error as Error).message} — configured routes disabled`],\n valid: false,\n path,\n };\n }\n}\n\n/** Return repository-default services selected in machine-local config. */\nexport function configuredLocalRouteServices(\n repoId: RepoId | undefined,\n config = readHestiaMachineConfig().config,\n): string[] {\n if (repoId === undefined) return [];\n return config.router.repositories[repoId]?.services ?? [];\n}\n\n/** Union per-worktree CLI intent with repository-default local route services. */\nexport function effectiveLocalRouteServices(\n record: StackRecord,\n config = readHestiaMachineConfig().config,\n): string[] {\n return effectiveLocalRoutes(record, config).map((route) => route.name);\n}\n\nexport interface EffectiveLocalRoute {\n name: string;\n service: string;\n selector?: string;\n}\n\n/** Resolve explicit aliases plus machine defaults into route targets. */\nexport function effectiveLocalRoutes(\n record: StackRecord,\n config = readHestiaMachineConfig().config,\n): EffectiveLocalRoute[] {\n const routes = new Map<string, EffectiveLocalRoute>();\n for (const service of configuredLocalRouteServices(record.repoId, config)) {\n routes.set(service, { name: service, service });\n }\n for (const endpoint of record.endpoints) {\n if (endpoint.local !== true) continue;\n routes.set(endpoint.alias ?? endpoint.name, {\n name: endpoint.alias ?? endpoint.name,\n service: endpoint.workload ?? endpoint.name,\n selector: endpoint.binding,\n });\n }\n for (const intent of record.localRoutes ?? []) {\n const name = intent.alias ?? intent.service;\n routes.set(name, { name, service: intent.service, selector: intent.selector });\n }\n for (const disabled of record.disabledLocalRoutes ?? []) {\n routes.delete(disabled.alias ?? disabled.service);\n }\n return [...routes.values()].sort((left, right) => left.name.localeCompare(right.name));\n}\n\n/** Render one collision-safe local hostname from a validated template. */\nexport function localRouteHostname(\n record: Pick<StackRecord, \"repoId\" | \"repo\" | \"branch\" | \"worktree\">,\n alias: string,\n config = readHestiaMachineConfig().config,\n workload = alias,\n): string {\n const repositoryName = record.repoId === undefined\n ? record.repo\n : config.router.repositories[record.repoId]?.name ?? record.repo;\n const expanded = config.router.hostnameTemplate\n .replaceAll(\"{alias}\", alias)\n .replaceAll(\"{workload}\", workload)\n .replaceAll(\"{service}\", alias)\n .replaceAll(\"{branch}\", record.branch)\n .replaceAll(\"{repo}\", repositoryName);\n const hostname = expanded.split(\".\").map((label) => localHostnameLabel(label)).join(\".\");\n if (hostname.length > 253) throw new Error(\"expanded local route hostname exceeds 253 characters\");\n return hostname;\n}\n\n/** Resolve hostnames with stable identity hashes so later stacks can never rename them. */\nexport function resolveLocalRouteHostnames(\n records: StackRecord[],\n config = readHestiaMachineConfig().config,\n): Map<string, string> {\n const candidates: Array<{ key: string; hostname: string; record: StackRecord }> = [];\n for (const record of records) {\n const routes = new Map<string, string>(\n effectiveLocalRoutes(record, config).map((route) => [route.name, route.service]),\n );\n for (const endpoint of record.endpoints) {\n if (!routes.has(endpoint.name)) routes.set(endpoint.name, endpoint.workload ?? endpoint.name);\n }\n for (const [service, workload] of routes) {\n candidates.push({\n key: localRouteKey(record, service),\n hostname: localRouteHostname(record, service, config, workload),\n record,\n });\n }\n }\n return new Map(candidates.map((candidate) => [\n candidate.key,\n identityDisambiguatedHostname(candidate.hostname, candidate.record),\n ]));\n}\n",
|
|
97
|
+
"import {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n} from \"node:fs\";\nimport { execFile } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { LABELS, STATE_SCHEMA_VERSION, type StackIdentity, type StackRecord } from \"@hestia/core\";\nimport { hestiaHome, mirrorProcsDir, parseStackRecord } from \"../state.ts\";\nimport { isLive, listPidfiles } from \"../proc/pidfile.ts\";\nimport { writeAtomicJsonFile } from \"../atomic-json-file.ts\";\nimport { hestiaConfigTomlPath, readHestiaMachineConfig } from \"../router/router-config.ts\";\n\n/**\n * Admission slots for the machine-wide stack cap. Truth is DERIVED, never\n * owned: occupancy is recomputed from the stack mirrors (live services,\n * provisional starting-records) plus small reservation files that bridge the\n * moment between a grant and the granted CLI's first state write. A daemon\n * crash therefore never corrupts accounting — a restart re-derives everything.\n */\n\nexport const DEFAULT_MAX_STACKS = 5;\n/** Backstop only — the provisional record takes over within seconds of a grant. */\nconst RESERVATION_TTL_MS = 60_000;\nconst DOCKER_PROBE_TIMEOUT_MS = 5_000;\n\nexport function daemonDir(): string {\n return join(hestiaHome(), \"daemon\");\n}\n\nfunction reservationsDir(): string {\n return join(daemonDir(), \"reservations\");\n}\n\n/** Persisted grant bridging daemon admission to the first stack mirror write. */\nexport interface StackReservation {\n schemaVersion?: typeof STATE_SCHEMA_VERSION;\n project: string;\n identity?: StackIdentity;\n /** Holder identity — a dead holder frees the reservation before the TTL. */\n pid: number;\n startTime: string;\n at: number;\n}\n\n/**\n * Strictly parse the cap. Invalid values (non-integer, zero, negative) fall\n * back to the default WITH a warning — a deny-all daemon caused by a typo'd\n * env var is indistinguishable from a bug.\n */\nexport function resolveMaxStacks(): { maxStacks: number; warnings: string[] } {\n const warnings: string[] = [];\n const fromEnv = process.env.HESTIA_MAX_STACKS;\n if (fromEnv !== undefined) {\n const n = Number(fromEnv);\n if (Number.isInteger(n) && n > 0) return { maxStacks: n, warnings };\n warnings.push(\n `invalid HESTIA_MAX_STACKS=${JSON.stringify(fromEnv)} — using default ${DEFAULT_MAX_STACKS}`,\n );\n return { maxStacks: DEFAULT_MAX_STACKS, warnings };\n }\n const toml = readHestiaMachineConfig();\n warnings.push(...toml.warnings);\n if (toml.config.maxStacks !== undefined) {\n return { maxStacks: toml.config.maxStacks, warnings };\n }\n const configPath = join(hestiaHome(), \"config.json\");\n if (existsSync(configPath)) {\n try {\n const cfg = JSON.parse(readFileSync(configPath, \"utf8\")) as {\n maxStacks?: unknown;\n };\n if (cfg.maxStacks !== undefined) {\n if (Number.isInteger(cfg.maxStacks) && (cfg.maxStacks as number) > 0) {\n warnings.push(`legacy ${configPath} is in use — migrate maxStacks to max_stacks in ${hestiaConfigTomlPath()}`);\n return { maxStacks: cfg.maxStacks as number, warnings };\n }\n warnings.push(\n `invalid maxStacks in ${configPath} — using default ${DEFAULT_MAX_STACKS}`,\n );\n }\n } catch {\n warnings.push(`unreadable ${configPath} — using default ${DEFAULT_MAX_STACKS}`);\n }\n }\n return { maxStacks: DEFAULT_MAX_STACKS, warnings };\n}\n\n/**\n * \"live\" | \"dead\" from a clean docker answer; null when docker itself erred\n * or timed out — the caller must treat null as unknown, never as dead\n * (a restarting Docker Desktop must not free slots).\n */\nexport type DockerProbe = (project: string) => Promise<\"live\" | \"dead\" | null>;\n\nexport const dockerProbe: DockerProbe = (project) =>\n new Promise((resolve) => {\n execFile(\n \"docker\",\n [\"ps\", \"-q\", \"--filter\", `label=${LABELS.stack}=${project}`],\n { timeout: DOCKER_PROBE_TIMEOUT_MS },\n (err, stdout) => {\n if (err) resolve(null);\n else resolve(stdout.trim() === \"\" ? \"dead\" : \"live\");\n },\n );\n });\n\nexport interface Occupancy {\n /** Projects occupying a slot: live services or a starting-record with a live holder. */\n live: string[];\n /** Reservation files not yet backed by any mirror record. */\n reserved: string[];\n warnings: string[];\n}\n\nexport class SlotLedger {\n /** Sticky last-known docker liveness per project — survives probe errors. */\n #lastDockerLive = new Map<string, boolean>();\n\n constructor(private readonly probe: DockerProbe = dockerProbe) {}\n\n /** Record the acquiring CLI's identity so its crash frees the reservation early. */\n reserveFor(\n identity: StackIdentity | string,\n holder: { pid: number; startTime: string },\n ): void {\n const project = typeof identity === \"string\" ? identity : identity.project;\n const reservation: StackReservation = {\n schemaVersion: STATE_SCHEMA_VERSION,\n project,\n identity: typeof identity === \"string\" ? undefined : identity,\n ...holder,\n at: Date.now(),\n };\n mkdirSync(reservationsDir(), { recursive: true, mode: 0o700 });\n chmodSync(reservationsDir(), 0o700);\n writeAtomicJsonFile(join(reservationsDir(), project), reservation, { pretty: false });\n }\n\n release(project: string): void {\n rmSync(join(reservationsDir(), project), { force: true });\n }\n\n /** Read current reservation identities without probing Docker or taking admission locks. */\n reservationSnapshot(): StackReservation[] {\n const dir = reservationsDir();\n if (!existsSync(dir)) return [];\n const out: StackReservation[] = [];\n for (const f of readdirSync(dir)) {\n if (f.endsWith(\".tmp\")) {\n rmSync(join(dir, f), { force: true });\n continue;\n }\n try {\n const reservation = JSON.parse(readFileSync(join(dir, f), \"utf8\")) as StackReservation;\n if (reservation.schemaVersion !== STATE_SCHEMA_VERSION) {\n throw new Error(\"legacy or unsupported reservation schema\");\n }\n if (reservation.project !== f) throw new Error(\"reservation filename mismatch\");\n out.push(reservation);\n } catch {\n rmSync(join(dir, f), { force: true });\n }\n }\n return out.sort((left, right) => left.at - right.at || left.project.localeCompare(right.project));\n }\n\n /**\n * Drop reservations that are no longer bridging anything: the project has a\n * mirror record now (the record carries occupancy from here), the holder\n * died, or the TTL backstop expired.\n */\n expireStale(hasRecord: (project: string) => boolean): void {\n for (const r of this.reservationSnapshot()) {\n const holderDead = r.startTime !== \"\" && !isLive({ pid: r.pid, startTime: r.startTime });\n const expired = Date.now() - r.at > RESERVATION_TTL_MS;\n if (hasRecord(r.project) || holderDead || expired) this.release(r.project);\n }\n }\n\n /**\n * One project's slot occupancy from its mirror. Quick-tunnel procs never\n * count — they outlive their origins and hold no real dev-stack resources.\n */\n async projectOccupies(project: string, record: StackRecord): Promise<boolean> {\n // Live services first — a partially-started stack (crashed mid-`up`, still\n // marked \"starting\") with running workers holds real resources regardless\n // of its starter's fate.\n const procLive = listPidfiles(mirrorProcsDir(project)).some(\n (pf) => pf.backend !== \"tunnel\" && isLive(pf),\n );\n if (procLive) return true;\n // Provisional grant: occupies while the CLI holding it is alive. A dead\n // starter still falls through to the docker probe — containers may have\n // come up before the crash.\n if (\n record.state === \"starting\" &&\n record.starter !== undefined &&\n isLive(record.starter)\n ) {\n return true;\n }\n if (!record.services.some((s) => s.backend === \"docker\")) return false;\n const probed = await this.probe(project);\n if (probed === null) {\n // Docker erred/timed out — sticky: keep the last clean answer, default\n // to LIVE for never-probed projects (holding a slot too long is safe;\n // freeing one that's actually running is a cap breach).\n return this.#lastDockerLive.get(project) ?? true;\n }\n const live = probed === \"live\";\n this.#lastDockerLive.set(project, live);\n return live;\n }\n\n async occupancy(): Promise<Occupancy> {\n const warnings: string[] = [];\n const live: string[] = [];\n const stacksDir = join(hestiaHome(), \"stacks\");\n const recorded = new Set<string>();\n if (existsSync(stacksDir)) {\n for (const project of readdirSync(stacksDir)) {\n const p = join(stacksDir, project, \"stack.json\");\n if (!existsSync(p)) continue;\n let record: StackRecord;\n try {\n record = parseStackRecord(readFileSync(p, \"utf8\"), p);\n } catch {\n warnings.push(`unreadable mirror for ${project}`);\n continue;\n }\n recorded.add(project);\n if (await this.projectOccupies(project, record)) live.push(project);\n }\n }\n this.expireStale((project) => recorded.has(project));\n const reserved = this.reservationSnapshot()\n .map((r) => r.project)\n .filter((p) => !live.includes(p));\n return { live, reserved, warnings };\n }\n}\n",
|
|
98
|
+
"import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n HestiaError,\n type DaemonHealth,\n type DaemonStateView,\n type FleetEnvelope,\n type LogLine,\n type RepoId,\n type StackIdentity,\n STATE_SCHEMA_VERSION,\n} from \"@hestia/core\";\nimport { isLive, readPidfile, startTimeOf } from \"../proc/pidfile.ts\";\nimport type { AcquireResult } from \"./routes.ts\";\nimport { daemonDir } from \"./slots.ts\";\n\n/** Discovery metadata the daemon writes next to its pidfile. */\nexport interface DaemonJson {\n schemaVersion?: typeof STATE_SCHEMA_VERSION;\n pid: number;\n port: number;\n protocolVersion: number;\n startedAt: string;\n /** Per-daemon bearer token; absent only on legacy protocol-v1 discovery files. */\n token?: string;\n /** Unprivileged Hestia local-router port behind Portless. */\n routerPort?: number;\n gatewaySocket?: string;\n}\n\nconst DAEMON_PIDFILE_NAME = \"hestiad\";\n\nexport function daemonJsonPath(): string {\n return join(daemonDir(), \"daemon.json\");\n}\n\nexport function readDaemonJson(): DaemonJson | null {\n const p = daemonJsonPath();\n if (!existsSync(p)) return null;\n try {\n const value = JSON.parse(readFileSync(p, \"utf8\")) as Partial<DaemonJson>;\n if (\n value.schemaVersion !== STATE_SCHEMA_VERSION ||\n !Number.isInteger(value.pid) ||\n !Number.isInteger(value.port) ||\n !Number.isInteger(value.protocolVersion) ||\n typeof value.startedAt !== \"string\"\n ) return null;\n return value as DaemonJson;\n } catch {\n return null;\n }\n}\n\n/** Authorization headers for the daemon currently published on this port. */\nexport function daemonAuthHeaders(port: number): Record<string, string> {\n const discovery = readDaemonJson();\n const pidfile = readPidfile(daemonDir(), DAEMON_PIDFILE_NAME);\n return discovery?.port === port &&\n discovery.token !== undefined &&\n pidfile?.pid === discovery.pid &&\n isLive(pidfile)\n ? { authorization: `Bearer ${discovery.token}` }\n : {};\n}\n\nasync function get<T>(port: number, path: string, timeoutMs: number): Promise<T | null> {\n try {\n const res = await fetch(`http://127.0.0.1:${port}${path}`, {\n signal: AbortSignal.timeout(timeoutMs),\n headers: daemonAuthHeaders(port),\n });\n if (!res.ok) return null;\n return (await res.json()) as T;\n } catch {\n return null;\n }\n}\n\nexport async function fetchHealth(port: number, timeoutMs = 1_000): Promise<DaemonHealth | null> {\n const discovery = readDaemonJson();\n if (discovery?.port !== port) return null;\n const health = await get<DaemonHealth>(port, \"/hestia/health\", timeoutMs);\n return health?.pid === discovery.pid ? health : null;\n}\n\nexport function fetchState(port: number, timeoutMs = 2_000): Promise<DaemonStateView | null> {\n return get<DaemonStateView>(port, \"/hestia/state\", timeoutMs);\n}\n\n/** Ask hestiad to reload route intent and reconcile its Portless aliases now. */\nexport async function reconcileDaemonLocalRoutes(port: number): Promise<void> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/hestia/router/reconcile`, {\n method: \"POST\",\n headers: daemonAuthHeaders(port),\n signal: AbortSignal.timeout(3_000),\n });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n } catch (error) {\n throw new HestiaError(\n \"router-unreachable\",\n `Router reconcile: could not reach hestiad on 127.0.0.1:${port}: ${(error as Error).message}`,\n );\n }\n}\n\nconst MAX_NDJSON_FRAME_BYTES = 1024 * 1024;\n\nasync function* streamDaemonNdjson<T>(\n port: number,\n path: string,\n signal?: AbortSignal,\n): AsyncGenerator<T> {\n const response = await fetch(`http://127.0.0.1:${port}${path}`, {\n headers: daemonAuthHeaders(port),\n signal,\n });\n if (!response.ok || response.body === null) {\n throw new HestiaError(\n \"daemon-unreachable\",\n `hestiad stream ${path} failed with HTTP ${response.status}`,\n );\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let pending = \"\";\n try {\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n pending += decoder.decode(result.value, { stream: true });\n if (Buffer.byteLength(pending) > MAX_NDJSON_FRAME_BYTES && !pending.includes(\"\\n\")) {\n throw new HestiaError(\"daemon-unreachable\", \"hestiad NDJSON frame exceeds 1 MiB\");\n }\n const lines = pending.split(\"\\n\");\n pending = lines.pop() ?? \"\";\n for (const line of lines) {\n if (line === \"\") continue;\n if (Buffer.byteLength(line) > MAX_NDJSON_FRAME_BYTES) {\n throw new HestiaError(\"daemon-unreachable\", \"hestiad NDJSON frame exceeds 1 MiB\");\n }\n yield JSON.parse(line) as T;\n }\n }\n pending += decoder.decode();\n if (pending.trim() !== \"\") {\n if (Buffer.byteLength(pending) > MAX_NDJSON_FRAME_BYTES) {\n throw new HestiaError(\"daemon-unreachable\", \"hestiad NDJSON frame exceeds 1 MiB\");\n }\n yield JSON.parse(pending) as T;\n }\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n\n/** Subscribe to authenticated full-state Fleet snapshots and daemon heartbeats. */\nexport function streamDaemonFleet(\n port: number,\n repoId: RepoId,\n signal?: AbortSignal,\n): AsyncIterable<FleetEnvelope> {\n return streamDaemonNdjson<FleetEnvelope>(\n port,\n `/hestia/fleet?repoId=${encodeURIComponent(repoId)}`,\n signal,\n );\n}\n\n/** Follow one selected service through the daemon's bounded Phase 5 log adapter. */\nexport function streamDaemonServiceLogs(\n port: number,\n project: string,\n service: string,\n tail = 50,\n signal?: AbortSignal,\n): AsyncIterable<LogLine> {\n const query = new URLSearchParams({ project, service, tail: String(tail) });\n return streamDaemonNdjson<LogLine>(port, `/hestia/logs?${query}`, signal);\n}\n\n/**\n * Request a slot. `waitMs > 0` long-polls the daemon-side FIFO queue; the\n * fetch timeout is padded so the daemon's own waiter timeout answers first.\n */\nexport async function acquireSlot(\n port: number,\n identity: StackIdentity,\n waitMs: number,\n): Promise<AcquireResult> {\n try {\n const res = await fetch(`http://127.0.0.1:${port}/hestia/acquire`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...daemonAuthHeaders(port) },\n body: JSON.stringify({\n identity,\n pid: process.pid,\n startTime: startTimeOf(process.pid) ?? \"\",\n waitMs,\n }),\n signal: AbortSignal.timeout(waitMs + 5_000),\n });\n if (!res.ok) {\n throw new HestiaError(\"daemon-unreachable\", `daemon rejected acquire: HTTP ${res.status}`);\n }\n return (await res.json()) as AcquireResult;\n } catch (err) {\n if (err instanceof HestiaError) throw err;\n throw new HestiaError(\n \"daemon-unreachable\",\n `could not reach hestiad on 127.0.0.1:${port}: ${(err as Error).message}`,\n );\n }\n}\n\n/** Best-effort: a gone daemon self-heals on its next sweep — never fail a down. */\nexport async function releaseSlot(port: number, project: string): Promise<void> {\n try {\n await fetch(`http://127.0.0.1:${port}/hestia/release`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...daemonAuthHeaders(port) },\n body: JSON.stringify({ project }),\n signal: AbortSignal.timeout(2_000),\n });\n } catch {\n // sweep reconciles\n }\n}\n",
|
|
99
|
+
"import { existsSync, mkdirSync, readFileSync, rmSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { hestiaHome } from \"../state.ts\";\nimport { HestiaError } from \"@hestia/core\";\nimport { writeAtomicTextFile } from \"../atomic-json-file.ts\";\n\nexport const LAUNCHD_LABEL = \"dev.hestia.daemon\";\n\n/** HESTIA_LAUNCHD_DIR overrides for tests — they must never touch the real LaunchAgents. */\nexport function launchAgentsDir(): string {\n return process.env.HESTIA_LAUNCHD_DIR ?? join(homedir(), \"Library\", \"LaunchAgents\");\n}\n\nexport function plistPath(): string {\n return join(launchAgentsDir(), `${LAUNCHD_LABEL}.plist`);\n}\n\nexport function daemonMainPath(): string {\n const bundled = join(dirname(fileURLToPath(import.meta.url)), \"daemon.js\");\n if (existsSync(bundled)) return bundled;\n return fileURLToPath(new URL(\"./main.ts\", import.meta.url));\n}\n\nfunction xml(v: string): string {\n return v.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n}\n\nexport interface PlistInput {\n bunPath: string;\n mainPath: string;\n /** Full PATH baked in — gui LaunchAgents inherit only /usr/bin:/bin:/usr/sbin:/sbin,\n * which has neither cloudflared nor docker, so revival would ENOENT without this. */\n path: string;\n logPath: string;\n hestiaHome?: string;\n}\n\nexport function generatePlist(input: PlistInput): string {\n const env: string[] = [\n ` <key>PATH</key><string>${xml(input.path)}</string>`,\n ];\n if (input.hestiaHome !== undefined) {\n env.push(` <key>HESTIA_HOME</key><string>${xml(input.hestiaHome)}</string>`);\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n <dict>\n <key>Label</key><string>${LAUNCHD_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${xml(input.bunPath)}</string>\n <string>run</string>\n <string>${xml(input.mainPath)}</string>\n </array>\n <key>RunAtLoad</key><true/>\n <!-- SuccessfulExit:false — respawn crashes only. Plain 'true' would respawn\n the single-instance guard's exit-0 forever and make 'daemon stop' a lie. -->\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key><false/>\n </dict>\n <key>EnvironmentVariables</key>\n <dict>\n${env.join(\"\\n\")}\n </dict>\n <key>StandardOutPath</key><string>${xml(input.logPath)}</string>\n <key>StandardErrorPath</key><string>${xml(input.logPath)}</string>\n </dict>\n</plist>\n`;\n}\n\n/** The plist input for THIS checkout + environment, with tool-resolution warnings. */\nexport function currentPlistInput(): { input: PlistInput; warnings: string[] } {\n const warnings: string[] = [];\n const path = process.env.PATH ?? \"/usr/bin:/bin:/usr/sbin:/sbin\";\n for (const tool of [\"cloudflared\", \"docker\"]) {\n if (Bun.which(tool) === null) {\n warnings.push(\n `${tool} not found in PATH — the daemon won't be able to run it after a reboot ` +\n `(install it, then re-run \\`hestia daemon install\\`)`,\n );\n }\n }\n return {\n input: {\n bunPath: process.execPath,\n mainPath: daemonMainPath(),\n path,\n logPath: join(hestiaHome(), \"daemon\", \"launchd.log\"),\n hestiaHome: process.env.HESTIA_HOME,\n },\n warnings,\n };\n}\n\nfunction domain(): string {\n return `gui/${process.getuid?.() ?? 501}`;\n}\n\nfunction launchctl(...args: string[]): { ok: boolean; output: string } {\n try {\n const output = execFileSync(\"launchctl\", args, { encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n return { ok: true, output };\n } catch (err) {\n return { ok: false, output: (err as { stderr?: string }).stderr ?? String(err) };\n }\n}\n\n/** Whether launchd currently manages the label (decides stop's bootout-vs-kill). */\nexport function isBootstrapped(): boolean {\n if (process.platform !== \"darwin\") return false;\n return launchctl(\"print\", `${domain()}/${LAUNCHD_LABEL}`).ok;\n}\n\n/**\n * Whether the bootstrapped agent manages the CURRENT hestia home. launchd is\n * machine-global but HESTIA_HOME is not — a CLI under a test/temp home must\n * never bootout or kickstart the real agent (found live: a HESTIA_HOME=tmp\n * e2e's `daemon stop` booted the user's real agent out).\n */\nexport function launchdManagesThisHome(): boolean {\n if (!isBootstrapped()) return false;\n try {\n const content = readFileSync(plistPath(), \"utf8\");\n const home = /<key>HESTIA_HOME<\\/key><string>([^<]*)<\\/string>/.exec(content)?.[1];\n return home === process.env.HESTIA_HOME || (home === undefined && process.env.HESTIA_HOME === undefined);\n } catch {\n return false;\n }\n}\n\nexport function kickstart(): { ok: boolean; output: string } {\n return launchctl(\"kickstart\", \"-k\", `${domain()}/${LAUNCHD_LABEL}`);\n}\n\nexport interface InstallResult {\n plist: string;\n /** Set when the plist was actually written + bootstrapped. */\n installedAt?: string;\n warnings: string[];\n}\n\n/**\n * Write + bootstrap the LaunchAgent (macOS). `print` renders the plist and\n * instructions without touching the system — also the non-darwin behavior.\n */\nexport function installLaunchd(opts?: { print?: boolean }): InstallResult {\n const { input, warnings } = currentPlistInput();\n const plist = generatePlist(input);\n if (opts?.print === true || process.platform !== \"darwin\") {\n if (process.platform !== \"darwin\") {\n warnings.push(\n \"launchd is macOS-only — wire the equivalent (systemd user unit) yourself: \" +\n `run \\`${input.bunPath} run ${input.mainPath}\\` at login with the printed PATH`,\n );\n }\n return { plist, warnings };\n }\n mkdirSync(launchAgentsDir(), { recursive: true });\n mkdirSync(dirname(input.logPath), { recursive: true });\n const target = plistPath();\n const previous = existsSync(target) ? readFileSync(target, \"utf8\") : null;\n const previouslyBootstrapped = isBootstrapped();\n const rollback = (): void => {\n launchctl(\"bootout\", `${domain()}/${LAUNCHD_LABEL}`);\n if (previous === null) rmSync(target, { force: true });\n else writeAtomicTextFile(target, previous);\n if (previouslyBootstrapped && previous !== null) {\n launchctl(\"bootstrap\", domain(), target);\n launchctl(\"kickstart\", \"-k\", `${domain()}/${LAUNCHD_LABEL}`);\n }\n };\n // Re-install must supersede a live agent: boot it out first (ignore \"not loaded\").\n launchctl(\"bootout\", `${domain()}/${LAUNCHD_LABEL}`);\n writeAtomicTextFile(target, plist);\n const boot = launchctl(\"bootstrap\", domain(), target);\n if (!boot.ok) {\n rollback();\n throw new HestiaError(\n \"launchd-install-failed\",\n `launchctl bootstrap failed and the previous agent was restored: ${boot.output.trim()}`,\n );\n }\n const started = kickstart();\n if (!started.ok) {\n rollback();\n throw new HestiaError(\n \"launchd-install-failed\",\n `launchctl kickstart failed and the previous agent was restored: ${started.output.trim()}`,\n );\n }\n return { plist, installedAt: target, warnings };\n}\n\nexport function uninstallLaunchd(): { removed: boolean; warnings: string[] } {\n const warnings: string[] = [];\n if (process.platform !== \"darwin\") return { removed: false, warnings };\n const out = launchctl(\"bootout\", `${domain()}/${LAUNCHD_LABEL}`);\n if (!out.ok && !out.output.includes(\"No such process\")) {\n warnings.push(`launchctl bootout: ${out.output.trim()}`);\n }\n const target = plistPath();\n const existed = existsSync(target);\n rmSync(target, { force: true });\n return { removed: existed, warnings };\n}\n",
|
|
100
|
+
"import {\n type DaemonHealth,\n type DaemonStateView,\n type FleetEnvelope,\n type LogLine,\n type LogsOptions,\n type RepoId,\n type StackIdentity,\n} from \"@hestia/core\";\nimport { readRequestTextWithLimit } from \"@hunk/session-broker-core\";\nimport { readMirrorState } from \"../state.ts\";\nimport { FleetMonitor } from \"./fleet-monitor.ts\";\nimport { SlotLedger, resolveMaxStacks } from \"./slots.ts\";\n\nexport const HESTIAD_PROTOCOL_VERSION = 5;\nconst MAX_JSON_BODY_BYTES = 16 * 1024;\nconst MAX_LOG_STREAMS = 16;\nconst MAX_LOG_TAIL = 200;\n\nexport interface AcquireResult {\n granted: boolean;\n /** Projects currently holding slots — the stack-limit error payload. */\n live: string[];\n}\n\ninterface Holder {\n pid: number;\n startTime: string;\n}\n\ninterface Waiter {\n identity: StackIdentity;\n holder: Holder;\n resolve(result: AcquireResult): void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nfunction admissionIdentity(identity: StackIdentity | string): StackIdentity {\n if (typeof identity !== \"string\") return identity;\n return {\n project: identity,\n repoId: \"repo-0000000000000000\" as RepoId,\n repo: \"legacy\",\n branch: identity,\n worktree: `/legacy/${identity}`,\n };\n}\n\n/** Machine-wide FIFO admission whose expensive occupancy probes never serve Fleet readers. */\nexport class Admission {\n #queue: Waiter[] = [];\n #cachedState: DaemonStateView = {\n maxStacks: resolveMaxStacks().maxStacks,\n live: [],\n reserved: [],\n queued: [],\n warnings: resolveMaxStacks().warnings,\n };\n #mutex: Promise<unknown> = Promise.resolve();\n\n constructor(readonly ledger: SlotLedger) {}\n\n #locked<T>(fn: () => Promise<T>): Promise<T> {\n const next = this.#mutex.then(fn, fn);\n this.#mutex = next.catch(() => {});\n return next;\n }\n\n async acquire(\n input: StackIdentity | string,\n holder: Holder,\n waitMs: number,\n ): Promise<AcquireResult> {\n const identity = admissionIdentity(input);\n const first = await this.#locked(() => this.#try(identity, holder));\n if (first.granted || waitMs <= 0) return first;\n return new Promise<AcquireResult>((resolve) => {\n const waiter: Waiter = {\n identity,\n holder,\n resolve,\n timer: setTimeout(() => {\n this.#queue = this.#queue.filter((candidate) => candidate !== waiter);\n resolve({ granted: false, live: first.live });\n }, waitMs),\n };\n this.#queue.push(waiter);\n });\n }\n\n /** Remove a waiter whose long-polling CLI disconnected. */\n forget(identity: StackIdentity, holder: Holder): void {\n this.#queue = this.#queue.filter((waiter) => {\n const match =\n waiter.identity.project === identity.project &&\n waiter.identity.repoId === identity.repoId &&\n waiter.holder.pid === holder.pid &&\n waiter.holder.startTime === holder.startTime;\n if (match) clearTimeout(waiter.timer);\n return !match;\n });\n }\n\n release(project: string): Promise<void> {\n return this.#locked(async () => {\n this.ledger.release(project);\n await this.#pump();\n });\n }\n\n /** Re-derive occupancy and grant whatever now fits. Called by the sweep. */\n pump(): Promise<void> {\n return this.#locked(() => this.#pump());\n }\n\n /** Copy queue identities synchronously without entering the occupancy mutex. */\n queuedIdentitySnapshot(): StackIdentity[] {\n return this.#queue.map((waiter) => ({ ...waiter.identity }));\n }\n\n /** Project-only queue view retained for daemon status and compatibility. */\n queuedProjects(): string[] {\n return this.queuedIdentitySnapshot().map((identity) => identity.project);\n }\n\n /** Constant-time cached view for liveness checks; never probes Docker or mutates reservations. */\n healthSnapshot(): DaemonStateView {\n return {\n ...this.#cachedState,\n live: [...this.#cachedState.live],\n reserved: [...this.#cachedState.reserved],\n queued: this.queuedProjects(),\n warnings: [...this.#cachedState.warnings],\n };\n }\n\n #cache(occupancy: Awaited<ReturnType<SlotLedger[\"occupancy\"]>>): void {\n const { maxStacks, warnings } = resolveMaxStacks();\n this.#cachedState = {\n maxStacks,\n live: [...occupancy.live],\n reserved: [...occupancy.reserved],\n queued: this.queuedProjects(),\n warnings: [...warnings, ...occupancy.warnings],\n };\n }\n\n async #try(identity: StackIdentity, holder: Holder): Promise<AcquireResult> {\n const { maxStacks } = resolveMaxStacks();\n const occupancy = await this.ledger.occupancy();\n this.#cache(occupancy);\n if (\n occupancy.live.includes(identity.project) ||\n occupancy.reserved.includes(identity.project)\n ) {\n return { granted: true, live: occupancy.live };\n }\n if (occupancy.live.length + occupancy.reserved.length < maxStacks) {\n this.ledger.reserveFor(identity, holder);\n return { granted: true, live: occupancy.live };\n }\n return { granted: false, live: occupancy.live };\n }\n\n async #pump(): Promise<void> {\n if (this.#queue.length === 0) return;\n const { maxStacks } = resolveMaxStacks();\n const occupancy = await this.ledger.occupancy();\n this.#cache(occupancy);\n let used = occupancy.live.length + occupancy.reserved.length;\n const granted: Waiter[] = [];\n for (const waiter of this.#queue) {\n if (\n occupancy.live.includes(waiter.identity.project) ||\n occupancy.reserved.includes(waiter.identity.project)\n ) {\n granted.push(waiter);\n }\n }\n for (const waiter of this.#queue) {\n if (granted.includes(waiter)) continue;\n if (used >= maxStacks) break;\n this.ledger.reserveFor(waiter.identity, waiter.holder);\n used += 1;\n granted.push(waiter);\n }\n if (granted.length === 0) return;\n this.#queue = this.#queue.filter((waiter) => !granted.includes(waiter));\n for (const waiter of granted) {\n clearTimeout(waiter.timer);\n waiter.resolve({ granted: true, live: occupancy.live });\n }\n }\n\n /** Legacy daemon status view; probes run outside the admission mutex. */\n async stateView(): Promise<DaemonStateView> {\n const { maxStacks, warnings } = resolveMaxStacks();\n const occupancy = await this.ledger.occupancy();\n this.#cache(occupancy);\n return {\n maxStacks,\n live: occupancy.live,\n reserved: occupancy.reserved,\n queued: this.queuedProjects(),\n warnings: [...warnings, ...occupancy.warnings],\n };\n }\n}\n\nexport interface DaemonRouteDependencies {\n token: string;\n fleet: FleetMonitor;\n routerPort: number;\n gatewaySocket: string;\n refreshLocalRoutes(): Promise<void>;\n logsProject(project: string, options: LogsOptions): AsyncIterable<LogLine>;\n}\n\nfunction json(body: unknown, status = 200): Response {\n return Response.json(body, { status });\n}\n\nfunction authorized(request: Request, token: string): boolean {\n return request.headers.get(\"authorization\") === `Bearer ${token}`;\n}\n\nfunction isProject(value: unknown): value is string {\n return typeof value === \"string\" && /^[a-z0-9][a-z0-9-]{0,99}$/.test(value);\n}\n\nfunction isRepoId(value: unknown): value is RepoId {\n return typeof value === \"string\" && /^repo-[a-f0-9]{16}$/.test(value);\n}\n\nfunction isService(value: unknown): value is string {\n return typeof value === \"string\" && /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(value);\n}\n\nfunction isStackIdentity(value: unknown): value is StackIdentity {\n if (typeof value !== \"object\" || value === null) return false;\n const identity = value as Partial<StackIdentity>;\n return (\n isProject(identity.project) &&\n isRepoId(identity.repoId) &&\n typeof identity.repo === \"string\" && identity.repo.length > 0 && identity.repo.length <= 256 &&\n typeof identity.branch === \"string\" && identity.branch.length > 0 && identity.branch.length <= 512 &&\n typeof identity.worktree === \"string\" && identity.worktree.startsWith(\"/\") && identity.worktree.length <= 4096\n );\n}\n\nasync function parseJsonBody<T>(request: Request): Promise<T> {\n if (!request.headers.get(\"content-type\")?.toLowerCase().startsWith(\"application/json\")) {\n throw new Error(\"content-type must be application/json\");\n }\n const declaredLength = Number(request.headers.get(\"content-length\") ?? \"0\");\n if (Number.isFinite(declaredLength) && declaredLength > MAX_JSON_BODY_BYTES) {\n throw new Error(\"request body exceeds 16 KiB\");\n }\n const source = await readRequestTextWithLimit(request, MAX_JSON_BODY_BYTES);\n return JSON.parse(source) as T;\n}\n\nfunction ndjsonResponse<T>(\n request: Request,\n createSource: (signal: AbortSignal) => AsyncIterable<T>,\n finished?: () => void,\n): Response {\n const encoder = new TextEncoder();\n const controller = new AbortController();\n let iterator: AsyncIterator<T> | undefined;\n let cleaned = false;\n const cleanup = async () => {\n if (cleaned) return;\n cleaned = true;\n controller.abort();\n request.signal.removeEventListener(\"abort\", abort);\n await iterator?.return?.();\n finished?.();\n };\n const abort = () => void cleanup();\n request.signal.addEventListener(\"abort\", abort, { once: true });\n const body = new ReadableStream<Uint8Array>({\n async pull(streamController) {\n try {\n iterator ??= createSource(controller.signal)[Symbol.asyncIterator]();\n const result = await iterator.next();\n if (result.done) {\n await cleanup();\n streamController.close();\n return;\n }\n streamController.enqueue(encoder.encode(`${JSON.stringify(result.value)}\\n`));\n } catch (error) {\n await cleanup();\n streamController.error(error);\n }\n },\n async cancel() {\n await cleanup();\n },\n });\n return new Response(body, {\n headers: {\n \"content-type\": \"application/x-ndjson; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n },\n });\n}\n\n/** Authenticated hestiad HTTP routes layered before the vendored broker router. */\nexport function createRoutes(\n admission: Admission,\n startedAt: string,\n dependencies: DaemonRouteDependencies,\n): (request: Request) => Promise<Response | undefined> | Response | undefined {\n let activeLogStreams = 0;\n return async (request) => {\n const url = new URL(request.url);\n if (!url.pathname.startsWith(\"/hestia/\")) return undefined;\n if (!authorized(request, dependencies.token)) return json({ error: \"unauthorized\" }, 401);\n\n if (url.pathname === \"/hestia/health\" && request.method === \"GET\") {\n const state = admission.healthSnapshot();\n const health: DaemonHealth = {\n ok: true,\n pid: process.pid,\n protocolVersion: HESTIAD_PROTOCOL_VERSION,\n maxStacks: state.maxStacks,\n live: state.live.length,\n queued: state.queued.length,\n startedAt,\n routerPort: dependencies.routerPort,\n gatewaySocket: dependencies.gatewaySocket,\n warnings: state.warnings,\n };\n return json(health);\n }\n\n if (url.pathname === \"/hestia/state\" && request.method === \"GET\") {\n return json(await admission.stateView());\n }\n\n if (url.pathname === \"/hestia/router/reconcile\" && request.method === \"POST\") {\n await dependencies.refreshLocalRoutes();\n return json({ ok: true, routerPort: dependencies.routerPort });\n }\n\n if (url.pathname === \"/hestia/fleet\" && request.method === \"GET\") {\n const repoId = url.searchParams.get(\"repoId\");\n if (!isRepoId(repoId)) return json({ error: \"repoId is invalid\" }, 400);\n return ndjsonResponse<FleetEnvelope>(request, (signal) =>\n dependencies.fleet.subscribe(repoId, signal),\n );\n }\n\n if (url.pathname === \"/hestia/logs\" && request.method === \"GET\") {\n const project = url.searchParams.get(\"project\");\n const service = url.searchParams.get(\"service\");\n const tailSource = url.searchParams.get(\"tail\") ?? \"50\";\n const tail = Number(tailSource);\n if (!isProject(project)) return json({ error: \"project is invalid\" }, 400);\n if (!isService(service)) return json({ error: \"service is invalid\" }, 400);\n if (!Number.isInteger(tail) || tail < 0 || tail > MAX_LOG_TAIL) {\n return json({ error: `tail must be an integer from 0 to ${MAX_LOG_TAIL}` }, 400);\n }\n const record = readMirrorState(project);\n if (record === null) return json({ error: `no mirror for project ${project}` }, 404);\n if (!record.services.some((candidate) => candidate.name === service)) {\n return json({ error: `service ${service} is not in project ${project}` }, 404);\n }\n if (activeLogStreams >= MAX_LOG_STREAMS) {\n return json({ error: \"too many active log streams\" }, 429);\n }\n activeLogStreams += 1;\n return ndjsonResponse<LogLine>(\n request,\n (signal) => dependencies.logsProject(project, {\n services: [service],\n follow: true,\n tail,\n signal,\n }),\n () => { activeLogStreams -= 1; },\n );\n }\n\n if (url.pathname === \"/hestia/acquire\" && request.method === \"POST\") {\n let body: { identity?: unknown; pid?: unknown; startTime?: unknown; waitMs?: unknown };\n try {\n body = await parseJsonBody(request);\n } catch (error) {\n return json({ error: `invalid JSON body: ${(error as Error).message}` }, 400);\n }\n if (!isStackIdentity(body.identity)) return json({ error: \"identity is invalid\" }, 400);\n const holder = {\n pid: typeof body.pid === \"number\" && Number.isInteger(body.pid) ? body.pid : 0,\n startTime: typeof body.startTime === \"string\" && body.startTime.length <= 128\n ? body.startTime\n : \"\",\n };\n const waitMs = typeof body.waitMs === \"number\" && Number.isFinite(body.waitMs) && body.waitMs > 0\n ? Math.min(body.waitMs, 24 * 60 * 60 * 1_000)\n : 0;\n const onAbort = () => admission.forget(body.identity as StackIdentity, holder);\n request.signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n return json(await admission.acquire(body.identity, holder, waitMs));\n } finally {\n request.signal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n if (url.pathname === \"/hestia/release\" && request.method === \"POST\") {\n let body: { project?: unknown };\n try {\n body = await parseJsonBody(request);\n } catch (error) {\n return json({ error: `invalid JSON body: ${(error as Error).message}` }, 400);\n }\n if (!isProject(body.project)) return json({ error: \"project is invalid\" }, 400);\n await admission.release(body.project);\n return json({ ok: true });\n }\n\n return json({ error: `unknown route ${url.pathname}` }, 404);\n };\n}\n",
|
|
101
|
+
"import { closeSync, openSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { HestiaError, type DaemonHealth } from \"@hestia/core\";\nimport { withLock } from \"../proc/lock.ts\";\nimport { isLive, readPidfile } from \"../proc/pidfile.ts\";\nimport { ensureDir } from \"../state.ts\";\nimport { fetchHealth, readDaemonJson } from \"./client.ts\";\nimport { daemonMainPath, kickstart, launchdManagesThisHome } from \"./launchd.ts\";\nimport { HESTIAD_PROTOCOL_VERSION } from \"./routes.ts\";\nimport { daemonDir } from \"./slots.ts\";\n\nconst START_TIMEOUT_MS = 5_000;\nconst POLL_MS = 100;\nconst PIDFILE_NAME = \"hestiad\";\n\nexport interface DaemonHandle {\n port: number;\n health: DaemonHealth;\n}\n\nasync function healthy(): Promise<DaemonHandle | null> {\n const j = readDaemonJson();\n if (j === null) return null;\n const health = await fetchHealth(j.port);\n if (health === null) return null;\n return { port: j.port, health };\n}\n\nfunction spawnDaemon(): void {\n const root = daemonDir();\n ensureDir(root);\n const fd = openSync(join(root, \"daemon.log\"), \"a\");\n // Same detached-spawn shape as the proc supervisor (node:child_process —\n // Bun.spawn has no `detached`); the daemon manages its own pidfile.\n const child = spawn(process.execPath, [\"run\", daemonMainPath()], {\n detached: true,\n stdio: [\"ignore\", fd, fd],\n env: process.env,\n });\n child.once(\"error\", () => closeSync(fd));\n child.once(\"spawn\", () => {\n closeSync(fd);\n child.unref();\n });\n}\n\n/** SIGTERM the live daemon by pidfile identity and wait for it to die. */\nexport async function stopDaemonProcess(timeoutMs = 5_000): Promise<boolean> {\n const pf = readPidfile(daemonDir(), PIDFILE_NAME);\n if (pf === null || !isLive(pf)) return false;\n try {\n process.kill(pf.pid, \"SIGTERM\");\n } catch {\n return false;\n }\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!isLive(pf)) return true;\n await new Promise((r) => setTimeout(r, POLL_MS));\n }\n try {\n process.kill(pf.pid, \"SIGKILL\");\n } catch {}\n return true;\n}\n\n/**\n * Make sure a protocol-compatible hestiad is serving; spawn or restart one if\n * not. Launchd-managed daemons are restarted through launchd (`kickstart -k`)\n * — killing them directly would just race KeepAlive.\n */\nexport async function ensureDaemon(): Promise<DaemonHandle> {\n const current = await healthy();\n if (current !== null && current.health.protocolVersion === HESTIAD_PROTOCOL_VERSION) {\n return current;\n }\n\n if (current !== null) {\n // Live but wrong protocol — restart it our way or launchd's way.\n if (launchdManagesThisHome()) kickstart();\n else {\n await stopDaemonProcess();\n spawnDaemon();\n }\n const restarted = await pollHealthy();\n if (restarted !== null) return restarted;\n throw new HestiaError(\n \"daemon-start-failed\",\n `hestiad restart after a protocol mismatch did not come up within ${START_TIMEOUT_MS / 1000}s`,\n );\n }\n\n // Discovery can identify the exact live daemon even when its HTTP surface\n // is wedged. Restart that identity before spawning; otherwise main.ts's\n // single-instance guard correctly rejects the newcomer and ensure times out.\n const discovery = readDaemonJson();\n const discoveredPidfile = readPidfile(daemonDir(), PIDFILE_NAME);\n if (\n discovery !== null &&\n discoveredPidfile?.pid === discovery.pid &&\n isLive(discoveredPidfile)\n ) {\n if (launchdManagesThisHome()) kickstart();\n else {\n await stopDaemonProcess();\n spawnDaemon();\n }\n const restarted = await pollHealthy();\n if (restarted !== null) return restarted;\n throw new HestiaError(\n \"daemon-start-failed\",\n `live but unhealthy hestiad ${discovery.pid} did not recover within ${START_TIMEOUT_MS / 1000}s`,\n );\n }\n\n // Not reachable — serialize the spawn decision so parallel agents fork at\n // most a couple of candidates (main.ts's own guard picks the single winner).\n // The lock covers ONLY check+spawn: main.ts takes the same lock to start\n // serving, so polling inside it would deadlock the startup we're waiting on.\n const raced = await withLock(daemonDir(), async () => {\n const h = await healthy();\n if (h !== null) return h;\n spawnDaemon();\n return null;\n });\n if (raced !== null) return raced;\n const started = await pollHealthy();\n if (started !== null) return started;\n throw new HestiaError(\n \"daemon-start-failed\",\n `hestiad did not come up within ${START_TIMEOUT_MS / 1000}s — ` +\n `logs: ${join(daemonDir(), \"daemon.log\")}`,\n );\n}\n\nasync function pollHealthy(): Promise<DaemonHandle | null> {\n const deadline = Date.now() + START_TIMEOUT_MS;\n while (Date.now() < deadline) {\n const h = await healthy();\n if (h !== null && h.health.protocolVersion === HESTIAD_PROTOCOL_VERSION) return h;\n await new Promise((r) => setTimeout(r, POLL_MS));\n }\n return null;\n}\n",
|
|
102
|
+
"/** Exact upstream Portless version bundled into the Hestia router payload. */\nexport const HESTIA_PORTLESS_VERSION = \"0.15.1\";\n\n/** SHA-256 of the exact Hestia hardening patch bundled into Portless. */\nexport const HESTIA_PORTLESS_PATCH_SHA256 = \"9ca94ca771ce502769a2c7cbe3bb4fe8d54dc847ff9f7e3e2b34abf728618690\";\n\nexport interface PortlessPayloadProvenance {\n package: \"portless\";\n version: string;\n patchSha256: string;\n}\n\n/** Build the deterministic provenance record copied into every router payload. */\nexport function expectedPortlessPayloadProvenance(): PortlessPayloadProvenance {\n return {\n package: \"portless\",\n version: HESTIA_PORTLESS_VERSION,\n patchSha256: HESTIA_PORTLESS_PATCH_SHA256,\n };\n}\n\n/** Check whether unknown provenance matches this exact Hestia source release. */\nexport function portlessPayloadProvenanceIsCurrent(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const provenance = value as Record<string, unknown>;\n return provenance.package === \"portless\" &&\n provenance.version === HESTIA_PORTLESS_VERSION &&\n provenance.patchSha256 === HESTIA_PORTLESS_PATCH_SHA256;\n}\n",
|
|
103
|
+
"import { execFile, spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, rmSync, statSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createConnection } from \"node:net\";\nimport { tmpdir } from \"node:os\";\nimport { HestiaError } from \"@hestia/core\";\nimport { ensureDir, hestiaHome } from \"../state.ts\";\nimport { startTimeOf } from \"../proc/pidfile.ts\";\nimport { writeAtomicJsonFile } from \"../atomic-json-file.ts\";\nimport { ensureDaemon } from \"../daemon/ensure.ts\";\nimport { withLock } from \"../proc/lock.ts\";\nimport {\n HESTIA_PORTLESS_VERSION,\n expectedPortlessPayloadProvenance,\n portlessPayloadProvenanceIsCurrent,\n} from \"./portless-payload.ts\";\n\nconst pexec = promisify(execFile);\nexport { HESTIA_PORTLESS_VERSION };\nconst PORTLESS_LAUNCHD_PLIST = \"/Library/LaunchDaemons/sh.portless.proxy.plist\";\nconst HESTIA_ROUTER_INSTALL_DIR = \"/Library/Application Support/Hestia/router\";\nconst HESTIA_ROUTER_STAGED_DIR = \"/Library/Application Support/Hestia/router.next\";\nconst HESTIA_ROUTER_PREVIOUS_DIR = \"/Library/Application Support/Hestia/router.previous\";\nconst HESTIA_ROUTER_BUN = join(HESTIA_ROUTER_INSTALL_DIR, \"bun\");\nconst HESTIA_ROUTER_PORTLESS = join(HESTIA_ROUTER_INSTALL_DIR, \"portless\");\nconst HESTIA_ROUTER_CLI = join(HESTIA_ROUTER_PORTLESS, \"dist\", \"cli.js\");\nconst HESTIA_ROUTER_RUNTIME_STATE_DIR = join(HESTIA_ROUTER_INSTALL_DIR, \"state\");\n\n/** Root-owned runtime state used by the privileged Portless LaunchDaemon. */\nexport function hestiaPortlessStateDir(): string {\n return HESTIA_ROUTER_RUNTIME_STATE_DIR;\n}\n\n/** User-owned, read-only-to-Portless alias projection written by hestiad. */\nexport function hestiaPortlessAliasesPath(): string {\n return join(hestiaHome(), \"router\", \"portless\", \"aliases.json\");\n}\n\nfunction portlessCliPath(): string {\n const moduleDirectory = dirname(fileURLToPath(import.meta.url));\n const bundled = join(moduleDirectory, \"assets\", \"portless\", \"dist\", \"cli.js\");\n if (existsSync(bundled) && portlessPayloadRootIsCurrent(dirname(dirname(bundled)))) return bundled;\n const workspaceBuild = join(moduleDirectory, \"..\", \"..\", \"..\", \"..\", \"dist\", \"assets\", \"portless\", \"dist\", \"cli.js\");\n if (existsSync(workspaceBuild) && portlessPayloadRootIsCurrent(dirname(dirname(workspaceBuild)))) {\n return workspaceBuild;\n }\n throw new HestiaError(\n \"router-version-unsupported\",\n \"current hardened Portless payload is unavailable; run bun run build and retry\",\n );\n}\n\nfunction portlessPayloadRootIsCurrent(root: string): boolean {\n try {\n return portlessPayloadProvenanceIsCurrent(\n JSON.parse(readFileSync(join(root, \"provenance.json\"), \"utf8\")),\n );\n } catch {\n return false;\n }\n}\n\nfunction installedPortlessPayloadIsCurrent(): boolean {\n return portlessPayloadRootIsCurrent(HESTIA_ROUTER_PORTLESS);\n}\n\nfunction xmlEscape(value: string): string {\n return value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\")\n .replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n}\n\nfunction portlessServiceOwnership(): \"absent\" | \"hestia\" | \"foreign\" {\n if (process.platform !== \"darwin\" || !existsSync(PORTLESS_LAUNCHD_PLIST)) return \"absent\";\n try {\n const plist = readFileSync(PORTLESS_LAUNCHD_PLIST, \"utf8\");\n const stateEntry = `<key>PORTLESS_STATE_DIR</key>\\n <string>${xmlEscape(hestiaPortlessStateDir())}</string>`;\n const aliasesEntry = `<key>HESTIA_PORTLESS_ROUTES_PATH</key>\\n <string>${xmlEscape(hestiaPortlessAliasesPath())}</string>`;\n const rootStateEntry = \"<key>HESTIA_PORTLESS_ROOT_STATE</key>\\n <string>1</string>\";\n const routesUidEntry = `<key>HESTIA_PORTLESS_ROUTES_UID</key>\\n <string>${process.getuid?.() ?? 0}</string>`;\n const hardenedPayload = plist.includes(`<string>${xmlEscape(HESTIA_ROUTER_BUN)}</string>`) &&\n plist.includes(`<string>${xmlEscape(HESTIA_ROUTER_CLI)}</string>`);\n const payloadSecure = [HESTIA_ROUTER_BUN, HESTIA_ROUTER_CLI].every((path) => {\n const stat = statSync(path);\n return stat.uid === 0 && (stat.mode & 0o022) === 0;\n });\n return plist.includes(stateEntry) && plist.includes(aliasesEntry) && plist.includes(rootStateEntry) &&\n plist.includes(routesUidEntry) &&\n hardenedPayload && payloadSecure\n ? \"hestia\"\n : \"foreign\";\n } catch {\n return \"foreign\";\n }\n}\n\nfunction requireHestiaServiceOwnership(action: \"install\" | \"uninstall\"): \"absent\" | \"hestia\" {\n if (process.platform !== \"darwin\") {\n throw new HestiaError(\n \"router-version-unsupported\",\n `Router ${action}: the first privileged installer supports macOS only`,\n );\n }\n const ownership = portlessServiceOwnership();\n if (ownership === \"foreign\") {\n throw new HestiaError(\n \"router-version-unsupported\",\n `Router ${action}: the machine-global Portless service belongs to another installation; Hestia will not modify it`,\n );\n }\n return ownership;\n}\n\n/** Reconcile every Hestia-owned Portless alias to the current daemon router port. */\nexport function reconcilePortlessAliases(hostnames: string[], routerPort: number): void {\n const daemonStartTime = startTimeOf(process.pid);\n if (daemonStartTime === null) {\n throw new Error(`cannot capture hestiad process identity for PID ${process.pid}`);\n }\n writeAtomicJsonFile(hestiaPortlessAliasesPath(), hostnames.map((hostname) => ({\n hostname,\n port: routerPort,\n pid: process.pid,\n startTime: daemonStartTime,\n })));\n}\n\nexport interface HestiaRouterStatus {\n installed: boolean;\n running: boolean;\n trusted: boolean;\n version: string;\n port: number;\n stateDir: string;\n}\n\n/** Inspect Hestia's isolated Portless service without prompting or mutating it. */\nexport async function readHestiaRouterStatus(): Promise<HestiaRouterStatus> {\n const stateDir = hestiaPortlessStateDir();\n const portFile = join(stateDir, \"proxy.port\");\n const port = existsSync(portFile) ? Number(readFileSync(portFile, \"utf8\").trim()) : 443;\n let running = false;\n try {\n const response = await fetch(`https://127.0.0.1:${port}`, {\n signal: AbortSignal.timeout(500),\n tls: { rejectUnauthorized: false },\n } as RequestInit);\n running = response.headers.get(\"x-portless\") === \"1\";\n } catch {\n try {\n const response = await fetch(`http://127.0.0.1:${port}`, {\n signal: AbortSignal.timeout(500),\n });\n running = response.headers.get(\"x-portless\") === \"1\";\n } catch {}\n }\n return {\n installed: portlessServiceOwnership() === \"hestia\",\n running,\n trusted: await hestiaPortlessCaIsTrusted(),\n version: HESTIA_PORTLESS_VERSION,\n port: Number.isInteger(port) && port > 0 ? port : 443,\n stateDir,\n };\n}\n\nasync function hestiaPortlessCaIsTrusted(): Promise<boolean> {\n const caPath = join(hestiaPortlessStateDir(), \"ca.pem\");\n if (!existsSync(caPath)) return false;\n try {\n const { stdout } = await pexec(\n \"openssl\",\n [\"x509\", \"-in\", caPath, \"-noout\", \"-fingerprint\", \"-sha1\"],\n { timeout: 10_000 },\n );\n const fingerprint = stdout.replace(/^.*=/, \"\").replaceAll(\":\", \"\").trim().toLowerCase();\n const systemKeychain = \"/Library/Keychains/System.keychain\";\n if (await keychainHasFingerprint(systemKeychain, fingerprint)) return true;\n const { stdout: loginOutput } = await pexec(\n \"security\",\n [\"default-keychain\", \"-d\", \"user\"],\n { timeout: 10_000 },\n );\n const loginKeychain = loginOutput.trim().replace(/^\"|\"$/g, \"\");\n return loginKeychain !== \"\" && await keychainHasFingerprint(loginKeychain, fingerprint);\n } catch {\n return false;\n }\n}\n\nasync function runRootCommand(command: string, args: string[], interactive: boolean, optional = false): Promise<void> {\n if (interactive) {\n const result = spawnSync(\"sudo\", [command, ...args], { stdio: \"inherit\", timeout: 60_000 });\n if (!optional && (result.error !== undefined || result.status !== 0)) {\n throw result.error ?? new Error(`${command} exited ${result.status}`);\n }\n return;\n }\n try {\n await pexec(\"sudo\", [\"-n\", command, ...args], { timeout: 60_000 });\n } catch (error) {\n if (!optional) throw error;\n }\n}\n\nasync function prepareHardenedPortlessPayloadAt(\n installDir: string,\n interactive: boolean,\n): Promise<void> {\n const packageRoot = dirname(dirname(portlessCliPath()));\n const portlessDir = join(installDir, \"portless\");\n const bunPath = join(installDir, \"bun\");\n const provenanceSource = join(dirname(hestiaPortlessAliasesPath()), \"payload-provenance.json\");\n ensureDir(dirname(provenanceSource));\n writeAtomicJsonFile(provenanceSource, expectedPortlessPayloadProvenance());\n await runRootCommand(\"mkdir\", [\"-p\", installDir], interactive);\n await runRootCommand(\"rm\", [\"-rf\", portlessDir], interactive);\n await runRootCommand(\"ditto\", [packageRoot, portlessDir], interactive);\n await runRootCommand(\"cp\", [provenanceSource, join(portlessDir, \"provenance.json\")], interactive);\n await runRootCommand(\"cp\", [process.execPath, bunPath], interactive);\n await runRootCommand(\"chown\", [\"-R\", \"root:wheel\", installDir], interactive);\n await runRootCommand(\"chmod\", [\"-R\", \"go-w\", installDir], interactive);\n rmSync(provenanceSource, { force: true });\n}\n\nasync function prepareHardenedPortlessPayload(interactive: boolean): Promise<void> {\n await prepareHardenedPortlessPayloadAt(HESTIA_ROUTER_INSTALL_DIR, interactive);\n}\n\nasync function runHardenedPortlessService(\n action: \"install\" | \"uninstall\",\n interactive: boolean,\n): Promise<void> {\n await runRootCommand(\"env\", [\n `PORTLESS_STATE_DIR=${hestiaPortlessStateDir()}`,\n \"PORTLESS_SYNC_HOSTS=0\",\n `HESTIA_PORTLESS_ROUTES_PATH=${hestiaPortlessAliasesPath()}`,\n \"HESTIA_PORTLESS_ROOT_STATE=1\",\n `HESTIA_PORTLESS_ROUTES_UID=${process.getuid?.() ?? 0}`,\n HESTIA_ROUTER_BUN,\n HESTIA_ROUTER_CLI,\n \"service\",\n action,\n ], interactive);\n}\n\nasync function rollbackHardenedPortlessInstall(interactive: boolean): Promise<void> {\n await runRootCommand(\"launchctl\", [\"bootout\", \"system\", PORTLESS_LAUNCHD_PLIST], interactive, true);\n await runRootCommand(\"rm\", [\"-f\", PORTLESS_LAUNCHD_PLIST], interactive, true);\n try {\n await removeHestiaPortlessCa(interactive);\n } catch {}\n await runRootCommand(\"rm\", [\"-rf\", HESTIA_ROUTER_INSTALL_DIR], interactive, true);\n rmSync(dirname(hestiaPortlessAliasesPath()), { recursive: true, force: true });\n}\n\nasync function trustHestiaPortlessCa(interactive: boolean): Promise<void> {\n await runRootCommand(\"env\", [\n `PORTLESS_STATE_DIR=${hestiaPortlessStateDir()}`,\n \"PORTLESS_SYNC_HOSTS=0\",\n HESTIA_ROUTER_BUN,\n HESTIA_ROUTER_CLI,\n \"trust\",\n ], interactive);\n}\n\nasync function keychainHasFingerprint(keychain: string, fingerprint: string): Promise<boolean> {\n try {\n const { stdout } = await pexec(\"security\", [\"find-certificate\", \"-Z\", \"-a\", keychain], {\n timeout: 10_000,\n });\n return stdout.replaceAll(/[^a-fA-F0-9]/g, \"\").toLowerCase().includes(fingerprint);\n } catch {\n return false;\n }\n}\n\nasync function removeHestiaPortlessCa(interactive: boolean): Promise<void> {\n const stateDir = hestiaPortlessStateDir();\n const caPath = join(stateDir, \"ca.pem\");\n if (!existsSync(caPath)) return;\n const { stdout } = await pexec(\"openssl\", [\"x509\", \"-in\", caPath, \"-noout\", \"-fingerprint\", \"-sha1\"], {\n timeout: 10_000,\n });\n const fingerprint = stdout.replace(/^.*=/, \"\").replaceAll(\":\", \"\").trim().toLowerCase();\n const systemKeychain = \"/Library/Keychains/System.keychain\";\n try {\n const { stdout: loginOutput } = await pexec(\"security\", [\"default-keychain\", \"-d\", \"user\"], {\n timeout: 10_000,\n });\n const loginKeychain = loginOutput.trim().replace(/^\"|\"$/g, \"\");\n if (loginKeychain && await keychainHasFingerprint(loginKeychain, fingerprint)) {\n await pexec(\"security\", [\"delete-certificate\", \"-Z\", fingerprint, loginKeychain], { timeout: 30_000 });\n }\n } catch (error) {\n throw new Error(`could not remove Hestia CA from the login keychain: ${(error as Error).message}`);\n }\n if (await keychainHasFingerprint(systemKeychain, fingerprint)) {\n const args = [\"security\", \"delete-certificate\", \"-Z\", fingerprint, systemKeychain];\n if (interactive) {\n const result = spawnSync(\"sudo\", args, { stdio: \"inherit\", timeout: 60_000 });\n if (result.error !== undefined || result.status !== 0) {\n throw result.error ?? new Error(`security delete-certificate exited ${result.status}`);\n }\n } else {\n await pexec(\"sudo\", [\"-n\", ...args], { timeout: 60_000 });\n }\n }\n}\n\nfunction requireNonInteractivePrivilege(): void {\n if (process.platform === \"win32\" || process.getuid?.() === 0) return;\n const result = spawnSync(\"sudo\", [\"-n\", \"true\"], {\n stdio: \"ignore\",\n timeout: 2_000,\n });\n if (result.status !== 0) {\n throw new HestiaError(\n \"router-privilege-required\",\n \"Router install: trusted HTTPS setup requires an administrator action\",\n { command: \"hestia router install --interactive\", requiresTTY: true },\n );\n }\n}\n\nasync function loopbackPortIsBusy(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = createConnection({ host: \"127.0.0.1\", port });\n const finish = (busy: boolean) => {\n socket.destroy();\n resolve(busy);\n };\n socket.setTimeout(500, () => finish(false));\n socket.once(\"connect\", () => finish(true));\n socket.once(\"error\", () => finish(false));\n });\n}\n\nasync function waitForInstalledHestiaRouter(timeoutMs = 10_000): Promise<HestiaRouterStatus> {\n const deadline = Date.now() + timeoutMs;\n let status = await readHestiaRouterStatus();\n while (Date.now() < deadline && !(status.installed && status.running && status.trusted)) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n status = await readHestiaRouterStatus();\n }\n if (!(status.installed && status.running && status.trusted)) {\n throw new HestiaError(\n \"router-unreachable\",\n \"Router install did not produce a running, trusted, Hestia-owned service\",\n );\n }\n return status;\n}\n\nasync function waitForRunningHestiaRouter(timeoutMs = 10_000): Promise<HestiaRouterStatus> {\n const deadline = Date.now() + timeoutMs;\n let status = await readHestiaRouterStatus();\n while (Date.now() < deadline && !(status.installed && status.running)) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n status = await readHestiaRouterStatus();\n }\n if (!(status.installed && status.running)) {\n throw new HestiaError(\n \"router-unreachable\",\n \"Router payload upgrade did not produce a running, Hestia-owned service\",\n );\n }\n return status;\n}\n\nasync function returnWithCurrentDaemon(status: HestiaRouterStatus): Promise<HestiaRouterStatus> {\n await ensureDaemon();\n return status;\n}\n\nasync function upgradeHardenedPortlessPayloadUnlocked(\n interactive: boolean,\n): Promise<HestiaRouterStatus> {\n const stagedPortless = join(HESTIA_ROUTER_STAGED_DIR, \"portless\");\n const stagedBun = join(HESTIA_ROUTER_STAGED_DIR, \"bun\");\n const previousPortless = join(HESTIA_ROUTER_PREVIOUS_DIR, \"portless\");\n const previousBun = join(HESTIA_ROUTER_PREVIOUS_DIR, \"bun\");\n let preservePrevious = false;\n try {\n await runRootCommand(\"rm\", [\"-rf\", HESTIA_ROUTER_STAGED_DIR, HESTIA_ROUTER_PREVIOUS_DIR], interactive);\n await prepareHardenedPortlessPayloadAt(HESTIA_ROUTER_STAGED_DIR, interactive);\n await runRootCommand(\"mkdir\", [\"-p\", HESTIA_ROUTER_PREVIOUS_DIR], interactive);\n await runRootCommand(\"ditto\", [HESTIA_ROUTER_PORTLESS, previousPortless], interactive);\n await runRootCommand(\"cp\", [HESTIA_ROUTER_BUN, previousBun], interactive);\n await runHardenedPortlessService(\"uninstall\", interactive);\n try {\n await runRootCommand(\"rm\", [\"-rf\", HESTIA_ROUTER_PORTLESS], interactive);\n await runRootCommand(\"ditto\", [stagedPortless, HESTIA_ROUTER_PORTLESS], interactive);\n await runRootCommand(\"cp\", [stagedBun, HESTIA_ROUTER_BUN], interactive);\n await runRootCommand(\"chown\", [\"-R\", \"root:wheel\", HESTIA_ROUTER_INSTALL_DIR], interactive);\n await runRootCommand(\"chmod\", [\"-R\", \"go-w\", HESTIA_ROUTER_INSTALL_DIR], interactive);\n await runHardenedPortlessService(\"install\", interactive);\n return await waitForRunningHestiaRouter();\n } catch (upgradeError) {\n await runHardenedPortlessService(\"uninstall\", interactive).catch(() => {});\n try {\n await runRootCommand(\"rm\", [\"-rf\", HESTIA_ROUTER_PORTLESS], interactive);\n await runRootCommand(\"ditto\", [previousPortless, HESTIA_ROUTER_PORTLESS], interactive);\n await runRootCommand(\"cp\", [previousBun, HESTIA_ROUTER_BUN], interactive);\n await runRootCommand(\"chown\", [\"-R\", \"root:wheel\", HESTIA_ROUTER_INSTALL_DIR], interactive);\n await runRootCommand(\"chmod\", [\"-R\", \"go-w\", HESTIA_ROUTER_INSTALL_DIR], interactive);\n await runHardenedPortlessService(\"install\", interactive);\n await waitForRunningHestiaRouter();\n } catch (restoreError) {\n preservePrevious = true;\n throw new Error(\n `new payload failed (${(upgradeError as Error).message}); previous payload restore failed ` +\n `(${(restoreError as Error).message})`,\n );\n }\n throw upgradeError;\n }\n } finally {\n await runRootCommand(\"rm\", [\"-rf\", HESTIA_ROUTER_STAGED_DIR], interactive, true);\n if (!preservePrevious) {\n await runRootCommand(\"rm\", [\"-rf\", HESTIA_ROUTER_PREVIOUS_DIR], interactive, true);\n }\n }\n}\n\nasync function upgradeHardenedPortlessPayload(\n interactive: boolean,\n): Promise<HestiaRouterStatus> {\n const uid = process.getuid?.() ?? 501;\n const lockRoot = join(tmpdir(), `hestia-${uid}`, \"router-payload-upgrade\");\n return withLock(\n lockRoot,\n () => upgradeHardenedPortlessPayloadUnlocked(interactive),\n 120_000,\n );\n}\n\n/** Install the trusted Portless service; non-interactive mode never waits for sudo. */\nexport async function installHestiaRouter(interactive: boolean): Promise<HestiaRouterStatus> {\n const ownership = requireHestiaServiceOwnership(\"install\");\n const existing = await readHestiaRouterStatus();\n const payloadCurrent = ownership === \"hestia\" && installedPortlessPayloadIsCurrent();\n if (ownership === \"hestia\" && existing.running && existing.trusted && payloadCurrent) {\n return returnWithCurrentDaemon(existing);\n }\n if (ownership === \"hestia\" && existing.running && !payloadCurrent) {\n if (interactive && !process.stdin.isTTY) {\n throw new HestiaError(\"router-privilege-required\", \"Router install: --interactive requires a TTY\");\n }\n if (!interactive) requireNonInteractivePrivilege();\n try {\n let upgraded = await upgradeHardenedPortlessPayload(interactive);\n if (!upgraded.trusted) {\n await trustHestiaPortlessCa(interactive);\n upgraded = await waitForInstalledHestiaRouter();\n }\n return returnWithCurrentDaemon(upgraded);\n } catch (error) {\n const detail = (error as { stderr?: string; message?: string }).stderr ?? (error as Error).message;\n throw new HestiaError(\"router-unreachable\", `Router payload upgrade failed: ${detail.trim()}`);\n }\n }\n if (ownership === \"hestia\" && existing.running) {\n if (interactive && !process.stdin.isTTY) {\n throw new HestiaError(\"router-privilege-required\", \"Router install: --interactive requires a TTY\");\n }\n if (!interactive) requireNonInteractivePrivilege();\n try {\n await trustHestiaPortlessCa(interactive);\n } catch (error) {\n throw new HestiaError(\"router-unreachable\", `Router trust failed: ${(error as Error).message}`);\n }\n const trusted = await readHestiaRouterStatus();\n if (!trusted.trusted) throw new HestiaError(\"router-unreachable\", \"Router trust failed: CA remains untrusted\");\n return returnWithCurrentDaemon(trusted);\n }\n if (await loopbackPortIsBusy(443)) {\n throw new HestiaError(\"router-port-busy\", \"Router install: port 443 is already owned by another process\");\n }\n if (interactive) {\n if (!process.stdin.isTTY) {\n throw new HestiaError(\"router-privilege-required\", \"Router install: --interactive requires a TTY\");\n }\n } else {\n requireNonInteractivePrivilege();\n }\n ensureDir(dirname(hestiaPortlessAliasesPath()));\n if (!existsSync(hestiaPortlessAliasesPath())) {\n writeAtomicJsonFile(hestiaPortlessAliasesPath(), []);\n }\n try {\n // Bootstrap only from the already root-owned payload. There is never a\n // root LaunchDaemon whose ProgramArguments reference workspace files.\n await prepareHardenedPortlessPayload(interactive);\n await runHardenedPortlessService(\"install\", interactive);\n } catch (error) {\n await rollbackHardenedPortlessInstall(interactive);\n const detail = (error as { stderr?: string; message?: string }).stderr ?? (error as Error).message;\n if (/address already in use|port 443|EADDRINUSE/i.test(detail)) {\n throw new HestiaError(\"router-port-busy\", \"Router install: port 443 is already owned by another process\");\n }\n throw new HestiaError(\"router-unreachable\", `Router install failed: ${detail.trim()}`);\n }\n return returnWithCurrentDaemon(await waitForInstalledHestiaRouter());\n}\n\n/** Uninstall the Hestia-owned Portless service; non-interactive mode never waits for sudo. */\nexport async function uninstallHestiaRouter(interactive: boolean): Promise<HestiaRouterStatus> {\n const ownership = requireHestiaServiceOwnership(\"uninstall\");\n if (ownership === \"absent\" && !existsSync(hestiaPortlessAliasesPath())) {\n return readHestiaRouterStatus();\n }\n if (interactive && !process.stdin.isTTY) {\n throw new HestiaError(\"router-privilege-required\", \"Router uninstall: --interactive requires a TTY\");\n }\n if (!interactive) requireNonInteractivePrivilege();\n try {\n if (ownership === \"hestia\") {\n await runHardenedPortlessService(\"uninstall\", interactive);\n }\n await removeHestiaPortlessCa(interactive);\n if (ownership === \"hestia\") {\n await runRootCommand(\"rm\", [\"-rf\", HESTIA_ROUTER_INSTALL_DIR], interactive);\n }\n rmSync(dirname(hestiaPortlessAliasesPath()), { recursive: true, force: true });\n } catch (error) {\n const detail = (error as { stderr?: string; message?: string }).stderr ?? (error as Error).message;\n throw new HestiaError(\"router-unreachable\", `Router uninstall failed: ${detail.trim()}`);\n }\n return readHestiaRouterStatus();\n}\n",
|
|
104
|
+
"import { execFile } from \"node:child_process\";\nimport { Agent, createServer, request as httpRequest, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { createConnection, createServer as createNetServer, type Socket } from \"node:net\";\nimport { promisify } from \"node:util\";\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { chmodSync, lstatSync, mkdirSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { slug, type ServiceRecord, type StackRecord } from \"@hestia/core\";\nimport { isLive } from \"../proc/pidfile.ts\";\nimport { inspectPort } from \"../proc/ports.ts\";\nimport { hestiaHome, parseStackRecord } from \"../state.ts\";\nimport {\n effectiveLocalRouteServices,\n effectiveLocalRoutes,\n localRouteKey,\n localRouteHostname,\n readHestiaMachineConfig,\n resolveLocalRouteHostnames,\n type HestiaMachineConfig,\n} from \"./router-config.ts\";\nimport { reconcilePortlessAliases } from \"./portless-adapter.ts\";\n\nconst pexec = promisify(execFile);\nconst ROUTE_REFRESH_MS = 1_000;\nconst MAX_MIRROR_BYTES = 2 * 1024 * 1024;\nconst MAX_REQUEST_HEADER_BYTES = 64 * 1024;\nconst HOP_BY_HOP_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"proxy-authenticate\", \"proxy-authorization\",\n \"te\", \"trailer\", \"transfer-encoding\", \"upgrade\",\n]);\n\ninterface LocalRouterTarget {\n hostname: string;\n project: string;\n service?: ServiceRecord;\n agent?: Agent;\n}\n\nclass OriginOwnershipError extends Error {}\n\nexport function readRouterStackRecords(): StackRecord[] {\n const stacksDir = join(hestiaHome(), \"stacks\");\n if (!existsSync(stacksDir)) return [];\n const records: StackRecord[] = [];\n for (const project of readdirSync(stacksDir).sort()) {\n const path = join(stacksDir, project, \"stack.json\");\n try {\n const source = readFileSync(path);\n if (source.byteLength > MAX_MIRROR_BYTES) continue;\n const record = parseStackRecord(source.toString(\"utf8\"), path);\n if (record.project === project) records.push(record);\n } catch {}\n }\n return records;\n}\n\n/** Resolve one route against all mirrored peers so collision hashes stay consistent. */\nexport function resolvedLocalRouteHostname(\n record: StackRecord,\n service: string,\n config: HestiaMachineConfig = readHestiaMachineConfig().config,\n): string {\n const records = readRouterStackRecords().filter((candidate) => candidate.project !== record.project);\n records.push(record);\n return resolveLocalRouteHostnames(records, config).get(localRouteKey(record, service)) ??\n localRouteHostname(record, service, config);\n}\n\nfunction parseRouteAuthority(authority: string | undefined): string | null {\n const match = authority?.trim().match(/^([a-z0-9](?:[a-z0-9.-]*[a-z0-9])?)(?::([0-9]{1,5}))?$/i);\n if (match === null || match === undefined) return null;\n const hostname = match[1]!.toLowerCase();\n const port = match[2] === undefined ? undefined : Number(match[2]);\n if (hostname.includes(\"..\") || hostname.split(\".\").some((label) => label.length > 63)) return null;\n if (port !== undefined && (port < 1 || port > 65_535)) return null;\n return hostname;\n}\n\nfunction connectionHeaderTokens(value: string | string[] | undefined): Set<string> {\n const values = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return new Set(values.flatMap((entry) => entry.split(\",\"))\n .map((token) => token.trim().toLowerCase())\n .filter((token) => /^[!#$%&'*+.^_`|~0-9a-z-]+$/.test(token)));\n}\n\nfunction forwardedHeaders(request: IncomingMessage, originPort: number): IncomingMessage[\"headers\"] {\n const headers = { ...request.headers };\n const connectionNames = connectionHeaderTokens(request.headers.connection);\n for (const name of Object.keys(headers)) {\n if (HOP_BY_HOP_HEADERS.has(name) || connectionNames.has(name) || name.startsWith(\"x-forwarded-\")) {\n delete headers[name];\n }\n }\n const incomingHost = request.headers.host ?? \"\";\n // Dev origins commonly reject unknown hosts. Connect and present loopback to the\n // origin while preserving the stable user-facing hostname in X-Forwarded-Host.\n headers.host = `127.0.0.1:${originPort}`;\n delete headers[\"x-forwarded-host\"];\n delete headers[\"x-forwarded-proto\"];\n delete headers[\"x-forwarded-for\"];\n headers[\"x-forwarded-host\"] = incomingHost;\n headers[\"x-forwarded-proto\"] = \"https\";\n const remote = request.socket.remoteAddress;\n if (remote) headers[\"x-forwarded-for\"] = remote;\n return headers;\n}\n\nasync function verifyDockerRouteTarget(target: LocalRouterTarget, port: number): Promise<boolean> {\n try {\n const service = target.service!;\n const args = [\n \"ps\", \"--no-trunc\", \"--format\", \"{{.ID}}\\t{{.Ports}}\",\n \"--filter\", `label=dev.hestia.stack=${target.project}`,\n \"--filter\", `label=com.docker.compose.service=${service.name}`,\n ];\n const { stdout } = await pexec(\"docker\", args, { timeout: 2_000 });\n return stdout.split(\"\\n\").some((line) => {\n const [id, ports = \"\"] = line.split(\"\\t\");\n const identityMatches = service.containerId === undefined || id?.startsWith(service.containerId);\n return identityMatches && new RegExp(`(?:127\\\\.0\\\\.0\\\\.1|0\\\\.0\\\\.0\\\\.0):${port}->`).test(ports);\n });\n } catch {\n return false;\n }\n}\n\nasync function verifyLocalRouterTarget(target: LocalRouterTarget): Promise<number | null> {\n const service = target.service;\n const port = service?.publishedPort;\n if (service === undefined || port === undefined || service.backend === \"tunnel\") return null;\n if (service.backend === \"docker\") {\n return await verifyDockerRouteTarget(target, port) ? port : null;\n }\n if (service.pid === undefined || service.startTime === undefined) return null;\n if (!isLive({ pid: service.pid, startTime: service.startTime })) return null;\n try {\n return (await inspectPort(service.pid, port)).ownerIsMember ? port : null;\n } catch {\n return null;\n }\n}\n\n/** Verify one persisted service still owns its direct loopback origin. */\nexport async function verifyStackServiceOrigin(\n record: StackRecord,\n service: ServiceRecord,\n publishedPort = service.publishedPort,\n): Promise<boolean> {\n return await verifyLocalRouterTarget({\n hostname: \"\",\n project: record.project,\n service: { ...service, publishedPort },\n }) !== null;\n}\n\nfunction targetIdentity(target: LocalRouterTarget): string {\n const service = target.service;\n return [target.project, service?.name, service?.backend, service?.publishedPort,\n service?.pid, service?.startTime, service?.containerId].join(\"\\0\");\n}\n\nfunction verifiedOriginAgent(target: LocalRouterTarget, port: number): Agent {\n if (target.agent !== undefined) return target.agent;\n const agent = new Agent({ keepAlive: true, maxSockets: 32 });\n agent.createConnection = ((\n _options: unknown,\n callback: (error: Error | null, socket?: Socket) => void,\n ) => {\n let settled = false;\n const finish = (error: Error | null, socket?: Socket) => {\n if (settled) return;\n settled = true;\n callback(error, socket);\n };\n const socket = createConnection({ host: \"127.0.0.1\", port });\n socket.once(\"connect\", () => {\n // No request bytes are written until the Agent receives this callback.\n // Verify after connect so a recycled listener cannot win the gap between\n // ownership inspection and socket establishment.\n void verifyLocalRouterTarget(target).then((verifiedPort) => {\n if (verifiedPort !== port) {\n socket.destroy();\n finish(new OriginOwnershipError(\"route origin ownership changed\"));\n return;\n }\n finish(null, socket);\n }).catch((error) => {\n socket.destroy();\n finish(error as Error);\n });\n });\n socket.once(\"error\", (error) => finish(error));\n return undefined;\n }) as typeof agent.createConnection;\n target.agent = agent;\n return agent;\n}\n\nexport function internalEndpointAuthority(project: string, service: string): string {\n const serviceLabel = slug(service).slice(0, 32);\n const hash = createHash(\"sha256\").update(`${project}\\0${service}`).digest(\"hex\").slice(0, 10);\n return `${serviceLabel}-${hash}.hestia.internal`;\n}\n\nexport function publicGatewaySocketPath(): string {\n const uid = process.getuid?.() ?? 501;\n const homeHash = createHash(\"sha256\").update(hestiaHome()).digest(\"hex\").slice(0, 12);\n return join(tmpdir(), `hestia-${uid}`, homeHash, \"origin.sock\");\n}\n\nfunction prepareGatewaySocket(path: string): void {\n const uid = process.getuid?.();\n const directories = [join(tmpdir(), `hestia-${uid ?? 501}`), join(tmpdir(), `hestia-${uid ?? 501}`, createHash(\"sha256\").update(hestiaHome()).digest(\"hex\").slice(0, 12))];\n for (const directory of directories) {\n mkdirSync(directory, { recursive: true, mode: 0o700 });\n const stat = lstatSync(directory);\n if (!stat.isDirectory() || stat.isSymbolicLink() || (uid !== undefined && stat.uid !== uid)) {\n throw new Error(`unsafe Hestia gateway runtime directory ${directory}`);\n }\n chmodSync(directory, 0o700);\n }\n if (!existsSync(path)) return;\n const stat = lstatSync(path);\n if (stat.isSymbolicLink() || !stat.isSocket() || (uid !== undefined && stat.uid !== uid)) {\n throw new Error(`refusing unsafe existing Hestia gateway socket ${path}`);\n }\n rmSync(path);\n}\n\nfunction sendRouterResponse(response: ServerResponse, status: number, message: string): void {\n response.writeHead(status, { \"content-type\": \"text/plain; charset=utf-8\", \"x-hestia-router\": \"1\" });\n response.end(`${message}\\n`);\n}\n\n/** Hestiad-owned loopback HTTP and WebSocket router for stable local URLs. */\nexport class HestiaLocalHttpRouter {\n readonly #server = createServer((request, response) => void this.#proxyHttp(request, response));\n readonly #frontServer = createNetServer((socket) => this.#acceptFrontSocket(socket));\n readonly #unixServer = createNetServer((socket) => this.#acceptFrontSocket(socket));\n #targets = new Map<string, LocalRouterTarget>();\n #timer?: ReturnType<typeof setInterval>;\n\n async start(): Promise<number> {\n await new Promise<void>((resolve, reject) => {\n this.#server.once(\"error\", reject);\n this.#server.listen(0, \"127.0.0.1\", () => {\n this.#server.off(\"error\", reject);\n resolve();\n });\n });\n prepareGatewaySocket(this.socketPath);\n await new Promise<void>((resolve, reject) => {\n this.#unixServer.once(\"error\", reject);\n this.#unixServer.listen(this.socketPath, () => {\n this.#unixServer.off(\"error\", reject);\n chmodSync(this.socketPath, 0o600);\n resolve();\n });\n });\n await new Promise<void>((resolve, reject) => {\n this.#frontServer.once(\"error\", reject);\n this.#frontServer.listen(0, \"127.0.0.1\", () => {\n this.#frontServer.off(\"error\", reject);\n resolve();\n });\n });\n await this.refreshRoutes();\n this.#timer = setInterval(() => void this.refreshRoutes().catch((error) => {\n console.error(`router: periodic route refresh failed: ${(error as Error).message}`);\n }), ROUTE_REFRESH_MS);\n this.#timer.unref?.();\n return this.port;\n }\n\n get port(): number {\n const address = this.#frontServer.address();\n return typeof address === \"object\" && address !== null ? address.port : 0;\n }\n\n get socketPath(): string {\n return publicGatewaySocketPath();\n }\n\n /** Rebuild route targets from mirrors plus machine TOML and reconcile Portless aliases. */\n async refreshRoutes(): Promise<void> {\n const configResult = readHestiaMachineConfig();\n const targets = new Map<string, LocalRouterTarget>();\n const records = readRouterStackRecords();\n const hostnames = resolveLocalRouteHostnames(records, configResult.config);\n for (const record of records) {\n for (const route of effectiveLocalRoutes(record, configResult.config)) {\n const hostname = hostnames.get(localRouteKey(record, route.name));\n if (hostname === undefined) continue;\n const originalService = record.services.find((service) => service.name === route.service);\n const selectedBinding = route.selector === undefined\n ? undefined\n : originalService?.bindings?.find(\n (binding) => `${binding.target}/${binding.protocol}` === route.selector,\n );\n const candidate: LocalRouterTarget = {\n hostname,\n project: record.project,\n service: originalService === undefined\n ? undefined\n : { ...originalService, publishedPort: selectedBinding?.publishedPort ?? originalService.publishedPort },\n };\n const previous = this.#targets.get(hostname);\n targets.set(hostname, previous !== undefined && targetIdentity(previous) === targetIdentity(candidate)\n ? previous\n : candidate);\n }\n for (const endpoint of record.endpoints) {\n const service = record.services.find((candidate) =>\n candidate.name === (endpoint.workload ?? endpoint.name));\n const binding = service?.bindings?.find((candidate) =>\n `${candidate.target}/${candidate.protocol}` === endpoint.binding);\n const publishedPort = binding?.publishedPort ?? service?.publishedPort;\n if (service === undefined || service.backend === \"tunnel\" || publishedPort === undefined) continue;\n const authority = internalEndpointAuthority(record.project, endpoint.alias ?? endpoint.name);\n targets.set(authority, {\n hostname: authority,\n project: record.project,\n service: { ...service, publishedPort },\n });\n if (endpoint.publicUrl !== undefined) {\n try {\n const publicUrl = new URL(endpoint.publicUrl);\n if (publicUrl.protocol === \"https:\" || publicUrl.protocol === \"http:\") {\n targets.set(publicUrl.hostname.toLowerCase(), {\n hostname: publicUrl.hostname.toLowerCase(),\n project: record.project,\n service: { ...service, publishedPort },\n });\n }\n } catch {\n // Stack parsing validates structure, not URL syntax. Ignore a\n // malformed legacy public URL instead of disabling all routes.\n }\n }\n }\n for (const exposure of record.tunnel?.exposures ?? []) {\n const originalService = record.services.find((service) => service.name === exposure.service);\n const selectedBinding = originalService?.bindings?.find((binding) =>\n `${binding.target}/${binding.protocol}` === exposure.binding);\n const hostnames = exposure.keepHostHeader\n ? [exposure.hostname]\n : [\n exposure.hostname,\n internalEndpointAuthority(record.project, exposure.alias ?? exposure.service),\n ];\n for (const hostname of hostnames) {\n targets.set(hostname, {\n hostname,\n project: record.project,\n service: originalService === undefined ? undefined : {\n ...originalService,\n publishedPort: selectedBinding?.publishedPort ?? originalService.publishedPort,\n },\n });\n }\n }\n }\n reconcilePortlessAliases(\n [...targets.keys()].filter((hostname) => hostname.endsWith(\".localhost\")),\n this.port,\n );\n for (const [hostname, target] of this.#targets) {\n if (targets.get(hostname) !== target) target.agent?.destroy();\n }\n this.#targets = targets;\n }\n\n stop(): void {\n if (this.#timer) clearInterval(this.#timer);\n try {\n reconcilePortlessAliases([], this.port);\n } catch (error) {\n console.error(`router: alias cleanup failed: ${(error as Error).message}`);\n }\n for (const target of this.#targets.values()) target.agent?.destroy();\n this.#frontServer.close();\n this.#unixServer.close();\n rmSync(this.socketPath, { force: true });\n this.#server.close();\n }\n\n #acceptFrontSocket(socket: Socket): void {\n let buffered = Buffer.alloc(0);\n const onData = (chunk: Buffer) => {\n buffered = Buffer.concat([buffered, chunk]);\n if (buffered.length > MAX_REQUEST_HEADER_BYTES) {\n socket.end(\"HTTP/1.1 431 Request Header Fields Too Large\\r\\nConnection: close\\r\\n\\r\\n\");\n return;\n }\n const boundary = buffered.indexOf(\"\\r\\n\\r\\n\");\n if (boundary < 0) return;\n socket.pause();\n socket.off(\"data\", onData);\n const header = buffered.subarray(0, boundary + 4).toString(\"latin1\");\n if (/\\r\\nupgrade:\\s*websocket\\s*\\r\\n/i.test(header)) {\n void this.#proxyWebSocket(socket, header, buffered.subarray(boundary + 4));\n } else {\n this.#proxyFrontHttp(socket, buffered);\n }\n };\n socket.on(\"data\", onData);\n }\n\n #proxyFrontHttp(socket: Socket, buffered: Buffer): void {\n const address = this.#server.address();\n const port = typeof address === \"object\" && address !== null ? address.port : 0;\n const internal = createConnection({ host: \"127.0.0.1\", port });\n internal.once(\"connect\", () => {\n internal.write(buffered);\n socket.pipe(internal).pipe(socket);\n socket.resume();\n });\n internal.once(\"error\", () => socket.end(\"HTTP/1.1 502 Bad Gateway\\r\\nConnection: close\\r\\n\\r\\n\"));\n socket.once(\"error\", () => internal.destroy());\n }\n\n async #proxyHttp(request: IncomingMessage, response: ServerResponse): Promise<void> {\n const hostname = parseRouteAuthority(request.headers.host);\n if (hostname === null) return sendRouterResponse(response, 400, \"Malformed Host authority\");\n const target = this.#targets.get(hostname);\n if (target === undefined) return sendRouterResponse(response, 404, \"Hestia route not found\");\n const port = target.service?.publishedPort;\n if (port === undefined) return sendRouterResponse(response, 503, \"Hestia route origin unavailable\");\n if (await verifyLocalRouterTarget(target) !== port) {\n return sendRouterResponse(response, 503, \"Hestia route origin unavailable\");\n }\n const proxy = httpRequest({\n hostname: \"127.0.0.1\",\n port,\n method: request.method,\n path: request.url,\n headers: forwardedHeaders(request, port),\n agent: verifiedOriginAgent(target, port),\n }, (origin) => {\n const headers = { ...origin.headers };\n for (const name of HOP_BY_HOP_HEADERS) delete headers[name];\n response.writeHead(origin.statusCode ?? 502, headers);\n origin.on(\"error\", () => response.destroy());\n origin.on(\"aborted\", () => response.destroy());\n response.on(\"error\", () => origin.destroy());\n origin.pipe(response);\n });\n proxy.on(\"error\", (error) => {\n if (!response.headersSent) {\n const ownershipFailure = error instanceof OriginOwnershipError;\n sendRouterResponse(\n response,\n ownershipFailure ? 503 : 502,\n ownershipFailure ? \"Hestia route origin unavailable\" : \"Hestia route origin failed\",\n );\n }\n else response.destroy();\n });\n request.pipe(proxy);\n }\n\n async #proxyWebSocket(socket: Socket, header: string, head: Buffer): Promise<void> {\n const hostHeaders = [...header.matchAll(/\\r\\nhost:\\s*([^\\r\\n]+)/gi)];\n const incomingHost = hostHeaders.length === 1 ? hostHeaders[0]![1]!.trim() : undefined;\n const host = parseRouteAuthority(incomingHost);\n if (host === null) {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\nConnection: close\\r\\n\\r\\n\");\n return;\n }\n const target = this.#targets.get(host);\n const port = target?.service?.publishedPort;\n if (target === undefined || port === undefined) {\n socket.end(`HTTP/1.1 ${target === undefined ? \"404 Not Found\" : \"503 Service Unavailable\"}\\r\\n\\r\\n`);\n return;\n }\n const rawHeaderLines = header.slice(0, -4).split(\"\\r\\n\");\n const connectionValues = rawHeaderLines.slice(1)\n .filter((line) => /^connection:/i.test(line))\n .map((line) => line.slice(line.indexOf(\":\") + 1));\n const connectionNames = connectionHeaderTokens(connectionValues);\n const retainedHeaders = rawHeaderLines.slice(1).filter((line) => {\n const separator = line.indexOf(\":\");\n if (separator < 1) return false;\n const name = line.slice(0, separator).trim().toLowerCase();\n return name !== \"host\" && !HOP_BY_HOP_HEADERS.has(name) &&\n !connectionNames.has(name) && !name.startsWith(\"x-forwarded-\");\n });\n const rewrittenHeader = [\n rawHeaderLines[0]!,\n ...retainedHeaders,\n `Host: 127.0.0.1:${port}`,\n \"Connection: Upgrade\",\n \"Upgrade: websocket\",\n `X-Forwarded-Host: ${incomingHost}`,\n \"X-Forwarded-Proto: https\",\n `X-Forwarded-For: ${socket.remoteAddress ?? \"127.0.0.1\"}`,\n \"\",\n \"\",\n ].join(\"\\r\\n\");\n const originSocket = createConnection({ host: \"127.0.0.1\", port });\n originSocket.once(\"connect\", async () => {\n const verifiedPort = await verifyLocalRouterTarget(target);\n if (verifiedPort !== port) {\n originSocket.destroy();\n socket.end(\"HTTP/1.1 503 Service Unavailable\\r\\n\\r\\n\");\n return;\n }\n socket.pipe(originSocket).pipe(socket);\n originSocket.write(rewrittenHeader, \"latin1\");\n if (head.length) originSocket.write(head);\n socket.resume();\n });\n originSocket.once(\"error\", () => {\n if (!socket.destroyed) socket.end(\"HTTP/1.1 502 Bad Gateway\\r\\n\\r\\n\");\n });\n socket.once(\"error\", () => originSocket.destroy());\n }\n}\n",
|
|
105
|
+
"import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport { connect } from \"node:net\";\nimport { HestiaError, type ProcSpec } from \"@hestia/core\";\nimport { allocatePort } from \"../proc/ports.ts\";\nimport { discoverWorkers, filterWorkers, type WorkerConfig } from \"./discover.ts\";\n\n/** Per-worktree private dev registry — the isolation mechanism itself. */\nexport function privateRegistryDir(worktreeRoot: string): string {\n return join(worktreeRoot, \".hestia\", \"wrangler-registry\");\n}\n\n/** Where an unwrapped wrangler/miniflare would register (and read bindings). */\nexport function globalRegistryDir(): string {\n return (\n process.env.WRANGLER_REGISTRY_PATH ??\n join(homedir(), \".wrangler\", \"config\", \"registry\")\n );\n}\n\nconst HEARTBEAT_FRESH_MS = 60_000;\n\nfunction tcpConnectable(address: string, timeoutMs = 500): Promise<boolean> {\n const [host, portStr] = address.split(\":\");\n const port = Number(portStr);\n if (!host || !Number.isFinite(port)) return Promise.resolve(false);\n return new Promise((resolve) => {\n const sock = connect({ host, port, timeout: timeoutMs });\n sock.once(\"connect\", () => {\n sock.destroy();\n resolve(true);\n });\n const dead = () => {\n sock.destroy();\n resolve(false);\n };\n sock.once(\"error\", dead);\n sock.once(\"timeout\", dead);\n });\n}\n\n/**\n * Refuse to start a worker whose name is already live in the GLOBAL registry —\n * that's a manual `pnpm dev` (or another tool) in some worktree of this repo,\n * and running both means fighting over `.wrangler/state` (SQLITE_BUSY).\n * Registry entries carry no pid; liveness = heartbeat-fresh mtime, else a\n * connectable debug address.\n */\nexport async function preflightForeignSessions(\n workers: WorkerConfig[],\n): Promise<void> {\n const dir = globalRegistryDir();\n if (!existsSync(dir)) return;\n for (const w of workers) {\n if (w.name === null) continue;\n const entryPath = join(dir, w.name);\n if (!existsSync(entryPath)) continue;\n const freshMs = Date.now() - statSync(entryPath).mtimeMs;\n let live = freshMs < HEARTBEAT_FRESH_MS;\n if (!live) {\n try {\n const entry = JSON.parse(readFileSync(entryPath, \"utf8\")) as {\n debugPortAddress?: string;\n };\n live = entry.debugPortAddress\n ? await tcpConnectable(entry.debugPortAddress)\n : false;\n } catch {\n live = false;\n }\n }\n if (live) {\n throw new HestiaError(\n \"worktree-busy\",\n `worker \"${w.name}\" is already registered in the global dev registry ` +\n `(${entryPath}) by a live non-hestia session — stop it or pass --force`,\n );\n }\n }\n}\n\nexport interface WorkerPlan {\n specs: ProcSpec[];\n warnings: string[];\n}\n\nexport interface WorkerPlanOptions {\n filter: string[];\n allowRemote: boolean;\n force: boolean;\n varlock: boolean;\n}\n\n/**\n * Keep Wrangler resources local unless the config explicitly declares a\n * remote binding and the caller has acknowledged it with --allow-remote.\n * Wrangler can otherwise create remote proxies for bindings such as AI even\n * when its general `--remote` option defaults to false.\n */\nexport function wranglerResourceModeArgs(\n worker: Pick<WorkerConfig, \"hasRemote\">,\n allowRemote: boolean,\n): string[] {\n return worker.hasRemote && allowRemote ? [] : [\"--local\"];\n}\n\n/** Discover, gate, and turn wrangler configs into supervised ProcSpecs. */\nexport async function planWorkers(\n worktreeRoot: string,\n opts: WorkerPlanOptions,\n): Promise<WorkerPlan> {\n const all = discoverWorkers(worktreeRoot);\n const matched = filterWorkers(all, worktreeRoot, opts.filter);\n if (matched.length === 0) {\n throw new HestiaError(\n \"no-workers-found\",\n opts.filter.length > 0\n ? `no wrangler configs match --workers=${opts.filter.join(\",\")}`\n : `no wrangler.{jsonc,json,toml} found in ${worktreeRoot}`,\n );\n }\n\n // Per-config resolution: pnpm workspaces (modem) link each app's deps into\n // <app>/node_modules/.bin, NOT the workspace root — walk from the config's\n // dir up to the worktree root and take the nearest local wrangler. Never a\n // global install.\n const wranglerBinFor = (configPath: string): string | null => {\n let dir = dirname(configPath);\n for (;;) {\n const candidate = join(dir, \"node_modules\", \".bin\", \"wrangler\");\n if (existsSync(candidate)) return candidate;\n if (dir === worktreeRoot) return null;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n };\n\n const warnings: string[] = [];\n const named: WorkerConfig[] = [];\n for (const w of matched) {\n const rel = relative(worktreeRoot, w.configPath);\n if (w.name === null) {\n warnings.push(`skipping ${rel}: no top-level \"name\" in config`);\n continue;\n }\n if (w.hasRemote && !opts.allowRemote) {\n throw new HestiaError(\n \"remote-binding-blocked\",\n `${rel} declares remote bindings (talks to real Cloudflare resources) — ` +\n `pass --allow-remote to permit`,\n );\n }\n named.push(w);\n }\n if (named.length === 0) {\n throw new HestiaError(\n \"no-workers-found\",\n `all matched wrangler configs were skipped (no top-level name)`,\n );\n }\n\n if (!opts.force) await preflightForeignSessions(named);\n\n const registry = privateRegistryDir(worktreeRoot);\n const specs: ProcSpec[] = [];\n for (const w of named) {\n const bin = wranglerBinFor(w.configPath);\n if (bin === null) {\n throw new HestiaError(\n \"wrangler-missing\",\n `no local wrangler for ${relative(worktreeRoot, w.configPath)} ` +\n `(searched node_modules/.bin from the config dir up to the worktree ` +\n `root) — hestia never uses a global install`,\n );\n }\n const inspectorPort = await allocatePort();\n specs.push({\n name: w.name!,\n // wrangler binary invoked directly — modem's package dev scripts use\n // `env -i` and pin inspector ports, so they must be bypassed.\n argv: [\n bin,\n \"dev\",\n ...wranglerResourceModeArgs(w, opts.allowRemote),\n \"-c\",\n w.configPath,\n \"--port\",\n \"{port}\",\n \"--inspector-port\",\n String(inspectorPort),\n ],\n env: {\n // both: wrangler reads WRANGLER_REGISTRY_PATH, the vite-plugin path\n // reads MINIFLARE_REGISTRY_PATH\n WRANGLER_REGISTRY_PATH: registry,\n MINIFLARE_REGISTRY_PATH: registry,\n },\n port: \"auto\",\n signal: \"int\",\n varlock: opts.varlock,\n backend: \"wrangler\",\n inspectorPort,\n configPath: w.configPath,\n });\n }\n return { specs, warnings };\n}\n",
|
|
106
|
+
"import { existsSync, readdirSync } from \"node:fs\";\nimport { HestiaError } from \"@hestia/core\";\nimport { globalRegistryDir } from \"./adapter.ts\";\n\nfunction namesIn(dir: string): Set<string> {\n if (!existsSync(dir)) return new Set();\n return new Set(readdirSync(dir));\n}\n\nexport function snapshotGlobalRegistry(): Set<string> {\n return namesIn(globalRegistryDir());\n}\n\n/**\n * The isolation assertion: every worker we started must appear in the PRIVATE\n * registry — that proves the redirect env vars took effect in the child. If a\n * name never shows up there, the worker registered somewhere else (or the\n * wrangler version stopped honoring the env var): a real leak, fail hard.\n */\nexport async function verifyPrivateRegistry(\n privateDir: string,\n workerNames: string[],\n timeoutMs = 10_000,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let missing: string[] = workerNames;\n while (Date.now() < deadline) {\n const present = namesIn(privateDir);\n missing = workerNames.filter((n) => !present.has(n));\n if (missing.length === 0) return;\n await new Promise((r) => setTimeout(r, 250));\n }\n throw new HestiaError(\n \"registry-leak\",\n `worker(s) ${missing.join(\", \")} never registered in the private registry ` +\n `(${privateDir}) — the WRANGLER_REGISTRY_PATH/MINIFLARE_REGISTRY_PATH ` +\n `redirect did not take effect`,\n );\n}\n\n/**\n * Advisory only: a global-registry gain of one of our names DURING our up is\n * probably a manual session in another worktree of the same repo (same repo →\n * same worker names). Entries carry no pid, so it cannot be attributed —\n * never fail on it, just surface it.\n */\nexport function globalGainWarnings(\n before: Set<string>,\n ourNames: string[],\n): string[] {\n const after = snapshotGlobalRegistry();\n return ourNames\n .filter((n) => after.has(n) && !before.has(n))\n .map(\n (n) =>\n `global dev registry gained \"${n}\" while this stack started — ` +\n `likely a non-hestia dev session in another worktree; hestia's own ` +\n `workers are isolated in the private registry`,\n );\n}\n",
|
|
107
|
+
"import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { HestiaError } from \"@hestia/core\";\n\nconst pexec = promisify(execFile);\n\n/**\n * Wrapper around the user's cloudflared binary. Hestia ADOPTS an existing\n * named tunnel — it never runs `tunnel create` or `tunnel delete`, and every\n * mutating call after adoption targets the tunnel's UUID, never its name, so\n * a teammate's same-prefixed tunnel on the shared account can never be hit.\n */\n\nexport const BIN = \"cloudflared\";\n\n/** ~/.cloudflared (cert.pem + per-uuid credential JSONs). Test seam via env. */\nexport function cloudflaredHome(): string {\n return process.env.HESTIA_CLOUDFLARED_HOME ?? join(homedir(), \".cloudflared\");\n}\n\nexport function certPath(): string {\n return process.env.TUNNEL_ORIGIN_CERT ?? join(cloudflaredHome(), \"cert.pem\");\n}\n\n/** Credentials JSON written by the user's own `cloudflared tunnel create`. */\nexport function credFilePath(uuid: string): string {\n return process.env.TUNNEL_CRED_FILE ?? join(cloudflaredHome(), `${uuid}.json`);\n}\n\nasync function run(args: string[], timeoutMs = 30_000): Promise<string> {\n try {\n const { stdout } = await pexec(BIN, args, { timeout: timeoutMs });\n return stdout;\n } catch (err) {\n const e = err as NodeJS.ErrnoException & { stderr?: string };\n if (e.code === \"ENOENT\") {\n throw new HestiaError(\n \"cloudflared-missing\",\n \"cloudflared not found on PATH (brew install cloudflared)\",\n );\n }\n throw err;\n }\n}\n\nexport interface TunnelListEntry {\n id: string;\n name: string;\n /** Live connector records — non-empty means someone is running this tunnel. */\n connections: Array<{ id?: string; origin_ip?: string; colo_name?: string }>;\n}\n\n/** `tunnel list -o json`, parsed tolerantly across cloudflared versions. */\nexport async function listTunnels(): Promise<TunnelListEntry[]> {\n const out = await run([\"tunnel\", \"list\", \"-o\", \"json\"]);\n const parsed = JSON.parse(out) as Array<Record<string, unknown>>;\n return parsed.map((t) => ({\n id: String(t.id ?? \"\"),\n name: String(t.name ?? \"\"),\n connections: Array.isArray(t.connections)\n ? (t.connections as TunnelListEntry[\"connections\"])\n : [],\n }));\n}\n\n/** Resolve an adopted tunnel by name; requires its credentials JSON locally. */\nexport async function adoptTunnel(\n name: string,\n): Promise<{ uuid: string; credFile: string; connections: number }> {\n const entry = (await listTunnels()).find((t) => t.name === name);\n if (entry === undefined) {\n throw new HestiaError(\n \"tunnel-not-found\",\n `no tunnel named \"${name}\" on this account — create it once with ` +\n `\\`cloudflared tunnel create ${name}\\``,\n );\n }\n const credFile = credFilePath(entry.id);\n if (!existsSync(credFile)) {\n throw new HestiaError(\n \"tunnel-auth-missing\",\n `credentials for tunnel \"${name}\" not found at ${credFile} — ` +\n `run \\`cloudflared tunnel create\\` on this machine or copy the JSON`,\n );\n }\n return { uuid: entry.id, credFile, connections: entry.connections.length };\n}\n\n/**\n * Route a hostname to the adopted tunnel (CNAME → <uuid>.cfargotunnel.com).\n * Plain by default; `overwrite` re-points an existing record — only pass it\n * when the caller has established the record is hestia's own (ledger hit or\n * explicit --overwrite-dns), never to silently capture a foreign name.\n */\nexport async function routeDns(\n uuid: string,\n hostname: string,\n overwrite: boolean,\n): Promise<void> {\n if (!existsSync(certPath())) {\n throw new HestiaError(\n \"tunnel-auth-missing\",\n `routing DNS needs ${certPath()} — run \\`cloudflared tunnel login\\``,\n );\n }\n const args = [\"tunnel\", \"route\", \"dns\"];\n if (overwrite) args.push(\"--overwrite-dns\");\n args.push(uuid, hostname);\n try {\n await run(args);\n } catch (err) {\n if (err instanceof HestiaError) throw err;\n const msg = (err as { stderr?: string; message?: string }).stderr ?? \"\";\n const text = `${msg} ${(err as Error).message ?? \"\"}`;\n if (/already exists|existing (DNS )?record/i.test(text)) {\n throw new HestiaError(\n \"dns-record-conflict\",\n `a DNS record for ${hostname} already exists and hestia has no ` +\n `memory of creating it — if it is from a previous hestia run, ` +\n `re-run with --overwrite-dns; if not, pick another name (records ` +\n `in the shared zone are never overwritten silently)`,\n );\n }\n throw new HestiaError(\n \"dns-route-failed\",\n `cloudflared tunnel route dns ${hostname} failed: ${(err as Error).message}`,\n );\n }\n}\n",
|
|
108
|
+
"import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { HestiaError, slug, type TunnelExposure } from \"@hestia/core\";\nimport { cloudflaredHome } from \"./cloudflared.ts\";\nimport {\n internalEndpointAuthority,\n publicGatewaySocketPath,\n} from \"../router/local-http-router.ts\";\n\n/**\n * Pure ingress logic for the unified tunnel: hostname derivation, import of\n * the user's static rules, and merged-config generation. The merged config is\n * DERIVED state — base rules re-read from the user's file and dynamic rules\n * re-read from stack mirrors on every regen — never hand-maintained.\n */\n\nexport interface IngressRule {\n hostname?: string;\n path?: string;\n service: string;\n originRequest?: Record<string, unknown>;\n}\n\n/** Max DNS label length; longer derived names get a stable hash suffix. */\nconst LABEL_MAX = 63;\nconst HASH_LEN = 6;\n\n/**\n * `<tunnel>-<branch>-<svc>` as one DNS label under the zone (single-label:\n * universal SSL only covers one level). Deterministic; over-budget labels are\n * truncated with a hash of the full form so two long names can't collide.\n */\nexport function hostnameFor(\n tunnelName: string,\n branch: string,\n service: string,\n zone: string,\n): string {\n const label = `${slug(tunnelName)}-${slug(branch)}-${slug(service)}`;\n if (label.length <= LABEL_MAX) return `${label}.${zone}`;\n const hash = createHash(\"sha256\").update(label).digest(\"hex\").slice(0, HASH_LEN);\n const keep = label.slice(0, LABEL_MAX - HASH_LEN - 1).replace(/-+$/, \"\");\n return `${keep}-${hash}.${zone}`;\n}\n\n/** The zone is the hostname minus its first label. */\nexport function zoneOf(hostname: string): string | undefined {\n const dot = hostname.indexOf(\".\");\n return dot > 0 ? hostname.slice(dot + 1) : undefined;\n}\n\n/** Infer the zone from imported base rules (their common suffix), if any. */\nexport function inferZone(baseRules: IngressRule[]): string | undefined {\n const zones = new Set(\n baseRules\n .map((r) => (r.hostname !== undefined ? zoneOf(r.hostname) : undefined))\n .filter((z): z is string => z !== undefined),\n );\n return zones.size === 1 ? [...zones][0] : undefined;\n}\n\n/**\n * Import the user's static ingress rules for the adopted tunnel from\n * ~/.cloudflared/config.yml (verbatim, minus the catch-all — we append our\n * own). The user's file is read-only to hestia. Returns [] when the file is\n * absent or describes a different tunnel.\n */\nexport function importBaseRules(uuid: string, name: string): IngressRule[] {\n const p = join(cloudflaredHome(), \"config.yml\");\n if (!existsSync(p)) return [];\n let parsed: { tunnel?: unknown; ingress?: unknown };\n try {\n parsed = parseYaml(readFileSync(p, \"utf8\")) as typeof parsed;\n } catch {\n return [];\n }\n const declared = String(parsed.tunnel ?? \"\");\n if (declared !== uuid && declared !== name) return [];\n if (!Array.isArray(parsed.ingress)) return [];\n return (parsed.ingress as IngressRule[]).filter(\n (r) => r.hostname !== undefined || r.path !== undefined,\n );\n}\n\nexport interface DynamicRule extends TunnelExposure {\n project: string;\n}\n\n/**\n * Base rules first (the user's primary worktree), then per-worktree dynamic\n * rules, then the mandatory catch-all. Host is rewritten to the origin by\n * default — vite/next dev servers reject foreign Hosts (allowedHosts /\n * allowedDevOrigins) — unless the exposure opted out.\n */\nexport function generateMergedConfig(opts: {\n uuid: string;\n credFile: string;\n baseRules: IngressRule[];\n dynamicRules: DynamicRule[];\n}): string {\n assertDisjoint(opts.baseRules, opts.dynamicRules);\n const dynamic: IngressRule[] = opts.dynamicRules.map((d) => ({\n hostname: d.hostname,\n service: `unix:${publicGatewaySocketPath()}`,\n ...(d.keepHostHeader\n ? {}\n : { originRequest: { httpHostHeader: internalEndpointAuthority(d.project, d.alias ?? d.service) } }),\n }));\n return stringifyYaml({\n tunnel: opts.uuid,\n \"credentials-file\": opts.credFile,\n ingress: [\n ...opts.baseRules,\n ...dynamic,\n { service: \"http_status:404\" },\n ],\n });\n}\n\n/**\n * Every hostname must map to exactly one rule — cloudflared ingress is\n * first-match-wins, so a duplicate silently serves the wrong worktree (the\n * exact misdelivery hestia exists to kill).\n */\nfunction assertDisjoint(base: IngressRule[], dynamic: DynamicRule[]): void {\n const seen = new Map<string, string>();\n for (const r of base) {\n if (r.hostname !== undefined) seen.set(r.hostname, \"the user's static rules\");\n }\n for (const d of dynamic) {\n const holder = seen.get(d.hostname);\n if (holder !== undefined) {\n throw new HestiaError(\n \"hostname-conflict\",\n `hostname ${d.hostname} (service \"${d.service}\" of ${d.project}) ` +\n `is already claimed by ${holder}`,\n );\n }\n seen.set(d.hostname, `project ${d.project}`);\n }\n}\n",
|
|
109
|
+
"/**\n * Runtime verification against cloudflared's metrics endpoint (loopback only):\n * /ready returns 200 + {readyConnections} once the connector holds an edge\n * connection; /quicktunnel returns {\"hostname\":\"…trycloudflare.com\"} for quick\n * tunnels (empty hostname on named tunnels).\n */\n\nconst POLL_MS = 300;\n\nasync function get(port: number, path: string): Promise<Response | null> {\n try {\n return await fetch(`http://127.0.0.1:${port}${path}`, {\n signal: AbortSignal.timeout(2_000),\n });\n } catch {\n return null;\n }\n}\n\n/** True once /ready reports ≥1 edge connection within the timeout. */\nexport async function pollReady(\n metricsPort: number,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const res = await get(metricsPort, \"/ready\");\n if (res !== null && res.ok) return true;\n await new Promise((r) => setTimeout(r, POLL_MS));\n }\n return false;\n}\n\n/** One-shot /ready check (status refresh). */\nexport async function isReady(metricsPort: number): Promise<boolean> {\n const res = await get(metricsPort, \"/ready\");\n return res !== null && res.ok;\n}\n\n/** Poll /quicktunnel until the assigned *.trycloudflare.com URL appears. */\nexport async function quickTunnelUrl(\n metricsPort: number,\n timeoutMs: number,\n): Promise<string | null> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const res = await get(metricsPort, \"/quicktunnel\");\n if (res !== null && res.ok) {\n try {\n const body = (await res.json()) as { hostname?: string };\n if (body.hostname !== undefined && body.hostname !== \"\") {\n return `https://${body.hostname}`;\n }\n } catch {\n // not JSON yet — keep polling\n }\n }\n await new Promise((r) => setTimeout(r, POLL_MS));\n }\n return null;\n}\n",
|
|
110
|
+
"import {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { HestiaError, STATE_SCHEMA_VERSION, type StackRecord, type TunnelRef } from \"@hestia/core\";\nimport { hestiaHome, parseStackRecord } from \"../state.ts\";\nimport { withLock } from \"../proc/lock.ts\";\nimport { credFilePath } from \"./cloudflared.ts\";\nimport { startProc } from \"../proc/supervisor.ts\";\nimport { isLive, readPidfile, removePidfile } from \"../proc/pidfile.ts\";\nimport { stopProcTree } from \"../proc/shutdown.ts\";\nimport {\n type DynamicRule,\n generateMergedConfig,\n importBaseRules,\n} from \"./ingress.ts\";\nimport { pollReady } from \"./verify.ts\";\nimport { writeAtomicJsonFile, writeAtomicTextFile } from \"../atomic-json-file.ts\";\n\n/**\n * The machine-global unified-tunnel singleton: ONE connector process per\n * adopted tunnel, serving a merged ingress (the user's static rules + every\n * worktree's exposures). One connector is the whole point — multiple\n * connectors on one tunnel are HA replicas that Cloudflare load-balances\n * nondeterministically across worktrees.\n *\n * The tunnel dir doubles as a \"worktree root\" for the shipped proc machinery\n * (startProc/pidfile/lock all key off `<root>/.hestia/...`), so the connector\n * gets tree supervision, lstart identity, and crash-safe pidfiles for free.\n */\n\nexport const CONNECTOR = \"connector\";\nconst READY_TIMEOUT_MS = 30_000;\n\nexport function tunnelDir(uuid: string): string {\n return join(hestiaHome(), \"tunnel\", uuid);\n}\n\nfunction configPath(uuid: string): string {\n return join(tunnelDir(uuid), \"config.yml\");\n}\n\n/** Marker that hestia has successfully run this tunnel's connector before. */\nfunction adoptedMarker(uuid: string): string {\n return join(tunnelDir(uuid), \"adopted.json\");\n}\n\n/**\n * Whether hestia has ever run this tunnel's connector. Gates the takeover\n * preflight: once adopted, live connections on the tunnel are (presumed)\n * hestia's own connector, not a foreign replica.\n */\nexport function isAdopted(uuid: string): boolean {\n return existsSync(adoptedMarker(uuid));\n}\n\nexport interface AdoptedRef {\n uuid: string;\n name: string;\n credFile: string;\n /** True when a legacy `{at}`-only marker was rebuilt from conventions/mirrors. */\n reconstructed: boolean;\n}\n\n/**\n * Read the adopted-tunnel ref for connector revival with no live CLI context.\n * Markers written before the ref was persisted (legacy `{at}`-only) are\n * reconstructed: uuid = the dir name, credFile by ~/.cloudflared convention,\n * name from any stack mirror pinned to this uuid (falls back to the uuid —\n * base-rule import matches by uuid too, so only name-keyed user configs\n * degrade, and callers can warn via `reconstructed`). The marker heals itself:\n * every successful reconcile rewrites it enriched.\n */\nexport function readAdopted(uuid: string): AdoptedRef | null {\n const p = adoptedMarker(uuid);\n if (!existsSync(p)) return null;\n let marker: { schemaVersion?: number; name?: string; credFile?: string };\n try {\n marker = JSON.parse(readFileSync(p, \"utf8\")) as typeof marker;\n } catch {\n marker = {};\n }\n if (\n marker.schemaVersion === STATE_SCHEMA_VERSION &&\n typeof marker.name === \"string\" &&\n typeof marker.credFile === \"string\"\n ) {\n return { uuid, name: marker.name, credFile: marker.credFile, reconstructed: false };\n }\n let name: string | undefined;\n const stacksDir = join(hestiaHome(), \"stacks\");\n if (existsSync(stacksDir)) {\n for (const project of readdirSync(stacksDir)) {\n const sp = join(stacksDir, project, \"stack.json\");\n if (!existsSync(sp)) continue;\n try {\n const record = parseStackRecord(readFileSync(sp, \"utf8\"), sp);\n if (record.tunnel?.uuid === uuid) {\n name = record.tunnel.name;\n break;\n }\n } catch {\n // unreadable mirror — keep scanning\n }\n }\n }\n return {\n uuid,\n name: name ?? uuid,\n credFile: marker.credFile ?? credFilePath(uuid),\n reconstructed: true,\n };\n}\n\n/** Every tunnel uuid this machine has adopted (daemon supervision set). */\nexport function listAdopted(): string[] {\n const root = join(hestiaHome(), \"tunnel\");\n if (!existsSync(root)) return [];\n return readdirSync(root).filter((uuid) => isAdopted(uuid));\n}\n\n/** Hostnames hestia has route-dns'ed — the ledger that makes re-routing a no-op. */\nfunction ledgerPath(uuid: string): string {\n return join(tunnelDir(uuid), \"hostnames.json\");\n}\n\nexport function ledgerHas(uuid: string, hostname: string): boolean {\n const p = ledgerPath(uuid);\n if (!existsSync(p)) return false;\n try {\n return (JSON.parse(readFileSync(p, \"utf8\")) as string[]).includes(hostname);\n } catch {\n return false;\n }\n}\n\nexport function ledgerAdd(uuid: string, hostname: string): void {\n mkdirSync(tunnelDir(uuid), { recursive: true });\n const p = ledgerPath(uuid);\n const cur = existsSync(p)\n ? (JSON.parse(readFileSync(p, \"utf8\")) as string[])\n : [];\n if (!cur.includes(hostname)) {\n writeAtomicJsonFile(p, [...cur, hostname]);\n }\n}\n\n/**\n * Every worktree's exposures for this tunnel, read from the stack mirrors —\n * the same mirrors `down --project` uses, so rules follow stack lifecycle\n * even after a worktree directory is deleted. Exposures whose service no\n * longer exists in the stack are dropped (the hostname 404s at the catch-all\n * instead of pointing at a recycled port).\n */\nexport function collectDynamicRules(uuid: string): {\n rules: DynamicRule[];\n dropped: Array<{ project: string; service: string; hostname: string }>;\n} {\n const stacksDir = join(hestiaHome(), \"stacks\");\n const rules: DynamicRule[] = [];\n const dropped: Array<{ project: string; service: string; hostname: string }> = [];\n if (!existsSync(stacksDir)) return { rules, dropped };\n for (const project of readdirSync(stacksDir)) {\n const p = join(stacksDir, project, \"stack.json\");\n if (!existsSync(p)) continue;\n let record: StackRecord;\n try {\n record = parseStackRecord(readFileSync(p, \"utf8\"), p);\n } catch {\n continue;\n }\n if (record.tunnel?.uuid !== uuid) continue;\n for (const exp of record.tunnel.exposures) {\n const svc = record.services.find((s) => s.name === exp.service);\n const binding = svc?.bindings?.find((candidate) =>\n `${candidate.target}/${candidate.protocol}` === exp.binding);\n const publishedPort = binding?.publishedPort ?? svc?.publishedPort;\n if (svc === undefined || publishedPort === undefined) {\n dropped.push({ project, service: exp.service, hostname: exp.hostname });\n continue;\n }\n // The stack's own regen hooks keep originPort current; the live record\n // is still authoritative in case this regen races a restart.\n rules.push({ ...exp, originPort: publishedPort, project });\n }\n }\n return { rules, dropped };\n}\n\nexport interface ReconcileOutcome {\n /** Connector was (re)started this call — the \"blip\". */\n restarted: boolean;\n /** Metrics port of the live connector, when one is running. */\n metricsPort?: number;\n ready: boolean;\n warnings: string[];\n error?: HestiaError;\n}\n\n/**\n * Converge the connector on the merged ingress derived from disk. Idempotent:\n * unchanged config + live connector = no-op. Serialized machine-wide by the\n * tunnel dir's lock; callers must NOT hold it (lock order: worktree → global).\n */\nexport async function reconcileTunnel(\n ref: Pick<TunnelRef, \"uuid\" | \"name\" | \"credFile\">,\n opts?: { force?: boolean; readyTimeoutMs?: number },\n): Promise<ReconcileOutcome> {\n const dir = tunnelDir(ref.uuid);\n mkdirSync(dir, { recursive: true });\n\n return withLock(dir, async () => {\n const warnings: string[] = [];\n const baseRules = importBaseRules(ref.uuid, ref.name);\n const { rules, dropped } = collectDynamicRules(ref.uuid);\n for (const d of dropped) {\n warnings.push(\n `exposure ${d.hostname} dropped — service \"${d.service}\" of ` +\n `${d.project} is not running (hostname now 404s)`,\n );\n }\n\n const cfgPath = configPath(ref.uuid);\n const nextConfig = generateMergedConfig({\n uuid: ref.uuid,\n credFile: ref.credFile,\n baseRules,\n dynamicRules: rules,\n });\n\n const pf = readPidfile(dir, CONNECTOR);\n const live = pf !== null && isLive(pf);\n const currentConfig = existsSync(cfgPath)\n ? readFileSync(cfgPath, \"utf8\")\n : null;\n\n if (live && currentConfig === nextConfig) {\n return { restarted: false, metricsPort: pf.port, ready: true, warnings };\n }\n\n // Nothing to serve and nothing imported: stop rather than run a 404-only\n // connector (first adoption with no exposures never gets here — expose\n // writes its records before reconciling).\n if (baseRules.length === 0 && rules.length === 0) {\n if (pf !== null) {\n await stopProcTree(pf);\n removePidfile(dir, CONNECTOR);\n }\n return { restarted: false, ready: false, warnings };\n }\n\n if (pf !== null) {\n await stopProcTree(pf);\n removePidfile(dir, CONNECTOR);\n }\n writeAtomicTextFile(cfgPath, nextConfig);\n\n const result = await startProc(\n dir,\n {\n name: CONNECTOR,\n argv: [\n \"cloudflared\",\n \"tunnel\",\n \"--config\",\n cfgPath,\n \"--metrics\",\n \"127.0.0.1:{port}\",\n \"--grace-period\",\n \"5s\",\n \"--no-autoupdate\",\n \"run\",\n ref.uuid,\n ],\n port: \"auto\",\n backend: \"tunnel\",\n readyTimeoutMs: opts?.readyTimeoutMs ?? READY_TIMEOUT_MS,\n },\n {},\n );\n if (result.error !== undefined) {\n // metrics port never bound — connector is misbehaving; surface as\n // tunnel-ready-timeout but leave it running for inspection.\n return {\n restarted: true,\n metricsPort: result.record.publishedPort,\n ready: false,\n warnings,\n error: new HestiaError(\n \"tunnel-ready-timeout\",\n `connector did not bind its metrics port — logs: ${result.record.logPath}`,\n ),\n };\n }\n\n // Enriched so revival (daemon duties) can rebuild the ref with zero live\n // stacks; also heals legacy `{at}`-only markers on their first reconcile.\n writeAtomicJsonFile(\n adoptedMarker(ref.uuid),\n {\n schemaVersion: STATE_SCHEMA_VERSION,\n at: new Date().toISOString(),\n uuid: ref.uuid,\n name: ref.name,\n credFile: ref.credFile,\n },\n );\n\n const metricsPort = result.record.publishedPort!;\n const ready = await pollReady(\n metricsPort,\n opts?.readyTimeoutMs ?? READY_TIMEOUT_MS,\n );\n return {\n restarted: true,\n metricsPort,\n ready,\n warnings,\n error: ready\n ? undefined\n : new HestiaError(\n \"tunnel-ready-timeout\",\n `connector is running but reported no edge connection in time ` +\n `(offline?) — left running, it will keep retrying; logs: ` +\n `${result.record.logPath}`,\n ),\n };\n });\n}\n\n/** Live connector view for `status`: pidfile identity + one-shot /ready. */\nexport function connectorPidfile(uuid: string) {\n return readPidfile(tunnelDir(uuid), CONNECTOR);\n}\n",
|
|
111
|
+
"export const MAX_LOG_LINE_BYTES = 64 * 1024;\nexport const LOG_LINE_TRUNCATION_MARKER = \"… [hestia: line truncated]\";\n\nexport interface BoundedLogText {\n text: string;\n truncated?: true;\n}\n\nfunction utf8Prefix(text: string, maxBytes: number): string {\n const source = Buffer.from(text);\n if (source.byteLength <= maxBytes) return text;\n let bounded = source.subarray(0, maxBytes).toString(\"utf8\");\n if (bounded.endsWith(\"�\")) bounded = bounded.slice(0, -1);\n return bounded;\n}\n\n/** Bound one complete application log line to the daemon-safe byte ceiling. */\nexport function boundLogLine(text: string): BoundedLogText {\n if (Buffer.byteLength(text) <= MAX_LOG_LINE_BYTES) return { text };\n const payloadBytes = MAX_LOG_LINE_BYTES - Buffer.byteLength(LOG_LINE_TRUNCATION_MARKER);\n return {\n text: utf8Prefix(text, payloadBytes) + LOG_LINE_TRUNCATION_MARKER,\n truncated: true,\n };\n}\n\n/** Incrementally split log chunks without retaining an unbounded unterminated line. */\nexport class BoundedLogLineAccumulator {\n #pending = \"\";\n #truncated = false;\n\n push(chunk: string): BoundedLogText[] {\n const parts = chunk.split(\"\\n\");\n const complete: BoundedLogText[] = [];\n for (let index = 0; index < parts.length; index += 1) {\n this.#append(parts[index]!);\n if (index < parts.length - 1) complete.push(this.#finish());\n }\n return complete;\n }\n\n flush(): BoundedLogText | null {\n if (this.#pending === \"\" && !this.#truncated) return null;\n return this.#finish();\n }\n\n /** Restore an unterminated backfill line before following appended bytes. */\n seed(line: BoundedLogText): void {\n this.#pending = line.truncated\n ? line.text.slice(0, -LOG_LINE_TRUNCATION_MARKER.length)\n : line.text;\n this.#truncated = line.truncated === true;\n }\n\n reset(): void {\n this.#pending = \"\";\n this.#truncated = false;\n }\n\n #append(text: string): void {\n if (this.#truncated) return;\n const combined = this.#pending + text;\n if (Buffer.byteLength(combined) <= MAX_LOG_LINE_BYTES) {\n this.#pending = combined;\n return;\n }\n const payloadBytes = MAX_LOG_LINE_BYTES - Buffer.byteLength(LOG_LINE_TRUNCATION_MARKER);\n this.#pending = utf8Prefix(combined, payloadBytes);\n this.#truncated = true;\n }\n\n #finish(): BoundedLogText {\n const result: BoundedLogText = this.#truncated\n ? { text: this.#pending + LOG_LINE_TRUNCATION_MARKER, truncated: true }\n : { text: this.#pending };\n this.reset();\n return result;\n }\n}\n",
|
|
112
|
+
"import { spawn } from \"node:child_process\";\nimport { BoundedLogLineAccumulator } from \"./log-line-bounds.ts\";\n\nexport type ComposeLogEvent =\n | { kind: \"line\"; text: string; truncated?: true }\n | { kind: \"meta\"; text: string };\n\nexport interface ComposeLogOptions {\n follow?: boolean;\n tail?: number;\n signal?: AbortSignal;\n}\n\n/** Stream one compose service incrementally without requiring compose files or a cwd. */\nexport async function* composeLogLines(\n project: string,\n service: string,\n options: ComposeLogOptions = {},\n): AsyncGenerator<ComposeLogEvent> {\n const args = [\n \"compose\",\n \"-p\",\n project,\n \"logs\",\n \"--no-color\",\n \"--no-log-prefix\",\n \"--tail\",\n String(Math.max(0, options.tail ?? 50)),\n ];\n if (options.follow) args.push(\"--follow\");\n args.push(service);\n\n const child = spawn(\"docker\", args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n const completion = new Promise<number | null>((resolve) => child.once(\"close\", resolve));\n let stderr = \"\";\n let spawnErrorMessage: string | undefined;\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk: string) => {\n stderr = (stderr + chunk).slice(-4096);\n });\n child.once(\"error\", (error) => {\n spawnErrorMessage = error.message;\n });\n const abort = () => child.kill(\"SIGTERM\");\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n\n try {\n const accumulator = new BoundedLogLineAccumulator();\n child.stdout.setEncoding(\"utf8\");\n for await (const chunk of child.stdout) {\n for (const line of accumulator.push(chunk as string)) {\n yield { kind: \"line\", ...line };\n }\n }\n const pending = accumulator.flush();\n if (pending !== null) yield { kind: \"line\", ...pending };\n const exitCode = await completion;\n if (spawnErrorMessage !== undefined) {\n yield { kind: \"meta\", text: `docker logs unavailable: ${spawnErrorMessage}` };\n } else if (exitCode !== 0 && !options.signal?.aborted) {\n const detail = stderr.trim().split(\"\\n\").at(-1) ?? `exit ${exitCode}`;\n yield { kind: \"meta\", text: `docker logs failed: ${detail}` };\n } else if (options.follow && !options.signal?.aborted) {\n yield { kind: \"meta\", text: \"docker log stream ended\" };\n }\n } finally {\n options.signal?.removeEventListener(\"abort\", abort);\n if (child.exitCode === null) child.kill(\"SIGTERM\");\n }\n}\n",
|
|
113
|
+
"import {\n closeSync,\n openSync,\n readSync,\n statSync,\n type Stats,\n} from \"node:fs\";\nimport { StringDecoder } from \"node:string_decoder\";\nimport { BoundedLogLineAccumulator, boundLogLine, type BoundedLogText } from \"./log-line-bounds.ts\";\n\nconst BACKFILL_CHUNK_BYTES = 64 * 1024;\nconst MAX_BACKFILL_SCAN_BYTES = 4 * 1024 * 1024;\nconst FORWARD_CHUNK_BYTES = 64 * 1024;\nconst LOG_POLL_MS = 200;\n\nexport type TailEvent =\n | { kind: \"line\"; text: string; truncated?: true }\n | { kind: \"reset\" }\n | { kind: \"gone\" }\n | { kind: \"absent\" };\n\nexport interface TailFileOptions {\n follow?: boolean;\n tail?: number;\n signal?: AbortSignal;\n}\n\nfunction statOrNull(path: string): Stats | null {\n try {\n return statSync(path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n}\n\nfunction readLastLineEventsBeforeOffset(\n path: string,\n count: number,\n endOffset: number,\n): BoundedLogText[] {\n if (count <= 0 || endOffset <= 0) return [];\n const fd = openSync(path, \"r\");\n try {\n let cursor = endOffset;\n let bytes = Buffer.alloc(0);\n let newlineCount = 0;\n const scanFloor = Math.max(0, endOffset - MAX_BACKFILL_SCAN_BYTES);\n while (cursor > scanFloor && newlineCount <= count) {\n const length = Math.min(BACKFILL_CHUNK_BYTES, cursor - scanFloor);\n cursor -= length;\n const chunk = Buffer.allocUnsafe(length);\n const read = readSync(fd, chunk, 0, length, cursor);\n const actual = chunk.subarray(0, read);\n newlineCount += actual.reduce((n, byte) => n + (byte === 10 ? 1 : 0), 0);\n bytes = Buffer.concat([actual, bytes]);\n }\n const lines = bytes.toString(\"utf8\").split(\"\\n\");\n if (lines.at(-1) === \"\") lines.pop();\n return lines.slice(-count).map(boundLogLine);\n } finally {\n closeSync(fd);\n }\n}\n\n/** Read the last complete or unterminated lines from a file in backward chunks. */\nexport function readLastLines(path: string, count: number): string[] {\n const stat = statOrNull(path);\n if (stat === null) return [];\n return readLastLineEventsBeforeOffset(path, count, stat.size).map((line) => line.text);\n}\n\nfunction waitForLogPoll(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timer = setTimeout(done, LOG_POLL_MS);\n function done() {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\nfunction sameFile(left: Stats, right: Stats): boolean {\n return left.ino === right.ino && left.dev === right.dev;\n}\n\n/** Tail one proc log with ordered backfill, reset detection, and polling cancellation. */\nexport async function* tailFile(\n path: string,\n options: TailFileOptions = {},\n): AsyncGenerator<TailEvent> {\n const follow = options.follow ?? false;\n const tail = Math.max(0, options.tail ?? 50);\n let identity = statOrNull(path);\n let existed = identity !== null;\n let offset = identity?.size ?? 0;\n const accumulator = new BoundedLogLineAccumulator();\n let decoder = new StringDecoder(\"utf8\");\n\n if (identity === null) {\n yield { kind: \"absent\" };\n if (!follow) return;\n } else {\n // Snapshot the forward cursor first. Backfill can then finish completely\n // before follow reads anything appended after this point.\n const backfill = readLastLineEventsBeforeOffset(path, tail, offset);\n if (follow && offset > 0) {\n const fd = openSync(path, \"r\");\n try {\n const lastByte = Buffer.allocUnsafe(1);\n readSync(fd, lastByte, 0, 1, offset - 1);\n if (lastByte[0] !== 10) {\n const partial = backfill.pop();\n if (partial !== undefined) accumulator.seed(partial);\n }\n } finally {\n closeSync(fd);\n }\n }\n for (const line of backfill) {\n yield { kind: \"line\", ...line };\n }\n if (!follow) return;\n }\n\n while (!options.signal?.aborted) {\n const current = statOrNull(path);\n if (current === null) {\n if (existed) {\n const decoded = decoder.end();\n if (decoded !== \"\") accumulator.push(decoded);\n const pending = accumulator.flush();\n if (pending !== null) yield { kind: \"line\", ...pending };\n yield { kind: \"gone\" };\n return;\n }\n await waitForLogPoll(options.signal);\n continue;\n }\n\n if (identity === null) {\n identity = current;\n existed = true;\n offset = 0;\n } else if (!sameFile(identity, current) || current.size < offset) {\n identity = current;\n offset = 0;\n accumulator.reset();\n decoder = new StringDecoder(\"utf8\");\n yield { kind: \"reset\" };\n }\n\n if (current.size > offset) {\n const fd = openSync(path, \"r\");\n try {\n while (offset < current.size) {\n const length = Math.min(FORWARD_CHUNK_BYTES, current.size - offset);\n const chunk = Buffer.allocUnsafe(length);\n const read = readSync(fd, chunk, 0, length, offset);\n if (read <= 0) break;\n offset += read;\n for (const line of accumulator.push(decoder.write(chunk.subarray(0, read)))) {\n yield { kind: \"line\", ...line };\n }\n }\n } finally {\n closeSync(fd);\n }\n }\n await waitForLogPoll(options.signal);\n }\n}\n",
|
|
114
|
+
"import {\n HestiaError,\n type LogLine,\n type LogsOptions,\n type ServiceRecord,\n type StackRecord,\n} from \"@hestia/core\";\nimport { composeLogLines } from \"./compose.ts\";\nimport { tailFile, type TailEvent } from \"./tail.ts\";\n\nexport interface LogMergeQueueItem {\n line?: LogLine;\n done?: true;\n}\n\n/** Bounded arrival-order queue whose blocked log producers wake on abort or close. */\nexport class BoundedLogMergeQueue {\n readonly #items: LogMergeQueueItem[] = [];\n readonly #waiters: Array<(item: LogMergeQueueItem) => void> = [];\n readonly #capacityWaiters: Array<() => void> = [];\n #closed = false;\n\n constructor(readonly capacity = 256) {}\n\n async push(item: LogMergeQueueItem, signal?: AbortSignal): Promise<boolean> {\n while (!this.#closed && !signal?.aborted && this.#items.length >= this.capacity) {\n await new Promise<void>((resolve) => {\n const done = () => {\n signal?.removeEventListener(\"abort\", done);\n resolve();\n };\n this.#capacityWaiters.push(done);\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n }\n if (this.#closed || signal?.aborted) return false;\n const waiter = this.#waiters.shift();\n if (waiter !== undefined) waiter(item);\n else this.#items.push(item);\n return true;\n }\n\n next(): Promise<LogMergeQueueItem> {\n const item = this.#items.shift();\n if (item !== undefined) {\n this.#capacityWaiters.shift()?.();\n return Promise.resolve(item);\n }\n if (this.#closed) return Promise.resolve({ done: true });\n return new Promise((resolve) => this.#waiters.push(resolve));\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n for (const wake of this.#capacityWaiters.splice(0)) wake();\n for (const waiter of this.#waiters.splice(0)) waiter({ done: true });\n }\n}\n\nfunction metaLine(record: StackRecord, service: ServiceRecord, text: string): LogLine {\n return { project: record.project, service: service.name, source: service.backend, text, meta: true };\n}\n\nfunction mapTailEvent(\n record: StackRecord,\n service: ServiceRecord,\n event: TailEvent,\n follow: boolean,\n): LogLine {\n switch (event.kind) {\n case \"line\":\n return {\n project: record.project,\n service: service.name,\n source: service.backend,\n text: event.text,\n truncated: event.truncated,\n };\n case \"reset\":\n return metaLine(record, service, \"log reset — proc restarted\");\n case \"gone\":\n return metaLine(record, service, \"log file removed (worktree deleted?)\");\n case \"absent\":\n return metaLine(record, service, follow ? \"waiting for log file\" : \"log file unavailable\");\n }\n}\n\nfunction selectLogServices(record: StackRecord, requested?: string[]): ServiceRecord[] {\n if (requested === undefined || requested.length === 0) return record.services;\n const selected: ServiceRecord[] = [];\n for (const name of requested) {\n const service = record.services.find((candidate) => candidate.name === name);\n if (service === undefined) {\n throw new HestiaError(\"service-not-found\", `service \"${name}\" is not in stack \"${record.project}\"`);\n }\n if (!selected.includes(service)) selected.push(service);\n }\n return selected;\n}\n\n/** Merge every selected stack source by arrival order and tear all sources down on return. */\nexport async function* streamStackLogs(\n record: StackRecord,\n options: LogsOptions = {},\n): AsyncGenerator<LogLine> {\n const services = selectLogServices(record, options.services);\n if (services.length === 0 || options.signal?.aborted) return;\n const controller = new AbortController();\n const queue = new BoundedLogMergeQueue();\n const abort = () => {\n controller.abort();\n queue.close();\n };\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n let active = services.length;\n\n const pumps = services.map(async (service) => {\n try {\n if (service.backend === \"docker\") {\n for await (const event of composeLogLines(record.project, service.name, {\n follow: options.follow,\n tail: options.tail,\n signal: controller.signal,\n })) {\n await queue.push({\n line:\n event.kind === \"line\"\n ? {\n project: record.project,\n service: service.name,\n source: service.backend,\n text: event.text,\n truncated: event.truncated,\n }\n : metaLine(record, service, event.text),\n }, controller.signal);\n }\n } else if (service.logPath === undefined) {\n await queue.push({ line: metaLine(record, service, \"log path unavailable\") }, controller.signal);\n } else {\n for await (const event of tailFile(service.logPath, {\n follow: options.follow,\n tail: options.tail,\n signal: controller.signal,\n })) {\n await queue.push(\n { line: mapTailEvent(record, service, event, options.follow ?? false) },\n controller.signal,\n );\n }\n }\n } catch (error) {\n await queue.push(\n { line: metaLine(record, service, `log source unreadable: ${(error as Error).message}`) },\n controller.signal,\n );\n } finally {\n active -= 1;\n if (active === 0) await queue.push({ done: true }, controller.signal);\n }\n });\n\n try {\n while (true) {\n const item = await queue.next();\n if (item.done) break;\n if (item.line !== undefined) yield item.line;\n }\n } finally {\n controller.abort();\n queue.close();\n options.signal?.removeEventListener(\"abort\", abort);\n await Promise.allSettled(pumps);\n }\n}\n",
|
|
115
|
+
"import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { execFile } from \"node:child_process\";\nimport { dirname, join } from \"node:path\";\nimport { LABELS, type StackRecord } from \"@hestia/core\";\nimport { getRepoInfo } from \"./git.ts\";\nimport { tryLoadConfig } from \"./config.ts\";\nimport { hestiaDir, hestiaHome, parseStackRecord, readState } from \"./state.ts\";\nimport { isLive, listPidfiles, procsDir } from \"./proc/pidfile.ts\";\nimport { detectVarlock } from \"./proc/resolver.ts\";\nimport { discoverWorkers } from \"./wrangler/discover.ts\";\nimport { connectorPidfile, listAdopted, readAdopted } from \"./tunnel/registry.ts\";\nimport { listTunnels } from \"./tunnel/cloudflared.ts\";\nimport { isReady } from \"./tunnel/verify.ts\";\nimport { fetchHealth, readDaemonJson } from \"./daemon/client.ts\";\nimport { HESTIAD_PROTOCOL_VERSION } from \"./daemon/routes.ts\";\nimport { plistPath } from \"./daemon/launchd.ts\";\nimport { readHestiaMachineConfig } from \"./router/router-config.ts\";\nimport { readHestiaRouterStatus } from \"./router/portless-adapter.ts\";\nimport { readRouterStackRecords } from \"./router/local-http-router.ts\";\n\n/**\n * `hestia doctor` — report-only, never mutates. Doctor is the tool you reach\n * for when things are broken, so it must not hang on a wedged docker socket\n * or an offline Cloudflare call: every check is individually time-bounded and\n * they all run concurrently. A timed-out check reports `unknown` and never\n * fails the run; only `error` rows set the exit code.\n */\n\nexport interface DoctorRow {\n check: string;\n level: \"ok\" | \"warn\" | \"error\" | \"unknown\";\n detail: string;\n}\n\nconst CHECK_TIMEOUT_MS = 5_000;\n\nfunction row(check: string, level: DoctorRow[\"level\"], detail: string): DoctorRow {\n return { check, level, detail };\n}\n\nasync function bounded(\n check: string,\n fn: () => Promise<DoctorRow[]>,\n timeoutMs = CHECK_TIMEOUT_MS,\n): Promise<DoctorRow[]> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<DoctorRow[]>((resolve) => {\n timer = setTimeout(() => resolve([row(check, \"unknown\", \"timed out\")]), timeoutMs);\n });\n try {\n return await Promise.race([fn(), timeout]);\n } catch (err) {\n return [row(check, \"unknown\", `check failed: ${(err as Error).message}`)];\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction exec(\n cmd: string,\n args: string[],\n timeoutMs = CHECK_TIMEOUT_MS - 500,\n): Promise<{ ok: boolean; stdout: string; message: string }> {\n return new Promise((resolve) => {\n execFile(cmd, args, { timeout: timeoutMs, encoding: \"utf8\" }, (err, stdout, stderr) => {\n resolve({\n ok: err === null,\n stdout: stdout ?? \"\",\n message: err !== null ? (stderr || err.message).trim().split(\"\\n\")[0]! : \"\",\n });\n });\n });\n}\n\ninterface RepoCtx {\n worktreeRoot: string;\n record: StackRecord | null;\n hasCompose: boolean;\n}\n\nasync function envChecks(ctx: RepoCtx | null): Promise<DoctorRow[]> {\n const rows: DoctorRow[] = [];\n if (ctx?.hasCompose) {\n if (Bun.which(\"docker\") === null) {\n rows.push(row(\"docker\", \"error\", \"compose file present but docker is not on PATH\"));\n } else {\n const v = await exec(\"docker\", [\"version\", \"--format\", \"{{.Server.Version}}\"]);\n rows.push(\n v.ok\n ? row(\"docker\", \"ok\", `daemon ${v.stdout.trim()}`)\n : row(\"docker\", \"error\", `docker daemon unreachable: ${v.message}`),\n );\n }\n }\n if (ctx !== null) {\n const ignored = await exec(\"git\", [\"-C\", ctx.worktreeRoot, \"check-ignore\", \"-q\", \".hestia/\"]);\n rows.push(\n ignored.ok\n ? row(\"state-ignore\", \"ok\", \".hestia/ is ignored\")\n : row(\n \"state-ignore\",\n \"error\",\n `add the exact line \".hestia/\" to ${join(ctx.worktreeRoot, \".gitignore\")}`,\n ),\n );\n const schema = existsSync(join(ctx.worktreeRoot, \".env.schema\"));\n if (schema) {\n rows.push(\n detectVarlock(ctx.worktreeRoot) !== null\n ? row(\"varlock\", \"ok\", \"local varlock found — worker env composition active\")\n : row(\"varlock\", \"warn\", \".env.schema present but no local varlock (bun install?)\"),\n );\n }\n const workers = discoverWorkers(ctx.worktreeRoot);\n if (workers.length > 0) {\n // same resolution as the adapter: nearest node_modules/.bin/wrangler\n // walking up from each config dir (pnpm links per-package, not root)\n const missing = workers.filter((w) => {\n let dir = dirname(w.configPath);\n for (;;) {\n if (existsSync(join(dir, \"node_modules\", \".bin\", \"wrangler\"))) return false;\n if (dir === ctx.worktreeRoot || dirname(dir) === dir) return true;\n dir = dirname(dir);\n }\n });\n rows.push(\n missing.length === 0\n ? row(\"wrangler\", \"ok\", `${workers.length} config(s), local binary reachable for all`)\n : row(\n \"wrangler\",\n \"error\",\n `${missing.length}/${workers.length} config(s) have no local wrangler binary (install deps)`,\n ),\n );\n }\n }\n if (listAdopted().length > 0 && Bun.which(\"cloudflared\") === null) {\n rows.push(row(\"cloudflared\", \"error\", \"tunnel adopted but cloudflared is not on PATH\"));\n }\n return rows;\n}\n\nasync function repoChecks(ctx: RepoCtx): Promise<DoctorRow[]> {\n const rows: DoctorRow[] = [];\n rows.push(\n ctx.hasCompose\n ? row(\"compose-file\", \"ok\", tryLoadConfig(ctx.worktreeRoot)!.composeFile)\n : row(\"compose-file\", \"warn\", \"none found — compose backend unavailable (run/workers still work)\"),\n );\n const ignored = await exec(\"git\", [\"-C\", ctx.worktreeRoot, \"check-ignore\", \"-q\", \".hestia\"]);\n rows.push(\n ignored.ok\n ? row(\"gitignore\", \"ok\", \".hestia is gitignored\")\n : row(\"gitignore\", \"warn\", \".hestia is NOT gitignored — stack state would be committed\"),\n );\n return rows;\n}\n\nasync function stateChecks(ctx: RepoCtx): Promise<DoctorRow[]> {\n const rows: DoctorRow[] = [];\n const { record, worktreeRoot } = ctx;\n if (record === null) {\n rows.push(row(\"stack\", \"ok\", \"no stack in this worktree\"));\n return rows;\n }\n // proc/wrangler liveness straight from pidfiles; docker via one label query\n const pidfiles = new Map(listPidfiles(procsDir(worktreeRoot)).map((pf) => [pf.name, pf]));\n for (const svc of record.services) {\n if (svc.backend === \"docker\") continue;\n const pf = pidfiles.get(svc.name);\n const live = pf !== undefined && isLive(pf);\n if (!live && svc.state === \"healthy\") {\n rows.push(row(`service:${svc.name}`, \"warn\", \"recorded healthy but the process is dead\"));\n }\n }\n if (record.services.some((s) => s.backend === \"docker\") && Bun.which(\"docker\") !== null) {\n const ps = await exec(\"docker\", [\n \"ps\",\n \"--filter\",\n `label=${LABELS.stack}=${record.project}`,\n \"--format\",\n \"{{.Names}}\",\n ]);\n if (ps.ok && ps.stdout.trim() === \"\") {\n rows.push(row(\"containers\", \"warn\", \"recorded compose services but no containers running\"));\n }\n }\n // exposure port drift = live cross-worktree leak (the OS recycles ports)\n for (const exp of record.tunnel?.exposures ?? []) {\n const svc = record.services.find((s) => s.name === exp.service);\n const binding = svc?.bindings?.find((candidate) =>\n `${candidate.target}/${candidate.protocol}` === exp.binding);\n const publishedPort = binding?.publishedPort ?? svc?.publishedPort;\n if (publishedPort !== undefined && publishedPort !== exp.originPort) {\n rows.push(\n row(\n `exposure:${exp.service}`,\n \"error\",\n `ingress rule points at port ${exp.originPort} but the service owns ` +\n `${publishedPort} — a recycled port serves ANOTHER worktree; ` +\n `run any hestia command to resync, this should not persist`,\n ),\n );\n }\n }\n const lockPath = join(hestiaDir(worktreeRoot), \"lock\");\n if (existsSync(lockPath)) {\n try {\n const holder = JSON.parse(readFileSync(lockPath, \"utf8\")) as {\n pid: number;\n startTime: string;\n };\n if (!isLive(holder)) {\n rows.push(row(\"lock\", \"warn\", \"stale worktree lock (dead holder) — auto-broken on next command\"));\n }\n } catch {\n rows.push(row(\"lock\", \"warn\", \"unreadable worktree lock file\"));\n }\n }\n const mirror = join(hestiaHome(), \"stacks\", record.project, \"stack.json\");\n if (!existsSync(mirror)) {\n rows.push(row(\"mirror\", \"warn\", \"no ~/.hestia mirror — `down --project` would not work after worktree deletion\"));\n }\n return rows;\n}\n\n/** Machine-wide checks: orphan mirrors + labeled containers with no mirror. */\nasync function machineChecks(): Promise<DoctorRow[]> {\n const rows: DoctorRow[] = [];\n const stacksDir = join(hestiaHome(), \"stacks\");\n const mirrored = new Set<string>();\n if (existsSync(stacksDir)) {\n for (const project of readdirSync(stacksDir)) {\n const p = join(stacksDir, project, \"stack.json\");\n if (!existsSync(p)) continue;\n mirrored.add(project);\n try {\n const rec = parseStackRecord(readFileSync(p, \"utf8\"), p);\n if (!existsSync(rec.worktree)) {\n rows.push(\n row(\n `orphan-mirror:${project}`,\n \"warn\",\n `worktree ${rec.worktree} is gone — \\`hestia down --project ${project}\\` to clean up`,\n ),\n );\n }\n } catch {\n rows.push(row(`mirror:${project}`, \"warn\", \"unreadable mirror stack.json\"));\n }\n }\n }\n if (Bun.which(\"docker\") !== null) {\n const ps = await exec(\"docker\", [\n \"ps\",\n \"--format\",\n `{{.Label \"${LABELS.stack}\"}}`,\n ]);\n if (ps.ok) {\n const labeled = new Set(ps.stdout.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n for (const project of labeled) {\n if (!mirrored.has(project)) {\n rows.push(\n row(\n `unmirrored-containers:${project}`,\n \"error\",\n `hestia-labeled containers with no mirror (crash before state write?) — ` +\n `\\`hestia down --project ${project}\\` to reclaim`,\n ),\n );\n }\n }\n }\n }\n return rows;\n}\n\nasync function tunnelChecks(): Promise<DoctorRow[]> {\n const rows: DoctorRow[] = [];\n const adopted = listAdopted();\n if (adopted.length === 0) return rows;\n let tunnels: Awaited<ReturnType<typeof listTunnels>> | null = null;\n try {\n tunnels = await listTunnels();\n } catch {\n tunnels = null; // offline / no cert — degrade below\n }\n for (const uuid of adopted) {\n const ref = readAdopted(uuid);\n const label = `tunnel:${ref?.name ?? uuid}`;\n const pf = connectorPidfile(uuid);\n const live = pf !== null && isLive(pf);\n if (!live) {\n rows.push(row(label, \"warn\", \"connector not running — the daemon (or the next hestia command) revives it\"));\n } else if (pf.port !== undefined) {\n rows.push(\n (await isReady(pf.port))\n ? row(label, \"ok\", \"connector live with an edge connection\")\n : row(label, \"warn\", \"connector running but no edge connection yet\"),\n );\n }\n if (tunnels === null) {\n rows.push(row(`${label}:connectors`, \"unknown\", \"cloudflare unreachable — cannot count connectors\"));\n } else {\n const info = tunnels.find((t) => t.id === uuid);\n const conns = info?.connections?.length ?? 0;\n const expected = live ? 1 : 0;\n if (conns > expected) {\n rows.push(\n row(\n `${label}:connectors`,\n \"error\",\n `${conns} connector(s) registered but hestia runs ${expected} — a foreign ` +\n `replica cross-wires worktrees; stop the other cloudflared`,\n ),\n );\n }\n }\n }\n return rows;\n}\n\nasync function daemonChecks(): Promise<DoctorRow[]> {\n const rows: DoctorRow[] = [];\n const j = readDaemonJson();\n const health = j !== null ? await fetchHealth(j.port) : null;\n if (health === null) {\n rows.push(row(\"daemon\", \"warn\", \"hestiad not running — starts on the next up/run (cap + supervision paused)\"));\n } else if (health.protocolVersion !== HESTIAD_PROTOCOL_VERSION) {\n rows.push(\n row(\n \"daemon\",\n \"warn\",\n `protocol v${health.protocolVersion} != CLI v${HESTIAD_PROTOCOL_VERSION} — restarts on next up/run`,\n ),\n );\n } else {\n rows.push(\n row(\"daemon\", \"ok\", `pid ${health.pid}, ${health.live}/${health.maxStacks} stacks, ${health.queued} queued`),\n );\n for (const w of health.warnings) rows.push(row(\"daemon-config\", \"warn\", w));\n }\n const plist = plistPath();\n if (existsSync(plist)) {\n const content = readFileSync(plist, \"utf8\");\n const args = [...content.matchAll(/<string>([^<]+)<\\/string>/g)].map((m) => m[1]!);\n const paths = args.filter((a) => a.startsWith(\"/\") && !a.includes(\":\"));\n const missing = paths.filter((p) => !existsSync(p));\n rows.push(\n missing.length === 0\n ? row(\"launchd\", \"ok\", `installed (${plist})`)\n : row(\"launchd\", \"error\", `plist references missing paths: ${missing.join(\", \")} — re-run \\`hestia daemon install\\``),\n );\n }\n return rows;\n}\n\nasync function localRouterChecks(): Promise<DoctorRow[]> {\n const rows: DoctorRow[] = [];\n const config = readHestiaMachineConfig();\n rows.push(\n config.valid\n ? row(\"config-toml\", \"ok\", config.path)\n : row(\"config-toml\", \"warn\", config.warnings.join(\"; \")),\n );\n const configuredRoutes = Object.values(config.config.router.repositories)\n .reduce((count, repository) => count + (repository?.services.length ?? 0), 0) +\n readRouterStackRecords().reduce((count, record) => count + (record.localRoutes?.length ?? 0), 0);\n const router = await readHestiaRouterStatus();\n if (!router.installed) {\n rows.push(row(\n \"local-router\",\n configuredRoutes > 0 ? \"warn\" : \"ok\",\n configuredRoutes > 0\n ? \"configured routes exist but the HTTPS router is not installed — run `hestia router install --interactive`\"\n : \"not installed (optional; direct ports remain available)\",\n ));\n } else {\n const usable = router.running && router.trusted;\n rows.push(row(\n \"local-router\",\n usable ? \"ok\" : \"warn\",\n usable\n ? `Portless ${router.version} serving on port ${router.port}`\n : router.running\n ? `Portless ${router.version} is running but its CA is not trusted — run \\`hestia router install --interactive\\``\n : `Portless ${router.version} installed but not reachable on port ${router.port}`,\n ));\n }\n return rows;\n}\n\nexport async function doctor(cwd: string): Promise<DoctorRow[]> {\n let ctx: RepoCtx | null = null;\n let repoRow: DoctorRow;\n try {\n const { worktreeRoot } = await getRepoInfo(cwd);\n ctx = {\n worktreeRoot,\n record: readState(worktreeRoot),\n hasCompose: tryLoadConfig(worktreeRoot) !== null,\n };\n repoRow = row(\"worktree\", \"ok\", worktreeRoot);\n } catch (err) {\n repoRow = row(\"worktree\", \"warn\", `not a git worktree (${(err as Error).message}) — repo/state checks skipped`);\n }\n\n const sections = await Promise.all([\n bounded(\"env\", () => envChecks(ctx)),\n ctx !== null ? bounded(\"repo\", () => repoChecks(ctx)) : Promise.resolve([]),\n ctx !== null ? bounded(\"state\", () => stateChecks(ctx)) : Promise.resolve([]),\n bounded(\"machine\", () => machineChecks()),\n bounded(\"tunnel\", () => tunnelChecks()),\n bounded(\"daemon\", () => daemonChecks()),\n bounded(\"local-router\", () => localRouterChecks()),\n ]);\n return [repoRow, ...sections.flat()];\n}\n",
|
|
116
|
+
"import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n LABELS,\n projectName,\n type FleetEnvelope,\n type FleetServiceView,\n type FleetSnapshot,\n type FleetStackPhase,\n type FleetStackView,\n type RepoId,\n type ServiceRecord,\n type StackIdentity,\n type StackRecord,\n} from \"@hestia/core\";\nimport { getRepoInfo } from \"../git.ts\";\nimport { allListeners, processTree, type Listener } from \"../proc/ports.ts\";\nimport { isLive, listPidfiles } from \"../proc/pidfile.ts\";\nimport { hestiaHome, mirrorProcsDir, parseStackRecord } from \"../state.ts\";\nimport {\n effectiveLocalRouteServices,\n readHestiaMachineConfig,\n type HestiaMachineConfig,\n} from \"../router/router-config.ts\";\nimport { resolvedLocalRouteHostname } from \"../router/local-http-router.ts\";\nimport { readHestiaRouterStatus } from \"../router/portless-adapter.ts\";\nimport { resolveMaxStacks, type SlotLedger, type StackReservation } from \"./slots.ts\";\n\nconst pexec = promisify(execFile);\nconst DEFAULT_REFRESH_MS = 1_000;\nconst DEFAULT_HEARTBEAT_MS = 15_000;\nconst MAX_MIRROR_BYTES = 2 * 1024 * 1024;\n\n/** Minimal admission view used by Fleet without entering the admission mutex. */\nexport interface FleetAdmissionSource {\n ledger: SlotLedger;\n queuedIdentitySnapshot(): StackIdentity[];\n}\n\ninterface ManagedMirrorResult {\n records: StackRecord[];\n warnings: string[];\n}\n\ninterface DockerServiceSnapshot {\n services: Map<string, Map<string, FleetServiceView[\"state\"]>> | null;\n warning?: string;\n}\n\nclass LatestFleetChannel {\n #pending: FleetEnvelope | undefined;\n #waiter: ((result: IteratorResult<FleetEnvelope>) => void) | undefined;\n #closed = false;\n\n push(frame: FleetEnvelope): void {\n if (this.#closed) return;\n const waiter = this.#waiter;\n if (waiter !== undefined) {\n this.#waiter = undefined;\n waiter({ value: frame, done: false });\n } else {\n if (this.#pending?.type === \"snapshot\" && frame.type === \"heartbeat\") return;\n this.#pending = frame;\n }\n }\n\n next(): Promise<IteratorResult<FleetEnvelope>> {\n if (this.#pending !== undefined) {\n const value = this.#pending;\n this.#pending = undefined;\n return Promise.resolve({ value, done: false });\n }\n if (this.#closed) return Promise.resolve({ value: undefined, done: true });\n return new Promise((resolve) => {\n this.#waiter = resolve;\n });\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#pending = undefined;\n this.#waiter?.({ value: undefined, done: true });\n this.#waiter = undefined;\n }\n}\n\nfunction readManagedMirrors(): ManagedMirrorResult {\n const records: StackRecord[] = [];\n const warnings: string[] = [];\n const stacksDirectory = join(hestiaHome(), \"stacks\");\n if (!existsSync(stacksDirectory)) return { records, warnings };\n for (const project of readdirSync(stacksDirectory).sort()) {\n const path = join(stacksDirectory, project, \"stack.json\");\n try {\n const source = readFileSync(path);\n if (source.byteLength > MAX_MIRROR_BYTES) {\n warnings.push(`Fleet mirror too large for ${project}`);\n continue;\n }\n const record = parseStackRecord(source.toString(\"utf8\"), path);\n if (record.project !== project) {\n warnings.push(`Fleet mirror project mismatch for ${project}`);\n continue;\n }\n records.push(record);\n } catch {\n warnings.push(`Fleet mirror unreadable for ${project}`);\n }\n }\n return { records, warnings };\n}\n\nasync function attributeLegacyRepoId(record: StackRecord): Promise<RepoId | null> {\n if (record.repoId !== undefined) return record.repoId;\n if (!existsSync(record.worktree)) return null;\n const info = await getRepoInfo(record.worktree);\n if (projectName(info.repoId, info.repo, info.branch, info.worktreeRoot) !== record.project) return null;\n return info.repoId;\n}\n\n/** Convert one bounded `docker ps` result into project/service health states. */\nexport function parseDockerFleetServices(\n stdout: string,\n): Map<string, Map<string, FleetServiceView[\"state\"]>> {\n const services = new Map<string, Map<string, FleetServiceView[\"state\"]>>();\n for (const line of stdout.split(\"\\n\")) {\n const [project, service, containerState, status] = line.trim().split(\"\\t\");\n if (!project || !service) continue;\n const projectServices = services.get(project) ??\n new Map<string, FleetServiceView[\"state\"]>();\n const healthy = containerState === \"running\" &&\n !/\\((?:unhealthy|health: starting)\\)/i.test(status ?? \"\");\n projectServices.set(service, healthy ? \"healthy\" : \"unhealthy\");\n services.set(project, projectServices);\n }\n return services;\n}\n\nasync function collectDockerServiceSnapshot(): Promise<DockerServiceSnapshot> {\n try {\n const { stdout } = await pexec(\n \"docker\",\n [\n \"ps\",\n \"--format\",\n `{{.Label \\\"${LABELS.stack}\\\"}}\\t{{.Label \\\"com.docker.compose.service\\\"}}\\t{{.State}}\\t{{.Status}}`,\n \"--filter\",\n `label=${LABELS.stack}`,\n ],\n { timeout: 5_000, maxBuffer: 4 * 1024 * 1024 },\n );\n return { services: parseDockerFleetServices(stdout) };\n } catch (error) {\n return {\n services: null,\n warning: `Fleet Docker probe unavailable: ${(error as Error).message}`,\n };\n }\n}\n\nasync function observeFleetService(\n record: StackRecord,\n service: ServiceRecord,\n docker: DockerServiceSnapshot,\n listeners: Listener[] | null,\n config: HestiaMachineConfig,\n localRouterUsable: boolean,\n): Promise<FleetServiceView> {\n let state: FleetServiceView[\"state\"];\n if (service.backend === \"docker\") {\n state = docker.services === null\n ? \"unknown\"\n : docker.services.get(record.project)?.get(service.name) ?? \"exited\";\n } else if (\n service.pid === undefined ||\n service.startTime === undefined ||\n !isLive({ pid: service.pid, startTime: service.startTime })\n ) {\n state = \"exited\";\n } else if (service.publishedPort === undefined) {\n state = \"healthy\";\n } else if (listeners === null) {\n state = \"unknown\";\n } else {\n const members = new Set(processTree(service.pid).map((member) => member.pid));\n const owner = listeners.find((listener) => listener.port === service.publishedPort);\n state = owner !== undefined && members.has(owner.pid) ? \"healthy\" : \"unhealthy\";\n }\n const endpointRecords = record.endpoints.filter(\n (candidate) => (candidate.workload ?? candidate.name) === service.name,\n );\n const locallyRouted = new Set(effectiveLocalRouteServices(record, config));\n const endpoints = endpointRecords.map((endpoint) => ({\n name: endpoint.name,\n workload: endpoint.workload,\n binding: endpoint.binding,\n kind: endpoint.kind,\n host: endpoint.host,\n port: endpoint.port,\n url: endpoint.url,\n localUrl: locallyRouted.has(endpoint.name) && localRouterUsable\n ? `https://${resolvedLocalRouteHostname(record, endpoint.name, config)}`\n : undefined,\n publicUrl: endpoint.publicUrl,\n }));\n return {\n name: service.name,\n backend: service.backend,\n state,\n publishedPort: service.publishedPort,\n endpoint: endpoints[0],\n endpoints,\n };\n}\n\nfunction deriveFleetPhase(record: StackRecord, services: FleetServiceView[]): FleetStackPhase {\n if (record.state === \"starting\" && record.starter !== undefined && isLive(record.starter)) {\n return \"starting\";\n }\n if (services.length === 0) return \"stopped\";\n if (services.every((service) => service.state === \"healthy\")) return \"up\";\n if (services.every((service) => service.state === \"exited\")) return \"stopped\";\n if (services.some((service) => service.state === \"unknown\")) return \"unknown\";\n return \"degraded\";\n}\n\nfunction syntheticFleetStack(identity: StackIdentity, phase: \"queued\" | \"reserved\"): FleetStackView {\n return { ...identity, phase, services: [] };\n}\n\nfunction reservationIdentity(\n reservation: StackReservation,\n records: StackRecord[],\n): StackIdentity | null {\n if (reservation.identity !== undefined) return reservation.identity;\n const record = records.find((candidate) => candidate.project === reservation.project);\n if (record?.repoId === undefined) return null;\n return {\n project: record.project,\n repoId: record.repoId,\n repo: record.repo,\n branch: record.branch,\n worktree: record.worktree,\n };\n}\n\n/** Collect one sanitized repository Fleet snapshot with a single machine-wide Docker query. */\nexport async function collectFleetSnapshot(\n repoId: RepoId,\n admission: FleetAdmissionSource,\n): Promise<FleetSnapshot> {\n const mirrorResult = readManagedMirrors();\n const machineConfig = readHestiaMachineConfig();\n const routerStatus = await readHestiaRouterStatus();\n const localRouterUsable = routerStatus.installed && routerStatus.running && routerStatus.trusted;\n const docker = await collectDockerServiceSnapshot();\n const warnings = [...mirrorResult.warnings, ...machineConfig.warnings];\n if (docker.warning !== undefined) warnings.push(docker.warning);\n const attributed: StackRecord[] = [];\n for (const record of mirrorResult.records) {\n const attributedRepoId = await attributeLegacyRepoId(record);\n if (attributedRepoId === null) {\n if (record.repoId === undefined) warnings.push(`Fleet excluded unattributed legacy mirror ${record.project}`);\n continue;\n }\n record.repoId = attributedRepoId;\n attributed.push(record);\n }\n\n let listeners: Listener[] | null = [];\n if (attributed.some((record) => record.services.some((service) =>\n service.backend !== \"docker\" && service.publishedPort !== undefined,\n ))) {\n try {\n listeners = await allListeners();\n } catch (error) {\n listeners = null;\n warnings.push(`Fleet port ownership probe unavailable: ${(error as Error).message}`);\n }\n }\n\n const liveMirroredProjects = new Set<string>();\n for (const record of attributed) {\n try {\n if (listPidfiles(mirrorProcsDir(record.project)).some(\n (pidfile) => pidfile.backend !== \"tunnel\" && isLive(pidfile),\n )) {\n liveMirroredProjects.add(record.project);\n }\n } catch {\n warnings.push(`Fleet pidfile mirror unreadable for ${record.project}`);\n }\n }\n\n const allStackViews: FleetStackView[] = [];\n for (const record of attributed) {\n const services = await Promise.all(\n record.services.map((service) => observeFleetService(\n record,\n service,\n docker,\n listeners,\n machineConfig.config,\n localRouterUsable,\n )),\n );\n const derivedPhase = deriveFleetPhase(record, services);\n allStackViews.push({\n project: record.project,\n repoId: record.repoId!,\n repo: record.repo,\n branch: record.branch,\n worktree: record.worktree,\n phase: derivedPhase === \"stopped\" && liveMirroredProjects.has(record.project)\n ? \"degraded\"\n : derivedPhase,\n services,\n createdAt: record.createdAt,\n });\n }\n const stackViews = allStackViews.filter((stack) => stack.repoId === repoId);\n\n const recordedProjects = new Set(stackViews.map((stack) => stack.project));\n const reservations = admission.ledger.reservationSnapshot();\n for (const reservation of reservations) {\n const identity = reservationIdentity(reservation, attributed);\n if (identity?.repoId === repoId) {\n const existing = stackViews.find((stack) => stack.project === identity.project);\n if (existing?.phase === \"stopped\") existing.phase = \"reserved\";\n else if (existing === undefined) {\n stackViews.push(syntheticFleetStack(identity, \"reserved\"));\n recordedProjects.add(identity.project);\n }\n }\n }\n const queued = admission.queuedIdentitySnapshot();\n for (const identity of queued) {\n if (identity.repoId === repoId) {\n const existing = stackViews.find((stack) => stack.project === identity.project);\n if (existing !== undefined && [\"stopped\", \"reserved\"].includes(existing.phase)) {\n existing.phase = \"queued\";\n } else if (existing === undefined) {\n stackViews.push(syntheticFleetStack(identity, \"queued\"));\n recordedProjects.add(identity.project);\n }\n }\n }\n\n stackViews.sort((left, right) => left.project.localeCompare(right.project));\n const slotBearingProjects = new Set<string>();\n for (const [index, record] of attributed.entries()) {\n const view = allStackViews[index];\n const observedNonTunnel = view?.services.some(\n (service) => service.backend !== \"tunnel\" && service.state !== \"exited\",\n ) ?? false;\n const liveStarter = record.state === \"starting\" &&\n record.starter !== undefined && isLive(record.starter);\n if (observedNonTunnel || liveStarter || liveMirroredProjects.has(record.project)) {\n slotBearingProjects.add(record.project);\n }\n }\n const live = allStackViews.filter((stack) =>\n slotBearingProjects.has(stack.project) &&\n ![\"queued\", \"reserved\", \"stopped\"].includes(stack.phase),\n ).length;\n const allRecordedProjects = new Set(attributed.map((record) => record.project));\n const unbackedReservations = reservations.filter(\n (reservation) => !allRecordedProjects.has(reservation.project),\n );\n const { maxStacks, warnings: capWarnings } = resolveMaxStacks();\n return {\n repoId,\n observedAt: new Date().toISOString(),\n capacity: {\n maxStacks,\n live,\n reserved: unbackedReservations.length,\n queued: queued.length,\n },\n stacks: stackViews,\n warnings: [...capWarnings, ...warnings].sort(),\n };\n}\n\nfunction semanticFleetSnapshot(snapshot: FleetSnapshot): string {\n return JSON.stringify({\n repoId: snapshot.repoId,\n capacity: snapshot.capacity,\n stacks: snapshot.stacks,\n warnings: snapshot.warnings,\n });\n}\n\n/** One overlap-guarded Fleet monitor shared by every daemon subscriber. */\nexport class FleetMonitor {\n readonly #subscribers = new Map<RepoId, Set<LatestFleetChannel>>();\n readonly #semantic = new Map<RepoId, string>();\n readonly #latest = new Map<RepoId, FleetSnapshot>();\n readonly #refreshTimer: ReturnType<typeof setInterval>;\n readonly #heartbeatTimer: ReturnType<typeof setInterval>;\n #refreshing = false;\n #dirty = false;\n #sequence = 0;\n\n constructor(\n readonly admission: FleetAdmissionSource,\n options: { refreshMs?: number; heartbeatMs?: number } = {},\n ) {\n this.#refreshTimer = setInterval(\n () => void this.refreshFleet(),\n options.refreshMs ?? DEFAULT_REFRESH_MS,\n );\n this.#heartbeatTimer = setInterval(\n () => this.#broadcastHeartbeat(),\n options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS,\n );\n }\n\n /** Subscribe to full Fleet snapshots with latest-only backpressure. */\n subscribe(repoId: RepoId, signal?: AbortSignal): AsyncIterable<FleetEnvelope> {\n const channel = new LatestFleetChannel();\n const channels = this.#subscribers.get(repoId) ?? new Set<LatestFleetChannel>();\n channels.add(channel);\n this.#subscribers.set(repoId, channels);\n const latest = this.#latest.get(repoId);\n if (latest !== undefined) {\n channel.push({ type: \"snapshot\", sequence: ++this.#sequence, snapshot: latest });\n }\n void this.refreshFleet();\n const close = () => channel.close();\n signal?.addEventListener(\"abort\", close, { once: true });\n const monitor = this;\n return {\n async *[Symbol.asyncIterator]() {\n try {\n for (;;) {\n const result = await channel.next();\n if (result.done) return;\n yield result.value;\n }\n } finally {\n signal?.removeEventListener(\"abort\", close);\n channel.close();\n const active = monitor.#subscribers.get(repoId);\n active?.delete(channel);\n if (active?.size === 0) monitor.#subscribers.delete(repoId);\n }\n },\n };\n }\n\n /** Refresh every subscribed repository once; overlapping requests coalesce. */\n async refreshFleet(): Promise<void> {\n if (this.#subscribers.size === 0) return;\n if (this.#refreshing) {\n this.#dirty = true;\n return;\n }\n this.#refreshing = true;\n try {\n do {\n this.#dirty = false;\n for (const repoId of this.#subscribers.keys()) {\n const snapshot = await collectFleetSnapshot(repoId, this.admission);\n const semantic = semanticFleetSnapshot(snapshot);\n if (this.#semantic.get(repoId) === semantic) continue;\n this.#semantic.set(repoId, semantic);\n this.#latest.set(repoId, snapshot);\n const frame: FleetEnvelope = {\n type: \"snapshot\",\n sequence: ++this.#sequence,\n snapshot,\n };\n for (const channel of this.#subscribers.get(repoId) ?? []) channel.push(frame);\n }\n } while (this.#dirty);\n } finally {\n this.#refreshing = false;\n }\n }\n\n /** Stop Fleet polling and close every active subscription. */\n stop(): void {\n clearInterval(this.#refreshTimer);\n clearInterval(this.#heartbeatTimer);\n for (const channels of this.#subscribers.values()) {\n for (const channel of channels) channel.close();\n }\n this.#subscribers.clear();\n }\n\n #broadcastHeartbeat(): void {\n const frame: FleetEnvelope = {\n type: \"heartbeat\",\n sequence: ++this.#sequence,\n at: new Date().toISOString(),\n };\n for (const channels of this.#subscribers.values()) {\n for (const channel of channels) channel.push(frame);\n }\n }\n}\n",
|
|
117
|
+
"import { dirname, relative } from \"node:path\";\nimport { chmodSync, mkdirSync } from \"node:fs\";\nimport { HestiaError } from \"@hestia/core\";\nimport { writeAtomicTextFile } from \"./atomic-json-file.ts\";\nimport { discoverRepository, type DiscoveryReport } from \"./discovery.ts\";\nimport { getRepoInfo } from \"./git.ts\";\nimport { withLock } from \"./proc/lock.ts\";\nimport { hestiaHome } from \"./state.ts\";\nimport {\n machineRepositoryConfigPath,\n parseRepositoryWorkloadConfig,\n readConfigLayer,\n renderRepositoryWorkloadConfig,\n repositoryConfigPath,\n type ConfiguredWorkload,\n type EndpointKind,\n type WorkloadSource,\n} from \"./repository-config.ts\";\n\nexport type InitScope = \"repository\" | \"machine\";\n\nexport type InitRequest =\n | { kind: \"dockerfile\"; name: string; file?: string }\n | { kind: \"proc\"; name: string; command: string[]; port?: \"auto\" | \"none\" }\n | { kind: \"wrangler\"; name: string; file?: string }\n | { kind: \"endpoint\"; alias: string; workload: string; binding: string; endpointKind: EndpointKind };\n\nexport interface InitResult {\n path: string;\n scope: InitScope;\n written: boolean;\n proposed: string;\n discovery: DiscoveryReport;\n runnable: boolean;\n}\n\nfunction validateName(name: string, what: string): void {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(name)) {\n throw new HestiaError(\"usage\", `${what} must use letters, digits, dot, dash, or underscore`);\n }\n}\n\nfunction inferredWorkload(report: DiscoveryReport, name: string): ConfiguredWorkload | null {\n const workload = [...report.runnableWorkloads, ...report.candidateWorkloads]\n .find((candidate) => candidate.name === name);\n if (workload === undefined) return null;\n return {\n source: workload.source,\n composeService: workload.source === \"compose\" ? workload.name : undefined,\n dockerfile: workload.source === \"dockerfile\" && workload.definitionPath !== undefined\n ? relative(report.repository.worktree, workload.definitionPath)\n : undefined,\n wranglerConfig: workload.source === \"wrangler\" && workload.definitionPath !== undefined\n ? relative(report.repository.worktree, workload.definitionPath)\n : undefined,\n endpoints: {},\n };\n}\n\nfunction applyRequest(\n report: DiscoveryReport,\n workloads: Record<string, ConfiguredWorkload>,\n request: InitRequest,\n): void {\n if (request.kind === \"endpoint\") {\n validateName(request.alias, \"endpoint alias\");\n validateName(request.workload, \"workload name\");\n if (!/^(?:main|[1-9][0-9]{0,4})\\/(?:tcp|udp)$/.test(request.binding)) {\n throw new HestiaError(\"usage\", \"endpoint binding must be main/tcp or <port>/tcp|udp\");\n }\n if (request.endpointKind === \"http\" && request.binding.endsWith(\"/udp\")) {\n throw new HestiaError(\"usage\", \"HTTP endpoints require a TCP binding\");\n }\n const workload = workloads[request.workload] ?? inferredWorkload(report, request.workload);\n if (workload === null) {\n throw new HestiaError(\"service-not-found\", `cannot configure endpoint for unknown workload ${request.workload}`);\n }\n workload.endpoints[request.alias] = {\n binding: request.binding,\n kind: request.endpointKind,\n local: request.endpointKind === \"http\",\n };\n workloads[request.workload] = workload;\n return;\n }\n\n validateName(request.name, \"workload name\");\n const source = request.kind as WorkloadSource;\n const existing = workloads[request.name];\n if (existing !== undefined && existing.source !== source) {\n throw new HestiaError(\n \"config-conflict\",\n `workload ${request.name} is already configured as ${existing.source}`,\n );\n }\n workloads[request.name] = {\n source,\n dockerfile: request.kind === \"dockerfile\" ? request.file ?? \"Dockerfile\" : undefined,\n command: request.kind === \"proc\" ? request.command : undefined,\n port: request.kind === \"proc\" ? request.port ?? \"auto\" : undefined,\n wranglerConfig: request.kind === \"wrangler\" ? request.file ?? \"wrangler.toml\" : undefined,\n endpoints: existing?.endpoints ?? {},\n };\n}\n\n/** Propose or explicitly write one validated repository/machine configuration edit. */\nexport async function initializeRepositoryConfig(\n cwd: string,\n request: InitRequest,\n scope: InitScope,\n write: boolean,\n): Promise<InitResult> {\n const repo = await getRepoInfo(cwd);\n const path = scope === \"repository\"\n ? repositoryConfigPath(repo.worktreeRoot)\n : machineRepositoryConfigPath(repo.repoId);\n const lockRoot = `${hestiaHome()}/config-locks/${repo.repoId}-${scope}`;\n return withLock(lockRoot, async () => {\n const before = await discoverRepository(repo.worktreeRoot);\n const layer = readConfigLayer(path);\n const config = {\n version: 1 as const,\n workloads: Object.fromEntries(\n Object.entries(layer.config.workloads).map(([name, workload]) => [\n name,\n { ...workload, command: workload.command?.slice(), endpoints: { ...workload.endpoints } },\n ]),\n ),\n };\n applyRequest(before, config.workloads, request);\n const proposed = renderRepositoryWorkloadConfig(config);\n parseRepositoryWorkloadConfig(proposed, path);\n if (write) {\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n if (scope === \"machine\") chmodSync(dirname(path), 0o700);\n writeAtomicTextFile(path, proposed, 0o600);\n }\n const discovery = write ? await discoverRepository(repo.worktreeRoot) : before;\n return {\n path,\n scope,\n written: write,\n proposed,\n discovery,\n runnable: discovery.conflicts.length === 0 && discovery.runnableWorkloads.length > 0,\n };\n });\n}\n",
|
|
118
|
+
"import { existsSync, rmSync, writeFileSync } from \"node:fs\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { join, resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { resolveCname } from \"node:dns/promises\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport {\n STATE_SCHEMA_VERSION,\n type AdmitOptions,\n type DownOptions,\n type Endpoint,\n type ExposeOptions,\n type IsolationEngine,\n type LogLine,\n type LogsOptions,\n type ProcSpec,\n type RepoId,\n type ServiceRecord,\n type StackIdentity,\n type StackRecord,\n type TunnelRef,\n type UpOptions,\n HestiaError,\n NotImplemented,\n projectName,\n} from \"@hestia/core\";\nimport { loadConfig, tryLoadConfig } from \"./config.ts\";\nimport { getRepoInfo, type RepoInfo } from \"./git.ts\";\nimport {\n assertDiscoveryRunnable,\n discoverRepository,\n resolveConfiguredWorkloads,\n} from \"./discovery.ts\";\nimport type { ConfiguredWorkload } from \"./repository-config.ts\";\nimport { resolveEndpointSelection } from \"./endpoint-resolution.ts\";\nimport { generateOverride } from \"./compose/override.ts\";\nimport {\n type ComposeCtx,\n composeConfig,\n composeDown,\n composePs,\n composeUp,\n publishedPortFor,\n resolveComposeModel,\n type ResolvedComposeModel,\n waitReady,\n} from \"./compose/cli.ts\";\nimport { writeAtomicTextFile } from \"./atomic-json-file.ts\";\nimport {\n clearState,\n ensureDir,\n hestiaDir,\n hestiaHome,\n mirrorDir,\n mirrorPidfile,\n mirrorProcsDir,\n readMirrorState,\n readState,\n assertMutableStackRecord,\n writeState,\n} from \"./state.ts\";\nimport { withLock } from \"./proc/lock.ts\";\nimport { envKey, startProc } from \"./proc/supervisor.ts\";\nimport {\n type Pidfile,\n isLive,\n listPidfiles,\n procsDir,\n procSpecFingerprint,\n readPidfile,\n removePidfile,\n startTimeOf,\n} from \"./proc/pidfile.ts\";\nimport { stopProcTree } from \"./proc/shutdown.ts\";\nimport { inspectPort } from \"./proc/ports.ts\";\nimport {\n internalEndpointAuthority,\n publicGatewaySocketPath,\n resolvedLocalRouteHostname,\n verifyStackServiceOrigin,\n} from \"./router/local-http-router.ts\";\nimport { detectVarlock } from \"./proc/resolver.ts\";\nimport { planWorkers, privateRegistryDir } from \"./wrangler/adapter.ts\";\nimport {\n globalGainWarnings,\n snapshotGlobalRegistry,\n verifyPrivateRegistry,\n} from \"./wrangler/verify.ts\";\nimport { adoptTunnel } from \"./tunnel/cloudflared.ts\";\nimport { hostnameFor, importBaseRules, inferZone } from \"./tunnel/ingress.ts\";\nimport {\n connectorPidfile,\n isAdopted,\n reconcileTunnel,\n} from \"./tunnel/registry.ts\";\nimport { isReady, quickTunnelUrl } from \"./tunnel/verify.ts\";\nimport { ensureDaemon } from \"./daemon/ensure.ts\";\nimport {\n acquireSlot,\n readDaemonJson,\n reconcileDaemonLocalRoutes,\n releaseSlot,\n} from \"./daemon/client.ts\";\nimport { streamStackLogs } from \"./logs/stream.ts\";\nimport {\n effectiveLocalRouteServices,\n readHestiaMachineConfig,\n} from \"./router/router-config.ts\";\nimport { readHestiaRouterStatus } from \"./router/portless-adapter.ts\";\n\nexport { dockerAvailable } from \"./compose/cli.ts\";\nexport * from \"./compose/override.ts\";\nexport { withLock } from \"./proc/lock.ts\";\nexport { substitutePort, envKey, openProcAttemptLog } from \"./proc/supervisor.ts\";\nexport { readLastLines, tailFile } from \"./logs/tail.ts\";\nexport { BoundedLogMergeQueue, streamStackLogs } from \"./logs/stream.ts\";\nexport { BoundedLogLineAccumulator, boundLogLine, MAX_LOG_LINE_BYTES } from \"./logs/log-line-bounds.ts\";\nexport * from \"./proc/ports.ts\";\nexport * from \"./proc/pidfile.ts\";\nexport * from \"./proc/resolver.ts\";\nexport * from \"./wrangler/discover.ts\";\nexport {\n privateRegistryDir,\n globalRegistryDir,\n planWorkers,\n wranglerResourceModeArgs,\n} from \"./wrangler/adapter.ts\";\nexport * from \"./tunnel/ingress.ts\";\nexport * from \"./tunnel/verify.ts\";\nexport {\n collectDynamicRules,\n connectorPidfile,\n ledgerAdd,\n ledgerHas,\n reconcileTunnel,\n tunnelDir,\n} from \"./tunnel/registry.ts\";\nexport { adoptTunnel, listTunnels, routeDns } from \"./tunnel/cloudflared.ts\";\nexport { hestiaHome } from \"./state.ts\";\nexport { type DoctorRow, doctor } from \"./doctor.ts\";\nexport {\n configuredLocalRouteServices,\n effectiveLocalRouteServices,\n hestiaConfigTomlPath,\n localRouteHostname,\n migrateHestiaMachineConfig,\n readHestiaMachineConfig,\n} from \"./router/router-config.ts\";\nexport {\n installHestiaRouter,\n readHestiaRouterStatus,\n uninstallHestiaRouter,\n} from \"./router/portless-adapter.ts\";\nexport { resolvedLocalRouteHostname } from \"./router/local-http-router.ts\";\nexport { daemonDir, resolveMaxStacks } from \"./daemon/slots.ts\";\nexport { HESTIAD_PROTOCOL_VERSION } from \"./daemon/routes.ts\";\nexport { FleetMonitor, collectFleetSnapshot } from \"./daemon/fleet-monitor.ts\";\nexport { ensureDaemon, stopDaemonProcess } from \"./daemon/ensure.ts\";\nexport {\n daemonAuthHeaders,\n fetchHealth,\n fetchState,\n reconcileDaemonLocalRoutes,\n readDaemonJson,\n streamDaemonFleet,\n streamDaemonServiceLogs,\n} from \"./daemon/client.ts\";\nexport { createRepoId, getRepoInfo } from \"./git.ts\";\nexport { writeAtomicJsonFile } from \"./atomic-json-file.ts\";\nexport * from \"./repository-config.ts\";\nexport * from \"./discovery.ts\";\nexport * from \"./init-config.ts\";\nexport * from \"./endpoint-resolution.ts\";\nexport {\n LAUNCHD_LABEL,\n installLaunchd,\n isBootstrapped,\n launchdManagesThisHome,\n plistPath,\n uninstallLaunchd,\n} from \"./daemon/launchd.ts\";\n\nconst OVERRIDE_FILE = \"compose.override.yml\";\nconst DOCKERFILE_COMPOSE_FILE = \"dockerfile.compose.yml\";\n\ninterface Prepared {\n ctx: ComposeCtx;\n services: string[];\n serviceBindings: Record<string, Array<{ target: number; protocol: \"tcp\" | \"udp\" }>>;\n composeFile: string;\n overridePath: string;\n}\n\nfunction composeUnsupported(message: string): never {\n throw new HestiaError(\"compose-unsupported\", message);\n}\n\nexport function validateResolvedComposeModel(model: ResolvedComposeModel, project: string): void {\n for (const [name, service] of Object.entries(model.services)) {\n if (service.network_mode === \"host\") composeUnsupported(`service ${name} uses host network mode`);\n if (service.pid === \"host\") composeUnsupported(`service ${name} uses host PID mode`);\n if (service.ipc === \"host\") composeUnsupported(`service ${name} uses host IPC mode`);\n for (const port of service.ports ?? []) {\n const target = typeof port.target === \"number\" ? port.target : Number(port.target);\n if (!Number.isInteger(target) || target < 1 || target > 65_535 || String(port.target).includes(\"-\")) {\n composeUnsupported(`service ${name} has unsupported port target ${String(port.target)} (ranges are not supported)`);\n }\n if (port.published?.includes(\"-\")) {\n composeUnsupported(`service ${name} has unsupported published port range ${port.published}`);\n }\n if (port.protocol !== undefined && port.protocol !== \"tcp\" && port.protocol !== \"udp\") {\n composeUnsupported(`service ${name} uses unsupported port protocol ${port.protocol}`);\n }\n }\n }\n for (const [kind, resources] of [\n [\"network\", model.networks],\n [\"volume\", model.volumes],\n ] as const) {\n for (const [key, resource] of Object.entries(resources ?? {})) {\n if (resource.external) composeUnsupported(`${kind} ${key} is external`);\n if (resource.name !== undefined && !resource.name.startsWith(`${project}_`)) {\n composeUnsupported(`${kind} ${key} has explicit machine-global name ${resource.name}`);\n }\n }\n }\n}\n\nexport function expandComposeDependencies(model: ResolvedComposeModel, requested?: string[]): string[] {\n const roots = requested ?? Object.keys(model.services);\n const expanded = new Set<string>();\n const visit = (name: string): void => {\n const service = model.services[name];\n if (service === undefined) {\n throw new HestiaError(\n \"service-not-found\",\n `compose service ${JSON.stringify(name)} is not defined (have: ${Object.keys(model.services).join(\", \")})`,\n );\n }\n if (expanded.has(name)) return;\n expanded.add(name);\n for (const dependency of Object.keys(service.depends_on ?? {})) visit(dependency);\n };\n for (const root of roots) visit(root);\n return [...expanded];\n}\n\nfunction assertNoEnvironmentKeyConflicts(\n workloads: Array<{ name: string; endpoints: Array<{ alias: string }> }>,\n): void {\n const owners = new Map<string, string>();\n for (const workload of workloads) {\n for (const owner of [workload.name, ...workload.endpoints.map((endpoint) => endpoint.alias)]) {\n const key = envKey(owner);\n const previous = owners.get(key);\n if (previous !== undefined && previous !== owner) {\n throw new HestiaError(\n \"env-key-conflict\",\n `${JSON.stringify(previous)} and ${JSON.stringify(owner)} both normalize to HESTIA_${key}`,\n { key: `HESTIA_${key}`, owners: [previous, owner] },\n );\n }\n owners.set(key, owner);\n }\n }\n}\n\nexport function applyConfiguredEndpoints(\n record: StackRecord,\n configuredWorkloads: Record<string, ConfiguredWorkload>,\n): void {\n for (const [workloadName, configured] of Object.entries(configuredWorkloads)) {\n const serviceName = configured.composeService ?? workloadName;\n const service = record.services.find((candidate) => candidate.name === serviceName);\n if (service === undefined) continue;\n for (const [alias, endpointConfig] of Object.entries(configured.endpoints)) {\n const [target, protocol] = endpointConfig.binding.split(\"/\") as [string, \"tcp\" | \"udp\"];\n const binding = service.bindings?.find((candidate) =>\n candidate.target === target && candidate.protocol === protocol\n );\n if (binding === undefined) {\n throw new HestiaError(\n \"endpoint-binding-not-found\",\n `endpoint ${alias} selects ${serviceName}:${endpointConfig.binding}, which is not published`,\n );\n }\n const directUrl = endpointConfig.kind === \"http\"\n ? `http://127.0.0.1:${binding.publishedPort}`\n : undefined;\n setEndpoint(record, {\n name: alias,\n alias,\n workload: serviceName,\n binding: endpointConfig.binding,\n kind: endpointConfig.kind,\n local: endpointConfig.local,\n host: \"127.0.0.1\",\n port: binding.publishedPort,\n url: directUrl,\n });\n record.env[`HESTIA_${envKey(alias)}_PORT`] = String(binding.publishedPort);\n if (directUrl !== undefined) record.env[`HESTIA_${envKey(alias)}_DIRECT_URL`] = directUrl;\n }\n }\n}\n\n/** Refuse to persist runtime state where Git could accidentally track it. */\nasync function assertHestiaStateIgnored(worktreeRoot: string): Promise<void> {\n try {\n await pexec(\"git\", [\"-C\", worktreeRoot, \"rev-parse\", \"--is-inside-work-tree\"], { timeout: 5_000 });\n } catch {\n return; // non-Git fallback mode has no index to protect\n }\n try {\n await pexec(\"git\", [\"-C\", worktreeRoot, \"check-ignore\", \"-q\", \".hestia/\"], { timeout: 5_000 });\n } catch {\n throw new HestiaError(\n \"state-not-ignored\",\n `.hestia is not ignored in ${worktreeRoot}; add the line \".hestia/\" to ${join(worktreeRoot, \".gitignore\")}`,\n { remedy: `.hestia/`, path: join(worktreeRoot, \".gitignore\") },\n );\n }\n}\n\n/** Resolve and validate Compose before atomically publishing its isolation override. */\nasync function prepareCompose(\n worktreeRoot: string,\n project: string,\n repo: string,\n branch: string,\n opts?: UpOptions,\n configuredBaseFile?: string,\n): Promise<Prepared> {\n const cfg = configuredBaseFile === undefined\n ? loadConfig(worktreeRoot)\n : { composeFile: configuredBaseFile, services: [] };\n const resolvedModel = await resolveComposeModel(project, cfg.composeFile, worktreeRoot);\n validateResolvedComposeModel(resolvedModel, project);\n const services = expandComposeDependencies(resolvedModel, opts?.services);\n const { yaml, serviceBindings } = generateOverride({\n userCompose: resolvedModel,\n project,\n repo,\n branch,\n worktree: worktreeRoot,\n services,\n });\n\n ensureDir(hestiaDir(worktreeRoot));\n const overridePath = join(hestiaDir(worktreeRoot), OVERRIDE_FILE);\n writeAtomicTextFile(overridePath, yaml);\n\n return {\n ctx: {\n project,\n baseFile: cfg.composeFile,\n overrideFile: overridePath,\n cwd: worktreeRoot,\n },\n services,\n serviceBindings,\n composeFile: cfg.composeFile,\n overridePath,\n };\n}\n\nfunction writeDockerfileComposeModel(\n worktreeRoot: string,\n workloads: Record<string, ConfiguredWorkload>,\n conventionalComposeFile?: string,\n): string | undefined {\n const dockerfiles = Object.entries(workloads).filter(([, workload]) => workload.source === \"dockerfile\");\n if (dockerfiles.length === 0) return conventionalComposeFile;\n const services = Object.fromEntries(dockerfiles.map(([name, workload]) => {\n const ports = [...new Set(Object.values(workload.endpoints).map((endpoint) => endpoint.binding))]\n .filter((binding) => !binding.startsWith(\"main/\"));\n return [name, {\n build: {\n context: worktreeRoot,\n dockerfile: workload.dockerfile ?? \"Dockerfile\",\n },\n ...(ports.length > 0 ? { ports } : {}),\n }];\n }));\n const model = {\n ...(conventionalComposeFile === undefined\n ? {}\n : { include: [{ path: conventionalComposeFile }] }),\n services,\n };\n const path = join(hestiaDir(worktreeRoot), DOCKERFILE_COMPOSE_FILE);\n writeAtomicTextFile(path, stringifyYaml(model));\n return path;\n}\n\nfunction freshRecord(\n project: string,\n repoId: RepoId,\n repo: string,\n branch: string,\n worktree: string,\n): StackRecord {\n return {\n schemaVersion: STATE_SCHEMA_VERSION,\n project,\n repoId,\n repo,\n branch,\n worktree,\n state: \"up\",\n services: [],\n env: {},\n endpoints: [],\n createdAt: new Date().toISOString(),\n };\n}\n\n/** Guard every stack mutation against legacy state and changed Git identity. */\nfunction assertCurrentStackIdentity(\n record: StackRecord,\n current: RepoInfo,\n): void {\n const path = join(hestiaDir(current.worktreeRoot), \"stack.json\");\n assertMutableStackRecord(record, path);\n const matches =\n record.repoId === current.repoId &&\n record.repo === current.repo &&\n record.branch === current.branch &&\n resolve(record.worktree) === resolve(current.worktreeRoot) &&\n record.project === projectName(\n current.repoId,\n current.repo,\n current.branch,\n current.worktreeRoot,\n );\n if (!matches) {\n throw new HestiaError(\n \"stack-identity-changed\",\n `this checkout no longer matches stack ${record.project}; run hestia down before starting or changing it`,\n {\n recorded: {\n repoId: record.repoId,\n repo: record.repo,\n branch: record.branch,\n worktree: record.worktree,\n },\n current,\n recovery: `hestia down --project ${record.project}`,\n },\n );\n }\n}\n\nfunction upsertService(record: StackRecord, svc: ServiceRecord): void {\n const i = record.services.findIndex((s) => s.name === svc.name);\n if (i >= 0) record.services[i] = svc;\n else record.services.push(svc);\n}\n\nfunction upsertAuxiliary(record: StackRecord, auxiliary: ServiceRecord): void {\n record.auxiliary ??= [];\n const index = record.auxiliary.findIndex((candidate) => candidate.name === auxiliary.name);\n if (index >= 0) record.auxiliary[index] = auxiliary;\n else record.auxiliary.push(auxiliary);\n}\n\nfunction setEndpoint(record: StackRecord, ep: Endpoint): void {\n const i = record.endpoints.findIndex((e) => e.name === ep.name);\n if (i >= 0) {\n const previous = record.endpoints[i]!;\n const portRotated = previous.port !== ep.port;\n const namedExposure = record.tunnel?.exposures.some((exposure) =>\n (exposure.alias ?? exposure.service) === ep.name) ?? false;\n if (portRotated && previous.publicUrl !== undefined && !namedExposure) {\n delete previous.publicUrl;\n delete record.env[urlKey(ep.name)];\n }\n record.endpoints[i] = { ...previous, ...ep };\n }\n else record.endpoints.push(ep);\n applyLocalRouteProjection(record);\n}\n\nfunction dropService(record: StackRecord, name: string): void {\n record.services = record.services.filter((s) => s.name !== name);\n record.endpoints = record.endpoints.filter((e) => e.name !== name);\n delete record.env[`HESTIA_${envKey(name)}_PORT`];\n delete record.env[directUrlKey(name)];\n delete record.env[localUrlKey(name)];\n}\n\nfunction persistStoppedService(record: StackRecord, name: string): void {\n const service = record.services.find((candidate) => candidate.name === name);\n if (service === undefined) return;\n service.state = \"stopped\";\n delete service.publishedPort;\n service.bindings = [];\n record.endpoints = record.endpoints.filter((endpoint) =>\n endpoint.name !== name && endpoint.workload !== name\n );\n for (const key of Object.keys(record.env)) {\n if (key.startsWith(`HESTIA_${envKey(name)}_`)) delete record.env[key];\n }\n}\n\nfunction recordProc(\n record: StackRecord,\n svc: ServiceRecord,\n): void {\n const recorded = svc.publishedPort === undefined ? svc : {\n ...svc,\n bindings: [{\n id: `${svc.name}:main/tcp`,\n target: \"main\",\n protocol: \"tcp\" as const,\n publishedPort: svc.publishedPort,\n }],\n };\n upsertService(record, recorded);\n if (svc.publishedPort !== undefined) {\n record.env[`HESTIA_${envKey(svc.name)}_MAIN_TCP_PORT`] = String(svc.publishedPort);\n record.env[`HESTIA_${envKey(svc.name)}_PORT`] = String(svc.publishedPort);\n setEndpoint(record, {\n name: svc.name,\n workload: svc.name,\n binding: \"main/tcp\",\n host: \"127.0.0.1\",\n port: svc.publishedPort,\n reservedName: `${svc.name}.${record.branch}.${record.repo}.localhost`,\n });\n }\n}\n\nfunction urlKey(name: string): string {\n return `HESTIA_${envKey(name)}_URL`;\n}\n\nfunction directUrlKey(name: string): string {\n return `HESTIA_${envKey(name)}_DIRECT_URL`;\n}\n\nfunction localUrlKey(name: string): string {\n return `HESTIA_${envKey(name)}_LOCAL_URL`;\n}\n\n/** Project direct and stable URL fields from explicit plus configured route intent. */\nfunction applyLocalRouteProjection(record: StackRecord): void {\n const config = readHestiaMachineConfig().config;\n const selected = new Set(effectiveLocalRouteServices(record, config));\n for (const endpoint of record.endpoints) {\n endpoint.reservedName = resolvedLocalRouteHostname(record, endpoint.name, config);\n const service = record.services.find(\n (candidate) => candidate.name === (endpoint.workload ?? endpoint.name),\n );\n const selectedBinding = endpoint.binding === undefined\n ? undefined\n : service?.bindings?.find(\n (binding) => `${binding.target}/${binding.protocol}` === endpoint.binding,\n );\n const publishedPort = selectedBinding?.publishedPort ?? service?.publishedPort;\n if (!selected.has(endpoint.name)) {\n // Explicit endpoint kind is a protocol declaration. Legacy untyped ports\n // remain raw until route intent declares HTTP.\n if (endpoint.kind === \"http\" && publishedPort !== undefined) {\n endpoint.url = `http://127.0.0.1:${publishedPort}`;\n record.env[directUrlKey(endpoint.name)] = endpoint.url;\n } else {\n delete endpoint.url;\n delete record.env[directUrlKey(endpoint.name)];\n }\n delete endpoint.localUrl;\n delete record.env[localUrlKey(endpoint.name)];\n continue;\n }\n if (service === undefined || publishedPort === undefined || service.backend === \"tunnel\") continue;\n endpoint.host = \"127.0.0.1\";\n endpoint.port = publishedPort;\n if (endpoint.kind !== undefined && endpoint.kind !== \"http\") {\n delete endpoint.url;\n delete endpoint.localUrl;\n delete record.env[directUrlKey(endpoint.name)];\n delete record.env[localUrlKey(endpoint.name)];\n continue;\n }\n endpoint.url = `http://127.0.0.1:${publishedPort}`;\n endpoint.localUrl = `https://${endpoint.reservedName}`;\n record.env[directUrlKey(endpoint.name)] = endpoint.url;\n record.env[localUrlKey(endpoint.name)] = endpoint.localUrl;\n }\n}\n\n/**\n * Re-point named-mode exposures at the services' CURRENT ports. Returns true\n * when the merged ingress derived from this record changed (a port rotated or\n * an origin stopped) — the caller must reconcile the global connector after\n * releasing the worktree lock, because an ingress rule aimed at a port this\n * stack no longer owns is a live cross-worktree misdelivery once the OS\n * recycles the port.\n */\nfunction syncExposures(record: StackRecord): boolean {\n const t = record.tunnel;\n if (t === undefined) return false;\n let changed = false;\n for (const exp of t.exposures) {\n const svc = record.services.find((s) => s.name === exp.service);\n const binding = svc?.bindings?.find((candidate) =>\n `${candidate.target}/${candidate.protocol}` === exp.binding);\n const publishedPort = binding?.publishedPort ?? svc?.publishedPort;\n if (publishedPort === undefined) {\n changed = true; // origin gone — regen drops the rule (404, never a stale port)\n } else if (publishedPort !== exp.originPort) {\n exp.originPort = publishedPort;\n changed = true;\n }\n }\n return changed;\n}\n\nconst pexec = promisify(execFile);\n\nfunction matchesExpectedStack(\n record: StackRecord | null,\n expected: NonNullable<DownOptions[\"expectedStack\"]>,\n): boolean {\n return record !== null &&\n (record.repoId === undefined || record.repoId === expected.repoId) &&\n record.worktree === expected.worktree &&\n record.createdAt === expected.createdAt;\n}\n\nfunction projectMutationRoot(project: string): string {\n return join(hestiaHome(), \"project-locks\", project);\n}\n\nasync function assertNamedTunnelDns(hostname: string, tunnelUuid: string): Promise<void> {\n const expected = `${tunnelUuid}.cfargotunnel.com`;\n if (process.env.HESTIA_E2E_DNS_RESOLVED === \"1\") return;\n try {\n const records = (await resolveCname(hostname)).map((record) => record.replace(/\\.$/, \"\").toLowerCase());\n if (records.includes(expected.toLowerCase())) return;\n } catch {}\n throw new HestiaError(\n \"dns-route-required\",\n `${hostname} does not resolve through Hestia's adopted tunnel; configure wildcard CNAME *.${hostname.split(\".\").slice(1).join(\".\")} -> ${expected}`,\n { hostname, wildcardTarget: expected },\n );\n}\n\ninterface StartAdmissionGuard {\n createdAt: string;\n rollback(): Promise<void>;\n}\n\nexport class ComposeEngine implements IsolationEngine {\n /** Refresh daemon route state after a stack mutation; strict mode surfaces failures. */\n async #refreshLocalRoutes(strict = false): Promise<void> {\n try {\n const daemon = readDaemonJson();\n if (daemon !== null) await reconcileDaemonLocalRoutes(daemon.port);\n } catch (error) {\n if (strict) throw error;\n process.stderr.write(`warning: local router reconcile failed: ${(error as Error).message}\\n`);\n }\n }\n\n /** Stream this worktree's recorded services without taking its mutation lock. */\n async *logs(cwd: string, opts?: LogsOptions): AsyncGenerator<LogLine> {\n const { worktreeRoot } = await getRepoInfo(cwd);\n const record = readState(worktreeRoot);\n if (record === null) {\n throw new HestiaError(\"no-stack\", \"no stack for this worktree\");\n }\n yield* streamStackLogs(record, opts);\n }\n\n /** Stream a mirrored project without requiring its original worktree. */\n async *logsProject(project: string, opts?: LogsOptions): AsyncGenerator<LogLine> {\n const record = readMirrorState(project);\n if (record === null) {\n throw new HestiaError(\"no-stack\", `no mirror for project \"${project}\"`);\n }\n yield* streamStackLogs(record, opts);\n }\n\n /**\n * Best-effort convergence of the global connector after a stack mutation.\n * Failures degrade to warnings — `run`/`down` must not fail because the\n * tunnel blipped; `status` will show it unhealthy.\n */\n async #reconcileAdopted(t: TunnelRef | undefined): Promise<void> {\n if (t === undefined) return;\n try {\n const outcome = await reconcileTunnel(t);\n for (const w of outcome.warnings) process.stderr.write(`warning: ${w}\\n`);\n if (outcome.error !== undefined) {\n process.stderr.write(`warning: ${outcome.error.message}\\n`);\n }\n } catch (err) {\n process.stderr.write(\n `warning: tunnel reconcile failed: ${(err as Error).message}\\n`,\n );\n }\n }\n\n /**\n * Machine-wide admission before any start: ensure hestiad, request a slot\n * (idempotent for already-live projects), and bridge the grant with a\n * provisional `starting` record so the slot survives a multi-minute cold\n * `compose up` and a CLI crash frees it (dead starter → sweep). Runs BEFORE\n * the worktree lock — never long-poll while holding it.\n * Returns a cleanup that rolls the provisional record back on failure.\n */\n async #admit(\n project: string,\n repoId: RepoId,\n repo: string,\n branch: string,\n worktreeRoot: string,\n opts?: AdmitOptions,\n ): Promise<StartAdmissionGuard> {\n const currentIdentity = { repo, repoId, branch, worktreeRoot };\n const existingRecord = readState(worktreeRoot);\n if (existingRecord !== null) assertCurrentStackIdentity(existingRecord, currentIdentity);\n let handle: Awaited<ReturnType<typeof ensureDaemon>> | null = null;\n if (opts?.noDaemon) {\n process.stderr.write(\n \"warning: --no-daemon skips the stack cap and daemon supervision\\n\",\n );\n } else {\n handle = await ensureDaemon();\n const identity: StackIdentity = {\n project,\n repoId,\n repo,\n branch,\n worktree: worktreeRoot,\n };\n const result = await acquireSlot(handle.port, identity, opts?.wait ?? 0);\n if (!result.granted) {\n const live = result.live.join(\", \");\n throw new HestiaError(\n \"stack-limit\",\n `stack cap reached (live: ${live}) — \\`hestia down\\` one, or retry with --wait`,\n );\n }\n }\n // Provisional record only when the project has no record at all — an\n // existing record already carries occupancy through its services.\n let provisional = false;\n let retainedEmpty = false;\n let previousState: StackRecord[\"state\"] | undefined;\n let previousStarter: StackRecord[\"starter\"];\n let createdAt = \"\";\n await withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n let rec = readState(worktreeRoot);\n if (rec === null) {\n const rec = freshRecord(project, repoId, repo, branch, worktreeRoot);\n rec.state = \"starting\";\n rec.starter = {\n pid: process.pid,\n startTime: startTimeOf(process.pid) ?? \"\",\n };\n writeState(worktreeRoot, rec);\n provisional = true;\n createdAt = rec.createdAt;\n } else {\n assertCurrentStackIdentity(rec, currentIdentity);\n if (rec.services.length === 0) {\n retainedEmpty = true;\n provisional = true;\n previousState = rec.state;\n previousStarter = rec.starter;\n rec.state = \"starting\";\n rec.starter = {\n pid: process.pid,\n startTime: startTimeOf(process.pid) ?? \"\",\n };\n writeState(worktreeRoot, rec);\n }\n createdAt = rec.createdAt;\n }\n }));\n return { createdAt, rollback: async () => {\n // Failure rollback: drop the record only if it is still our untouched\n // provisional (a partially-started stack must stay visible for `down`).\n if (!provisional) return;\n await withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const rec = readState(worktreeRoot);\n if (rec !== null && rec.state === \"starting\" && rec.services.length === 0 && rec.composeFile === undefined) {\n if (retainedEmpty) {\n rec.state = previousState ?? \"stopped\";\n rec.starter = previousStarter;\n writeState(worktreeRoot, rec);\n } else {\n clearState(worktreeRoot, project);\n }\n }\n }));\n if (handle !== null) await releaseSlot(handle.port, project);\n } };\n }\n\n async up(cwd: string, opts?: UpOptions): Promise<StackRecord> {\n const discovery = await discoverRepository(cwd);\n assertDiscoveryRunnable(discovery);\n assertNoEnvironmentKeyConflicts(\n [...discovery.runnableWorkloads, ...discovery.candidateWorkloads]\n .map((workload) => ({ name: workload.name, endpoints: workload.endpoints })),\n );\n const configured = await resolveConfiguredWorkloads(cwd);\n if (configured.conflicts.length > 0) {\n throw new HestiaError(\"config-conflict\", configured.conflicts.join(\"; \"));\n }\n const { repo, repoId, branch, worktreeRoot } = await getRepoInfo(cwd);\n await assertHestiaStateIgnored(worktreeRoot);\n const project = projectName(repoId, repo, branch, worktreeRoot);\n let tunnelDirty = false;\n\n const admission = await this.#admit(project, repoId, repo, branch, worktreeRoot, opts);\n let done: StackRecord;\n try {\n done = await this.#upLocked(\n worktreeRoot,\n project,\n repoId,\n repo,\n branch,\n admission.createdAt,\n opts,\n configured.workloads,\n (d) => {\n tunnelDirty = d;\n },\n );\n } catch (err) {\n await admission.rollback();\n throw err;\n }\n if (tunnelDirty) await this.#reconcileAdopted(done.tunnel);\n await this.#refreshLocalRoutes();\n return done;\n }\n\n async #upLocked(\n worktreeRoot: string,\n project: string,\n repoId: RepoId,\n repo: string,\n branch: string,\n admittedCreatedAt: string,\n opts: UpOptions | undefined,\n configuredWorkloads: Record<string, ConfiguredWorkload>,\n setTunnelDirty: (d: boolean) => void,\n ): Promise<StackRecord> {\n return withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const record = readState(worktreeRoot);\n if (record?.createdAt !== admittedCreatedAt) {\n throw new HestiaError(\"worktree-busy\", \"stack was removed after admission; start cancelled\");\n }\n record.repoId ??= repoId;\n const conventionalCompose = tryLoadConfig(worktreeRoot);\n const composeBaseFile = writeDockerfileComposeModel(\n worktreeRoot,\n configuredWorkloads,\n conventionalCompose?.composeFile,\n );\n const hasCompose = composeBaseFile !== undefined;\n const configuredProcs = Object.entries(configuredWorkloads)\n .filter(([, workload]) => workload.source === \"proc\");\n const configuredWorkers = Object.entries(configuredWorkloads)\n .filter(([, workload]) => workload.source === \"wrangler\");\n if (!hasCompose && !opts?.workers && configuredProcs.length === 0 && configuredWorkers.length === 0) {\n // plain `up` still means \"compose up\" — procs arrive via `run`\n loadConfig(worktreeRoot); // throws config-missing\n }\n\n if (hasCompose) {\n const p = await prepareCompose(worktreeRoot, project, repo, branch, opts, composeBaseFile);\n await composeConfig(p.ctx);\n for (const serviceName of p.services) {\n const proc = record.services.find(\n (service) => service.name === serviceName && service.backend !== \"docker\",\n );\n if (proc !== undefined) {\n throw new HestiaError(\n \"name-conflict\",\n `compose service \"${serviceName}\" collides with a running proc of the same name`,\n );\n }\n }\n // Publish teardown intent before Compose may create anything. A later\n // failure remains visible and `down` can always remove partial resources.\n record.composeFile = p.composeFile;\n record.overrideFile = p.overridePath;\n writeState(worktreeRoot, record);\n // The explicit list prevents unrelated profile services from starting;\n // transitive dependencies were expanded before override generation.\n let rows;\n try {\n await composeUp(p.ctx, p.services);\n rows = await waitReady(p.ctx, p.services);\n } catch (error) {\n record.state = \"degraded\";\n for (const serviceName of p.services) {\n upsertService(record, {\n name: serviceName,\n backend: \"docker\",\n state: \"unhealthy\",\n containerPort: p.serviceBindings[serviceName]?.[0]?.target,\n bindings: [],\n });\n }\n delete record.starter;\n writeState(worktreeRoot, record);\n throw error;\n }\n const byName = new Map(rows.map((r) => [r.Service, r]));\n\n for (const svc of p.services) {\n const row = byName.get(svc);\n const targetBindings = p.serviceBindings[svc] ?? [];\n const bindings = targetBindings.flatMap((binding) => {\n const publishedPort = publishedPortFor(row, binding.target, binding.protocol);\n return publishedPort === undefined ? [] : [{\n id: `${svc}:${binding.target}/${binding.protocol}`,\n target: String(binding.target),\n protocol: binding.protocol,\n publishedPort,\n }];\n });\n const canonical = bindings.length === 1 ? bindings[0]!.publishedPort : undefined;\n upsertService(record, {\n name: svc,\n backend: \"docker\",\n state: \"healthy\",\n containerPort: targetBindings[0]?.target,\n publishedPort: canonical,\n containerId: row?.ID,\n bindings,\n });\n for (const binding of bindings) {\n record.env[\n `HESTIA_${envKey(svc)}_${binding.target}_${binding.protocol.toUpperCase()}_PORT`\n ] = String(binding.publishedPort);\n }\n if (bindings.length === 1 && canonical !== undefined) {\n record.env[`HESTIA_${envKey(svc)}_PORT`] = String(canonical);\n setEndpoint(record, {\n name: svc,\n host: \"127.0.0.1\",\n port: canonical,\n workload: svc,\n binding: `${bindings[0]!.target}/${bindings[0]!.protocol}`,\n kind: bindings[0]!.protocol,\n reservedName: `${svc}.${branch}.${repo}.localhost`,\n });\n }\n }\n }\n\n for (const [name, workload] of configuredProcs) {\n const command = workload.command!;\n const configuredSpec: ProcSpec = {\n name,\n argv: command,\n port: workload.port ?? \"auto\",\n backend: \"proc\",\n };\n const clash = record.services.find((service) => service.name === name && service.backend === \"docker\");\n if (clash !== undefined) {\n throw new HestiaError(\"name-conflict\", `configured proc ${name} collides with a compose workload`);\n }\n const existing = readPidfile(worktreeRoot, name);\n if (existing !== null && isLive(existing)) {\n if (existing.specFingerprint === procSpecFingerprint(configuredSpec)) continue;\n persistStoppedService(record, name);\n setTunnelDirty(syncExposures(record));\n writeState(worktreeRoot, record);\n await stopProcTree(existing);\n removePidfile(worktreeRoot, name);\n } else if (existing !== null) {\n removePidfile(worktreeRoot, name);\n }\n const result = await startProc(\n worktreeRoot,\n configuredSpec,\n record.env,\n (pidfile) => mirrorPidfile(record.project, pidfile),\n );\n recordProc(record, result.record);\n writeState(worktreeRoot, record);\n if (result.error !== undefined) throw result.error;\n }\n\n if (opts?.workers || configuredWorkers.length > 0) {\n const configuredFilters = configuredWorkers.map(([name, workload]) => workload.wranglerConfig ?? name);\n const explicitFilters = Array.isArray(opts?.workers) ? opts.workers : [];\n await this.#upWorkers(worktreeRoot, record, {\n ...opts,\n workers: opts?.workers === true ? true : [...new Set([...explicitFilters, ...configuredFilters])],\n });\n }\n\n applyConfiguredEndpoints(record, configuredWorkloads);\n\n record.state = \"up\";\n delete record.starter; // no longer provisional — services carry the slot\n setTunnelDirty(syncExposures(record));\n writeState(worktreeRoot, record);\n return record;\n }));\n }\n\n /** Spawn one supervised `wrangler dev` per discovered config, in parallel. */\n async #upWorkers(\n worktreeRoot: string,\n record: StackRecord,\n opts: UpOptions,\n ): Promise<void> {\n const plan = await planWorkers(worktreeRoot, {\n filter: Array.isArray(opts.workers) ? opts.workers : [],\n allowRemote: opts.allowRemote ?? false,\n force: opts.force ?? false,\n varlock: !opts.noVarlock && detectVarlock(worktreeRoot) !== null,\n });\n for (const w of plan.warnings) process.stderr.write(`warning: ${w}\\n`);\n\n for (const spec of plan.specs) {\n const clash = record.services.find(\n (s) => s.name === spec.name && s.backend === \"docker\",\n );\n if (clash !== undefined) {\n throw new HestiaError(\n \"name-conflict\",\n `worker \"${spec.name}\" collides with a compose service name`,\n );\n }\n }\n\n const globalBefore = snapshotGlobalRegistry();\n const results = await Promise.allSettled(\n plan.specs.map((spec) =>\n startProc(worktreeRoot, spec, record.env, (pf) =>\n mirrorPidfile(record.project, pf),\n ),\n ),\n );\n\n let firstError: unknown;\n const started: string[] = [];\n for (const [i, res] of results.entries()) {\n if (res.status === \"fulfilled\") {\n recordProc(record, res.value.record);\n if (res.value.error !== undefined) firstError ??= res.value.error;\n else started.push(plan.specs[i]!.name);\n } else {\n firstError ??= res.reason;\n }\n }\n // Persist what did start before surfacing any failure, so `down` cleans it.\n writeState(worktreeRoot, record);\n if (started.length > 0) {\n await verifyPrivateRegistry(privateRegistryDir(worktreeRoot), started);\n for (const w of globalGainWarnings(globalBefore, started)) {\n process.stderr.write(`warning: ${w}\\n`);\n }\n }\n if (firstError !== undefined) throw firstError;\n }\n\n async run(cwd: string, spec: ProcSpec, admit?: AdmitOptions): Promise<StackRecord> {\n const { repo, repoId, branch, worktreeRoot } = await getRepoInfo(cwd);\n await assertHestiaStateIgnored(worktreeRoot);\n const project = projectName(repoId, repo, branch, worktreeRoot);\n let tunnelDirty = false;\n\n const admission = await this.#admit(project, repoId, repo, branch, worktreeRoot, admit);\n let done: StackRecord;\n try {\n done = await this.#runLocked(worktreeRoot, project, repoId, repo, branch, admission.createdAt, spec, (d) => {\n tunnelDirty = d;\n });\n } catch (err) {\n await admission.rollback();\n throw err;\n }\n if (tunnelDirty) await this.#reconcileAdopted(done.tunnel);\n await this.#refreshLocalRoutes();\n return done;\n }\n\n async #runLocked(\n worktreeRoot: string,\n project: string,\n repoId: RepoId,\n repo: string,\n branch: string,\n admittedCreatedAt: string,\n spec: ProcSpec,\n setTunnelDirty: (d: boolean) => void,\n ): Promise<StackRecord> {\n return withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const record = readState(worktreeRoot);\n if (record?.createdAt !== admittedCreatedAt) {\n throw new HestiaError(\"worktree-busy\", \"stack was removed after admission; start cancelled\");\n }\n record.repoId ??= repoId;\n\n const docker = record.services.find(\n (s) => s.name === spec.name && s.backend === \"docker\",\n );\n if (docker !== undefined) {\n throw new HestiaError(\n \"name-conflict\",\n `\"${spec.name}\" is a compose service in this stack — pick another --name`,\n );\n }\n\n const existing = readPidfile(worktreeRoot, spec.name);\n if (existing !== null && isLive(existing)) {\n const sameCmd = existing.specFingerprint === procSpecFingerprint(spec);\n if (sameCmd) return record; // idempotent no-op: already running this\n persistStoppedService(record, spec.name);\n setTunnelDirty(syncExposures(record));\n writeState(worktreeRoot, record);\n await stopProcTree(existing); // replace: same name, different command\n removePidfile(worktreeRoot, spec.name);\n } else if (existing !== null) {\n removePidfile(worktreeRoot, spec.name); // stale (crashed/reused pid)\n }\n\n delete record.env[directUrlKey(spec.name)];\n const result = await startProc(worktreeRoot, spec, record.env, (pf) =>\n mirrorPidfile(record.project, pf),\n );\n recordProc(record, result.record);\n record.state = \"up\";\n delete record.starter; // no longer provisional — services carry the slot\n setTunnelDirty(syncExposures(record));\n writeState(worktreeRoot, record);\n if (result.error !== undefined) throw result.error;\n return record;\n }));\n }\n\n async stopService(cwd: string, name: string): Promise<void> {\n const currentIdentity = await getRepoInfo(cwd);\n const { repo, repoId, branch, worktreeRoot } = currentIdentity;\n let tunnel: TunnelRef | undefined;\n let tunnelDirty = false;\n const project = readState(worktreeRoot)?.project ?? projectName(repoId, repo, branch, worktreeRoot);\n await withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const record = readState(worktreeRoot);\n if (record !== null) {\n assertCurrentStackIdentity(record, currentIdentity);\n if (record.services.some((service) => service.name === name && service.backend === \"docker\")) {\n throw new HestiaError(\n \"backend-not-stoppable\",\n `Docker workload ${name} cannot be stopped individually; use hestia down`,\n );\n }\n }\n const pf = readPidfile(worktreeRoot, name);\n if (pf !== null) {\n await stopProcTree(pf);\n removePidfile(worktreeRoot, name);\n }\n if (record !== null) {\n const originAuxiliaries = (record.auxiliary ?? []).filter(\n (auxiliary) => auxiliary.originService === name,\n );\n for (const auxiliary of originAuxiliaries) {\n const auxiliaryPidfile = readPidfile(worktreeRoot, auxiliary.name);\n if (auxiliaryPidfile !== null && isLive(auxiliaryPidfile)) {\n await stopProcTree(auxiliaryPidfile);\n }\n removePidfile(worktreeRoot, auxiliary.name);\n }\n if (originAuxiliaries.length > 0) {\n const auxiliaryNames = new Set(originAuxiliaries.map((auxiliary) => auxiliary.name));\n record.auxiliary = (record.auxiliary ?? []).filter(\n (auxiliary) => !auxiliaryNames.has(auxiliary.name),\n );\n for (const auxiliary of originAuxiliaries) {\n const endpointName = auxiliary.originEndpoint ?? name;\n const endpoint = record.endpoints.find((candidate) => candidate.name === endpointName);\n if (endpoint !== undefined) delete endpoint.publicUrl;\n delete record.env[urlKey(endpointName)];\n }\n }\n // a quick tunnel going down takes its origin's public URL with it\n const stopped = record.services.find((s) => s.name === name);\n if (stopped?.originService !== undefined) {\n const endpointName = stopped.originEndpoint ?? stopped.originService;\n const ep = record.endpoints.find((e) => e.name === endpointName);\n if (ep !== undefined) delete ep.publicUrl;\n delete record.env[urlKey(endpointName)];\n }\n dropService(record, name);\n tunnel = record.tunnel;\n tunnelDirty = syncExposures(record);\n const hasStickyLocalRoutes = effectiveLocalRouteServices(record).length > 0;\n if (record.services.length === 0 && record.composeFile === undefined && !hasStickyLocalRoutes) {\n clearState(worktreeRoot, record.project);\n } else {\n writeState(worktreeRoot, record);\n }\n }\n }));\n if (tunnelDirty) await this.#reconcileAdopted(tunnel);\n await this.#refreshLocalRoutes();\n }\n\n async addLocalRoutes(cwd: string, services: string[]): Promise<StackRecord> {\n if (services.length === 0) throw new HestiaError(\"usage\", \"Route add: at least one service is required\");\n const daemon = await ensureDaemon();\n const currentIdentity = await getRepoInfo(cwd);\n const { worktreeRoot } = currentIdentity;\n const project = readState(worktreeRoot)?.project;\n if (project === undefined) throw new HestiaError(\"no-stack\", \"Route add: no stack for this worktree\");\n const record = await withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const current = readState(worktreeRoot);\n if (current === null) throw new HestiaError(\"no-stack\", \"Route add: no stack for this worktree\");\n assertCurrentStackIdentity(current, currentIdentity);\n const resolvedRoutes = services.map((input) => ({\n input,\n selection: resolveEndpointSelection(current, input),\n }));\n for (const { input, selection } of resolvedRoutes) {\n if (selection.endpoint.kind !== undefined && selection.endpoint.kind !== \"http\") {\n throw new HestiaError(\n \"usage\",\n `Route add requires an HTTP endpoint; ${input} is ${selection.endpoint.kind}`,\n );\n }\n const service = current.services.find((candidate) => candidate.name === selection.workload);\n const binding = service?.bindings?.find(\n (candidate) => `${candidate.target}/${candidate.protocol}` === selection.binding,\n );\n const publishedPort = binding?.publishedPort ?? service?.publishedPort;\n if (service === undefined || publishedPort === undefined || service.backend === \"tunnel\") {\n throw new HestiaError(\n \"route-origin-unavailable\",\n `Route add: endpoint \"${input}\" is not running with a direct port`,\n );\n }\n if (!await verifyStackServiceOrigin(current, service, publishedPort)) {\n throw new HestiaError(\n \"route-origin-unavailable\",\n `Route add: endpoint \"${input}\" no longer owns its recorded direct port`,\n );\n }\n }\n current.localRoutes ??= [];\n for (const { selection } of resolvedRoutes) {\n const alias = selection.endpoint.name;\n current.disabledLocalRoutes = (current.disabledLocalRoutes ?? []).filter(\n (route) => (route.alias ?? route.service) !== alias,\n );\n const intent = { service: selection.workload, selector: selection.binding, alias };\n const existing = current.localRoutes.findIndex((route) => (route.alias ?? route.service) === alias);\n if (existing >= 0) current.localRoutes[existing] = intent;\n else current.localRoutes.push(intent);\n }\n current.localRoutes.sort((left, right) => (left.alias ?? left.service).localeCompare(right.alias ?? right.service));\n applyLocalRouteProjection(current);\n writeState(worktreeRoot, current);\n return current;\n }));\n await reconcileDaemonLocalRoutes(daemon.port);\n return record;\n }\n\n async removeLocalRoutes(cwd: string, services: string[]): Promise<StackRecord> {\n return this.resetLocalRoutes(cwd, services);\n }\n\n async disableLocalRoutes(cwd: string, services: string[]): Promise<StackRecord> {\n return this.#setLocalRouteOverride(cwd, services, \"disable\");\n }\n\n async resetLocalRoutes(cwd: string, services: string[]): Promise<StackRecord> {\n return this.#setLocalRouteOverride(cwd, services, \"reset\");\n }\n\n async #setLocalRouteOverride(\n cwd: string,\n services: string[],\n mode: \"disable\" | \"reset\",\n ): Promise<StackRecord> {\n if (services.length === 0) throw new HestiaError(\"usage\", `Route ${mode}: at least one endpoint is required`);\n const currentIdentity = await getRepoInfo(cwd);\n const { worktreeRoot } = currentIdentity;\n const project = readState(worktreeRoot)?.project;\n if (project === undefined) throw new HestiaError(\"no-stack\", `Route ${mode}: no stack for this worktree`);\n const record = await withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const current = readState(worktreeRoot);\n if (current === null) throw new HestiaError(\"no-stack\", `Route ${mode}: no stack for this worktree`);\n assertCurrentStackIdentity(current, currentIdentity);\n const selections = services.map((input) => resolveEndpointSelection(current, input));\n const names = new Set(selections.map((selection) => selection.endpoint.name));\n current.localRoutes = (current.localRoutes ?? []).filter(\n (route) => !names.has(route.alias ?? route.service),\n );\n if (current.localRoutes.length === 0) delete current.localRoutes;\n current.disabledLocalRoutes = (current.disabledLocalRoutes ?? []).filter(\n (route) => !names.has(route.alias ?? route.service),\n );\n if (mode === \"disable\") {\n for (const selection of selections) {\n current.disabledLocalRoutes.push({\n service: selection.workload,\n selector: selection.binding,\n alias: selection.endpoint.name,\n });\n }\n }\n if (current.disabledLocalRoutes.length === 0) delete current.disabledLocalRoutes;\n applyLocalRouteProjection(current);\n if (\n current.services.length === 0 &&\n current.composeFile === undefined &&\n effectiveLocalRouteServices(current).length === 0\n ) {\n clearState(worktreeRoot, current.project);\n } else {\n writeState(worktreeRoot, current);\n }\n return current;\n }));\n await this.#refreshLocalRoutes();\n return record;\n }\n\n async down(cwd: string, opts?: DownOptions): Promise<void> {\n const { repo, repoId, branch, worktreeRoot } = await getRepoInfo(cwd);\n let tunnel: TunnelRef | undefined;\n let initialRecord: StackRecord | null = null;\n try {\n initialRecord = readState(worktreeRoot);\n } catch (error) {\n if ((error as { code?: string }).code !== \"state-corrupt\") throw error;\n }\n const mutationProject = initialRecord?.project ?? projectName(repoId, repo, branch, worktreeRoot);\n await withLock(worktreeRoot, () => withLock(projectMutationRoot(mutationProject), async () => {\n let record: StackRecord | null = null;\n try {\n record = readState(worktreeRoot);\n } catch (error) {\n if ((error as { code?: string }).code !== \"state-corrupt\") throw error;\n if (opts?.expectedStack !== undefined) {\n throw new HestiaError(\"worktree-busy\", \"cannot verify confirmed stack identity against corrupt state\");\n }\n }\n if (opts?.expectedStack !== undefined && !matchesExpectedStack(record, opts.expectedStack)) {\n throw new HestiaError(\"worktree-busy\", \"stack changed after down confirmation; retry\");\n }\n tunnel = record?.tunnel;\n\n // procs first — they depend on the containers, not vice-versa\n for (const pf of listPidfiles(procsDir(worktreeRoot))) {\n await stopProcTree(pf);\n removePidfile(worktreeRoot, pf.name);\n }\n rmSync(privateRegistryDir(worktreeRoot), { recursive: true, force: true });\n\n const composeFile = record?.composeFile ?? tryLoadConfig(worktreeRoot)?.composeFile;\n if (composeFile !== undefined) {\n const project =\n record?.project ?? projectName(repoId, repo, branch, worktreeRoot);\n const overrideFile =\n record?.overrideFile ?? join(hestiaDir(worktreeRoot), OVERRIDE_FILE);\n if (existsSync(overrideFile)) {\n await composeDown(\n { project, baseFile: composeFile, overrideFile, cwd: worktreeRoot },\n opts?.destroy ?? false,\n );\n } else if (record?.composeFile !== undefined) {\n // Recorded compose services but the override is gone — tear down by\n // project label alone, same as the mirror path (needs no files).\n const rest = [\"compose\", \"-p\", project, \"down\", \"--remove-orphans\"];\n if (opts?.destroy) rest.push(\"-v\");\n await pexec(\"docker\", rest, { timeout: 180_000 });\n }\n // else: the repo has a compose file but this stack never composed\n // (procs-only `run` in a compose repo) — nothing docker-side to do.\n }\n\n const project = record?.project ?? projectName(repoId, repo, branch, worktreeRoot);\n clearState(worktreeRoot, project);\n await this.#releaseAdmission(project);\n }));\n // mirror is gone → regen drops this stack's ingress rules; the connector\n // keeps serving the base rules and other worktrees\n await this.#reconcileAdopted(tunnel);\n await this.#refreshLocalRoutes();\n }\n\n /** Best-effort slot release — waiters get their grant now instead of at the next sweep. */\n async #releaseAdmission(project: string): Promise<void> {\n const j = readDaemonJson();\n if (j !== null) await releaseSlot(j.port, project);\n }\n\n /**\n * Teardown by project name from the ~/.hestia mirror — the worktree (and its\n * lock) may no longer exist. Containers go down by label via `compose -p`,\n * which needs no compose files.\n */\n async downProject(project: string, opts?: DownOptions): Promise<void> {\n if (!/^[a-z0-9][a-z0-9-]{0,99}$/.test(project)) {\n throw new HestiaError(\"usage\", `invalid project name ${JSON.stringify(project)}`);\n }\n let record: StackRecord | null = null;\n let mirrorCorrupt = false;\n try {\n record = readMirrorState(project);\n } catch (error) {\n if ((error as { code?: string }).code !== \"state-corrupt\") throw error;\n mirrorCorrupt = true;\n }\n const teardownFromMirror = async (): Promise<void> => {\n let fresh: StackRecord | null = null;\n try {\n fresh = readMirrorState(project);\n } catch (error) {\n if ((error as { code?: string }).code !== \"state-corrupt\") throw error;\n mirrorCorrupt = true;\n }\n if (mirrorCorrupt && opts?.expectedStack !== undefined) {\n throw new HestiaError(\"worktree-busy\", \"cannot verify confirmed stack identity against corrupt state\");\n }\n if (opts?.expectedStack !== undefined && !matchesExpectedStack(fresh, opts.expectedStack)) {\n throw new HestiaError(\"worktree-busy\", \"stack changed after down confirmation; retry\");\n }\n try {\n for (const pf of listPidfiles(mirrorProcsDir(project))) await stopProcTree(pf);\n } catch {\n // A corrupt pidfile is unsafe to signal. Continue with label-only\n // Docker cleanup and remove the corrupt mirror for manual proc audit.\n }\n try {\n const rest = [\"compose\", \"-p\", project, \"down\", \"--remove-orphans\"];\n if (opts?.destroy) rest.push(\"-v\");\n await pexec(\"docker\", rest, { timeout: 180_000 });\n } catch (err) {\n if (fresh?.composeFile !== undefined) {\n throw new HestiaError(\n \"compose-failed\",\n `docker compose -p ${project} down failed: ${(err as Error).message}`,\n );\n }\n }\n rmSync(mirrorDir(project), { recursive: true, force: true });\n };\n if (record !== null && existsSync(record.worktree)) {\n const info = await getRepoInfo(record.worktree);\n const identityMatches =\n resolve(info.worktreeRoot) === resolve(record.worktree) &&\n (record.repoId === undefined ? record.repo === info.repo : record.repoId === info.repoId);\n const localRecord = readState(record.worktree);\n if (identityMatches && localRecord?.project === record.project) {\n await this.down(record.worktree, opts);\n return;\n }\n if (identityMatches) {\n // A cleaned local .hestia directory still shares the worktree's\n // mutation lock with up/run, while teardown reads the surviving mirror.\n const usedMirror = await withLock(record.worktree, () =>\n withLock(projectMutationRoot(project), async () => {\n const current = readState(record.worktree);\n if (current?.project === project) return false;\n await teardownFromMirror();\n return true;\n })\n );\n if (!usedMirror) {\n await this.down(record.worktree, opts);\n return;\n }\n await this.#releaseAdmission(project);\n await this.#reconcileAdopted(record.tunnel);\n await this.#refreshLocalRoutes();\n return;\n }\n }\n\n // The mirror directory cannot host its own lock because successful\n // teardown removes it. Keep deleted-worktree serialization in a stable\n // project-lock directory outside the mirror being destroyed.\n const projectLockRoot = projectMutationRoot(project);\n await withLock(projectLockRoot, teardownFromMirror);\n await this.#releaseAdmission(project);\n await this.#reconcileAdopted(record?.tunnel);\n await this.#refreshLocalRoutes();\n }\n\n async expose(\n cwd: string,\n services: string[],\n opts?: ExposeOptions,\n ): Promise<StackRecord> {\n const currentIdentity = await getRepoInfo(cwd);\n const { worktreeRoot } = currentIdentity;\n if (services.length === 0) {\n throw new HestiaError(\"usage\", \"expose requires at least one service name\");\n }\n // Mode pick: --tunnel wins, else the sticky adoption, else quick tunnels.\n const existingRecord = readState(worktreeRoot);\n if (existingRecord !== null) assertCurrentStackIdentity(existingRecord, currentIdentity);\n const tunnelName = opts?.tunnel ?? existingRecord?.tunnel?.name;\n if (tunnelName === undefined && opts?.keepHostHeader) {\n throw new HestiaError(\n \"usage\",\n \"--keep-host-header is not supported for quick tunnels because guarded routing requires Hestia's internal authority\",\n );\n }\n await ensureDaemon();\n await this.#refreshLocalRoutes(true);\n if (tunnelName === undefined) {\n return this.#exposeQuick(worktreeRoot, services, opts);\n }\n return this.#exposeNamed(worktreeRoot, services, tunnelName, opts);\n }\n\n /** One quick tunnel per service — zero-account, URL rotates per run. */\n async #exposeQuick(\n worktreeRoot: string,\n services: string[],\n opts?: ExposeOptions,\n ): Promise<StackRecord> {\n const project = readState(worktreeRoot)?.project;\n if (project === undefined) {\n throw new HestiaError(\"service-not-found\", \"no stack in this worktree — `hestia up`/`run` something first\");\n }\n const exposed = await withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const record = readState(worktreeRoot);\n if (record === null) {\n throw new HestiaError(\n \"service-not-found\",\n \"no stack in this worktree — `hestia up`/`run` something first\",\n );\n }\n for (const input of services) {\n const selection = resolveEndpointSelection(record, input);\n if (selection.endpoint.kind !== undefined && selection.endpoint.kind !== \"http\") {\n throw new HestiaError(\"usage\", `public tunnels require an HTTP endpoint; ${input} is ${selection.endpoint.kind}`);\n }\n const alias = selection.endpoint.alias ?? selection.endpoint.name;\n const authority = internalEndpointAuthority(record.project, alias);\n const name = `aux-quick-${createHash(\"sha256\").update(alias).digest(\"hex\").slice(0, 10)}`;\n const quickCfg = join(hestiaDir(worktreeRoot), `quick-${name}.yml`);\n // A hostname-less ingress entry matches every request and is therefore\n // cloudflared's required terminal catch-all. It must remain the only\n // rule; appending `http_status:404` would make this catch-all non-final.\n writeAtomicTextFile(\n quickCfg,\n `ingress:\\n - service: ${JSON.stringify(`unix:${publicGatewaySocketPath()}`)}\\n` +\n ` originRequest:\\n httpHostHeader: ${JSON.stringify(authority)}\\n`,\n );\n const argv = [\n \"cloudflared\",\n \"tunnel\",\n \"--config\",\n quickCfg,\n \"--metrics\",\n \"127.0.0.1:{port}\",\n \"--grace-period\",\n \"5s\",\n \"--no-autoupdate\",\n \"--url\",\n \"http://127.0.0.1:1\",\n ];\n const existing = readPidfile(worktreeRoot, name);\n let metricsPort: number | undefined;\n if (\n existing !== null &&\n isLive(existing) &&\n existing.specFingerprint === procSpecFingerprint({\n name,\n argv,\n port: \"auto\",\n backend: \"tunnel\",\n originService: selection.workload,\n originEndpoint: alias,\n readyTimeoutMs: opts?.readyTimeoutMs,\n })\n ) {\n metricsPort = existing.port; // idempotent: same origin, still live\n } else {\n if (existing !== null) {\n if (isLive(existing)) await stopProcTree(existing);\n removePidfile(worktreeRoot, name);\n }\n const result = await startProc(\n worktreeRoot,\n {\n name,\n argv,\n port: \"auto\",\n backend: \"tunnel\",\n originService: selection.workload,\n originEndpoint: alias,\n readyTimeoutMs: opts?.readyTimeoutMs,\n },\n record.env,\n (pf) => mirrorPidfile(record.project, pf),\n );\n // metrics port only — never a public surface, so no recordProc\n upsertAuxiliary(record, result.record);\n metricsPort = result.record.publishedPort;\n if (result.error !== undefined) {\n writeState(worktreeRoot, record);\n throw result.error;\n }\n }\n const url =\n metricsPort !== undefined\n ? await quickTunnelUrl(metricsPort, opts?.readyTimeoutMs ?? 30_000)\n : null;\n if (url === null) {\n writeState(worktreeRoot, record);\n throw new HestiaError(\n \"tunnel-ready-timeout\",\n `quick tunnel for \"${alias}\" reported no URL in time (offline?) — ` +\n `left running, logs: .hestia/logs/${name}.log`,\n );\n }\n const ep = record.endpoints.find((endpoint) => endpoint.name === selection.endpoint.name);\n if (ep !== undefined) ep.publicUrl = url;\n else {\n setEndpoint(record, {\n name: alias,\n alias,\n workload: selection.workload,\n binding: selection.binding,\n kind: \"http\",\n host: \"127.0.0.1\",\n port: selection.endpoint.port,\n publicUrl: url,\n });\n }\n record.env[urlKey(alias)] = url;\n }\n writeState(worktreeRoot, record);\n return record;\n }));\n await this.#refreshLocalRoutes(true);\n return exposed;\n }\n\n /**\n * Unified named mode: adopt the existing tunnel, record this stack's\n * exposures (intent first — crash-safe), route DNS outside any lock, then\n * converge the machine-global connector. Lock order: worktree → global.\n */\n async #exposeNamed(\n worktreeRoot: string,\n services: string[],\n tunnelName: string,\n opts?: ExposeOptions,\n ): Promise<StackRecord> {\n const project = readState(worktreeRoot)?.project;\n if (project === undefined) {\n throw new HestiaError(\"service-not-found\", \"no stack in this worktree — `hestia up`/`run` something first\");\n }\n // network preflight — no locks held. Foreign connectors (the user's\n // manual `tunnel run`, a teammate's replica) make the edge load-balance\n // hostnames across worktrees; hestia never kills processes it didn't\n // spawn, so it refuses to become connector #2.\n const adopted = await adoptTunnel(tunnelName);\n if (adopted.connections > 0 && !isAdopted(adopted.uuid) && !opts?.force) {\n throw new HestiaError(\n \"tunnel-busy\",\n `tunnel \"${tunnelName}\" already has ${adopted.connections} live ` +\n `connector(s) — stop the other cloudflared first (hestia's ` +\n `connector serves your static hostnames too), or pass --force to ` +\n `accept nondeterministic routing`,\n );\n }\n\n const preflightRecord = readState(worktreeRoot);\n if (preflightRecord === null) {\n throw new HestiaError(\"service-not-found\", \"stack disappeared while preparing exposure\");\n }\n const baseRules = importBaseRules(adopted.uuid, tunnelName);\n const zone = opts?.zone ?? preflightRecord.tunnel?.zone ?? inferZone(baseRules);\n if (zone === undefined) {\n throw new HestiaError(\"usage\", \"cannot infer a zone from the tunnel's existing rules — pass --zone\");\n }\n const preparedHostnames = new Map<string, { hostname: string; alias: string; workload: string; binding: string }>();\n for (const input of services) {\n const selection = resolveEndpointSelection(preflightRecord, input);\n if (selection.endpoint.kind !== undefined && selection.endpoint.kind !== \"http\") {\n throw new HestiaError(\"usage\", `public tunnels require an HTTP endpoint; ${input} is ${selection.endpoint.kind}`);\n }\n const alias = selection.endpoint.alias ?? selection.endpoint.name;\n const hostname = hostnameFor(tunnelName, preflightRecord.branch, alias, zone);\n await assertNamedTunnelDns(hostname, adopted.uuid);\n preparedHostnames.set(input, {\n hostname,\n alias,\n workload: selection.workload,\n binding: selection.binding,\n });\n }\n\n await withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const record = readState(worktreeRoot);\n if (record === null) {\n throw new HestiaError(\n \"service-not-found\",\n \"no stack in this worktree — `hestia up`/`run` something first\",\n );\n }\n const t: TunnelRef =\n record.tunnel !== undefined && record.tunnel.uuid === adopted.uuid\n ? record.tunnel\n : {\n name: tunnelName,\n uuid: adopted.uuid,\n zone,\n credFile: adopted.credFile,\n exposures: [],\n };\n t.name = tunnelName;\n t.zone = zone;\n t.credFile = adopted.credFile;\n record.tunnel = t;\n\n for (const input of services) {\n const prepared = preparedHostnames.get(input)!;\n const selection = resolveEndpointSelection(record, input);\n const exp = t.exposures.find((candidate) =>\n (candidate.alias ?? candidate.service) === prepared.alias);\n if (exp !== undefined) {\n exp.service = prepared.workload;\n exp.alias = prepared.alias;\n exp.binding = prepared.binding;\n exp.hostname = prepared.hostname;\n exp.originPort = selection.endpoint.port;\n exp.keepHostHeader = opts?.keepHostHeader;\n } else {\n t.exposures.push({\n service: prepared.workload,\n alias: prepared.alias,\n binding: prepared.binding,\n hostname: prepared.hostname,\n originPort: selection.endpoint.port,\n keepHostHeader: opts?.keepHostHeader,\n });\n }\n }\n // DNS was verified before intent publication; Hestia never mutates DNS.\n writeState(worktreeRoot, record);\n }));\n\n const outcome = await reconcileTunnel(\n { name: tunnelName, uuid: adopted.uuid, credFile: adopted.credFile },\n { force: opts?.force, readyTimeoutMs: opts?.readyTimeoutMs },\n );\n for (const w of outcome.warnings) process.stderr.write(`warning: ${w}\\n`);\n\n const final = await withLock(worktreeRoot, () => withLock(projectMutationRoot(project), async () => {\n const record = readState(worktreeRoot);\n if (record === null) {\n throw new HestiaError(\n \"service-not-found\",\n \"stack disappeared while exposing (concurrent down?)\",\n );\n }\n for (const exp of record.tunnel?.exposures ?? []) {\n const url = `https://${exp.hostname}`;\n const alias = exp.alias ?? exp.service;\n const ep = record.endpoints.find((endpoint) => endpoint.name === alias);\n if (ep !== undefined) ep.publicUrl = url;\n else {\n setEndpoint(record, {\n name: alias,\n alias,\n workload: exp.service,\n binding: exp.binding,\n kind: \"http\",\n host: \"127.0.0.1\",\n port: exp.originPort,\n publicUrl: url,\n });\n }\n record.env[urlKey(alias)] = url;\n }\n writeState(worktreeRoot, record);\n return record;\n }));\n if (outcome.error !== undefined) throw outcome.error;\n await this.#refreshLocalRoutes(true);\n return final;\n }\n\n async status(cwd: string): Promise<StackRecord | null> {\n const { worktreeRoot } = await getRepoInfo(cwd);\n const record = readState(worktreeRoot);\n if (record === null) return null;\n\n let anyUp = false;\n\n // docker services: best-effort refresh of live health/ports\n if (record.composeFile !== undefined && record.overrideFile !== undefined) {\n try {\n const rows = await composePs({\n project: record.project,\n baseFile: record.composeFile,\n overrideFile: record.overrideFile,\n cwd: worktreeRoot,\n });\n const byName = new Map(rows.map((r) => [r.Service, r]));\n for (const svc of record.services) {\n if (svc.backend !== \"docker\") continue;\n const row = byName.get(svc.name);\n if (row === undefined) {\n svc.state = \"exited\";\n continue;\n }\n anyUp = true;\n svc.state =\n row.Health === \"healthy\" || row.State === \"running\"\n ? \"healthy\"\n : \"unhealthy\";\n const pub = publishedPortFor(row, svc.containerPort);\n if (pub !== undefined) {\n svc.publishedPort = pub;\n svc.containerId = row.ID ?? svc.containerId;\n const endpoint = record.endpoints.find((candidate) => candidate.name === svc.name);\n if (endpoint !== undefined) endpoint.port = pub;\n }\n }\n } catch {\n // docker unreachable — report last known state for docker services\n anyUp = record.services.some(\n (s) => s.backend === \"docker\" && s.state === \"healthy\",\n );\n }\n }\n\n // procs: live (pid + verbatim start-time) and still owning their port\n for (const svc of [...record.services, ...(record.auxiliary ?? [])]) {\n if (svc.backend === \"docker\") continue;\n const auxiliary = record.auxiliary?.includes(svc) ?? false;\n if (\n svc.pid === undefined ||\n !isLive({ pid: svc.pid, startTime: svc.startTime ?? \"\" })\n ) {\n svc.state = \"exited\";\n continue;\n }\n if (!auxiliary) anyUp = true;\n if (svc.publishedPort !== undefined) {\n try {\n const view = await inspectPort(svc.pid, svc.publishedPort);\n svc.state = view.ownerIsMember ? \"healthy\" : \"unhealthy\";\n } catch {\n svc.state = \"healthy\"; // ownership tool missing — alive is the best we know\n }\n } else {\n svc.state = \"healthy\";\n }\n const endpoint = record.endpoints.find((candidate) => candidate.name === svc.name);\n if (endpoint !== undefined && svc.publishedPort !== undefined) endpoint.port = svc.publishedPort;\n // quick tunnel that connected after its expose timed out: surface the URL\n if (\n svc.backend === \"tunnel\" &&\n svc.originService !== undefined &&\n svc.state === \"healthy\" &&\n svc.publishedPort !== undefined &&\n record.env[urlKey(svc.originEndpoint ?? svc.originService)] === undefined\n ) {\n const url = await quickTunnelUrl(svc.publishedPort, 1_000);\n if (url !== null) {\n const endpointName = svc.originEndpoint ?? svc.originService;\n record.env[urlKey(endpointName)] = url;\n const ep = record.endpoints.find((e) => e.name === endpointName);\n if (ep !== undefined) ep.publicUrl = url;\n }\n }\n }\n\n // named mode: the global connector, viewed from this stack\n if (record.tunnel !== undefined) {\n const pf = connectorPidfile(record.tunnel.uuid);\n let state: ServiceRecord[\"state\"] = \"exited\";\n if (pf !== null && isLive(pf)) {\n // an exposure aimed at a port this stack no longer holds is the\n // misdelivery hazard — report it, don't hide it behind /ready\n const portsCurrent = record.tunnel.exposures.every((exp) => {\n const svc = record.services.find((s) => s.name === exp.service);\n const binding = svc?.bindings?.find((candidate) =>\n `${candidate.target}/${candidate.protocol}` === exp.binding);\n return (binding?.publishedPort ?? svc?.publishedPort) === exp.originPort;\n });\n const ready =\n pf.port !== undefined ? await isReady(pf.port) : false;\n state = portsCurrent && ready ? \"healthy\" : \"unhealthy\";\n }\n upsertService(record, {\n name: \"tunnel\",\n backend: \"tunnel\",\n state,\n pid: pf?.pid,\n pgid: pf?.pgid,\n startTime: pf?.startTime,\n logPath: pf?.logPath,\n });\n }\n\n record.state = anyUp ? \"up\" : \"stopped\";\n applyLocalRouteProjection(record);\n return record;\n }\n\n restartService(): Promise<void> {\n throw new NotImplemented(\"restartService\");\n }\n}\n\nexport const engine = new ComposeEngine();\n",
|
|
119
|
+
"import type { LogLine } from \"@hestia/core\";\n\nfunction logLineSignature(line: LogLine): string {\n return `${line.project}\\0${line.service}\\0${line.source}\\0${line.meta === true ? \"1\" : \"0\"}\\0${line.text}`;\n}\n\n/** Suppress only the reconnect backfill prefix that overlaps the visible ring tail. */\nexport class ReconnectLogDeduper {\n readonly #capacity: number;\n #history: Array<{ signature: string; line: LogLine }> = [];\n #reconnectBuffer: Array<{ signature: string; line: LogLine }> | null = null;\n\n constructor(capacity = 50) {\n this.#capacity = capacity;\n }\n\n beginReconnect(): void {\n this.#reconnectBuffer = [];\n }\n\n push(line: LogLine): LogLine[] {\n const entry = { signature: logLineSignature(line), line };\n if (this.#reconnectBuffer === null || this.#history.length === 0) {\n this.#remember([entry]);\n return [line];\n }\n this.#reconnectBuffer.push(entry);\n const buffered = this.#reconnectBuffer;\n const activeOverlapLengths: number[] = [];\n const completedOverlapLengths: number[] = [];\n for (let start = 0; start < this.#history.length; start += 1) {\n const overlapLength = this.#history.length - start;\n const compared = Math.min(buffered.length, overlapLength);\n let matches = true;\n for (let index = 0; index < compared; index += 1) {\n if (buffered[index]!.signature !== this.#history[start + index]!.signature) {\n matches = false;\n break;\n }\n }\n if (!matches) continue;\n if (buffered.length <= overlapLength) activeOverlapLengths.push(overlapLength);\n if (buffered.length >= overlapLength) completedOverlapLengths.push(overlapLength);\n }\n if (activeOverlapLengths.length > 0) return [];\n const suppressed = Math.max(0, ...completedOverlapLengths);\n const fresh = buffered.slice(suppressed);\n this.#reconnectBuffer = null;\n this.#remember(fresh);\n return fresh.map((candidate) => candidate.line);\n }\n\n #remember(entries: Array<{ signature: string; line: LogLine }>): void {\n this.#history = [...this.#history, ...entries].slice(-this.#capacity);\n }\n}\n",
|
|
120
|
+
"import type {\n FleetEnvelope,\n FleetSnapshotEnvelope,\n FleetStackView,\n LogLine,\n RepoId,\n} from \"@hestia/core\";\nimport {\n doctor,\n engine,\n ensureDaemon,\n streamDaemonFleet,\n streamDaemonServiceLogs,\n type DoctorRow,\n} from \"@hestia/engine\";\nimport { ReconnectLogDeduper } from \"./log-reconnect-deduper.ts\";\n\nfunction isFleetEnvelope(value: unknown): value is FleetEnvelope {\n if (typeof value !== \"object\" || value === null) return false;\n const frame = value as Partial<FleetEnvelope>;\n if (!Number.isInteger(frame.sequence)) return false;\n if (frame.type === \"heartbeat\") return typeof frame.at === \"string\";\n if (frame.type !== \"snapshot\") return false;\n const snapshot = (frame as Partial<FleetSnapshotEnvelope>).snapshot;\n return (\n typeof snapshot === \"object\" &&\n snapshot !== null &&\n Array.isArray(snapshot.stacks) &&\n Array.isArray(snapshot.warnings)\n );\n}\n\nfunction isLogLine(value: unknown): value is LogLine {\n if (typeof value !== \"object\" || value === null) return false;\n const line = value as Partial<LogLine>;\n return (\n typeof line.project === \"string\" &&\n typeof line.service === \"string\" &&\n typeof line.source === \"string\" &&\n typeof line.text === \"string\"\n );\n}\n\nasync function reconnectDelay(attempt: number, signal: AbortSignal): Promise<void> {\n const delay = Math.min(4_000, 250 * 2 ** Math.min(attempt, 4));\n if (signal.aborted) return;\n await new Promise<void>((resolve) => {\n const timer = setTimeout(done, delay);\n function done() {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", done);\n resolve();\n }\n signal.addEventListener(\"abort\", done, { once: true });\n });\n}\n\n/** TUI data source owning daemon discovery, reconnects, logs, doctor, and safe down. */\nexport class DaemonFleetSource {\n readonly #lifetime = new AbortController();\n\n constructor(readonly repoId: RepoId) {}\n\n /** Follow full Fleet snapshots, rediscovering a restarted daemon and its new token/port. */\n async *fleet(signal: AbortSignal): AsyncGenerator<FleetEnvelope> {\n let attempt = 0;\n while (!signal.aborted && !this.#lifetime.signal.aborted) {\n try {\n const daemon = await ensureDaemon();\n for await (const frame of streamDaemonFleet(daemon.port, this.repoId, signal)) {\n if (!isFleetEnvelope(frame)) throw new Error(\"Fleet protocol frame is invalid\");\n attempt = 0;\n yield frame;\n }\n if (!signal.aborted) throw new Error(\"Fleet stream ended\");\n } catch (error) {\n if (signal.aborted || this.#lifetime.signal.aborted) return;\n yield {\n type: \"heartbeat\",\n sequence: -1,\n at: `disconnected: ${(error as Error).message}`,\n };\n await reconnectDelay(attempt++, signal);\n }\n }\n }\n\n /** Follow one service, retaining the UI ring while reconnecting with a small backfill. */\n async *logs(\n project: string,\n service: string,\n signal: AbortSignal,\n ): AsyncGenerator<LogLine> {\n let attempt = 0;\n let connectedBefore = false;\n const deduper = new ReconnectLogDeduper(50);\n while (!signal.aborted && !this.#lifetime.signal.aborted) {\n const connectedAt = Date.now();\n try {\n const daemon = await ensureDaemon();\n if (connectedBefore) {\n deduper.beginReconnect();\n }\n connectedBefore = true;\n for await (const line of streamDaemonServiceLogs(daemon.port, project, service, 50, signal)) {\n if (!isLogLine(line)) throw new Error(\"log protocol frame is invalid\");\n for (const freshLine of deduper.push(line)) yield freshLine;\n }\n if (!signal.aborted) throw new Error(\"log stream ended\");\n } catch {\n if (signal.aborted || this.#lifetime.signal.aborted) return;\n if (Date.now() - connectedAt >= 10_000) attempt = 0;\n await reconnectDelay(attempt++, signal);\n }\n }\n }\n\n /** Run report-only diagnostics for one extant managed worktree. */\n diagnose(worktree: string): Promise<DoctorRow[]> {\n return doctor(worktree);\n }\n\n /** Tear down one managed project while always retaining named volumes. */\n down(stack: FleetStackView): Promise<void> {\n if (stack.createdAt === undefined) {\n return Promise.reject(new Error(`stack ${stack.project} has no stable incarnation timestamp`));\n }\n return engine.downProject(stack.project, {\n destroy: false,\n expectedStack: {\n repoId: stack.repoId,\n worktree: stack.worktree,\n createdAt: stack.createdAt,\n },\n });\n }\n\n /** Stop every reconnect loop owned by this TUI process. */\n stop(): void {\n this.#lifetime.abort();\n }\n}\n",
|
|
121
|
+
"import type { FleetSnapshot, FleetStackView } from \"@hestia/core\";\n\nexport type FleetFocus = \"stacks\" | \"services\" | \"logs\" | \"filter\";\nexport type FleetLayoutMode = \"auto\" | \"split\" | \"stack\";\n\nexport interface FleetSelection {\n project?: string;\n service?: string;\n endpoint?: string;\n}\n\nexport interface FleetUiState {\n selection: FleetSelection;\n focus: FleetFocus;\n layout: FleetLayoutMode;\n filter: string;\n follow: boolean;\n logOffset: number;\n unseenLines: number;\n helpOpen: boolean;\n doctorOpen: boolean;\n confirmDown?: FleetStackView;\n downPending: boolean;\n}\n\nexport type FleetUiAction =\n | { type: \"reconcile\"; snapshot: FleetSnapshot; preferredProject?: string }\n | { type: \"move-stack\"; delta: number; snapshot: FleetSnapshot }\n | { type: \"move-service\"; delta: number; snapshot: FleetSnapshot }\n | { type: \"select-stack\"; project: string; snapshot: FleetSnapshot }\n | { type: \"select-service\"; service: string; snapshot: FleetSnapshot }\n | { type: \"select-endpoint\"; service: string; endpoint: string; snapshot: FleetSnapshot }\n | { type: \"focus\"; focus: FleetFocus }\n | { type: \"layout\"; layout: FleetLayoutMode }\n | { type: \"filter\"; filter: string; snapshot?: FleetSnapshot }\n | { type: \"follow\"; follow: boolean }\n | { type: \"scroll-logs\"; delta: number }\n | { type: \"new-lines\"; count: number; maxOffset?: number }\n | { type: \"help\"; open: boolean }\n | { type: \"doctor\"; open: boolean }\n | { type: \"confirm-down\"; stack?: FleetStackView }\n | { type: \"down-pending\"; pending: boolean };\n\n/** Create deterministic Fleet UI state before the first daemon snapshot arrives. */\nexport function createFleetUiState(): FleetUiState {\n return {\n selection: {},\n focus: \"stacks\",\n layout: \"auto\",\n filter: \"\",\n follow: true,\n logOffset: 0,\n unseenLines: 0,\n helpOpen: false,\n doctorOpen: false,\n downPending: false,\n };\n}\n\n/** Filter only Hestia-managed snapshot rows; Git worktrees are never discovered here. */\nexport function visibleFleetStacks(snapshot: FleetSnapshot, filter: string): FleetStackView[] {\n const needle = filter.trim().toLowerCase();\n if (needle === \"\") return snapshot.stacks;\n return snapshot.stacks.filter((stack) =>\n `${stack.project}\\n${stack.branch}\\n${stack.services.map((service) =>\n `${service.name}\\n${(service.endpoints ?? []).map((endpoint) => endpoint.name).join(\"\\n\")}`\n ).join(\"\\n\")}`\n .toLowerCase()\n .includes(needle),\n );\n}\n\nfunction nearestItem<T>(items: T[], currentIndex: number): T | undefined {\n return items[Math.min(Math.max(currentIndex, 0), Math.max(0, items.length - 1))];\n}\n\n/** Preserve stable project/service selection and clamp only when snapshot rows disappear. */\nexport function reconcileFleetSelection(\n previous: FleetSelection,\n snapshot: FleetSnapshot,\n preferredProject?: string,\n): FleetSelection {\n if (snapshot.stacks.length === 0) return {};\n const previousIndex = snapshot.stacks.findIndex((stack) => stack.project === previous.project);\n const stack = snapshot.stacks.find((candidate) => candidate.project === previous.project)\n ?? snapshot.stacks.find((candidate) => candidate.project === preferredProject)\n ?? nearestItem(snapshot.stacks, previousIndex < 0 ? 0 : previousIndex)\n ?? snapshot.stacks[0]!;\n const service = stack.services.find((candidate) => candidate.name === previous.service)\n ?? stack.services[0];\n const endpoints = service?.endpoints ?? (service?.endpoint === undefined ? [] : [service.endpoint]);\n const endpoint = endpoints.find((candidate) => candidate.name === previous.endpoint);\n return { project: stack.project, service: service?.name, endpoint: endpoint?.name };\n}\n\nfunction moveSelection<T>(items: T[], currentIndex: number, delta: number): T | undefined {\n if (items.length === 0) return undefined;\n const start = currentIndex < 0 ? 0 : currentIndex;\n const index = Math.min(items.length - 1, Math.max(0, start + delta));\n return items[index];\n}\n\n/** Reduce keyboard and stream events without coupling selection logic to React rendering. */\nexport function reduceFleetUiState(state: FleetUiState, action: FleetUiAction): FleetUiState {\n switch (action.type) {\n case \"reconcile\":\n const visibleSnapshot = state.filter === \"\"\n ? action.snapshot\n : { ...action.snapshot, stacks: visibleFleetStacks(action.snapshot, state.filter) };\n return {\n ...state,\n selection: reconcileFleetSelection(state.selection, visibleSnapshot, action.preferredProject),\n };\n case \"move-stack\": {\n const stacks = visibleFleetStacks(action.snapshot, state.filter);\n const currentIndex = stacks.findIndex((stack) => stack.project === state.selection.project);\n const stack = moveSelection(stacks, currentIndex, action.delta);\n return stack === undefined\n ? state\n : {\n ...state,\n selection: {\n project: stack.project,\n service: stack.services[0]?.name,\n endpoint: undefined,\n },\n follow: true,\n logOffset: 0,\n unseenLines: 0,\n };\n }\n case \"move-service\": {\n const stack = action.snapshot.stacks.find((candidate) => candidate.project === state.selection.project);\n if (stack === undefined) return state;\n const currentIndex = stack.services.findIndex((service) => service.name === state.selection.service);\n const service = moveSelection(stack.services, currentIndex, action.delta);\n return service === undefined\n ? state\n : {\n ...state,\n selection: {\n ...state.selection,\n service: service.name,\n endpoint: undefined,\n },\n follow: true,\n logOffset: 0,\n unseenLines: 0,\n };\n }\n case \"select-stack\": {\n const stack = visibleFleetStacks(action.snapshot, state.filter).find(\n (candidate) => candidate.project === action.project,\n );\n return stack === undefined ? state : {\n ...state,\n focus: \"stacks\",\n selection: {\n project: stack.project,\n service: stack.services[0]?.name,\n endpoint: undefined,\n },\n follow: true,\n logOffset: 0,\n unseenLines: 0,\n };\n }\n case \"select-service\": {\n const stack = action.snapshot.stacks.find(\n (candidate) => candidate.project === state.selection.project,\n );\n if (!stack?.services.some((service) => service.name === action.service)) return state;\n return {\n ...state,\n focus: \"services\",\n selection: {\n ...state.selection,\n service: action.service,\n endpoint: undefined,\n },\n follow: true,\n logOffset: 0,\n unseenLines: 0,\n };\n }\n case \"select-endpoint\": {\n const stack = action.snapshot.stacks.find(\n (candidate) => candidate.project === state.selection.project,\n );\n const service = stack?.services.find((candidate) => candidate.name === action.service);\n if (!service?.endpoints?.some((endpoint) => endpoint.name === action.endpoint)) return state;\n return {\n ...state,\n focus: \"services\",\n selection: { ...state.selection, service: action.service, endpoint: action.endpoint },\n };\n }\n case \"focus\": return { ...state, focus: action.focus };\n case \"layout\": return { ...state, layout: action.layout };\n case \"filter\": {\n if (action.snapshot === undefined) return { ...state, filter: action.filter };\n const visibleSnapshot = {\n ...action.snapshot,\n stacks: visibleFleetStacks(action.snapshot, action.filter),\n };\n return {\n ...state,\n filter: action.filter,\n selection: reconcileFleetSelection(state.selection, visibleSnapshot),\n };\n }\n case \"follow\": return {\n ...state,\n follow: action.follow,\n logOffset: action.follow ? 0 : state.logOffset,\n unseenLines: action.follow ? 0 : state.unseenLines,\n };\n case \"scroll-logs\": return {\n ...state,\n follow: action.delta > 0 ? state.follow : false,\n logOffset: Math.max(0, state.logOffset - action.delta),\n };\n case \"new-lines\": return state.follow\n ? state\n : {\n ...state,\n logOffset: Math.min(action.maxOffset ?? Number.MAX_SAFE_INTEGER, state.logOffset + action.count),\n unseenLines: state.unseenLines + action.count,\n };\n case \"help\": return { ...state, helpOpen: action.open };\n case \"doctor\": return { ...state, doctorOpen: action.open };\n case \"confirm-down\": return {\n ...state,\n confirmDown: action.stack,\n };\n case \"down-pending\": return { ...state, downPending: action.pending };\n }\n}\n",
|
|
122
|
+
"const ESCAPE_CONTROL_SEQUENCE = /\\x1b(?:\\][\\s\\S]*?(?:\\x07|\\x1b\\\\)|[PX^_][\\s\\S]*?\\x1b\\\\|\\[[0-?]*[ -/]*[@-~])/g;\nconst C1_CONTROL_SEQUENCE = /(?:[\\x90\\x98\\x9d\\x9e\\x9f][\\s\\S]*?(?:\\x07|\\x9c)|\\x9b[0-?]*[ -/]*[@-~])/g;\n\n/** Strip terminal control sequences from untrusted stack names and application logs. */\nexport function sanitizeFleetTerminalText(text: string, preserveNewlines = false): string {\n const controls = preserveNewlines\n ? /[\\x00-\\x08\\x0b-\\x1f\\x7f-\\x9f]/g\n : /[\\x00-\\x1f\\x7f-\\x9f]/g;\n return text\n .replace(ESCAPE_CONTROL_SEQUENCE, \"\")\n .replace(C1_CONTROL_SEQUENCE, \"\")\n .replace(controls, \"\");\n}\n",
|
|
123
|
+
"/** Fixed github-dark-inspired palette for the first Fleet cockpit. */\nexport const fleetTheme = {\n background: \"#0d1117\",\n panel: \"#161b22\",\n panelAlt: \"#21262d\",\n border: \"#30363d\",\n text: \"#c9d1d9\",\n muted: \"#8b949e\",\n accent: \"#58a6ff\",\n healthy: \"#3fb950\",\n warning: \"#d29922\",\n danger: \"#f85149\",\n selected: \"#1f6feb\",\n} as const;\n",
|
|
124
|
+
"export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n",
|
|
125
|
+
"import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n",
|
|
126
|
+
"// Generated by scripts/build.js\n\nexport const ambiguousMinimalCodePoint = 161;\nexport const ambiguousMaximumCodePoint = 1114109;\nexport const ambiguousRanges = [161, 161, 164, 164, 167, 168, 170, 170, 173, 174, 176, 180, 182, 186, 188, 191, 198, 198, 208, 208, 215, 216, 222, 225, 230, 230, 232, 234, 236, 237, 240, 240, 242, 243, 247, 250, 252, 252, 254, 254, 257, 257, 273, 273, 275, 275, 283, 283, 294, 295, 299, 299, 305, 307, 312, 312, 319, 322, 324, 324, 328, 331, 333, 333, 338, 339, 358, 359, 363, 363, 462, 462, 464, 464, 466, 466, 468, 468, 470, 470, 472, 472, 474, 474, 476, 476, 593, 593, 609, 609, 708, 708, 711, 711, 713, 715, 717, 717, 720, 720, 728, 731, 733, 733, 735, 735, 768, 879, 913, 929, 931, 937, 945, 961, 963, 969, 1025, 1025, 1040, 1103, 1105, 1105, 8208, 8208, 8211, 8214, 8216, 8217, 8220, 8221, 8224, 8226, 8228, 8231, 8240, 8240, 8242, 8243, 8245, 8245, 8251, 8251, 8254, 8254, 8308, 8308, 8319, 8319, 8321, 8324, 8364, 8364, 8451, 8451, 8453, 8453, 8457, 8457, 8467, 8467, 8470, 8470, 8481, 8482, 8486, 8486, 8491, 8491, 8531, 8532, 8539, 8542, 8544, 8555, 8560, 8569, 8585, 8585, 8592, 8601, 8632, 8633, 8658, 8658, 8660, 8660, 8679, 8679, 8704, 8704, 8706, 8707, 8711, 8712, 8715, 8715, 8719, 8719, 8721, 8721, 8725, 8725, 8730, 8730, 8733, 8736, 8739, 8739, 8741, 8741, 8743, 8748, 8750, 8750, 8756, 8759, 8764, 8765, 8776, 8776, 8780, 8780, 8786, 8786, 8800, 8801, 8804, 8807, 8810, 8811, 8814, 8815, 8834, 8835, 8838, 8839, 8853, 8853, 8857, 8857, 8869, 8869, 8895, 8895, 8978, 8978, 9312, 9449, 9451, 9547, 9552, 9587, 9600, 9615, 9618, 9621, 9632, 9633, 9635, 9641, 9650, 9651, 9654, 9655, 9660, 9661, 9664, 9665, 9670, 9672, 9675, 9675, 9678, 9681, 9698, 9701, 9711, 9711, 9733, 9734, 9737, 9737, 9742, 9743, 9756, 9756, 9758, 9758, 9792, 9792, 9794, 9794, 9824, 9825, 9827, 9829, 9831, 9834, 9836, 9837, 9839, 9839, 9886, 9887, 9919, 9919, 9926, 9933, 9935, 9939, 9941, 9953, 9955, 9955, 9960, 9961, 9963, 9969, 9972, 9972, 9974, 9977, 9979, 9980, 9982, 9983, 10045, 10045, 10102, 10111, 11094, 11097, 12872, 12879, 57344, 63743, 65024, 65039, 65533, 65533, 127232, 127242, 127248, 127277, 127280, 127337, 127344, 127373, 127375, 127376, 127387, 127404, 917760, 917999, 983040, 1048573, 1048576, 1114109];\n\nexport const fullwidthMinimalCodePoint = 12288;\nexport const fullwidthMaximumCodePoint = 65510;\nexport const fullwidthRanges = [12288, 12288, 65281, 65376, 65504, 65510];\n\nexport const halfwidthMinimalCodePoint = 8361;\nexport const halfwidthMaximumCodePoint = 65518;\nexport const halfwidthRanges = [8361, 8361, 65377, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65512, 65518];\n\nexport const narrowMinimalCodePoint = 32;\nexport const narrowMaximumCodePoint = 10630;\nexport const narrowRanges = [32, 126, 162, 163, 165, 166, 172, 172, 175, 175, 10214, 10221, 10629, 10630];\n\nexport const wideMinimalCodePoint = 4352;\nexport const wideMaximumCodePoint = 262141;\nexport const wideRanges = [4352, 4447, 8986, 8987, 9001, 9002, 9193, 9196, 9200, 9200, 9203, 9203, 9725, 9726, 9748, 9749, 9776, 9783, 9800, 9811, 9855, 9855, 9866, 9871, 9875, 9875, 9889, 9889, 9898, 9899, 9917, 9918, 9924, 9925, 9934, 9934, 9940, 9940, 9962, 9962, 9970, 9971, 9973, 9973, 9978, 9978, 9981, 9981, 9989, 9989, 9994, 9995, 10024, 10024, 10060, 10060, 10062, 10062, 10067, 10069, 10071, 10071, 10133, 10135, 10160, 10160, 10175, 10175, 11035, 11036, 11088, 11088, 11093, 11093, 11904, 11929, 11931, 12019, 12032, 12245, 12272, 12287, 12289, 12350, 12353, 12438, 12441, 12543, 12549, 12591, 12593, 12686, 12688, 12773, 12783, 12830, 12832, 12871, 12880, 42124, 42128, 42182, 43360, 43388, 44032, 55203, 63744, 64255, 65040, 65049, 65072, 65106, 65108, 65126, 65128, 65131, 94176, 94180, 94192, 94198, 94208, 101589, 101631, 101662, 101760, 101874, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 119552, 119638, 119648, 119670, 126980, 126980, 127183, 127183, 127374, 127374, 127377, 127386, 127488, 127490, 127504, 127547, 127552, 127560, 127568, 127569, 127584, 127589, 127744, 127776, 127789, 127797, 127799, 127868, 127870, 127891, 127904, 127946, 127951, 127955, 127968, 127984, 127988, 127988, 127992, 128062, 128064, 128064, 128066, 128252, 128255, 128317, 128331, 128334, 128336, 128359, 128378, 128378, 128405, 128406, 128420, 128420, 128507, 128591, 128640, 128709, 128716, 128716, 128720, 128722, 128725, 128728, 128732, 128735, 128747, 128748, 128756, 128764, 128992, 129003, 129008, 129008, 129292, 129338, 129340, 129349, 129351, 129535, 129648, 129660, 129664, 129674, 129678, 129734, 129736, 129736, 129741, 129756, 129759, 129770, 129775, 129784, 131072, 196605, 196608, 262141];\n",
|
|
127
|
+
"/**\nBinary search on a sorted flat array of [start, end] pairs.\n\n@param {number[]} ranges - Flat array of inclusive [start, end] range pairs, e.g. [0, 5, 10, 20].\n@param {number} codePoint - The value to search for.\n@returns {boolean} Whether the value falls within any of the ranges.\n*/\nexport const isInRange = (ranges, codePoint) => {\n\tlet low = 0;\n\tlet high = Math.floor(ranges.length / 2) - 1;\n\twhile (low <= high) {\n\t\tconst mid = Math.floor((low + high) / 2);\n\t\tconst i = mid * 2;\n\t\tif (codePoint < ranges[i]) {\n\t\t\thigh = mid - 1;\n\t\t} else if (codePoint > ranges[i + 1]) {\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n",
|
|
128
|
+
"import {\n\tambiguousMinimalCodePoint,\n\tambiguousMaximumCodePoint,\n\tambiguousRanges,\n\n\tfullwidthMinimalCodePoint,\n\tfullwidthMaximumCodePoint,\n\tfullwidthRanges,\n\n\thalfwidthMinimalCodePoint,\n\thalfwidthMaximumCodePoint,\n\thalfwidthRanges,\n\n\tnarrowMinimalCodePoint,\n\tnarrowMaximumCodePoint,\n\tnarrowRanges,\n\n\twideMinimalCodePoint,\n\twideMaximumCodePoint,\n\twideRanges,\n} from './lookup-data.js';\nimport {isInRange} from './utilities.js';\n\nconst commonCjkCodePoint = 0x4E_00;\nconst [wideFastPathStart, wideFastPathEnd] = /* #__PURE__ */ findWideFastPathRange(wideRanges);\n\n// Use a hot-path range so common `isWide` calls can skip binary search.\n// The range containing U+4E00 covers common CJK ideographs;\n// fallback to the largest range for resilience to Unicode table changes.\nfunction findWideFastPathRange(ranges) {\n\tlet fastPathStart = ranges[0];\n\tlet fastPathEnd = ranges[1];\n\n\tfor (let index = 0; index < ranges.length; index += 2) {\n\t\tconst start = ranges[index];\n\t\tconst end = ranges[index + 1];\n\n\t\tif (\n\t\t\tcommonCjkCodePoint >= start\n\t\t\t&& commonCjkCodePoint <= end\n\t\t) {\n\t\t\treturn [start, end];\n\t\t}\n\n\t\tif ((end - start) > (fastPathEnd - fastPathStart)) {\n\t\t\tfastPathStart = start;\n\t\t\tfastPathEnd = end;\n\t\t}\n\t}\n\n\treturn [fastPathStart, fastPathEnd];\n}\n\nexport const isAmbiguous = codePoint => {\n\tif (\n\t\tcodePoint < ambiguousMinimalCodePoint\n\t\t|| codePoint > ambiguousMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(ambiguousRanges, codePoint);\n};\n\nexport const isFullWidth = codePoint => {\n\tif (\n\t\tcodePoint < fullwidthMinimalCodePoint\n\t\t|| codePoint > fullwidthMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(fullwidthRanges, codePoint);\n};\n\nconst isHalfWidth = codePoint => {\n\tif (\n\t\tcodePoint < halfwidthMinimalCodePoint\n\t\t|| codePoint > halfwidthMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(halfwidthRanges, codePoint);\n};\n\nconst isNarrow = codePoint => {\n\tif (\n\t\tcodePoint < narrowMinimalCodePoint\n\t\t|| codePoint > narrowMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(narrowRanges, codePoint);\n};\n\nexport const isWide = codePoint => {\n\tif (\n\t\tcodePoint >= wideFastPathStart\n\t\t&& codePoint <= wideFastPathEnd\n\t) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\tcodePoint < wideMinimalCodePoint\n\t\t|| codePoint > wideMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(wideRanges, codePoint);\n};\n\nexport function getCategory(codePoint) {\n\tif (isAmbiguous(codePoint)) {\n\t\treturn 'ambiguous';\n\t}\n\n\tif (isFullWidth(codePoint)) {\n\t\treturn 'fullwidth';\n\t}\n\n\tif (isHalfWidth(codePoint)) {\n\t\treturn 'halfwidth';\n\t}\n\n\tif (isNarrow(codePoint)) {\n\t\treturn 'narrow';\n\t}\n\n\tif (isWide(codePoint)) {\n\t\treturn 'wide';\n\t}\n\n\treturn 'neutral';\n}\n",
|
|
129
|
+
"import {getCategory, isAmbiguous, isFullWidth, isWide} from './lookup.js';\n\nfunction validate(codePoint) {\n\tif (!Number.isSafeInteger(codePoint)) {\n\t\tthrow new TypeError(`Expected a code point, got \\`${typeof codePoint}\\`.`);\n\t}\n}\n\nexport function eastAsianWidthType(codePoint) {\n\tvalidate(codePoint);\n\n\treturn getCategory(codePoint);\n}\n\nexport function eastAsianWidth(codePoint, {ambiguousAsWide = false} = {}) {\n\tvalidate(codePoint);\n\n\tif (\n\t\tisFullWidth(codePoint)\n\t\t|| isWide(codePoint)\n\t\t|| (ambiguousAsWide && isAmbiguous(codePoint))\n\t) {\n\t\treturn 2;\n\t}\n\n\treturn 1;\n}\n\n// Private exports for https://github.com/sindresorhus/is-fullwidth-code-point\nexport {isFullWidth as _isFullWidth, isWide as _isWide} from './lookup.js';\n",
|
|
130
|
+
"export default () => {\n\t// https://mths.be/emoji\n\treturn /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E-\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED8\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDD75(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3C-\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE8A\\uDE8E-\\uDEC2\\uDEC6\\uDEC8\\uDECD-\\uDEDC\\uDEDF-\\uDEEA\\uDEEF]|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g;\n};\n",
|
|
131
|
+
"import stripAnsi from 'strip-ansi';\nimport {eastAsianWidth} from 'get-east-asian-width';\nimport emojiRegex from 'emoji-regex';\n\nconst segmenter = new Intl.Segmenter();\n\nconst defaultIgnorableCodePointRegex = /^\\p{Default_Ignorable_Code_Point}$/u;\n\nexport default function stringWidth(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment: character} of segmenter.segment(string)) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore zero-width characters\n\t\tif (\n\t\t\t(codePoint >= 0x20_0B && codePoint <= 0x20_0F) // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark\n\t\t\t|| codePoint === 0xFE_FF // Zero-width no-break space\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (\n\t\t\t(codePoint >= 0x3_00 && codePoint <= 0x3_6F) // Combining diacritical marks\n\t\t\t|| (codePoint >= 0x1A_B0 && codePoint <= 0x1A_FF) // Combining diacritical marks extended\n\t\t\t|| (codePoint >= 0x1D_C0 && codePoint <= 0x1D_FF) // Combining diacritical marks supplement\n\t\t\t|| (codePoint >= 0x20_D0 && codePoint <= 0x20_FF) // Combining diacritical marks for symbols\n\t\t\t|| (codePoint >= 0xFE_20 && codePoint <= 0xFE_2F) // Combining half marks\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore surrogate pairs\n\t\tif (codePoint >= 0xD8_00 && codePoint <= 0xDF_FF) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore variation selectors\n\t\tif (codePoint >= 0xFE_00 && codePoint <= 0xFE_0F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This covers some of the above cases, but we still keep them for performance reasons.\n\t\tif (defaultIgnorableCodePointRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: Use `/\\p{RGI_Emoji}/v` when targeting Node.js 20.\n\t\tif (emojiRegex().test(character)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n",
|
|
132
|
+
"import stringWidth from \"string-width\";\n\n/** Crop terminal text by display cells rather than JavaScript code-unit length. */\nexport function fitFleetText(text: string, width: number): string {\n if (width <= 0) return \"\";\n if (stringWidth(text) <= width) return text;\n const suffix = width > 1 ? \"…\" : \"\";\n let result = \"\";\n for (const character of Array.from(text)) {\n if (stringWidth(result + character + suffix) > width) break;\n result += character;\n }\n return result + suffix;\n}\n\n/** Pad terminal text to an exact display-cell width. */\nexport function padFleetText(text: string, width: number): string {\n const fitted = fitFleetText(text, width);\n return fitted + \" \".repeat(Math.max(0, width - stringWidth(fitted)));\n}\n",
|
|
133
|
+
"import type { FleetStackView } from \"@hestia/core\";\nimport { padFleetText } from \"../fleet-text.ts\";\nimport { fleetTheme } from \"../fleet-theme.ts\";\nimport { sanitizeFleetTerminalText } from \"../terminal-text.ts\";\n\nfunction phaseColor(phase: FleetStackView[\"phase\"]): string {\n if (phase === \"up\") return fleetTheme.healthy;\n if (phase === \"degraded\" || phase === \"unknown\") return fleetTheme.warning;\n if (phase === \"stopped\") return fleetTheme.danger;\n return fleetTheme.accent;\n}\n\n/** Render only the managed stack rows supplied by the daemon Fleet snapshot. */\nexport function StackSidebar({\n stacks,\n selectedProject,\n width,\n onSelectProject,\n}: {\n stacks: FleetStackView[];\n selectedProject?: string;\n width: number;\n onSelectProject?: (project: string) => void;\n}) {\n return (\n <box style={{ width, height: \"100%\", flexDirection: \"column\", border: true, borderColor: fleetTheme.border }}>\n <box style={{ height: 1, paddingLeft: 1, backgroundColor: fleetTheme.panelAlt }}>\n <text fg={fleetTheme.text}>Fleet</text>\n </box>\n {stacks.length === 0 ? (\n <box style={{ paddingLeft: 1, paddingTop: 1 }}>\n <text fg={fleetTheme.muted}>No managed stacks</text>\n </box>\n ) : stacks.map((stack) => {\n const selected = stack.project === selectedProject;\n const branch = sanitizeFleetTerminalText(stack.branch);\n return (\n <box\n key={stack.project}\n onMouseDown={(event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n onSelectProject?.(stack.project);\n }}\n style={{\n height: 1,\n paddingLeft: 1,\n paddingRight: 1,\n flexDirection: \"row\",\n backgroundColor: selected ? fleetTheme.selected : fleetTheme.background,\n }}\n >\n <text fg={selected ? \"#ffffff\" : phaseColor(stack.phase)}>{selected ? \"▸ \" : \" \"}</text>\n <text fg={selected ? \"#ffffff\" : fleetTheme.text}>\n {padFleetText(branch, Math.max(4, width - 13))}\n </text>\n <text fg={selected ? \"#ffffff\" : phaseColor(stack.phase)}>\n {padFleetText(stack.phase, 9)}\n </text>\n </box>\n );\n })}\n </box>\n );\n}\n",
|
|
134
|
+
"import type { FleetEndpointView, FleetServiceView, FleetStackView } from \"@hestia/core\";\nimport { padFleetText } from \"../fleet-text.ts\";\nimport { fleetTheme } from \"../fleet-theme.ts\";\nimport { sanitizeFleetTerminalText } from \"../terminal-text.ts\";\n\nfunction serviceColor(service: FleetServiceView): string {\n if (service.state === \"healthy\") return fleetTheme.healthy;\n if (service.state === \"unknown\" || service.state === \"unhealthy\") return fleetTheme.warning;\n return fleetTheme.danger;\n}\n\nfunction endpointReach(endpoint: FleetEndpointView): string {\n return endpoint.localUrl ?? endpoint.publicUrl ?? endpoint.url ?? `${endpoint.host}:${endpoint.port}`;\n}\n\n/** Render workload rows for lifecycle/log selection and child endpoints for reachability actions. */\nexport function ServicePane({\n stack,\n selectedService,\n selectedEndpoint,\n onSelectService,\n onSelectEndpoint,\n}: {\n stack?: FleetStackView;\n selectedService?: string;\n selectedEndpoint?: string;\n onSelectService?: (service: string) => void;\n onSelectEndpoint?: (service: string, endpoint: string) => void;\n}) {\n return (\n <box style={{ height: \"100%\", width: \"100%\", flexDirection: \"column\", border: true, borderColor: fleetTheme.border }}>\n <box style={{ height: 1, paddingLeft: 1, backgroundColor: fleetTheme.panelAlt }}>\n <text fg={fleetTheme.text}>\n {stack === undefined ? \"Workloads\" : `Workloads — ${sanitizeFleetTerminalText(stack.branch)}`}\n </text>\n </box>\n {stack?.services.length ? stack.services.flatMap((service) => {\n const workloadSelected = service.name === selectedService && selectedEndpoint === undefined;\n const endpoints = service.endpoints ?? (service.endpoint === undefined ? [] : [service.endpoint]);\n const workloadRow = (\n <box\n key={`workload:${service.name}`}\n onMouseDown={(event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n onSelectService?.(service.name);\n }}\n style={{\n height: 1,\n paddingLeft: 1,\n paddingRight: 1,\n flexDirection: \"row\",\n backgroundColor: workloadSelected ? fleetTheme.selected : fleetTheme.background,\n }}\n >\n <text fg={workloadSelected ? \"#ffffff\" : serviceColor(service)}>{workloadSelected ? \"▸ \" : \" \"}</text>\n <text fg={workloadSelected ? \"#ffffff\" : fleetTheme.text}>\n {padFleetText(sanitizeFleetTerminalText(service.name), 20)}\n </text>\n <text fg={workloadSelected ? \"#ffffff\" : fleetTheme.muted}>{padFleetText(service.backend, 10)}</text>\n <text fg={workloadSelected ? \"#ffffff\" : serviceColor(service)}>{service.state}</text>\n </box>\n );\n const endpointRows = endpoints.map((endpoint, index) => {\n const endpointSelected = service.name === selectedService && endpoint.name === selectedEndpoint;\n const connector = index === endpoints.length - 1 ? \"└─\" : \"├─\";\n const kind = (endpoint.kind ?? \"http\").toUpperCase();\n const selector = `${endpoint.workload ?? service.name}:${endpoint.binding ?? endpoint.port}`;\n return (\n <box\n key={`endpoint:${service.name}:${endpoint.name}`}\n onMouseDown={(event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n onSelectEndpoint?.(service.name, endpoint.name);\n }}\n style={{\n height: 1,\n paddingLeft: 2,\n paddingRight: 1,\n flexDirection: \"row\",\n backgroundColor: endpointSelected ? fleetTheme.selected : fleetTheme.background,\n }}\n >\n <text fg={endpointSelected ? \"#ffffff\" : fleetTheme.muted}>{endpointSelected ? \"▸ \" : `${connector} `}</text>\n <text fg={endpointSelected ? \"#ffffff\" : fleetTheme.accent}>\n {padFleetText(sanitizeFleetTerminalText(endpoint.name), 18)}\n </text>\n <text fg={endpointSelected ? \"#ffffff\" : fleetTheme.muted}>{padFleetText(kind, 8)}</text>\n <text fg={endpointSelected ? \"#ffffff\" : fleetTheme.muted}>\n {padFleetText(sanitizeFleetTerminalText(selector), 20)}\n </text>\n <text fg={endpointSelected ? \"#ffffff\" : fleetTheme.text}>\n {sanitizeFleetTerminalText(endpointReach(endpoint))}\n </text>\n </box>\n );\n });\n return [workloadRow, ...endpointRows];\n }) : (\n <box style={{ paddingLeft: 1, paddingTop: 1 }}>\n <text fg={fleetTheme.muted}>No workloads recorded</text>\n </box>\n )}\n </box>\n );\n}\n",
|
|
135
|
+
"import type { LogLine } from \"@hestia/core\";\nimport { fitFleetText, padFleetText } from \"../fleet-text.ts\";\nimport { fleetTheme } from \"../fleet-theme.ts\";\n\n/** Render only visible selected-service log rows plus a tiny overscan window. */\nexport function LogPane({\n lines,\n height,\n width,\n offset,\n follow,\n unseen,\n label,\n onScroll,\n}: {\n lines: LogLine[];\n height: number;\n width: number;\n offset: number;\n follow: boolean;\n unseen: number;\n label: string;\n onScroll?: (delta: number) => void;\n}) {\n const viewportRows = Math.max(1, height - 3);\n const end = Math.max(0, lines.length - offset);\n const start = Math.max(0, end - viewportRows - 2);\n const visible = lines.slice(start, end).slice(-viewportRows);\n return (\n <box\n onMouseScroll={(event) => {\n if (event.button !== 4 && event.button !== 5) return;\n event.preventDefault();\n event.stopPropagation();\n onScroll?.(event.button === 4 ? -3 : 3);\n }}\n style={{ height: \"100%\", width: \"100%\", flexDirection: \"column\", border: true, borderColor: fleetTheme.border }}\n >\n <box style={{ height: 1, paddingLeft: 1, paddingRight: 1, flexDirection: \"row\", backgroundColor: fleetTheme.panelAlt }}>\n <text fg={fleetTheme.text}>{padFleetText(`Logs — ${label}`, Math.max(1, width - 24))}</text>\n <text fg={follow ? fleetTheme.healthy : fleetTheme.warning}>\n {follow ? \"following\" : `paused${unseen > 0 ? ` · ${unseen} new` : \"\"}`}\n </text>\n </box>\n {visible.length === 0 ? (\n <box style={{ paddingLeft: 1, paddingTop: 1 }}>\n <text fg={fleetTheme.muted}>No log output yet — service is still being followed.</text>\n </box>\n ) : visible.map((line, index) => (\n <box key={`${start + index}-${line.text}`} style={{ height: 1, paddingLeft: 1 }}>\n <text fg={line.meta ? fleetTheme.warning : fleetTheme.text}>\n {fitFleetText(line.meta ? `[hestia] ${line.text}` : line.text, Math.max(1, width - 4))}\n </text>\n </box>\n ))}\n </box>\n );\n}\n",
|
|
136
|
+
"import type { ReactNode } from \"react\";\nimport { fleetTheme } from \"../fleet-theme.ts\";\n\n/** Centered modal with a mouse-catching backdrop so destructive keys cannot leak through. */\nexport function FleetModal({\n title,\n terminalWidth,\n terminalHeight,\n children,\n}: {\n title: string;\n terminalWidth: number;\n terminalHeight: number;\n children: ReactNode;\n}) {\n const width = Math.min(72, Math.max(30, terminalWidth - 4));\n const height = Math.min(18, Math.max(7, terminalHeight - 4));\n return (\n <>\n <box style={{ position: \"absolute\", top: 0, left: 0, width: terminalWidth, height: terminalHeight, zIndex: 50 }} />\n <box\n style={{\n position: \"absolute\",\n top: Math.max(1, Math.floor((terminalHeight - height) / 2)),\n left: Math.max(1, Math.floor((terminalWidth - width) / 2)),\n width,\n height,\n zIndex: 60,\n border: true,\n borderColor: fleetTheme.accent,\n backgroundColor: fleetTheme.panel,\n flexDirection: \"column\",\n paddingLeft: 1,\n paddingRight: 1,\n paddingTop: 1,\n }}\n >\n <text fg={fleetTheme.accent}>{title}</text>\n <box style={{ height: 1 }} />\n {children}\n </box>\n </>\n );\n}\n",
|
|
137
|
+
"import { useEffect, useMemo, useReducer, useRef, useState } from \"react\";\nimport { existsSync } from \"node:fs\";\nimport { useKeyboard, useRenderer, useTerminalDimensions } from \"@opentui/react\";\nimport type { FleetSnapshot, FleetStackView, LogLine, RepoId } from \"@hestia/core\";\nimport type { DoctorRow } from \"@hestia/engine\";\nimport { DaemonFleetSource } from \"./fleet-source.ts\";\nimport {\n createFleetUiState,\n reduceFleetUiState,\n visibleFleetStacks,\n type FleetFocus,\n} from \"./fleet-controller.ts\";\nimport { sanitizeFleetTerminalText } from \"./terminal-text.ts\";\nimport { fleetTheme } from \"./fleet-theme.ts\";\nimport { StackSidebar } from \"./components/StackSidebar.tsx\";\nimport { ServicePane } from \"./components/ServicePane.tsx\";\nimport { LogPane } from \"./components/LogPane.tsx\";\nimport { FleetModal } from \"./components/FleetModal.tsx\";\n\nconst LOG_RING_CAPACITY = 2_000;\nconst EMPTY_CAPACITY = { maxStacks: 0, live: 0, reserved: 0, queued: 0 };\n\nexport interface InvokingRepositoryContext {\n repo: string;\n branch: string;\n worktree: string;\n}\n\n/** Preserve path orientation and basename while fitting narrow terminals. */\nexport function middleTruncateWorktreePath(path: string, width: number): string {\n if (path.length <= width) return path;\n if (width <= 3) return path.slice(0, width);\n const parts = path.split(\"/\");\n const basename = parts.at(-1) || path;\n if (basename.length + 3 >= width) {\n const tail = basename.slice(-Math.max(1, width - 2));\n return `…/${tail}`.slice(0, width);\n }\n const prefixWidth = width - basename.length - 2;\n return `${path.slice(0, prefixWidth)}…/${basename}`;\n}\n\nfunction emptySnapshot(repoId: RepoId): FleetSnapshot {\n return { repoId, observedAt: new Date(0).toISOString(), capacity: EMPTY_CAPACITY, stacks: [], warnings: [] };\n}\n\nfunction isEscape(key: { name: string; sequence?: string }): boolean {\n const name = key.name.toLowerCase();\n return name === \"escape\" || name === \"esc\" || key.sequence === \"\\x1b\";\n}\n\nfunction isFleetKey(\n key: {\n name: string;\n sequence?: string;\n ctrl?: boolean;\n meta?: boolean;\n option?: boolean;\n super?: boolean;\n hyper?: boolean;\n },\n value: string,\n): boolean {\n return !key.ctrl && !key.meta && !key.option && !key.super && !key.hyper &&\n (key.name === value || key.sequence === value);\n}\n\nfunction selectedStack(snapshot: FleetSnapshot, project?: string): FleetStackView | undefined {\n return snapshot.stacks.find((stack) => stack.project === project);\n}\n\nfunction fleetServiceRowCount(stack: FleetStackView | undefined): number {\n return stack?.services.reduce((count, service) =>\n count + 1 + (service.endpoints?.length ?? (service.endpoint === undefined ? 0 : 1)), 0) ?? 0;\n}\n\nfunction selectedFleetEndpoint(\n stack: FleetStackView | undefined,\n serviceName?: string,\n endpointName?: string,\n): FleetStackView[\"services\"][number][\"endpoint\"] {\n const service = stack?.services.find((candidate) => candidate.name === serviceName);\n const endpoints = service?.endpoints ?? (service?.endpoint === undefined ? [] : [service.endpoint]);\n return endpoints.find((endpoint) => endpoint.name === endpointName) ?? endpoints[0];\n}\n\nfunction usableEndpoint(\n stack: FleetStackView | undefined,\n serviceName?: string,\n endpointName?: string,\n): string | undefined {\n const endpoint = selectedFleetEndpoint(stack, serviceName, endpointName);\n if (endpoint === undefined) return undefined;\n return endpoint.localUrl ?? endpoint.publicUrl ?? endpoint.url ?? `${endpoint.host}:${endpoint.port}`;\n}\n\nfunction copyableEndpoint(\n stack: FleetStackView | undefined,\n serviceName?: string,\n endpointName?: string,\n): FleetStackView[\"services\"][number][\"endpoint\"] {\n return selectedFleetEndpoint(stack, serviceName, endpointName);\n}\n\n/** Reset the visible log ring whenever a stack or service incarnation changes. */\nexport function fleetLogSelectionKey(\n stack: FleetStackView | undefined,\n serviceName: string | undefined,\n): string | undefined {\n if (stack === undefined || serviceName === undefined) return undefined;\n const service = stack.services.find((candidate) => candidate.name === serviceName);\n if (service === undefined) return undefined;\n return `${stack.project}\\0${service.name}\\0${stack.createdAt ?? \"\"}\\0${service.publishedPort ?? \"\"}`;\n}\n\nfunction openFleetUrl(value: string): void {\n if (!/^https?:\\/\\//.test(value) || process.env.HESTIA_NO_OPEN) return;\n const command = process.platform === \"darwin\" ? [\"open\", value] : [\"xdg-open\", value];\n try {\n Bun.spawn(command, { stdout: \"ignore\", stderr: \"ignore\" }).unref();\n } catch {\n // The status notice still exposes the URL when no desktop opener exists.\n }\n}\n\n/** Summarize diagnostic rows that do not fit in the fixed-height report. */\nexport function doctorOmissionSummary(rows: DoctorRow[], visibleRows = 10): string | undefined {\n const omitted = rows.slice(visibleRows);\n if (omitted.length === 0) return undefined;\n const errors = omitted.filter((row) => row.level === \"error\").length;\n const warnings = omitted.filter((row) => row.level === \"warn\").length;\n return `… ${omitted.length} more (${errors} errors, ${warnings} warnings)`;\n}\n\n/** Compose the live Fleet panes while keeping transport and selection state in separate seams. */\nexport function FleetApp({\n source,\n preferredProject,\n invokingRepository,\n onQuit,\n}: {\n source: DaemonFleetSource;\n preferredProject: string;\n invokingRepository: InvokingRepositoryContext;\n onQuit: () => void;\n}) {\n const terminal = useTerminalDimensions();\n const renderer = useRenderer();\n const [snapshot, setSnapshot] = useState(() => emptySnapshot(source.repoId));\n const [state, dispatch] = useReducer(reduceFleetUiState, undefined, createFleetUiState);\n const [logs, setLogs] = useState<LogLine[]>([]);\n const [connected, setConnected] = useState(false);\n const [notice, setNotice] = useState(\"connecting to hestiad…\");\n const [doctorRows, setDoctorRows] = useState<DoctorRow[]>([]);\n const [doctorRunning, setDoctorRunning] = useState(false);\n const lastFrameAt = useRef(Date.now());\n const stateRef = useRef(state);\n stateRef.current = state;\n\n useEffect(() => {\n const controller = new AbortController();\n void (async () => {\n for await (const frame of source.fleet(controller.signal)) {\n lastFrameAt.current = Date.now();\n if (frame.type === \"snapshot\") {\n setConnected(true);\n setNotice((current) =>\n current === \"connecting to hestiad…\" ||\n current.startsWith(\"disconnected:\") ||\n current.startsWith(\"hestiad heartbeat\")\n ? \"\"\n : current,\n );\n setSnapshot(frame.snapshot);\n dispatch({ type: \"reconcile\", snapshot: frame.snapshot, preferredProject });\n } else if (frame.sequence === -1) {\n setConnected(false);\n setNotice(frame.at);\n } else {\n setConnected(true);\n }\n }\n })();\n const staleTimer = setInterval(() => {\n if (Date.now() - lastFrameAt.current > 20_000) {\n setConnected(false);\n setNotice(\"hestiad heartbeat is stale; reconnecting…\");\n }\n }, 1_000);\n return () => {\n clearInterval(staleTimer);\n controller.abort();\n };\n }, [preferredProject, source]);\n\n const selectedLogStack = selectedStack(snapshot, state.selection.project);\n const selectionKey = fleetLogSelectionKey(selectedLogStack, state.selection.service);\n useEffect(() => {\n setLogs([]);\n if (selectionKey === undefined) return;\n const [project, service] = selectionKey.split(\"\\0\") as [string, string];\n const controller = new AbortController();\n void (async () => {\n for await (const line of source.logs(project, service, controller.signal)) {\n const sanitized: LogLine = {\n ...line,\n project: sanitizeFleetTerminalText(line.project),\n service: sanitizeFleetTerminalText(line.service),\n text: sanitizeFleetTerminalText(line.text),\n };\n setLogs((current) => [...current, sanitized].slice(-LOG_RING_CAPACITY));\n dispatch({ type: \"new-lines\", count: 1, maxOffset: LOG_RING_CAPACITY - 1 });\n }\n })();\n return () => controller.abort();\n }, [selectionKey, source]);\n\n const stacks = useMemo(\n () => visibleFleetStacks(snapshot, state.filter),\n [snapshot, state.filter],\n );\n const stack = selectedStack(snapshot, state.selection.project);\n const context = {\n repo: sanitizeFleetTerminalText(stack?.repo ?? invokingRepository.repo),\n branch: sanitizeFleetTerminalText(stack?.branch ?? invokingRepository.branch),\n worktree: sanitizeFleetTerminalText(stack?.worktree ?? invokingRepository.worktree),\n project: sanitizeFleetTerminalText(stack?.project ?? \"—\"),\n };\n const endpointView = copyableEndpoint(stack, state.selection.service, state.selection.endpoint);\n const endpoint = usableEndpoint(stack, state.selection.service, state.selection.endpoint);\n const effectiveLayout = state.layout === \"auto\"\n ? terminal.width >= 110 ? \"split\" : \"stack\"\n : state.layout;\n const focusOrder: FleetFocus[] = [\"stacks\", \"services\", \"logs\"];\n\n useEffect(() => {\n const confirmed = state.confirmDown;\n const currentIncarnation = snapshot.stacks.find(\n (candidate) => candidate.project === confirmed?.project,\n );\n if (\n confirmed !== undefined &&\n !state.downPending &&\n (\n currentIncarnation?.repoId !== confirmed.repoId ||\n currentIncarnation.worktree !== confirmed.worktree ||\n currentIncarnation.createdAt !== confirmed.createdAt\n )\n ) {\n dispatch({ type: \"confirm-down\" });\n setNotice(`${confirmed.project} changed; down cancelled`);\n }\n }, [snapshot, state.confirmDown, state.downPending]);\n\n useKeyboard((key) => {\n const current = stateRef.current;\n if (current.confirmDown !== undefined) {\n key.preventDefault();\n key.stopPropagation();\n if (isEscape(key) && !current.downPending) {\n dispatch({ type: \"confirm-down\" });\n } else if (\n !current.downPending &&\n (isFleetKey(key, \"d\") || key.name === \"return\" || key.name === \"enter\")\n ) {\n const confirmed = current.confirmDown;\n const currentIncarnation = snapshot.stacks.find(\n (candidate) => candidate.project === confirmed.project,\n );\n if (\n currentIncarnation?.repoId !== confirmed.repoId ||\n currentIncarnation.worktree !== confirmed.worktree ||\n currentIncarnation.createdAt !== confirmed.createdAt\n ) {\n dispatch({ type: \"confirm-down\" });\n setNotice(`${confirmed.project} changed; down cancelled`);\n return;\n }\n const project = confirmed.project;\n dispatch({ type: \"down-pending\", pending: true });\n setNotice(`tearing down ${project}…`);\n void source.down(confirmed).then(() => {\n dispatch({ type: \"down-pending\", pending: false });\n dispatch({ type: \"confirm-down\" });\n setNotice(`${project} is down; named volumes retained`);\n }).catch((error) => {\n dispatch({ type: \"down-pending\", pending: false });\n setNotice(`down failed: ${(error as Error).message}`);\n });\n }\n return;\n }\n if (current.helpOpen || current.doctorOpen) {\n key.preventDefault();\n key.stopPropagation();\n if (isEscape(key) || isFleetKey(key, \"?\")) {\n dispatch({ type: current.helpOpen ? \"help\" : \"doctor\", open: false });\n }\n return;\n }\n if (current.focus === \"filter\") {\n if (isEscape(key) || key.name === \"return\" || key.name === \"enter\") {\n key.preventDefault();\n key.stopPropagation();\n dispatch({ type: \"focus\", focus: \"stacks\" });\n }\n return;\n }\n\n if (isFleetKey(key, \"q\")) return onQuit();\n if (isFleetKey(key, \"?\")) return dispatch({ type: \"help\", open: true });\n if (isFleetKey(key, \"/\")) return dispatch({ type: \"focus\", focus: \"filter\" });\n if (isFleetKey(key, \"0\")) return dispatch({ type: \"layout\", layout: \"auto\" });\n if (isFleetKey(key, \"1\")) return dispatch({ type: \"layout\", layout: \"split\" });\n if (isFleetKey(key, \"2\")) return dispatch({ type: \"layout\", layout: \"stack\" });\n if (key.name === \"tab\") {\n const index = focusOrder.indexOf(current.focus);\n const delta = key.shift ? -1 : 1;\n const next = (index + delta + focusOrder.length) % focusOrder.length;\n return dispatch({ type: \"focus\", focus: focusOrder[next]! });\n }\n if (isFleetKey(key, \"[\")) return dispatch({ type: \"move-service\", delta: -1, snapshot });\n if (isFleetKey(key, \"]\")) return dispatch({ type: \"move-service\", delta: 1, snapshot });\n if ((isFleetKey(key, \"g\") && key.shift) || key.sequence === \"G\") {\n return dispatch({ type: \"follow\", follow: true });\n }\n if (key.sequence === \"D\" || (isFleetKey(key, \"d\") && key.shift)) {\n if (doctorRunning) return;\n dispatch({ type: \"doctor\", open: true });\n setDoctorRunning(true);\n setDoctorRows([]);\n const worktree = stack !== undefined && existsSync(stack.worktree)\n ? stack.worktree\n : process.cwd();\n void source.diagnose(worktree).then(setDoctorRows).catch((error) => {\n setNotice(`doctor failed: ${(error as Error).message}`);\n }).finally(() => setDoctorRunning(false));\n return;\n }\n if (isFleetKey(key, \"d\")) {\n if (stack?.phase === \"queued\" || stack?.phase === \"reserved\") {\n setNotice(`${stack.project} is ${stack.phase}; down is available after startup begins`);\n } else if (stack !== undefined) {\n dispatch({ type: \"confirm-down\", stack });\n }\n return;\n }\n if (isFleetKey(key, \"o\") && endpoint !== undefined) {\n openFleetUrl(endpoint);\n setNotice(endpoint);\n return;\n }\n if (isFleetKey(key, \"y\") && endpoint !== undefined) {\n const copied = renderer.copyToClipboardOSC52(endpoint);\n setNotice(copied ? `copied ${endpoint}` : `copy unavailable: ${endpoint}`);\n return;\n }\n const copySurfaceRequested = [\"c\", \"l\", \"p\"].some((name) => isFleetKey(key, name));\n const surface = isFleetKey(key, \"c\")\n ? endpointView?.url\n : isFleetKey(key, \"l\")\n ? endpointView?.localUrl\n : isFleetKey(key, \"p\")\n ? endpointView?.publicUrl\n : undefined;\n if (surface !== undefined) {\n const copied = renderer.copyToClipboardOSC52(surface);\n setNotice(copied ? `copied ${surface}` : `copy unavailable: ${surface}`);\n return;\n }\n if (copySurfaceRequested) {\n setNotice(\"selected URL surface is unavailable\");\n return;\n }\n const delta = key.name === \"down\" || isFleetKey(key, \"j\")\n ? 1\n : key.name === \"up\" || isFleetKey(key, \"k\")\n ? -1\n : 0;\n if (delta === 0) return;\n if (current.focus === \"stacks\") dispatch({ type: \"move-stack\", delta, snapshot });\n else if (current.focus === \"services\") dispatch({ type: \"move-service\", delta, snapshot });\n else dispatch({ type: \"scroll-logs\", delta });\n });\n\n const capacity = snapshot.capacity;\n const status = connected\n ? `${capacity.live}/${capacity.maxStacks} live · ${capacity.reserved} reserved · ${capacity.queued} queued`\n : \"disconnected\";\n const logLabel = state.selection.service ?? \"select a service\";\n\n return (\n <box style={{ width: \"100%\", height: \"100%\", flexDirection: \"column\", backgroundColor: fleetTheme.background }}>\n <box style={{ height: 1, paddingLeft: 1, paddingRight: 1, flexDirection: \"row\", backgroundColor: fleetTheme.panelAlt }}>\n <text fg={fleetTheme.accent}>Hestia Fleet — {context.repo}</text>\n <text fg={fleetTheme.muted}> {status}</text>\n </box>\n\n {terminal.width >= 90 ? (\n <box style={{ height: 4, paddingLeft: 1, flexDirection: \"column\", backgroundColor: fleetTheme.background }}>\n <text fg={fleetTheme.text}>Repository {context.repo}</text>\n <text fg={fleetTheme.text}>Branch {context.branch}</text>\n <text fg={fleetTheme.text}>Worktree {middleTruncateWorktreePath(context.worktree, Math.max(16, terminal.width - 13))}</text>\n <text fg={fleetTheme.muted}>Project {context.project}</text>\n </box>\n ) : (\n <box style={{ height: 2, paddingLeft: 1, flexDirection: \"column\", backgroundColor: fleetTheme.background }}>\n <text fg={fleetTheme.text}>{context.repo} · {context.branch} · {context.project}</text>\n <text fg={fleetTheme.muted}>worktree {middleTruncateWorktreePath(context.worktree, Math.max(12, terminal.width - 10))}</text>\n </box>\n )}\n\n {effectiveLayout === \"split\" ? (\n <box style={{ flexGrow: 1, flexDirection: \"row\" }}>\n <StackSidebar\n stacks={stacks}\n selectedProject={state.selection.project}\n width={Math.max(28, Math.floor(terminal.width * 0.28))}\n onSelectProject={(project) => dispatch({ type: \"select-stack\", project, snapshot })}\n />\n <box style={{ flexGrow: 1, flexDirection: \"column\" }}>\n <box style={{ height: Math.min(12, Math.max(5, fleetServiceRowCount(stack) + 2)) }}>\n <ServicePane\n stack={stack}\n selectedService={state.selection.service}\n selectedEndpoint={state.selection.endpoint}\n onSelectService={(service) => dispatch({ type: \"select-service\", service, snapshot })}\n onSelectEndpoint={(service, endpoint) => dispatch({ type: \"select-endpoint\", service, endpoint, snapshot })}\n />\n </box>\n <box style={{ flexGrow: 1 }}>\n <LogPane lines={logs} height={Math.max(5, terminal.height - 13)} width={Math.max(20, Math.floor(terminal.width * 0.72))} offset={state.logOffset} follow={state.follow} unseen={state.unseenLines} label={logLabel} onScroll={(delta) => dispatch({ type: \"scroll-logs\", delta })} />\n </box>\n </box>\n </box>\n ) : (\n <box style={{ flexGrow: 1, flexDirection: \"column\" }}>\n <box style={{ height: Math.min(7, Math.max(4, stacks.length + 2)) }}>\n <StackSidebar\n stacks={stacks}\n selectedProject={state.selection.project}\n width={terminal.width}\n onSelectProject={(project) => dispatch({ type: \"select-stack\", project, snapshot })}\n />\n </box>\n <box style={{ height: Math.min(10, Math.max(4, fleetServiceRowCount(stack) + 2)) }}>\n <ServicePane\n stack={stack}\n selectedService={state.selection.service}\n selectedEndpoint={state.selection.endpoint}\n onSelectService={(service) => dispatch({ type: \"select-service\", service, snapshot })}\n onSelectEndpoint={(service, endpoint) => dispatch({ type: \"select-endpoint\", service, endpoint, snapshot })}\n />\n </box>\n <box style={{ flexGrow: 1 }}>\n <LogPane lines={logs} height={Math.max(5, terminal.height - 17)} width={terminal.width} offset={state.logOffset} follow={state.follow} unseen={state.unseenLines} label={logLabel} onScroll={(delta) => dispatch({ type: \"scroll-logs\", delta })} />\n </box>\n </box>\n )}\n\n <box style={{ height: 1, paddingLeft: 1, paddingRight: 1, flexDirection: \"row\", backgroundColor: fleetTheme.panelAlt }}>\n {state.focus === \"filter\" ? (\n <>\n <text fg={fleetTheme.accent}>filter: </text>\n <input\n width={Math.max(12, terminal.width - 10)}\n value={state.filter}\n focused={true}\n placeholder=\"branch, project, or service\"\n onInput={(value) => dispatch({ type: \"filter\", filter: value, snapshot })}\n onSubmit={() => dispatch({ type: \"focus\", focus: \"stacks\" })}\n />\n </>\n ) : (\n <text fg={notice ? fleetTheme.warning : fleetTheme.muted}>\n {notice || \"click rows · wheel logs · j/k navigate · [/] service · / filter · d down · ? help · q quit\"}\n </text>\n )}\n </box>\n\n {state.helpOpen ? (\n <FleetModal title=\"Fleet help\" terminalWidth={terminal.width} terminalHeight={terminal.height}>\n <text fg={fleetTheme.text}>j/k or arrows navigate focused pane</text>\n <text fg={fleetTheme.text}>mouse click stacks/services · wheel scroll logs</text>\n <text fg={fleetTheme.text}>Tab / Shift-Tab change pane</text>\n <text fg={fleetTheme.text}>[ / ] previous / next service</text>\n <text fg={fleetTheme.text}>/ filter · G follow logs · 0/1/2 layout</text>\n <text fg={fleetTheme.text}>o open · y primary · c direct · l local · p public</text>\n <text fg={fleetTheme.text}>D doctor</text>\n <text fg={fleetTheme.danger}>d confirmed down (named volumes retained)</text>\n <text fg={fleetTheme.muted}>Esc closes this dialog</text>\n </FleetModal>\n ) : null}\n\n {state.doctorOpen ? (\n <FleetModal title=\"hestia doctor\" terminalWidth={terminal.width} terminalHeight={terminal.height}>\n {doctorRunning ? <text fg={fleetTheme.muted}>Running diagnostics…</text> : doctorRows.slice(0, 10).map((row) => (\n <text key={row.check} fg={row.level === \"error\" ? fleetTheme.danger : row.level === \"warn\" ? fleetTheme.warning : fleetTheme.text}>\n {`${row.level === \"ok\" ? \"✓\" : row.level === \"error\" ? \"✗\" : \"!\"} ${sanitizeFleetTerminalText(row.check)} — ${sanitizeFleetTerminalText(row.detail)}`}\n </text>\n ))}\n {!doctorRunning && doctorOmissionSummary(doctorRows) !== undefined ? (\n <text fg={fleetTheme.warning}>{doctorOmissionSummary(doctorRows)}</text>\n ) : null}\n <text fg={fleetTheme.muted}>Esc closes this report</text>\n </FleetModal>\n ) : null}\n\n {state.confirmDown !== undefined ? (\n <FleetModal title=\"Confirm stack down\" terminalWidth={terminal.width} terminalHeight={terminal.height}>\n <text fg={fleetTheme.text}>Branch: {sanitizeFleetTerminalText(state.confirmDown.branch)}</text>\n <text fg={fleetTheme.text}>Repository: {sanitizeFleetTerminalText(state.confirmDown.repo)}</text>\n <text fg={fleetTheme.text}>Worktree: {sanitizeFleetTerminalText(state.confirmDown.worktree)}</text>\n <text fg={fleetTheme.text}>Project: {sanitizeFleetTerminalText(state.confirmDown.project)}</text>\n <box style={{ height: 1 }} />\n <text fg={fleetTheme.warning}>Named volumes are retained.</text>\n <text fg={fleetTheme.danger}>\n {state.downPending ? \"Tearing down…\" : \"Press Enter or d to confirm; Esc cancels.\"}\n </text>\n </FleetModal>\n ) : null}\n </box>\n );\n}\n",
|
|
138
|
+
"import type { CliRenderer, KeyEvent } from \"@opentui/core\";\n\ntype FleetJobRenderer = Pick<CliRenderer, \"isDestroyed\" | \"resume\" | \"suspend\"> & {\n keyInput: {\n on(event: \"keypress\", listener: (key: KeyEvent) => void): unknown;\n off(event: \"keypress\", listener: (key: KeyEvent) => void): unknown;\n };\n};\n\nexport interface FleetSuspendDependencies {\n platform?: string;\n kill?: (pid: number, signal: NodeJS.Signals) => unknown;\n once?: (signal: NodeJS.Signals, listener: () => void) => unknown;\n off?: (signal: NodeJS.Signals, listener: () => void) => unknown;\n}\n\n/** Route raw-mode Ctrl-C through the TUI's complete renderer shutdown path. */\nexport function installFleetInterrupt(\n renderer: Pick<FleetJobRenderer, \"isDestroyed\" | \"keyInput\">,\n shutdown: () => void,\n): () => void {\n const listener = (key: KeyEvent) => {\n if (renderer.isDestroyed || !key.ctrl || key.name !== \"c\") return;\n key.preventDefault();\n key.stopPropagation();\n shutdown();\n };\n renderer.keyInput.on(\"keypress\", listener);\n return () => renderer.keyInput.off(\"keypress\", listener);\n}\n\n/** Restore the terminal around Ctrl-Z so shell job control behaves like a native TUI. */\nexport function installFleetSuspend(\n renderer: FleetJobRenderer,\n dependencies: FleetSuspendDependencies = {},\n): () => void {\n if ((dependencies.platform ?? process.platform) === \"win32\") return () => {};\n const kill = dependencies.kill ?? process.kill.bind(process);\n const once = dependencies.once ?? process.once.bind(process);\n const off = dependencies.off ?? process.off.bind(process);\n let resume: (() => void) | undefined;\n const listener = (key: KeyEvent) => {\n if (renderer.isDestroyed || !key.ctrl || key.name !== \"z\") return;\n key.preventDefault();\n key.stopPropagation();\n renderer.suspend();\n resume = () => {\n resume = undefined;\n if (!renderer.isDestroyed) renderer.resume();\n };\n once(\"SIGCONT\", resume);\n try {\n kill(0, \"SIGTSTP\");\n } catch {\n if (resume !== undefined) off(\"SIGCONT\", resume);\n resume = undefined;\n if (!renderer.isDestroyed) renderer.resume();\n }\n };\n renderer.keyInput.on(\"keypress\", listener);\n return () => {\n renderer.keyInput.off(\"keypress\", listener);\n if (resume !== undefined) off(\"SIGCONT\", resume);\n };\n}\n",
|
|
139
|
+
"import { Component, type ErrorInfo, type ReactNode } from \"react\";\nimport { createCliRenderer } from \"@opentui/core\";\nimport { createRoot } from \"@opentui/react\";\nimport { HestiaError, projectName } from \"@hestia/core\";\nimport { getRepoInfo } from \"@hestia/engine\";\nimport { DaemonFleetSource } from \"./fleet-source.ts\";\nimport { FleetApp } from \"./FleetApp.tsx\";\nimport { installFleetInterrupt, installFleetSuspend } from \"./job-control.ts\";\n\nclass FleetErrorBoundary extends Component<\n { children: ReactNode; onError: (error: Error) => void },\n { failed: boolean }\n> {\n state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n componentDidCatch(error: Error, _info: ErrorInfo): void {\n this.props.onError(error);\n }\n\n render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/** Run the alternate-screen Fleet TUI and restore the primary terminal on every exit path. */\nexport async function runFleetTui(cwd = process.cwd()): Promise<void> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new HestiaError(\"usage\", \"hestia tui requires interactive stdin and stdout\");\n }\n const repo = await getRepoInfo(cwd);\n const preferredProject = projectName(repo.repoId, repo.repo, repo.branch, repo.worktreeRoot);\n const source = new DaemonFleetSource(repo.repoId);\n const renderer = await createCliRenderer({\n stdin: process.stdin,\n stdout: process.stdout,\n screenMode: \"alternate-screen\",\n useMouse: true,\n useThread: false,\n exitOnCtrlC: false,\n openConsoleOnError: false,\n });\n const root = createRoot(renderer);\n\n await new Promise<void>((resolve, reject) => {\n let shuttingDown = false;\n let removeInterrupt = () => {};\n let removeSuspend = () => {};\n const signals: NodeJS.Signals[] = [\"SIGINT\", \"SIGTERM\"];\n const shutdown = (error?: Error) => {\n if (shuttingDown) return;\n shuttingDown = true;\n for (const signal of signals) process.off(signal, shutdown);\n removeInterrupt();\n removeSuspend();\n source.stop();\n try {\n root.unmount();\n } finally {\n renderer.destroy();\n }\n if (error !== undefined) reject(error);\n else resolve();\n };\n for (const signal of signals) process.once(signal, shutdown);\n removeInterrupt = installFleetInterrupt(renderer, shutdown);\n removeSuspend = installFleetSuspend(renderer);\n root.render(\n <FleetErrorBoundary onError={(error) => shutdown(error)}>\n <FleetApp\n source={source}\n preferredProject={preferredProject}\n invokingRepository={{\n repo: repo.repo,\n branch: repo.branch,\n worktree: repo.worktreeRoot,\n }}\n onQuit={shutdown}\n />\n </FleetErrorBoundary>,\n );\n });\n}\n",
|
|
140
|
+
"/** Side-effect-free Fleet TUI entrypoint loaded only by the `hestia tui` command. */\nexport { runFleetTui } from \"./runtime.tsx\";\nexport { DaemonFleetSource } from \"./fleet-source.ts\";\nexport {\n createFleetUiState,\n reconcileFleetSelection,\n reduceFleetUiState,\n visibleFleetStacks,\n} from \"./fleet-controller.ts\";\nexport { sanitizeFleetTerminalText } from \"./terminal-text.ts\";\n",
|
|
141
|
+
"#!/usr/bin/env bun\nimport {\n type DoctorRow,\n doctor,\n discoverRepository,\n engine,\n ensureDaemon,\n effectiveLocalRouteServices,\n fetchHealth,\n fetchState,\n installLaunchd,\n installHestiaRouter,\n launchdManagesThisHome,\n resolvedLocalRouteHostname,\n plistPath,\n readDaemonJson,\n readHestiaMachineConfig,\n readHestiaRouterStatus,\n hestiaConfigTomlPath,\n stopDaemonProcess,\n uninstallLaunchd,\n uninstallHestiaRouter,\n initializeRepositoryConfig,\n type EndpointKind,\n type InitRequest,\n type InitScope,\n HESTIAD_PROTOCOL_VERSION,\n resolveEndpointSelection,\n migrateHestiaMachineConfig,\n} from \"@hestia/engine\";\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n HestiaError,\n STATE_SCHEMA_VERSION,\n type ProcSpec,\n type StackRecord,\n} from \"@hestia/core\";\n\ninterface Flags {\n json: boolean;\n destroy: boolean;\n services?: string[];\n /** true = all discovered wrangler configs; string[] filters. */\n workers?: boolean | string[];\n allowRemote: boolean;\n force: boolean;\n noVarlock: boolean;\n varlock: boolean;\n name?: string;\n cwd?: string;\n env: Record<string, string>;\n noPort: boolean;\n signal?: \"term\" | \"int\";\n readyTimeout?: number;\n project?: string;\n tunnel?: string;\n zone?: string;\n keepHostHeader: boolean;\n overwriteDns: boolean;\n /** seconds to queue for a stack slot at the cap (absent = fail fast). */\n wait?: number;\n noDaemon: boolean;\n print: boolean;\n interactive: boolean;\n direct: boolean;\n local: boolean;\n public: boolean;\n file?: string;\n scope?: InitScope;\n write: boolean;\n follow: boolean;\n tail?: number;\n /** everything after `--` (the `run` command argv) */\n rest: string[];\n _: string[];\n errors: string[];\n}\n\nfunction parseFlags(argv: string[]): Flags {\n const f: Flags = {\n json: false,\n destroy: false,\n allowRemote: false,\n force: false,\n noVarlock: false,\n varlock: false,\n noPort: false,\n keepHostHeader: false,\n overwriteDns: false,\n noDaemon: false,\n print: false,\n interactive: false,\n direct: false,\n local: false,\n public: false,\n follow: false,\n write: false,\n env: {},\n rest: [],\n _: [],\n errors: [],\n };\n for (let i = 0; i < argv.length; i++) {\n const takeValue = (): string | undefined => {\n const value = argv[i + 1];\n if (value === undefined || value.startsWith(\"--\")) return undefined;\n i += 1;\n return value;\n };\n const a = argv[i]!;\n if (a === \"--\") {\n f.rest = argv.slice(i + 1);\n break;\n } else if (a === \"--json\") f.json = true;\n else if (a === \"--destroy\") f.destroy = true;\n else if (a === \"--allow-remote\") f.allowRemote = true;\n else if (a === \"--force\") f.force = true;\n else if (a === \"--no-varlock\") f.noVarlock = true;\n else if (a === \"--varlock\") f.varlock = true;\n else if (a === \"--no-port\") f.noPort = true;\n else if (a === \"--services\") {\n const value = takeValue();\n if (value === undefined || value.startsWith(\"--\")) f.errors.push(\"--services requires a comma-separated value\");\n else f.services = value.split(\",\").filter(Boolean);\n }\n else if (a === \"--name\") {\n f.name = takeValue();\n if (!f.name || f.name.startsWith(\"--\")) f.errors.push(\"--name requires a value\");\n }\n else if (a === \"--cwd\") {\n f.cwd = takeValue();\n if (!f.cwd || f.cwd.startsWith(\"--\")) f.errors.push(\"--cwd requires a value\");\n }\n else if (a === \"--signal\") {\n const value = takeValue();\n if (value === \"int\" || value === \"term\") f.signal = value;\n else f.errors.push(\"--signal must be term or int\");\n }\n else if (a === \"--ready-timeout\") {\n const value = Number(takeValue());\n if (!Number.isFinite(value) || value < 0) f.errors.push(\"--ready-timeout requires a non-negative finite number\");\n else f.readyTimeout = value * 1000;\n }\n else if (a === \"--project\") {\n f.project = takeValue();\n if (!f.project || f.project.startsWith(\"--\")) f.errors.push(\"--project requires a value\");\n }\n else if (a === \"--tunnel\") {\n f.tunnel = takeValue();\n if (!f.tunnel || f.tunnel.startsWith(\"--\")) f.errors.push(\"--tunnel requires a value\");\n }\n else if (a === \"--zone\") {\n f.zone = takeValue();\n if (!f.zone || f.zone.startsWith(\"--\")) f.errors.push(\"--zone requires a value\");\n }\n else if (a === \"--keep-host-header\") f.keepHostHeader = true;\n else if (a === \"--overwrite-dns\") f.overwriteDns = true;\n else if (a === \"--no-daemon\") f.noDaemon = true;\n else if (a === \"--print\") f.print = true;\n else if (a === \"--interactive\") f.interactive = true;\n else if (a === \"--direct\") f.direct = true;\n else if (a === \"--local\") f.local = true;\n else if (a === \"--public\") f.public = true;\n else if (a === \"--file\") {\n f.file = takeValue();\n if (!f.file || f.file.startsWith(\"--\")) f.errors.push(\"--file requires a value\");\n }\n else if (a === \"--scope\") {\n const scope = takeValue();\n if (scope === \"repository\" || scope === \"machine\") f.scope = scope;\n else f.errors.push(\"--scope must be repository or machine\");\n }\n else if (a === \"--write\") f.write = true;\n else if (a === \"-f\" || a === \"--follow\") f.follow = true;\n else if (a === \"--tail\") {\n const value = Number(takeValue());\n if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {\n f.errors.push(\"--tail requires a non-negative integer\");\n } else f.tail = value;\n }\n else if (a.startsWith(\"--wait=\")) {\n const value = Number(a.slice(\"--wait=\".length));\n if (!Number.isFinite(value) || value < 0) f.errors.push(\"--wait requires a non-negative finite number\");\n else f.wait = value;\n }\n else if (a === \"--wait\") {\n // bare flag = wait a long time; a following number is seconds\n const next = argv[i + 1];\n if (next !== undefined && /^\\d+$/.test(next)) f.wait = Number(argv[++i]);\n else f.wait = 3600;\n }\n else if (a === \"--env\") {\n const kv = takeValue() ?? \"\";\n const eq = kv.indexOf(\"=\");\n if (eq > 0) f.env[kv.slice(0, eq)] = kv.slice(eq + 1);\n else f.errors.push(\"--env requires K=V\");\n } else if (a.startsWith(\"--workers=\")) {\n f.workers = a.slice(\"--workers=\".length).split(\",\").filter(Boolean);\n } else if (a === \"--workers\") {\n // bare flag = all discovered; a following non-flag token is a filter list\n const next = argv[i + 1];\n if (next !== undefined && !next.startsWith(\"-\")) {\n f.workers = argv[++i]!.split(\",\").filter(Boolean);\n } else f.workers = true;\n } else if (a.startsWith(\"-\")) f.errors.push(`unknown option ${a}`);\n else f._.push(a);\n }\n if (Array.isArray(f.workers) && f.workers.length === 0) f.workers = true;\n return f;\n}\n\nfunction validateCommandOptions(argv: string[], command: string | undefined): string | null {\n const allowedByCommand: Record<string, Set<string>> = {\n version: new Set([\"--json\"]),\n skill: new Set([\"--json\"]),\n discover: new Set([\"--json\"]),\n init: new Set([\"--json\", \"--print\", \"--scope\", \"--write\", \"--no-port\"]),\n up: new Set([\"--json\", \"--services\", \"--workers\", \"--allow-remote\", \"--force\", \"--no-varlock\", \"--wait\", \"--no-daemon\"]),\n run: new Set([\"--json\", \"--name\", \"--env\", \"--no-port\", \"--varlock\", \"--signal\", \"--ready-timeout\", \"--cwd\", \"--wait\", \"--no-daemon\"]),\n expose: new Set([\"--json\", \"--tunnel\", \"--zone\", \"--keep-host-header\", \"--overwrite-dns\", \"--force\", \"--ready-timeout\"]),\n route: new Set([\"--json\"]),\n router: new Set([\"--json\", \"--interactive\"]),\n config: new Set([\"--json\", \"--file\"]),\n open: new Set([\"--json\", \"--direct\", \"--local\", \"--public\"]),\n stop: new Set([\"--json\"]),\n down: new Set([\"--json\", \"--destroy\", \"--project\"]),\n status: new Set([\"--json\"]),\n env: new Set([\"--json\"]),\n endpoint: new Set([\"--json\"]),\n logs: new Set([\"--json\", \"--follow\", \"-f\", \"--tail\", \"--project\"]),\n doctor: new Set([\"--json\"]),\n tui: new Set<string>(),\n daemon: new Set([\"--json\", \"--print\"]),\n help: new Set<string>(),\n };\n const allowed = allowedByCommand[command ?? \"help\"];\n if (allowed === undefined) return null;\n const optionArguments = new Set([\n \"--services\", \"--name\", \"--env\", \"--signal\", \"--ready-timeout\", \"--cwd\",\n \"--project\", \"--tunnel\", \"--zone\", \"--file\", \"--scope\", \"--tail\",\n ]);\n for (let index = 0; index < argv.length; index += 1) {\n const raw = argv[index]!;\n if (raw === \"--\") break;\n if (!raw.startsWith(\"-\")) continue;\n const option = raw.startsWith(\"--\") && raw.includes(\"=\") ? raw.slice(0, raw.indexOf(\"=\")) : raw;\n if (!allowed.has(option)) return `${option} is not valid for hestia ${command ?? \"help\"}`;\n if (!raw.includes(\"=\") && optionArguments.has(option)) index += 1;\n }\n return null;\n}\n\n/**\n * Best-effort browser open. Always a no-op-safe side effect — the URL is\n * printed regardless, so a headless/remote agent still hands the human a\n * clickable link. HESTIA_NO_OPEN skips the shell-out (tests, pure-resolve use).\n */\nfunction openUrl(url: string): void {\n if (process.env.HESTIA_NO_OPEN) return;\n const [cmd, ...pre] =\n process.platform === \"darwin\"\n ? [\"open\"]\n : process.platform === \"win32\"\n ? [\"cmd\", \"/c\", \"start\", \"\"]\n : [\"xdg-open\"];\n try {\n Bun.spawn([cmd!, ...pre, url], { stdout: \"ignore\", stderr: \"ignore\" }).unref();\n } catch {\n // no browser here — the printed URL is the fallback\n }\n}\n\nfunction fail(\n code: string,\n message: string,\n json: boolean,\n details?: Record<string, unknown>,\n): never {\n if (json) {\n process.stdout.write(JSON.stringify({ error: { code, message, ...(details ? { details } : {}) } }) + \"\\n\");\n } else {\n process.stderr.write(`error [${code}]: ${message}\\n`);\n }\n process.exit(1);\n}\n\nfunction printStackHuman(r: StackRecord): void {\n const out: string[] = [];\n out.push(`${r.project} ${r.state} (${r.branch} @ ${r.worktree})`);\n for (const s of r.services) {\n const port = s.publishedPort ? `127.0.0.1:${s.publishedPort}` : \"-\";\n const pub = r.endpoints.find((e) => e.name === s.name)?.publicUrl;\n out.push(\n ` ● ${s.name.padEnd(12)} ${s.backend.padEnd(7)} ${port.padEnd(20)} ${s.state}` +\n (pub !== undefined ? ` ${pub}` : \"\"),\n );\n }\n process.stdout.write(out.join(\"\\n\") + \"\\n\");\n}\n\nconst HELP = `hestia — per-worktree isolated dev stacks\n\nusage:\n hestia version [--json]\n print CLI version, state schema, and daemon protocol\n hestia skill path [--json]\n print the packaged Hestia agent skill path\n hestia discover [--json]\n read-only discovery of workloads, bindings, endpoint configuration,\n unresolved decisions, conflicts, and exact setup suggestions\n hestia init --print\n hestia init dockerfile <name> [Dockerfile] --scope repository|machine [--write]\n hestia init proc <name> --scope repository|machine [--no-port] [--write] -- <command...>\n hestia init wrangler <name> [config] --scope repository|machine [--write]\n hestia init endpoint <alias> <workload> <binding> <http|tcp|udp>\n --scope repository|machine [--write]\n proposal-first setup. Without --write the complete proposed TOML is\n printed; explicit --scope ... --write atomically updates that layer.\n Hestia never commits repository configuration\n hestia up [--services a,b] [--workers[=a,b]] [--allow-remote] [--force]\n [--no-varlock] [--wait[=secs]] [--no-daemon] [--json]\n compose stack up; --workers also supervises one \\`wrangler dev\\` per\n discovered wrangler config (private dev registry per worktree).\n Starting a NEW stack takes a machine-wide slot (cap 5, configurable\n via HESTIA_MAX_STACKS / ~/.hestia/config.toml / legacy config.json);\n at the cap it fails\n with stack-limit — --wait[=secs] queues FIFO instead, --no-daemon\n skips the cap entirely\n hestia run --name <name> [--env K=V ...] [--no-port] [--varlock]\n [--signal term|int] [--ready-timeout <s>] [--cwd <rel>]\n [--wait[=secs]] [--no-daemon] [--json] -- <command...>\n supervise a host process in this worktree's stack; {port} in the\n command and $PORT in its env carry the assigned port ({{port}} escapes)\n hestia expose <endpoint...> [--tunnel <name>] [--zone <zone>]\n [--keep-host-header] [--force]\n [--ready-timeout <s>] [--json]\n publish running stack services through a cloudflare tunnel.\n Without --tunnel (and no prior adoption): one QUICK tunnel per\n service — no account needed, URL rotates per run. With --tunnel:\n adopts your existing named tunnel (sticky) as the machine's SINGLE\n connector serving hostname <tunnel>-<branch>-<svc>.<zone> per\n service alongside your static rules — never run \\`cloudflared\n tunnel run\\` yourself alongside it (HA replicas cross-wire\n worktrees). URLs land in endpoints[] + HESTIA_<SVC>_URL. These are\n fail-closed but unauthenticated public URLs. Named v1 performs no DNS\n writes and requires wildcard CNAME *.<zone> → <uuid>.cfargotunnel.com.\n hestia open <service> [path] [--json]\n resolve a service's public URL (from \\`expose\\`) and open it in the\n browser; the URL is always printed too, so a headless agent can hand\n the human a direct-click link. HESTIA_NO_OPEN prints only.\n hestia route add|disable|reset <endpoint...> [--json] | route list [--json]\n manage sticky per-worktree stable local HTTPS routes. Agents select\n services; hestia resolves and verifies their current direct ports\n hestia router status|install|uninstall [--interactive] [--json]\n manage Hestia's isolated Portless HTTPS service. Commands are\n non-interactive by default; --interactive is the only sudo prompt path\n hestia config path|show|validate|migrate [--file <path>] [--json]\n discover and validate machine-local ~/.hestia/config.toml\n hestia daemon status|start|stop|install [--print]|uninstall [--json]\n hestiad enforces the stack cap and revives adopted tunnel connectors;\n it auto-starts on up/run. \\`install\\` writes a launchd agent\n (RunAtLoad + KeepAlive) so the daemon — and your adopted tunnel —\n survive reboots; --print renders the plist without installing.\n \\`stop\\` pauses supervision; running stacks are untouched\n hestia doctor [--json]\n report-only preflight + state audit: binaries, repo wiring, dead\n procs, exposure port drift, orphan mirrors, connector and daemon\n health. Exit 1 only on error-level rows; never mutates anything\n hestia stop <name> [--json] stop one supervised proc (idempotent)\n hestia down [--destroy] [--project <name>] [--json]\n tear down procs + containers (--destroy also removes volumes);\n --project works from the mirror after the worktree is deleted\n hestia status [--json] show this worktree's stack\n hestia env [--json] print the injected env (export lines)\n hestia endpoint list [--json] | endpoint get <alias|selector> [--json]\n resolve aliases, canonical workload:target/protocol selectors, or a\n uniquely-bound workload; ambiguous workloads fail explicitly\n hestia logs [service...] [-f|--follow] [--tail N] [--project <name>] [--json]\n stream docker and supervised-process logs (default: all services,\n last 50 lines). --json emits one LogLine JSON object per line;\n --project reads the mirror and works after worktree deletion\n hestia tui\n open the interactive, repo-scoped Fleet cockpit. Shows only stacks\n currently managed by hestia; the only mutation is confirmed down,\n which always retains named volumes\n`;\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const flags = parseFlags(argv);\n if (flags.errors.length > 0) fail(\"usage\", flags.errors.join(\"; \"), flags.json);\n const cmd = flags._[0];\n const invalidOption = validateCommandOptions(argv, cmd);\n if (invalidOption !== null) fail(\"usage\", invalidOption, flags.json);\n const cwd = process.cwd();\n\n try {\n switch (cmd) {\n case \"version\": {\n const version = {\n cliVersion: \"1.0.0\",\n stateSchema: STATE_SCHEMA_VERSION,\n daemonProtocol: HESTIAD_PROTOCOL_VERSION,\n runtime: \"bun\",\n };\n if (flags.json) process.stdout.write(JSON.stringify(version) + \"\\n\");\n else process.stdout.write(\n `hestia ${version.cliVersion} (state v${version.stateSchema}, daemon v${version.daemonProtocol}, Bun)\\n`,\n );\n break;\n }\n case \"skill\": {\n if (flags._[1] !== \"path\") fail(\"usage\", \"usage: hestia skill path\", flags.json);\n const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));\n const candidates = [\n join(packageRoot, \"skills\", \"hestia\", \"SKILL.md\"),\n join(process.cwd(), \"skills\", \"hestia\", \"SKILL.md\"),\n ];\n const path = candidates.find(existsSync);\n if (path === undefined) fail(\"config-missing\", \"packaged Hestia skill was not found\", flags.json);\n if (flags.json) process.stdout.write(JSON.stringify({ path }) + \"\\n\");\n else process.stdout.write(`${path}\\n`);\n break;\n }\n case \"discover\": {\n const report = await discoverRepository(cwd);\n if (flags.json) process.stdout.write(JSON.stringify(report, null, 2) + \"\\n\");\n else {\n process.stdout.write(\n `${report.repository.repo} · ${report.repository.branch}\\n${report.repository.worktree}\\n`,\n );\n for (const workload of report.runnableWorkloads) {\n process.stdout.write(\n ` runnable ${workload.name.padEnd(18)} ${workload.source.padEnd(10)} ${workload.decisionSource}\\n`,\n );\n }\n for (const workload of report.candidateWorkloads) {\n process.stdout.write(\n ` candidate ${workload.name.padEnd(18)} ${workload.source.padEnd(10)} ${workload.notes.join(\"; \")}\\n`,\n );\n }\n for (const conflict of report.conflicts) process.stderr.write(`conflict: ${conflict}\\n`);\n for (const suggestion of report.suggestions) process.stdout.write(`suggest: ${suggestion}\\n`);\n }\n if (report.conflicts.length > 0) process.exitCode = 1;\n break;\n }\n case \"init\": {\n const kind = flags._[1];\n if (kind === undefined && flags.print) {\n const report = await discoverRepository(cwd);\n if (flags.json) process.stdout.write(JSON.stringify({ suggestions: report.suggestions }, null, 2) + \"\\n\");\n else process.stdout.write(report.suggestions.map((line) => `${line}\\n`).join(\"\"));\n break;\n }\n if (flags.scope === undefined) {\n fail(\"usage\", \"init requires --scope repository or --scope machine\", flags.json);\n }\n let request: InitRequest;\n if (kind === \"dockerfile\") {\n const name = flags._[2];\n if (!name) fail(\"usage\", \"init dockerfile requires <name>\", flags.json);\n request = { kind, name, file: flags._[3] };\n } else if (kind === \"proc\") {\n const name = flags._[2];\n if (!name || flags.rest.length === 0) {\n fail(\"usage\", \"init proc requires <name> and a command after --\", flags.json);\n }\n request = { kind, name, command: flags.rest, port: flags.noPort ? \"none\" : \"auto\" };\n } else if (kind === \"wrangler\") {\n const name = flags._[2];\n if (!name) fail(\"usage\", \"init wrangler requires <name>\", flags.json);\n request = { kind, name, file: flags._[3] };\n } else if (kind === \"endpoint\") {\n const [alias, workload, binding, endpointKind] = flags._.slice(2);\n if (!alias || !workload || !binding || !([\"http\", \"tcp\", \"udp\"] as string[]).includes(endpointKind ?? \"\")) {\n fail(\n \"usage\",\n \"init endpoint requires <alias> <workload> <binding> <http|tcp|udp>\",\n flags.json,\n );\n }\n request = {\n kind,\n alias,\n workload,\n binding,\n endpointKind: endpointKind as EndpointKind,\n };\n } else {\n fail(\"usage\", \"usage: hestia init --print | init dockerfile|proc|wrangler|endpoint ...\", flags.json);\n }\n const result = await initializeRepositoryConfig(cwd, request, flags.scope, flags.write);\n if (flags.json) process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n else if (result.written) {\n process.stdout.write(`wrote ${result.path}\\nrepository ${result.runnable ? \"is runnable\" : \"still needs setup\"}\\n`);\n } else {\n process.stdout.write(`# proposed ${result.path}\\n${result.proposed}`);\n }\n break;\n }\n case \"up\": {\n const r = await engine.up(cwd, {\n services: flags.services,\n workers: flags.workers,\n allowRemote: flags.allowRemote,\n force: flags.force,\n noVarlock: flags.noVarlock,\n wait: flags.wait !== undefined ? flags.wait * 1000 : undefined,\n noDaemon: flags.noDaemon,\n });\n if (flags.json) process.stdout.write(JSON.stringify(r, null, 2) + \"\\n\");\n else printStackHuman(r);\n break;\n }\n case \"run\": {\n if (!flags.name) fail(\"usage\", \"run requires --name <name>\", flags.json);\n if (flags.rest.length === 0) {\n fail(\"usage\", \"run requires a command after --\", flags.json);\n }\n const spec: ProcSpec = {\n name: flags.name,\n argv: flags.rest,\n cwd: flags.cwd,\n env: Object.keys(flags.env).length > 0 ? flags.env : undefined,\n port: flags.noPort ? \"none\" : \"auto\",\n signal: flags.signal,\n readyTimeoutMs: flags.readyTimeout,\n varlock: flags.varlock,\n };\n const r = await engine.run(cwd, spec, {\n wait: flags.wait !== undefined ? flags.wait * 1000 : undefined,\n noDaemon: flags.noDaemon,\n });\n if (flags.json) process.stdout.write(JSON.stringify(r, null, 2) + \"\\n\");\n else printStackHuman(r);\n break;\n }\n case \"expose\": {\n const services = flags._.slice(1);\n if (services.length === 0) {\n fail(\"usage\", \"usage: hestia expose <service...> [--tunnel <name>]\", flags.json);\n }\n if (flags.overwriteDns) {\n fail(\"usage\", \"--overwrite-dns was removed; named v1 requires user-managed wildcard DNS\", flags.json);\n }\n const r = await engine.expose(cwd, services, {\n tunnel: flags.tunnel,\n zone: flags.zone,\n keepHostHeader: flags.keepHostHeader,\n overwriteDns: flags.overwriteDns,\n force: flags.force,\n readyTimeoutMs: flags.readyTimeout,\n });\n if (flags.json) process.stdout.write(JSON.stringify(r, null, 2) + \"\\n\");\n else printStackHuman(r);\n break;\n }\n case \"route\": {\n const action = flags._[1];\n const services = flags._.slice(2);\n if (action === \"add\") {\n const record = await engine.addLocalRoutes(cwd, services);\n if (flags.json) process.stdout.write(JSON.stringify(record, null, 2) + \"\\n\");\n else printStackHuman(record);\n } else if (action === \"disable\") {\n const record = await engine.disableLocalRoutes(cwd, services);\n if (flags.json) process.stdout.write(JSON.stringify(record, null, 2) + \"\\n\");\n else printStackHuman(record);\n } else if (action === \"reset\" || action === \"remove\") {\n const record = await engine.resetLocalRoutes(cwd, services);\n if (flags.json) process.stdout.write(JSON.stringify(record, null, 2) + \"\\n\");\n else printStackHuman(record);\n } else if (action === \"list\") {\n const record = await engine.status(cwd);\n if (record === null) fail(\"no-stack\", \"Route list: no stack for this worktree\", flags.json);\n const routes = effectiveLocalRouteServices(record).map((service) => {\n const endpoint = record.endpoints.find((candidate) => candidate.name === service);\n return {\n service,\n directUrl: endpoint?.url,\n localUrl: endpoint?.localUrl ?? `https://${resolvedLocalRouteHostname(record, service)}`,\n available: endpoint?.url !== undefined,\n explicit: record.localRoutes?.some((route) => route.service === service) ?? false,\n };\n });\n if (flags.json) process.stdout.write(JSON.stringify(routes, null, 2) + \"\\n\");\n else for (const route of routes) process.stdout.write(`${route.service.padEnd(16)} ${route.localUrl}\\n`);\n } else {\n fail(\"usage\", \"usage: hestia route add|disable|reset <endpoint...> | route list\", flags.json);\n }\n break;\n }\n case \"router\": {\n const action = flags._[1];\n const result = action === \"status\"\n ? await readHestiaRouterStatus()\n : action === \"install\"\n ? await installHestiaRouter(flags.interactive)\n : action === \"uninstall\"\n ? await uninstallHestiaRouter(flags.interactive)\n : null;\n if (result === null) {\n fail(\"usage\", \"usage: hestia router status|install|uninstall [--interactive]\", flags.json);\n }\n if (flags.json) process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n else {\n process.stdout.write(\n `router ${result.running ? \"running\" : result.installed ? \"installed\" : \"not installed\"} ` +\n `(Portless ${result.version}, port ${result.port}, ${result.stateDir})\\n`,\n );\n }\n break;\n }\n case \"config\": {\n const action = flags._[1];\n const path = flags.file ?? hestiaConfigTomlPath();\n if (action === \"migrate\") {\n const result = migrateHestiaMachineConfig();\n if (flags.json) process.stdout.write(JSON.stringify(result) + \"\\n\");\n else process.stdout.write(result.migrated ? `migrated ${result.from} -> ${result.to}\\n` : `${result.to} already exists\\n`);\n } else if (action === \"path\") {\n if (flags.json) process.stdout.write(JSON.stringify({ path }) + \"\\n\");\n else process.stdout.write(`${path}\\n`);\n } else if (action === \"show\" || action === \"validate\") {\n const result = readHestiaMachineConfig(path);\n if (flags.json) process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n else if (action === \"show\") {\n process.stdout.write(`${result.path}\\n${JSON.stringify(result.config, null, 2)}\\n`);\n for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\\n`);\n }\n else {\n process.stdout.write(`${result.valid ? \"valid\" : \"invalid\"} ${result.path}\\n`);\n for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\\n`);\n }\n if (!result.valid) process.exitCode = 1;\n } else {\n fail(\"usage\", \"usage: hestia config path|show|validate|migrate [--file <path>]\", flags.json);\n }\n break;\n }\n case \"open\": {\n const service = flags._[1];\n if (!service) fail(\"usage\", \"usage: hestia open <service> [path]\", flags.json);\n const r = await engine.status(cwd);\n if (r === null) fail(\"no-stack\", \"no stack for this worktree\", flags.json);\n const endpoint = resolveEndpointSelection(r, service).endpoint;\n const selectedModes = [flags.direct, flags.local, flags.public].filter(Boolean).length;\n if (selectedModes > 1) fail(\"usage\", \"open accepts only one of --direct, --local, or --public\", flags.json);\n const localIsCandidate = endpoint?.localUrl !== undefined && (flags.local || selectedModes === 0);\n const router = localIsCandidate ? await readHestiaRouterStatus() : undefined;\n const daemon = localIsCandidate ? readDaemonJson() : null;\n let daemonHealth: Awaited<ReturnType<typeof fetchHealth>> | null = null;\n if (daemon !== null) {\n try {\n daemonHealth = await fetchHealth(daemon.port);\n } catch {}\n }\n const localUsable = router?.installed === true && router.running && router.trusted &&\n daemonHealth?.routerPort === daemon?.routerPort;\n if (flags.local && endpoint?.localUrl !== undefined && !localUsable) {\n fail(\"router-unreachable\", \"the requested local HTTPS router is not installed, running, and trusted\", flags.json);\n }\n const base = flags.direct\n ? endpoint?.url\n : flags.local\n ? endpoint?.localUrl\n : flags.public\n ? endpoint?.publicUrl\n : localUsable ? endpoint?.localUrl : endpoint?.publicUrl ?? endpoint?.url;\n if (base === undefined) {\n fail(\n \"service-not-found\",\n `\"${service}\" has no requested URL surface`,\n flags.json,\n );\n }\n const path = flags._[2];\n const url =\n path === undefined\n ? base\n : base.replace(/\\/$/, \"\") + (path.startsWith(\"/\") ? path : `/${path}`);\n openUrl(url);\n if (flags.json) process.stdout.write(JSON.stringify({ url }) + \"\\n\");\n else process.stdout.write(`${url}\\n`);\n break;\n }\n case \"stop\": {\n const name = flags._[1];\n if (!name) fail(\"usage\", \"usage: hestia stop <name>\", flags.json);\n await engine.stopService(cwd, name);\n if (flags.json) process.stdout.write(JSON.stringify({ ok: true }) + \"\\n\");\n else process.stdout.write(`${name} stopped\\n`);\n break;\n }\n case \"down\": {\n if (flags.project !== undefined) {\n await engine.downProject(flags.project, { destroy: flags.destroy });\n } else {\n await engine.down(cwd, { destroy: flags.destroy });\n }\n if (flags.json) process.stdout.write(JSON.stringify({ ok: true }) + \"\\n\");\n else process.stdout.write(\"stack down\\n\");\n break;\n }\n case \"status\": {\n const r = await engine.status(cwd);\n if (flags.json) process.stdout.write(JSON.stringify(r) + \"\\n\");\n else if (r === null) process.stdout.write(\"no stack for this worktree\\n\");\n else printStackHuman(r);\n break;\n }\n case \"env\": {\n const r = await engine.status(cwd);\n if (r === null) fail(\"no-stack\", \"no stack for this worktree\", flags.json);\n if (flags.json) process.stdout.write(JSON.stringify(r.env) + \"\\n\");\n else {\n for (const [k, v] of Object.entries(r.env)) {\n process.stdout.write(`export ${k}=${JSON.stringify(v)}\\n`);\n }\n }\n break;\n }\n case \"endpoint\": {\n const action = flags._[1];\n const r = await engine.status(cwd);\n if (r === null) fail(\"no-stack\", \"no stack for this worktree\", flags.json);\n if (action === \"get\") {\n const input = flags._[2];\n if (!input) fail(\"usage\", \"usage: hestia endpoint get <alias|selector>\", flags.json);\n const resolved = resolveEndpointSelection(r, input);\n if (flags.json) process.stdout.write(JSON.stringify(resolved) + \"\\n\");\n else process.stdout.write(\n `${resolved.endpoint.name} ${resolved.workload}:${resolved.binding} ` +\n `${resolved.endpoint.kind ?? \"tcp\"} ${resolved.endpoint.host}:${resolved.endpoint.port}\\n`,\n );\n } else if (action === \"list\") {\n if (flags.json) process.stdout.write(JSON.stringify(r.endpoints) + \"\\n\");\n else {\n for (const e of r.endpoints) {\n process.stdout.write(`${e.name.padEnd(12)} ${e.host}:${e.port}\\n`);\n if (e.url) process.stdout.write(` direct ${e.url}\\n`);\n if (e.localUrl) process.stdout.write(` local ${e.localUrl}\\n`);\n if (e.publicUrl) process.stdout.write(` public ${e.publicUrl}\\n`);\n }\n }\n } else {\n fail(\"usage\", \"usage: hestia endpoint list | endpoint get <alias|selector>\", flags.json);\n }\n break;\n }\n case \"logs\": {\n if (flags.tail !== undefined && (!Number.isInteger(flags.tail) || flags.tail < 0)) {\n fail(\"usage\", \"--tail requires a non-negative integer\", flags.json);\n }\n const services = flags._.slice(1);\n const stream = flags.project !== undefined\n ? engine.logsProject(flags.project, {\n services,\n follow: flags.follow,\n tail: flags.tail,\n })\n : engine.logs(cwd, {\n services,\n follow: flags.follow,\n tail: flags.tail,\n });\n const nameWidth = Math.max(8, ...services.map((name) => name.length));\n for await (const line of stream) {\n if (flags.json) {\n process.stdout.write(JSON.stringify(line) + \"\\n\");\n } else {\n const text = line.meta ? `[hestia] ${line.text}` : line.text;\n process.stdout.write(`${line.service.padEnd(nameWidth)} │ ${text}\\n`);\n }\n }\n break;\n }\n case \"doctor\": {\n const rows = await doctor(cwd);\n if (flags.json) {\n process.stdout.write(JSON.stringify(rows, null, 2) + \"\\n\");\n } else {\n const mark: Record<DoctorRow[\"level\"], string> = {\n ok: \"✓\",\n warn: \"!\",\n error: \"✗\",\n unknown: \"?\",\n };\n for (const r of rows) {\n process.stdout.write(`${mark[r.level]} ${r.check.padEnd(28)} ${r.detail}\\n`);\n }\n }\n if (rows.some((r) => r.level === \"error\")) process.exit(1);\n break;\n }\n case \"tui\": {\n if (flags.json) fail(\"usage\", \"hestia tui does not support --json\", true);\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n fail(\"usage\", \"hestia tui requires interactive stdin and stdout\", false);\n }\n const { runFleetTui } = await import(\"@hestia/tui\");\n await runFleetTui(cwd);\n break;\n }\n case \"daemon\": {\n const sub = flags._[1];\n if (sub === \"status\") {\n const j = readDaemonJson();\n const health = j !== null ? await fetchHealth(j.port) : null;\n if (health === null) {\n if (flags.json) process.stdout.write(JSON.stringify({ running: false }) + \"\\n\");\n else process.stdout.write(\"hestiad not running (starts on the next up/run)\\n\");\n break;\n }\n const state = await fetchState(j!.port);\n if (flags.json) {\n process.stdout.write(JSON.stringify({ running: true, ...health, ...state }) + \"\\n\");\n } else {\n process.stdout.write(\n `hestiad pid ${health.pid} (protocol v${health.protocolVersion}) — ` +\n `${health.live}/${health.maxStacks} stacks` +\n (state !== null && state.live.length > 0 ? `: ${state.live.join(\", \")}` : \"\") +\n (health.queued > 0 ? `, ${health.queued} queued` : \"\") +\n \"\\n\",\n );\n for (const w of health.warnings) process.stderr.write(`warning: ${w}\\n`);\n }\n } else if (sub === \"stop\") {\n // A launchd-managed daemon must be booted out — SIGTERM alone would\n // just be respawned (or leave launchd thinking it crashed). Only\n // when launchd manages THIS home: a HESTIA_HOME'd CLI must never\n // boot out the machine's real agent.\n if (launchdManagesThisHome()) {\n const uid = process.getuid?.() ?? 501;\n execFileSync(\"launchctl\", [\"bootout\", `gui/${uid}/dev.hestia.daemon`]);\n process.stderr.write(\n \"warning: launchd agent booted out — `hestia daemon install` re-enables reboot revival\\n\",\n );\n } else {\n await stopDaemonProcess();\n }\n process.stderr.write(\n \"warning: stacks keep running; cap + connector supervision paused until the next up/run\\n\",\n );\n if (flags.json) process.stdout.write(JSON.stringify({ ok: true }) + \"\\n\");\n else process.stdout.write(\"hestiad stopped\\n\");\n } else if (sub === \"install\") {\n const result = installLaunchd({ print: flags.print });\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n if (flags.json) {\n process.stdout.write(JSON.stringify(result) + \"\\n\");\n } else if (result.installedAt !== undefined) {\n process.stdout.write(\n `installed ${result.installedAt} — hestiad (and adopted tunnel connectors) now survive reboots\\n`,\n );\n } else {\n process.stdout.write(result.plist);\n }\n } else if (sub === \"uninstall\") {\n const result = uninstallLaunchd();\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n if (flags.json) process.stdout.write(JSON.stringify(result) + \"\\n\");\n else {\n process.stdout.write(\n result.removed ? `removed ${plistPath()}\\n` : \"launchd agent was not installed\\n\",\n );\n }\n } else if (sub === \"start\") {\n const h = await ensureDaemon();\n if (flags.json) process.stdout.write(JSON.stringify(h.health) + \"\\n\");\n else process.stdout.write(`hestiad running on 127.0.0.1:${h.port} (pid ${h.health.pid})\\n`);\n } else {\n fail(\"usage\", \"usage: hestia daemon status|start|stop|install [--print]|uninstall\", flags.json);\n }\n break;\n }\n case \"help\":\n case undefined:\n process.stdout.write(HELP);\n break;\n default:\n fail(\"unknown-command\", `unknown command: ${cmd}`, flags.json);\n }\n } catch (err) {\n if (err instanceof HestiaError) fail(err.code, err.message, flags.json, err.details);\n fail(\"internal\", (err as Error).message ?? String(err), flags.json);\n }\n}\n\nmain();\n"
|
|
142
|
+
],
|
|
143
|
+
"mappings": "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K,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAA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",
|
|
144
|
+
"debugId": "A4ADFA741120BECE64756E2164756E21",
|
|
145
|
+
"names": []
|
|
146
|
+
}
|