@mod-computer/cli 0.1.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/README.md +125 -0
- package/commands/execute.md +156 -0
- package/commands/overview.md +233 -0
- package/commands/review.md +151 -0
- package/commands/spec.md +169 -0
- package/dist/app.js +227 -0
- package/dist/cli.bundle.js +25824 -0
- package/dist/cli.bundle.js.map +7 -0
- package/dist/cli.js +121 -0
- package/dist/commands/agents-run.js +71 -0
- package/dist/commands/auth.js +151 -0
- package/dist/commands/branch.js +1411 -0
- package/dist/commands/claude-sync.js +772 -0
- package/dist/commands/index.js +43 -0
- package/dist/commands/init.js +378 -0
- package/dist/commands/recover.js +207 -0
- package/dist/commands/spec.js +386 -0
- package/dist/commands/status.js +329 -0
- package/dist/commands/sync.js +95 -0
- package/dist/commands/workspace.js +423 -0
- package/dist/components/conflict-resolution-ui.js +120 -0
- package/dist/components/messages.js +5 -0
- package/dist/components/thread.js +8 -0
- package/dist/config/features.js +72 -0
- package/dist/config/release-profiles/development.json +11 -0
- package/dist/config/release-profiles/mvp.json +12 -0
- package/dist/config/release-profiles/v0.1.json +11 -0
- package/dist/config/release-profiles/v0.2.json +11 -0
- package/dist/containers/branches-container.js +140 -0
- package/dist/containers/directory-container.js +92 -0
- package/dist/containers/thread-container.js +214 -0
- package/dist/containers/threads-container.js +27 -0
- package/dist/containers/workspaces-container.js +27 -0
- package/dist/daemon-worker.js +257 -0
- package/dist/lib/auth-server.js +153 -0
- package/dist/lib/browser.js +35 -0
- package/dist/lib/storage.js +203 -0
- package/dist/services/automatic-file-tracker.js +303 -0
- package/dist/services/cli-orchestrator.js +227 -0
- package/dist/services/feature-flags.js +187 -0
- package/dist/services/file-import-service.js +283 -0
- package/dist/services/file-transformation-service.js +218 -0
- package/dist/services/logger.js +44 -0
- package/dist/services/mod-config.js +61 -0
- package/dist/services/modignore-service.js +326 -0
- package/dist/services/sync-daemon.js +244 -0
- package/dist/services/thread-notification-service.js +50 -0
- package/dist/services/thread-service.js +147 -0
- package/dist/stores/use-directory-store.js +96 -0
- package/dist/stores/use-threads-store.js +46 -0
- package/dist/stores/use-workspaces-store.js +32 -0
- package/dist/types/config.js +16 -0
- package/dist/types/index.js +2 -0
- package/dist/types/workspace-connection.js +2 -0
- package/dist/types.js +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../mod-core/dist/services/stream-handler.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/typeAliases.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js", "../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.js", "../../mod-core/dist/schemas/thread-schemas.js", "../../mod-core/dist/repos/thread-repo.js", "../../mod-core/dist/repos/branch-repo.js", "../../mod-core/dist/services/working-directory-service.js", "../../mod-core/dist/services/spec-branch-validator.js", "../../mod-core/dist/services/branch-service.js", "../../mod-core/dist/services/thread-service.js", "../../mod-core/dist/services/branchable-repo.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/constants.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/buffer-util.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/limiter.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/permessage-deflate.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/validation.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/receiver.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/sender.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/event-target.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/extension.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/websocket.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/stream.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/subprotocol.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/lib/websocket-server.js", "../../../node_modules/.pnpm/ws@8.18.3/node_modules/ws/index.js", "../../../node_modules/.pnpm/isomorphic-ws@5.0.0_ws@8.18.3/node_modules/isomorphic-ws/node.js", "../../mod-core/dist/repos/base-repo.js", "../../mod-core/dist/schemas/workspace-schemas.js", "../../mod-core/dist/utils/local-storage.js", "../../mod-core/dist/repos/workspace-repo.js", "../../mod-core/dist/services/task-tracking.js", "../../mod-core/dist/schemas/task-schemas.js", "../../mod-core/dist/repos/tasks-repo.js", "../../mod-core/dist/services/task-service.js", "../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm/stringify.js", "../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm/rng.js", "../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm/native.js", "../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm/v4.js", "../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm/index.js", "../../mod-core/dist/repos/permission-repo.js", "../../mod-core/dist/services/permission-service.js", "../../mod-core/dist/repos/folder-repo.js", "../../mod-core/dist/services/folder-service.js", "../../mod-core/dist/services/workspace-service.js", "../../mod-core/dist/utils/search-utils.js", "../../mod-core/src/shims/openai.ts", "../../mod-core/dist/services/base-search.js", "../../mod-core/dist/services/document-search.js", "../../mod-core/dist/tools/search-documents.js", "../../mod-core/dist/tools/read-document.js", "../../mod-core/dist/tools/search-documents-enhanced.js", "../../mod-core/dist/tools/search-workspace.js", "../../mod-core/dist/tools/read-workspace-file.js", "../../mod-core/dist/services/tool-registry.js", "../../mod-core/dist/services/agent-registry.js", "../../mod-core/dist/tools/transfer-to-agent.js", "cli.js", "app.js", "containers/workspaces-container.js", "stores/use-workspaces-store.js", "containers/thread-container.js", "components/thread.js", "components/messages.js", "services/thread-service.js", "services/cli-orchestrator.js", "services/logger.js", "containers/directory-container.js", "stores/use-directory-store.js", "services/mod-config.js", "containers/branches-container.js", "services/feature-flags.js", "../../mod-core/dist/repos/repo.node.js", "../../mod-core/dist/utils/resolveAutomergeWsUrl.js", "../../mod-core/dist/utils/automergeSyncAvailability.js", "commands/agents-run.js", "lib/storage.js", "types/config.js", "lib/browser.js", "lib/auth-server.js", "commands/auth.js", "commands/branch.js", "../../mod-core/dist/mod-workspace.js", "../../mod-core/dist/repos/comment-repo.js", "../../mod-core/dist/services/comment-service.js", "../../mod-core/dist/types/mod-file-types.js", "services/automatic-file-tracker.js", "../../mod-core/dist/index.js", "../../mod-core/dist/tools/create-tasks.js", "../../mod-core/dist/tools/set-active-task.js", "../../mod-core/dist/tools/set-task-status.js", "../../mod-core/dist/types/specification-types.js", "../../mod-core/dist/schemas/user-schemas.js", "../../mod-core/dist/schemas/invitation-schemas.js", "../../mod-core/dist/repos/user-repo.js", "../../mod-core/dist/services/invitation-service.js", "../../mod-core/dist/utils/spec-parser-utils.js", "../../mod-core/dist/services/specification-parser.js", "../../mod-core/dist/utils/find-document.js", "../../mod-core/dist/utils/debugSync.js", "../../mod-core/dist/utils/workspace-defaults.js", "services/modignore-service.js", "services/sync-daemon.js", "commands/spec.js", "commands/workspace.js", "commands/claude-sync.js", "services/file-import-service.js", "commands/sync.js", "commands/init.js", "commands/recover.js", "config/features.js", "commands/index.js"],
|
|
4
|
+
"sourcesContent": ["export async function handleStream(stream, options) {\n let state = options.initialState;\n for await (const chunk of stream) {\n switch (chunk.type) {\n case 'content':\n if (options.onContent)\n await options.onContent(chunk, state);\n break;\n case 'tool':\n if (options.onTool)\n await options.onTool(chunk, state);\n break;\n case 'transfer':\n if (options.onTransfer)\n await options.onTransfer(chunk, state);\n break;\n case 'error':\n if (options.onError)\n await options.onError(chunk, state);\n break;\n case 'finish':\n if (options.onFinish)\n await options.onFinish(state);\n break;\n default:\n // Unknown chunk type; ignore or extend as needed\n break;\n }\n }\n return state;\n}\n", "export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n", "import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n", "import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n", "import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n", "import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n", "export {};\n", "export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n", "import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&\u2019*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n", "export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n", "import * as z from \"./v3/external.js\";\nexport * from \"./v3/external.js\";\nexport { z };\nexport default z;\n", "import { z } from 'zod';\nexport const ThreadPaginationSchema = z.object({\n total: z.number(),\n page: z.number(),\n page_size: z.number(),\n total_pages: z.number(),\n});\nexport const ThreadSchema = z.object({\n id: z.string(),\n name: z.string(),\n itemIds: z.array(z.string()),\n branchId: z.string(),\n created: z.number(),\n updated: z.number(),\n pagination: ThreadPaginationSchema.optional(),\n tasksDocId: z.string().optional(), // Optional: link to the tasks doc for this thread\n});\nexport const SourceSchema = z.object({\n id: z.string(),\n title: z.string(),\n url: z.string().optional(),\n label: z.string(),\n matchScore: z.number().optional(),\n description: z.string().optional(),\n priority: z.number().optional(),\n status: z.string().optional(),\n});\nexport const ThreadItemDocSchema = z.object({\n id: z.string(),\n metadata: z.object({\n type: z.literal('threadItem'),\n createdAt: z.string(),\n updatedAt: z.string(),\n }),\n threadId: z.string(),\n content: z.string(),\n userType: z.union([z.literal('user'), z.literal('assistant'), z.literal('tool'), z.literal('system')]),\n userId: z.string(),\n user: z.object({\n name: z.string(),\n avatarUrl: z.string(),\n }).optional(),\n documentIds: z.array(z.string()).optional(),\n contextDocumentIds: z.array(z.string()).optional(),\n sources: z.array(SourceSchema).optional(),\n type: z.string(),\n toolCall: z.object({\n tool: z.string(),\n toolCallId: z.string(),\n toolName: z.string(),\n args: z.any(),\n }).optional(),\n toolResult: z.object({\n tool: z.string(),\n toolCallId: z.string(),\n toolName: z.string(),\n result: z.any(),\n isError: z.boolean().optional(),\n }).optional(),\n reasoning: z.object({\n summary: z.string().optional(),\n }).optional(),\n ui: z.object({\n type: z.string().optional(),\n component: z.string().optional(),\n connectorId: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n buttonText: z.string().optional(),\n }).optional(),\n data: z.record(z.any()).optional(),\n});\nexport const SubThreadSchema = z.object({\n id: z.string(),\n itemIds: z.array(z.string()),\n agentId: z.string(),\n metadata: z.object({\n type: z.literal('subThread'),\n createdAt: z.string(),\n updatedAt: z.string(),\n }),\n});\n", "import { ThreadSchema, ThreadItemDocSchema, SubThreadSchema } from '../schemas/thread-schemas.js';\nexport class ThreadRepository {\n constructor(repo) {\n this.repo = repo;\n }\n async getHandle(id) {\n const handle = await this.repo.find(id);\n if (!handle)\n throw new Error(`Thread not found: ${id}`);\n return handle;\n }\n validateId(id) {\n if (!id || typeof id !== 'string')\n throw new Error('Invalid DocumentId');\n }\n async create(data) {\n const handle = this.repo.create();\n handle.change((doc) => {\n Object.assign(doc, {\n id: handle.documentId,\n name: data.name || '',\n itemIds: [],\n created: Date.now(),\n updated: Date.now(),\n ...data\n });\n });\n // Validate after creation\n const thread = handle.doc();\n const parsed = ThreadSchema.safeParse(thread);\n if (!parsed.success) {\n throw new Error('Invalid thread data: ' + parsed.error.message);\n }\n return handle.documentId;\n }\n async update(id, data) {\n const handle = await this.getHandle(id);\n handle.change((doc) => {\n Object.assign(doc, {\n ...data,\n updated: Date.now()\n });\n });\n // Validate after update\n const thread = handle.doc();\n const normalizedThread = {\n ...thread,\n created: typeof thread.created === 'string' ? Date.parse(thread.created) : thread.created,\n updated: typeof thread.updated === 'string' ? Date.parse(thread.updated) : thread.updated,\n };\n const parsed = ThreadSchema.safeParse(normalizedThread);\n if (!parsed.success) {\n throw new Error('Invalid thread data: ' + parsed.error.message);\n }\n return handle.documentId;\n }\n async delete(_id) {\n // Note: This is a placeholder as Automerge doesn't have built-in delete\n // In real implementation, we might want to mark as deleted or handle differently\n console.warn('Delete operation not fully implemented for Automerge documents');\n }\n async get(id) {\n const handle = await this.getHandle(id);\n const thread = handle.doc();\n // Create a shallow copy with normalized created/updated fields\n const normalizedThread = {\n ...thread,\n created: typeof thread.created === 'string' ? Date.parse(thread.created) : thread.created,\n updated: typeof thread.updated === 'string' ? Date.parse(thread.updated) : thread.updated,\n };\n const parsed = ThreadSchema.safeParse(normalizedThread);\n if (!parsed.success) {\n throw new Error('Invalid thread data: ' + parsed.error.message);\n }\n return normalizedThread;\n }\n async list(_query) {\n // This is a placeholder - in real implementation we'd need a way to \n // query/index threads, possibly using a separate index store\n return [];\n }\n async getThreadItem(itemId) {\n const handle = await this.repo.find(itemId);\n if (!handle) {\n throw new Error(`Thread item not found: ${itemId}`);\n }\n const item = handle.doc();\n const parsed = ThreadItemDocSchema.safeParse(item);\n if (!parsed.success) {\n throw new Error('Invalid thread item data: ' + parsed.error.message);\n }\n return item;\n }\n /**\n * Public: Get the DocHandle for a ThreadItemDoc by id\n */\n async getThreadItemHandle(itemId) {\n const handle = await this.repo.find(itemId);\n if (!handle)\n throw new Error(`Thread item handle not found: ${itemId}`);\n return handle;\n }\n async addThreadItem(threadId, content, outputDocumentIds = [], addToThread = false, userId = 'user-1', userName = 'nassar', userAvatarUrl, options) {\n this.validateId(threadId);\n // Only reject empty messages from non-streaming assistant responses\n if (userId.startsWith('assistant') && !content.trim() && content !== '') {\n return Promise.reject(new Error('Empty content for assistant message'));\n }\n const threadHandle = await this.getHandle(threadId);\n const itemHandle = await this.repo.create();\n const type = options?.type || 'message';\n const toolCall = options?.toolCall;\n const toolResult = options?.toolResult;\n const reasoning = options?.reasoning;\n const ui = options?.ui;\n const data = options?.data;\n const agentContext = options?.agentContext;\n const contextItems = options?.contextItems;\n // Ensure JSON-safe structures (no undefined, Dates -> ISO strings)\n function toJsonSafe(value) {\n if (value === undefined)\n return undefined; // caller will omit undefined keys\n if (value === null)\n return null;\n if (value instanceof Date)\n return value.toISOString();\n if (Array.isArray(value))\n return value.map((v) => toJsonSafe(v)).filter((v) => v !== undefined);\n if (typeof value === 'object' && value !== null) {\n const out = {};\n for (const [k, v] of Object.entries(value)) {\n const safeV = toJsonSafe(v);\n if (safeV !== undefined)\n out[k] = safeV;\n }\n return out;\n }\n return value;\n }\n const cleanedContextItems = Array.isArray(contextItems)\n ? toJsonSafe(contextItems)\n : undefined;\n itemHandle.change((doc) => {\n Object.assign(doc, {\n id: itemHandle.documentId,\n threadId: threadId,\n content: content,\n userType: userId.startsWith('assistant') ? 'assistant' : 'user',\n userId: userId,\n documentIds: outputDocumentIds,\n ...(typeof agentContext !== 'undefined' ? { agentContext } : {}),\n user: {\n name: userName,\n avatarUrl: userAvatarUrl || (userId.startsWith('assistant') ?\n `https://api.dicebear.com/7.x/bottts/svg?seed=${userName}` :\n \"https://github.com/shadcn.png\"),\n },\n metadata: {\n type: 'threadItem',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n },\n type,\n ...(typeof toolCall !== 'undefined' ? { toolCall } : {}),\n ...(typeof toolResult !== 'undefined' ? { toolResult } : {}),\n ...(typeof reasoning !== 'undefined' ? { reasoning } : {}),\n ...(typeof ui !== 'undefined' ? { ui } : {}),\n ...(typeof data !== 'undefined' ? { data } : {}),\n ...(typeof cleanedContextItems !== 'undefined' ? { contextItems: cleanedContextItems } : {}),\n });\n });\n // Validate after creation\n const item = itemHandle.doc();\n const parsed = ThreadItemDocSchema.safeParse(item);\n if (!parsed.success) {\n throw new Error('Invalid thread item data: ' + parsed.error.message);\n }\n // Add item to thread if requested\n if (addToThread) {\n threadHandle.change((doc) => {\n if (!doc.itemIds)\n doc.itemIds = [];\n doc.itemIds.push(itemHandle.documentId);\n doc.updated = Date.now();\n });\n // Validate thread after adding item\n const thread = threadHandle.doc();\n const normalizedThread = {\n ...thread,\n created: typeof thread.created === 'string' ? Date.parse(thread.created) : thread.created,\n updated: typeof thread.updated === 'string' ? Date.parse(thread.updated) : thread.updated,\n };\n const threadParsed = ThreadSchema.safeParse(normalizedThread);\n if (!threadParsed.success) {\n throw new Error('Invalid thread data after adding item: ' + threadParsed.error.message);\n }\n }\n return itemHandle.doc();\n }\n async addChunkToThreadItem(itemId, chunk) {\n try {\n // Get the current thread item\n const currentItem = await this.getThreadItem(itemId);\n // Try to update the existing thread item\n try {\n const handle = await this.repo.find(itemId);\n if (!handle) {\n throw new Error(`Thread item not found: ${itemId}`);\n }\n handle.change((doc) => {\n // Process the content to avoid duplication\n if (!doc.content) {\n doc.content = chunk;\n }\n else {\n doc.content = doc.content + chunk;\n }\n if (!doc.metadata)\n doc.metadata = {\n type: 'threadItem',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n doc.metadata.updatedAt = new Date().toISOString();\n });\n // Validate after update\n const item = handle.doc();\n const parsed = ThreadItemDocSchema.safeParse(item);\n if (!parsed.success) {\n throw new Error('Invalid thread item data after chunk: ' + parsed.error.message);\n }\n return handle.doc();\n }\n catch (error) {\n // If updating the existing thread item fails, create a new one\n console.warn(\"[ThreadRepository] Error updating thread item, creating a new one:\", error);\n // Create a new thread item with the combined content\n const newItem = await this.addThreadItem(currentItem.threadId, chunk, // Just use the new chunk instead of concatenating\n currentItem.documentIds || [], true, // Add to thread\n currentItem.userId, currentItem.user?.name || 'assistant', currentItem.user?.avatarUrl, {\n type: currentItem.type,\n data: currentItem.data,\n ui: currentItem.ui\n });\n return newItem;\n }\n }\n catch (error) {\n console.error(\"[ThreadRepository] Failed to add chunk to thread item:\", error);\n throw error;\n }\n }\n async addDocumentIdsToThreadItem(itemId, documentIds) {\n const handle = await this.repo.find(itemId);\n if (!handle) {\n throw new Error(`Thread item not found: ${itemId}`);\n }\n handle.change((doc) => {\n if (!doc.documentIds)\n doc.documentIds = [];\n // Add only unique document IDs\n const uniqueDocIds = documentIds.filter(id => !doc.documentIds?.includes(id));\n // Add the unique document IDs\n if (uniqueDocIds.length > 0) {\n doc.documentIds.push(...uniqueDocIds);\n }\n if (!doc.metadata)\n doc.metadata = {\n type: 'threadItem',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n doc.metadata.updatedAt = new Date().toISOString();\n });\n // Validate after update\n const item = handle.doc();\n const parsed = ThreadItemDocSchema.safeParse(item);\n if (!parsed.success) {\n throw new Error('Invalid thread item data after adding document IDs: ' + parsed.error.message);\n }\n return handle.doc();\n }\n async addSourcesToThreadItem(itemId, sources) {\n const handle = await this.repo.find(itemId);\n if (!handle) {\n throw new Error(`Thread item not found: ${itemId}`);\n }\n handle.change((doc) => {\n doc.sources = [];\n if (sources) {\n sources.forEach(source => {\n const cleanSource = {\n id: source.id,\n title: source.title,\n label: source.label,\n ...(source.url && { url: source.url }),\n ...(source.matchScore !== undefined && { matchScore: source.matchScore }),\n ...(source.description && { description: source.description }),\n ...(source.priority !== undefined && { priority: source.priority }),\n ...(source.status && { status: source.status })\n };\n doc.sources?.push(cleanSource);\n });\n }\n if (!doc.metadata)\n doc.metadata = {\n type: 'threadItem',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n doc.metadata.updatedAt = new Date().toISOString();\n });\n // Validate after update\n const item = handle.doc();\n const parsed = ThreadItemDocSchema.safeParse(item);\n if (!parsed.success) {\n throw new Error('Invalid thread item data after adding sources: ' + parsed.error.message);\n }\n return handle.doc();\n }\n // --- SubThread Methods ---\n async createSubThread(parentThreadItemId, agentId) {\n const handle = this.repo.create();\n const subThreadId = handle.documentId;\n handle.change((doc) => {\n Object.assign(doc, {\n id: subThreadId,\n parentThreadItemId,\n itemIds: [],\n agentId,\n metadata: {\n type: 'subThread',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n });\n });\n // Validate after creation\n const subThread = handle.doc();\n const parsed = SubThreadSchema.safeParse(subThread);\n if (!parsed.success) {\n throw new Error('Invalid subThread data: ' + parsed.error.message);\n }\n return subThreadId;\n }\n async getSubThread(subThreadId) {\n const handle = await this.repo.find(subThreadId);\n if (!handle)\n return null;\n const subThread = handle.doc();\n const parsed = SubThreadSchema.safeParse(subThread);\n if (!parsed.success) {\n throw new Error('Invalid subThread data: ' + parsed.error.message);\n }\n return subThread;\n }\n async addItemToSubThread(subThreadId, itemId) {\n const handle = await this.repo.find(subThreadId);\n if (!handle) {\n throw new Error(`Sub-thread not found: ${subThreadId}`);\n }\n handle.change((doc) => {\n if (!doc.itemIds.includes(itemId)) {\n doc.itemIds.push(itemId);\n }\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n // Validate after update\n const subThread = handle.doc();\n const parsed = SubThreadSchema.safeParse(subThread);\n if (!parsed.success) {\n throw new Error('Invalid subThread data after adding item: ' + parsed.error.message);\n }\n }\n}\n", "// Default timeout for repo.find() operations (5 seconds)\nconst DEFAULT_FIND_TIMEOUT_MS = 5000;\n// Default timeout for document readiness (2 seconds)\nconst DEFAULT_READY_TIMEOUT_MS = 2000;\n/**\n * Wrap repo.find() with a timeout to prevent indefinite hangs\n */\nasync function findWithTimeout(repo, documentId, timeoutMs = DEFAULT_FIND_TIMEOUT_MS) {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n console.warn(`[BranchRepo] repo.find() timed out after ${timeoutMs}ms for ${documentId}`);\n resolve(null);\n }, timeoutMs);\n repo.find(documentId)\n .then((handle) => {\n clearTimeout(timeout);\n resolve(handle);\n })\n .catch((err) => {\n clearTimeout(timeout);\n console.warn(`[BranchRepo] repo.find() failed for ${documentId}:`, err);\n resolve(null);\n });\n });\n}\nexport class BranchRepo {\n constructor(repo) {\n this.branchDocuments = new Map();\n this.repo = repo;\n }\n async create(branch, branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n branchDoc.change((doc) => {\n doc.branches[branch.id] = branch;\n doc.updatedAt = new Date().toISOString();\n });\n return branch;\n }\n async findById(branchId, branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n const doc = branchDoc.doc();\n return doc?.branches?.[branchId] || null;\n }\n async findAll(branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n const doc = branchDoc.doc();\n if (!doc?.branches) {\n return [];\n }\n return Object.values(doc.branches).filter(branch => branch.status === 'active');\n }\n async update(branch, branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n branchDoc.change((doc) => {\n // Deep clone the branch to remove any Automerge proxies or document handles\n const serializableBranch = JSON.parse(JSON.stringify({\n ...branch,\n updatedAt: new Date().toISOString()\n }));\n doc.branches[branch.id] = serializableBranch;\n doc.updatedAt = new Date().toISOString();\n });\n return branch;\n }\n async delete(branchId, branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n branchDoc.change((doc) => {\n if (doc.branches[branchId]) {\n doc.branches[branchId].status = 'deleted';\n doc.branches[branchId].updatedAt = new Date().toISOString();\n }\n doc.updatedAt = new Date().toISOString();\n });\n }\n async findProposalBranches(parentBranchId, branchesDocId) {\n const branches = await this.findAll(branchesDocId);\n return branches.filter(branch => branch.parentBranchId === parentBranchId &&\n branch.metadata.type === 'proposal');\n }\n async findByType(type, branchesDocId) {\n const branches = await this.findAll(branchesDocId);\n return branches.filter(branch => branch.metadata.type === type);\n }\n // Create or get a BranchesDoc for a workspace\n async createBranchesDoc() {\n if (!this.repo || typeof this.repo.create !== 'function') {\n console.error('[BranchRepo.createBranchesDoc] Repo is not initialized or create() is not a function', this.repo);\n throw new Error('Automerge repo is not initialized or create() is not a function');\n }\n const branchDoc = this.repo.create();\n branchDoc.change((doc) => {\n doc.branches = {};\n doc.createdAt = new Date().toISOString();\n doc.updatedAt = new Date().toISOString();\n });\n console.log('[BranchRepo.createBranchesDoc] Created branchDoc:', branchDoc);\n console.log('[BranchRepo.createBranchesDoc] branchDoc.documentId:', branchDoc.documentId, 'typeof:', typeof branchDoc.documentId);\n if (!branchDoc.documentId) {\n console.error('[BranchRepo.createBranchesDoc] Failed to create branches document: documentId is undefined', branchDoc);\n throw new Error('[BranchRepo.createBranchesDoc] Failed to create branches document: documentId is undefined');\n }\n console.log('[BranchRepo.createBranchesDoc] Returning branchDoc with documentId:', branchDoc.documentId);\n return branchDoc;\n }\n async getBranchesDocument(branchesDocId) {\n let branchDoc = this.branchDocuments.get(branchesDocId);\n if (!branchDoc) {\n try {\n // Load existing branches document with timeout to prevent indefinite hangs\n const foundDoc = await findWithTimeout(this.repo, branchesDocId);\n if (!foundDoc) {\n throw new Error(`[BranchRepo] Branches document ${branchesDocId} not found or timed out`);\n }\n branchDoc = foundDoc;\n this.branchDocuments.set(branchesDocId, branchDoc);\n }\n catch (error) {\n const errorMessage = String(error?.message || error || '');\n if (errorMessage.includes('corrupt deflate stream') || errorMessage.includes('unable to parse chunk')) {\n throw new Error(`Failed to load branches document ${branchesDocId}: ${errorMessage}. This document reference may be stale or invalid.`);\n }\n throw error;\n }\n }\n await this.ensureDocumentReady(branchDoc, branchesDocId);\n return await this.ensureBranchesInitialized(branchDoc);\n }\n async ensureDocumentReady(branchDoc, branchesDocId) {\n if (!branchDoc) {\n throw new Error(`[BranchRepo] Branches document ${branchesDocId} could not be loaded`);\n }\n const needsReady = typeof branchDoc.isReady === 'function'\n ? !branchDoc.isReady()\n : true;\n if (needsReady && typeof branchDoc.whenReady === 'function') {\n // Use a timeout to prevent indefinite hangs waiting for document readiness\n await Promise.race([\n branchDoc.whenReady().catch(() => { }),\n new Promise(resolve => setTimeout(resolve, DEFAULT_READY_TIMEOUT_MS))\n ]);\n }\n }\n async ensureBranchesInitialized(branchDoc) {\n const doc = branchDoc.doc();\n if (!doc) {\n throw new Error('[BranchRepo] Branch document is not ready after initialization');\n }\n if (!doc.branches) {\n branchDoc.change((doc) => {\n doc.branches = doc.branches || {};\n doc.createdAt = doc.createdAt || new Date().toISOString();\n doc.updatedAt = new Date().toISOString();\n });\n }\n return branchDoc;\n }\n // Build branch tree for visualization\n async getBranchTree(branchesDocId) {\n const branches = await this.findAll(branchesDocId);\n const relationships = [];\n branches.forEach(branch => {\n if (branch.parentBranchId) {\n relationships.push({\n parent: branch.parentBranchId,\n child: branch.id\n });\n }\n });\n return { branches, relationships };\n }\n // Utility methods for testing and debugging\n async getAllBranches(branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n const doc = branchDoc.doc();\n if (!doc?.branches) {\n return [];\n }\n return Object.values(doc.branches);\n }\n async cleanup() {\n this.branchDocuments.clear();\n }\n sanitizeBranchForAutomerge(branch) {\n // Implement the logic to sanitize the branch object for Automerge compatibility\n // This is a placeholder and should be replaced with the actual implementation\n return branch;\n }\n /**\n * Get the current head hash for a workspace document\n */\n async getWorkspaceHead(workspaceId) {\n const wsHandle = await findWithTimeout(this.repo, workspaceId, 2000);\n if (wsHandle && typeof wsHandle.heads === 'function') {\n const heads = wsHandle.heads();\n return heads && heads[0];\n }\n return undefined;\n }\n async setTasksDocId(branchId, tasksDocId, branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n branchDoc.change((doc) => {\n if (doc.branches[branchId]) {\n doc.branches[branchId].tasksDocId = tasksDocId;\n doc.updatedAt = new Date().toISOString();\n }\n });\n }\n async setChangeLogDocId(branchId, changeLogDocId, branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n branchDoc.change((doc) => {\n if (doc.branches[branchId]) {\n doc.branches[branchId].changeLogDocId = changeLogDocId;\n doc.updatedAt = new Date().toISOString();\n }\n });\n }\n async setThreadId(branchId, threadId, branchesDocId) {\n const branchDoc = await this.getBranchesDocument(branchesDocId);\n branchDoc.change((doc) => {\n if (doc.branches[branchId]) {\n doc.branches[branchId].threadId = threadId;\n doc.updatedAt = new Date().toISOString();\n }\n });\n }\n}\n", "export class WorkingDirectoryService {\n constructor(repo, branchService) {\n this.repo = repo;\n this.branchService = branchService;\n }\n async captureWorkingDirectorySnapshot(branchId, branchesDocId, message) {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n if (!branch) {\n throw new Error(`Branch ${branchId} not found`);\n }\n const snapshotId = `wds-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const capturedAt = new Date().toISOString();\n const fileStates = {};\n for (const [fileId, currentHead] of Object.entries(branch.fileHeads)) {\n try {\n const handle = await this.repo.find(fileId);\n if (!handle) {\n console.warn(`[WorkingDirectoryService] Document handle not found for ${fileId}, skipping`);\n continue;\n }\n // Get current document state\n const currentDoc = await handle.doc();\n const isModified = await this.detectUncommittedChanges(fileId, currentHead);\n fileStates[fileId] = {\n currentHead,\n uncommittedChanges: isModified ? currentDoc : undefined,\n isModified,\n isUntracked: false // Files in branch.fileHeads are already tracked\n };\n }\n catch (error) {\n const errorMessage = String(error?.message || error || '');\n if (errorMessage.includes('unavailable')) {\n console.warn(`[WorkingDirectoryService] Document ${fileId} is unavailable, skipping snapshot capture`);\n // Document is unavailable - continue processing other files\n continue;\n }\n console.warn(`[WorkingDirectoryService] Failed to capture state for file ${fileId}:`, error);\n // Continue processing other files even if this one fails\n }\n }\n const snapshot = {\n snapshotId,\n capturedAt,\n message: message || 'Working directory snapshot',\n fileStates,\n workspaceState: {\n activeFileId: undefined, // Could be enhanced with VSCode integration\n openFiles: Object.keys(fileStates),\n cursorPositions: {}\n }\n };\n await this.storeSnapshot(branchId, branchesDocId, snapshot);\n return snapshotId;\n }\n async restoreWorkingDirectorySnapshot(branchId, branchesDocId, snapshotId) {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n if (!branch?.metadata.workingDirectorySnapshots) {\n throw new Error(`No working directory snapshots found for branch ${branchId}`);\n }\n let snapshot;\n if (snapshotId) {\n // Find specific stashed snapshot\n snapshot = branch.metadata.workingDirectorySnapshots.stashed?.find(s => s.snapshotId === snapshotId);\n if (!snapshot) {\n throw new Error(`Snapshot ${snapshotId} not found in branch ${branchId}`);\n }\n }\n else {\n // Use current snapshot\n snapshot = branch.metadata.workingDirectorySnapshots.current;\n if (!snapshot) {\n throw new Error(`No current working directory snapshot found for branch ${branchId}`);\n }\n }\n for (const [fileId, fileState] of Object.entries(snapshot.fileStates)) {\n if (!fileState.uncommittedChanges)\n continue;\n try {\n const handle = await this.repo.find(fileId);\n if (!handle) {\n console.warn(`[WorkingDirectoryService] Document handle not found for ${fileId} during restore, skipping`);\n continue;\n }\n // Check for conflicts with current state\n const currentDoc = await handle.doc();\n const hasConflicts = await this.detectConflicts(currentDoc, fileState.uncommittedChanges);\n if (hasConflicts) {\n console.warn(`[WorkingDirectoryService] Conflicts detected restoring ${fileId}, skipping`);\n continue;\n }\n // Apply uncommitted changes via BranchableRepo.change()\n handle.change((doc) => {\n Object.assign(doc, fileState.uncommittedChanges);\n });\n // Get the new head after the change\n const heads = handle.heads();\n const newHead = heads[0]; // Latest head after the change\n // Update branch fileHeads with new state\n await this.branchService.updateFileHead(branchId, fileId, newHead, branchesDocId);\n }\n catch (error) {\n const errorMessage = String(error?.message || error || '');\n if (errorMessage.includes('unavailable')) {\n console.warn(`[WorkingDirectoryService] Document ${fileId} is unavailable during restore, skipping`);\n // Document is unavailable - continue processing other files\n continue;\n }\n console.warn(`[WorkingDirectoryService] Failed to restore file ${fileId}:`, error);\n }\n }\n // Clear the restored snapshot if it was a stashed one\n if (snapshotId) {\n await this.removeStashedSnapshot(branchId, branchesDocId, snapshotId);\n }\n }\n async stashCurrentState(branchId, branchesDocId, message) {\n const snapshotId = await this.captureWorkingDirectorySnapshot(branchId, branchesDocId, message);\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n if (!branch?.metadata.workingDirectorySnapshots?.current) {\n throw new Error(`Failed to capture current state for branch ${branchId}`);\n }\n // Move current snapshot to stashed list\n const currentSnapshot = branch.metadata.workingDirectorySnapshots.current;\n const stashed = branch.metadata.workingDirectorySnapshots.stashed || [];\n await this.branchService.updateBranchMetadata(branchId, branchesDocId, {\n workingDirectorySnapshots: {\n current: undefined,\n stashed: [...stashed, currentSnapshot]\n }\n });\n return snapshotId;\n }\n async listStashedSnapshots(branchId, branchesDocId) {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n return branch?.metadata.workingDirectorySnapshots?.stashed || [];\n }\n async clearCurrentSnapshot(branchId, branchesDocId) {\n await this.branchService.updateBranchMetadata(branchId, branchesDocId, {\n workingDirectorySnapshots: {\n current: undefined\n }\n });\n }\n // Private helper methods\n async storeSnapshot(branchId, branchesDocId, snapshot) {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n const existingSnapshots = branch?.metadata.workingDirectorySnapshots;\n await this.branchService.updateBranchMetadata(branchId, branchesDocId, {\n workingDirectorySnapshots: {\n current: snapshot,\n stashed: existingSnapshots?.stashed || []\n }\n });\n }\n async removeStashedSnapshot(branchId, branchesDocId, snapshotId) {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n if (!branch?.metadata.workingDirectorySnapshots?.stashed)\n return;\n const updatedStashed = branch.metadata.workingDirectorySnapshots.stashed.filter(s => s.snapshotId !== snapshotId);\n await this.branchService.updateBranchMetadata(branchId, branchesDocId, {\n workingDirectorySnapshots: {\n stashed: updatedStashed\n }\n });\n }\n async detectUncommittedChanges(fileId, lastCommittedHead) {\n try {\n const handle = await this.repo.find(fileId);\n if (!handle) {\n console.warn(`[WorkingDirectoryService] Document handle not found for ${fileId} during change detection`);\n return false;\n }\n const currentHeads = handle.heads();\n return currentHeads.length > 0 && currentHeads[0] !== lastCommittedHead;\n }\n catch (error) {\n const errorMessage = String(error?.message || error || '');\n if (errorMessage.includes('unavailable')) {\n console.warn(`[WorkingDirectoryService] Document ${fileId} is unavailable during change detection`);\n // Document is unavailable - assume no changes\n return false;\n }\n console.warn(`[WorkingDirectoryService] Failed to detect changes for ${fileId}:`, error);\n return false;\n }\n }\n async detectConflicts(currentDoc, restoredDoc) {\n // Simple conflict detection - could be enhanced based on document type\n try {\n const currentStr = JSON.stringify(currentDoc);\n const restoredStr = JSON.stringify(restoredDoc);\n return currentStr !== restoredStr;\n }\n catch (error) {\n console.warn('[WorkingDirectoryService] Failed to compare documents for conflicts:', error);\n return true; // Assume conflict if comparison fails\n }\n }\n}\n", "export class SpecBranchValidator {\n constructor(repo, branchService) {\n this.repo = repo;\n this.branchService = branchService;\n }\n async validateWorkspaceSpecBranchState(workspaceId, branchesDocId) {\n const result = {\n isValid: true,\n errors: [],\n warnings: [],\n recoveryActions: []\n };\n try {\n const specBranches = await this.branchService.getSpecBranches(branchesDocId);\n const activeBranch = await this.branchService.getActiveSpecBranch(branchesDocId);\n if (activeBranch) {\n const activeValidation = await this.validateSpecBranchIntegrity(activeBranch, branchesDocId);\n if (!activeValidation.isValid) {\n result.isValid = false;\n result.errors.push(`Active spec branch ${activeBranch.id} has integrity issues`);\n result.errors.push(...activeValidation.errors);\n result.recoveryActions.push({\n action: 'reset_active_branch',\n branchId: activeBranch.id,\n reason: 'Active branch references non-existent or invalid spec file'\n });\n }\n }\n for (const branch of specBranches) {\n const branchValidation = await this.validateSpecBranchIntegrity(branch, branchesDocId);\n if (!branchValidation.isValid) {\n result.warnings.push(`Spec branch ${branch.id} has issues: ${branchValidation.errors.join(', ')}`);\n if (branchValidation.errors.some(e => e.includes('spec file not found'))) {\n result.recoveryActions.push({\n action: 'cleanup_orphaned_branch',\n branchId: branch.id,\n reason: 'Spec file no longer exists in branch file heads'\n });\n }\n }\n }\n return result;\n }\n catch (error) {\n result.isValid = false;\n result.errors.push(`Validation failed: ${error instanceof Error ? error.message : String(error)}`);\n return result;\n }\n }\n async validateSpecBranchIntegrity(branch, branchesDocId) {\n const result = {\n isValid: true,\n errors: [],\n warnings: [],\n recoveryActions: []\n };\n const specData = branch.metadata.specificationData;\n if (!specData) {\n result.isValid = false;\n result.errors.push('Branch missing specification metadata');\n return result;\n }\n // Check if spec file exists in branch file heads\n const specFileExists = specData.specDocId in branch.fileHeads;\n if (!specFileExists) {\n result.isValid = false;\n result.errors.push(`Spec file ${specData.specDocId} not found in branch file heads`);\n }\n // Check if spec document is accessible\n try {\n const handle = await this.repo.find(specData.specDocId);\n if (!handle) {\n result.isValid = false;\n result.errors.push(`Spec document ${specData.specDocId} not accessible in repository`);\n }\n }\n catch (error) {\n result.isValid = false;\n result.errors.push(`Failed to access spec document: ${error instanceof Error ? error.message : String(error)}`);\n }\n // Check for working directory consistency\n if (branch.metadata.workingDirectorySnapshots?.current) {\n const snapshotValidation = await this.validateWorkingDirectorySnapshot(branch.metadata.workingDirectorySnapshots.current, branch);\n result.warnings.push(...snapshotValidation.warnings);\n if (!snapshotValidation.isValid) {\n result.warnings.push('Working directory snapshot may be stale or corrupted');\n }\n }\n return result;\n }\n async validateSpecVisibilityConsistency(availableSpecs, activeBranchId, branchesDocId) {\n const result = {\n isValid: true,\n errors: [],\n warnings: [],\n recoveryActions: []\n };\n if (!activeBranchId) {\n // No active branch - specs should come from main branch or global file system\n return result;\n }\n const activeBranch = await this.branchService.getBranch(activeBranchId, branchesDocId);\n if (!activeBranch) {\n result.isValid = false;\n result.errors.push(`Active branch ${activeBranchId} not found`);\n result.recoveryActions.push({\n action: 'clear_invalid_state',\n branchId: activeBranchId,\n reason: 'Active branch no longer exists'\n });\n return result;\n }\n // Check that visible specs exist in current branch file heads\n for (const spec of availableSpecs) {\n const existsInBranch = spec.specDocId in activeBranch.fileHeads;\n if (!existsInBranch) {\n result.warnings.push(`Spec ${spec.title} (${spec.path}) visible but not in active branch file heads`);\n }\n }\n return result;\n }\n async recoverFromFailedOperations(branchId, branchesDocId) {\n try {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n if (!branch)\n return false;\n // Check for corrupted working directory snapshots\n const workingDir = branch.metadata.workingDirectorySnapshots;\n if (workingDir?.current) {\n const isValid = await this.validateWorkingDirectorySnapshot(workingDir.current, branch);\n if (!isValid.isValid) {\n // Clear corrupted snapshot\n await this.branchService.clearWorkingDirectorySnapshot(branchId, branchesDocId);\n console.log(`[SpecBranchValidator] Cleared corrupted working directory snapshot for branch ${branchId}`);\n }\n }\n // Check for broken stash references\n if (workingDir?.stashed?.length) {\n const validStashes = [];\n for (const stash of workingDir.stashed) {\n const isValid = await this.validateWorkingDirectorySnapshot(stash, branch);\n if (isValid.isValid) {\n validStashes.push(stash);\n }\n }\n if (validStashes.length !== workingDir.stashed.length) {\n await this.branchService.updateBranchMetadata(branchId, branchesDocId, {\n workingDirectorySnapshots: {\n current: workingDir.current,\n stashed: validStashes\n }\n });\n console.log(`[SpecBranchValidator] Cleaned ${workingDir.stashed.length - validStashes.length} corrupted stashes from branch ${branchId}`);\n }\n }\n return true;\n }\n catch (error) {\n console.warn(`[SpecBranchValidator] Failed to recover branch ${branchId}:`, error);\n return false;\n }\n }\n async validateWorkingDirectorySnapshot(snapshot, branch) {\n const result = {\n isValid: true,\n errors: [],\n warnings: [],\n recoveryActions: []\n };\n if (!snapshot.snapshotId || !snapshot.capturedAt || !snapshot.fileStates) {\n result.isValid = false;\n result.errors.push('Invalid snapshot structure');\n return result;\n }\n // Check if snapshot file states are consistent with branch file heads\n for (const fileId of Object.keys(snapshot.fileStates)) {\n if (!(fileId in branch.fileHeads)) {\n result.warnings.push(`Snapshot contains file ${fileId} not present in branch file heads`);\n }\n }\n return result;\n }\n async ensureFileTrackingEnabled(branchId, branchesDocId) {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n if (!branch?.metadata.specificationData)\n return;\n // Ensure active tracking is enabled if this is an active spec branch\n const activeBranch = await this.branchService.getActiveSpecBranch(branchesDocId);\n if (activeBranch?.id === branchId && !branch.metadata.specificationData.activeTrackingEnabled) {\n await this.branchService.updateBranchMetadata(branchId, branchesDocId, {\n specificationData: {\n activeTrackingEnabled: true,\n lastSetActiveAt: new Date().toISOString()\n }\n });\n console.log(`[SpecBranchValidator] Re-enabled file tracking for active branch ${branchId}`);\n }\n }\n}\n", "import { BranchRepo } from \"../repos/branch-repo.js\";\nimport { WorkingDirectoryService } from \"./working-directory-service.js\";\nimport { SpecBranchValidator } from \"./spec-branch-validator.js\";\nexport class BranchService {\n constructor(repo) {\n this.repo = repo;\n this.branchRepo = new BranchRepo(repo);\n this.workingDirectoryService = new WorkingDirectoryService(repo, this);\n this.specBranchValidator = new SpecBranchValidator(repo, this);\n }\n // Branch management\n async createBranch(parentBranchId, name, workspaceId, type, author, branchesDocId, fileHeads, // Optional: pass in fileHeads to initialize\n extras) {\n let parentBranch = null;\n if (parentBranchId) {\n parentBranch = await this.branchRepo.findById(parentBranchId, branchesDocId);\n if (!parentBranch) {\n throw new Error(`Parent branch ${parentBranchId} not found`);\n }\n }\n let initialFileHeads;\n if (fileHeads) {\n initialFileHeads = { ...fileHeads };\n }\n else if (parentBranch) {\n initialFileHeads = { ...parentBranch.fileHeads };\n // Ensure workspace doc head is not ''\n if (initialFileHeads[workspaceId] === '') {\n const latestHead = await this.branchRepo.getWorkspaceHead(workspaceId);\n if (latestHead) {\n initialFileHeads[workspaceId] = latestHead;\n }\n else {\n delete initialFileHeads[workspaceId]; // Remove invalid entry\n }\n }\n }\n else {\n // No parent, no explicit fileHeads\n // Prefer initializing with the current workspace head if available.\n // Otherwise, start with an empty map (no invalid placeholder values).\n const latestHead = await this.branchRepo.getWorkspaceHead(workspaceId);\n initialFileHeads = latestHead ? { [workspaceId]: latestHead } : {};\n }\n const createdAt = new Date().toISOString();\n const specDocId = extras?.specificationMetadata?.specDocId ?? extras?.specDocId;\n const description = extras?.description ?? (parentBranch ? `Branch created from ${parentBranch.name}` : `${type} branch`);\n const specificationData = this.buildSpecificationData(extras?.specificationMetadata, {\n specDocId,\n branchName: name,\n branchDescription: description,\n workspaceId,\n initialFileHeads,\n createdAt,\n });\n const branchId = `branch-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const metadata = {\n type,\n author,\n description\n };\n if (specificationData) {\n metadata.specificationData = specificationData;\n }\n const branch = {\n id: branchId,\n name,\n parentBranchId: parentBranch?.id || null,\n fileHeads: initialFileHeads,\n commits: [],\n createdAt,\n updatedAt: createdAt,\n status: 'active',\n metadata,\n // Defaults at creation; callers/services will set these as they become available\n tasksDocId: '',\n threadId: '',\n changeLogDocId: '',\n };\n if (specDocId) {\n branch.specDocId = specDocId;\n }\n return await this.branchRepo.create(branch, branchesDocId);\n }\n async createSpecificationBranch(options) {\n const branchName = options.branchName ?? this.generateSpecBranchName(options.title, options.timestamp);\n const specMetadata = {\n specDocId: options.specDocId,\n specFilePath: options.specFilePath,\n title: options.title,\n branchName,\n branchDescription: options.description ?? undefined,\n createdAt: options.timestamp ?? new Date().toISOString(),\n updatedAt: options.timestamp ?? new Date().toISOString(),\n workspaceId: options.workspaceId,\n lifecycleStatus: 'active',\n activeTrackingEnabled: options.enableTracking ?? true\n };\n if (options.abstract) {\n specMetadata.abstract = options.abstract;\n }\n if (!specMetadata.branchDescription) {\n delete specMetadata.branchDescription;\n }\n const branch = await this.createBranch(options.parentBranchId, branchName, options.workspaceId, 'thread', options.author, options.branchesDocId, undefined, {\n description: options.description ?? options.abstract,\n specDocId: options.specDocId,\n specificationMetadata: specMetadata\n });\n if (options.enableTracking !== false) {\n await this.setActiveSpecBranch(branch.id, options.workspaceId, options.branchesDocId);\n }\n return branch;\n }\n async getBranch(branchId, branchesDocId) {\n return await this.branchRepo.findById(branchId, branchesDocId);\n }\n async setTasksDocId(branchId, tasksDocId, branchesDocId) {\n await this.branchRepo.setTasksDocId(branchId, tasksDocId, branchesDocId);\n }\n async setChangeLogDocId(branchId, changeLogDocId, branchesDocId) {\n await this.branchRepo.setChangeLogDocId(branchId, changeLogDocId, branchesDocId);\n }\n async getActiveBranch(workspaceId, branchesDocId) {\n const branches = await this.branchRepo.findAll(branchesDocId);\n const activeSpecBranch = branches.find(branch => branch.metadata?.specificationData?.activeTrackingEnabled);\n if (activeSpecBranch) {\n return activeSpecBranch;\n }\n const mainBranches = branches.filter(branch => branch.metadata?.type === 'main');\n return mainBranches[0] || branches[0] || null;\n }\n async getBranchesForWorkspace(branchesDocId) {\n return await this.branchRepo.findAll(branchesDocId);\n }\n async getSpecBranches(branchesDocId) {\n const branches = await this.branchRepo.findAll(branchesDocId);\n return branches.filter(branch => Boolean(branch.specDocId || branch.metadata?.specificationData));\n }\n async getActiveSpecBranch(branchesDocId) {\n const branches = await this.getSpecBranches(branchesDocId);\n return branches.find(branch => branch.metadata?.specificationData?.activeTrackingEnabled) || null;\n }\n async setActiveSpecBranch(branchId, workspaceId, branchesDocId) {\n const specBranches = await this.getSpecBranches(branchesDocId);\n if (specBranches.length === 0) {\n return;\n }\n const timestamp = new Date().toISOString();\n await Promise.all(specBranches.map(async (branch) => {\n const specificationData = branch.metadata.specificationData;\n if (!specificationData) {\n return;\n }\n const shouldBeActive = Boolean(branchId && branch.id === branchId);\n const isActive = specificationData.activeTrackingEnabled;\n if (shouldBeActive === isActive) {\n if (shouldBeActive) {\n await this.updateBranchMetadata(branch.id, branchesDocId, {\n specificationData: {\n lastSetActiveAt: timestamp,\n workspaceId\n }\n });\n }\n return;\n }\n await this.updateBranchMetadata(branch.id, branchesDocId, {\n specificationData: {\n activeTrackingEnabled: shouldBeActive,\n lifecycleStatus: shouldBeActive ? 'active' : specificationData.lifecycleStatus,\n lastSetActiveAt: shouldBeActive ? timestamp : specificationData.lastSetActiveAt,\n workspaceId\n }\n });\n }));\n }\n async updateSpecBranchLifecycle(branchId, branchesDocId, status, opts) {\n const timestamp = new Date().toISOString();\n const updates = {\n lifecycleStatus: status,\n updatedAt: timestamp\n };\n if (opts?.deactivateTracking) {\n updates.activeTrackingEnabled = false;\n }\n await this.updateBranchMetadata(branchId, branchesDocId, {\n specificationData: updates\n });\n }\n async updateSpecBranchChangeSummary(branchId, branchesDocId, summary, coverage) {\n await this.updateBranchMetadata(branchId, branchesDocId, {\n specificationData: {\n changeSummary: {\n ...summary,\n lastComputedAt: summary.lastComputedAt ?? new Date().toISOString()\n },\n coverage: coverage ?? undefined,\n updatedAt: new Date().toISOString()\n }\n });\n }\n async updateSpecBranchCoverage(branchId, branchesDocId, coverage) {\n await this.updateBranchMetadata(branchId, branchesDocId, {\n specificationData: {\n coverage: {\n ...coverage,\n stats: {\n ...coverage.stats,\n lastEvaluatedAt: coverage.stats?.lastEvaluatedAt ?? new Date().toISOString()\n }\n },\n updatedAt: new Date().toISOString()\n }\n });\n }\n async resetSpecBranchBaseline(branchId, branchesDocId, baseline) {\n await this.updateBranchMetadata(branchId, branchesDocId, {\n specificationData: {\n baseline,\n updatedAt: new Date().toISOString()\n }\n });\n }\n /**\n * Captures current working directory state using Mod-native CRDT storage\n * Replaces brittle Git stash operations with reliable BranchableRepo serialization\n */\n async captureWorkingDirectorySnapshot(branchId, branchesDocId, message) {\n return await this.workingDirectoryService.captureWorkingDirectorySnapshot(branchId, branchesDocId, message);\n }\n /**\n * Restores working directory state from Mod-native snapshot\n * Applies saved edits via BranchableRepo.change() with conflict resolution\n */\n async restoreWorkingDirectorySnapshot(branchId, branchesDocId, snapshotId) {\n await this.workingDirectoryService.restoreWorkingDirectorySnapshot(branchId, branchesDocId, snapshotId);\n }\n /**\n * Stashes current state for later restoration (advanced workflow support)\n */\n async stashWorkingDirectory(branchId, branchesDocId, message) {\n return await this.workingDirectoryService.stashCurrentState(branchId, branchesDocId, message);\n }\n /**\n * Lists all stashed working directory snapshots for a branch\n */\n async listWorkingDirectoryStashes(branchId, branchesDocId) {\n return await this.workingDirectoryService.listStashedSnapshots(branchId, branchesDocId);\n }\n /**\n * Clears current working directory snapshot\n */\n async clearWorkingDirectorySnapshot(branchId, branchesDocId) {\n await this.workingDirectoryService.clearCurrentSnapshot(branchId, branchesDocId);\n }\n /**\n * Validates workspace spec branch state on startup and provides recovery actions\n * Prevents issues with wrong active specs and hidden edits\n */\n async validateWorkspaceSpecBranchState(workspaceId, branchesDocId) {\n return await this.specBranchValidator.validateWorkspaceSpecBranchState(workspaceId, branchesDocId);\n }\n /**\n * Validates spec visibility consistency between TracesProvider and SpecBranchManager\n */\n async validateSpecVisibilityConsistency(availableSpecs, activeBranchId, branchesDocId) {\n return await this.specBranchValidator.validateSpecVisibilityConsistency(availableSpecs, activeBranchId, branchesDocId);\n }\n /**\n * Recovers from failed working directory operations and corrupted state\n */\n async recoverFromFailedOperations(branchId, branchesDocId) {\n return await this.specBranchValidator.recoverFromFailedOperations(branchId, branchesDocId);\n }\n /**\n * Ensures file tracking is properly enabled for active spec branches\n */\n async ensureFileTrackingEnabled(branchId, branchesDocId) {\n await this.specBranchValidator.ensureFileTrackingEnabled(branchId, branchesDocId);\n }\n /**\n * Resolve the head for a file on a branch by walking up the parent chain\n * until a head is found. Returns { head, sourceBranchId } where head may be\n * undefined if no ancestor has a head for this file.\n */\n async resolveBranchHead(fileId, branchId, branchesDocId) {\n let currentId = branchId;\n const visited = new Set();\n while (currentId) {\n if (visited.has(currentId))\n break;\n visited.add(currentId);\n const b = await this.branchRepo.findById(currentId, branchesDocId);\n if (!b)\n break;\n const h = b.fileHeads?.[fileId];\n if (h) {\n return { head: h, sourceBranchId: currentId };\n }\n currentId = b.parentBranchId || null;\n }\n return { head: undefined, sourceBranchId: undefined };\n }\n /**\n * Resolve the workspace document head for a branch (using ancestor fallback).\n */\n async resolveWorkspaceHead(workspaceId, branchId, branchesDocId) {\n return this.resolveBranchHead(workspaceId, branchId, branchesDocId);\n }\n async getBranchTree(branchesDocId) {\n return await this.branchRepo.getBranchTree(branchesDocId);\n }\n async deleteBranch(branchId, branchesDocId) {\n await this.branchRepo.delete(branchId, branchesDocId);\n }\n // Proposal branch management\n async createProposalBranch(parentBranchId, author, branchesDocId, description) {\n const parentBranch = await this.branchRepo.findById(parentBranchId, branchesDocId);\n if (!parentBranch) {\n throw new Error(`Parent branch ${parentBranchId} not found`);\n }\n const proposalBranchId = `proposal-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const proposalBranch = {\n id: proposalBranchId,\n name: `proposal-${proposalBranchId}`,\n parentBranchId,\n fileHeads: { ...parentBranch.fileHeads }, // Start with parent file heads\n commits: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n metadata: {\n type: 'proposal',\n author,\n description: description || `Proposal from ${parentBranch.name}`,\n proposalDiffStatus: {} // Will be populated as files are changed\n },\n tasksDocId: '',\n threadId: '',\n };\n return await this.branchRepo.create(proposalBranch, branchesDocId);\n }\n async updateProposalDiffStatus(proposalBranchId, fileId, status, user, branchesDocId) {\n const branch = await this.branchRepo.findById(proposalBranchId, branchesDocId);\n if (!branch || branch.metadata.type !== 'proposal') {\n throw new Error('Proposal branch not found');\n }\n const updatedBranch = {\n ...branch,\n metadata: {\n ...branch.metadata,\n proposalDiffStatus: {\n ...branch.metadata.proposalDiffStatus,\n [fileId]: status\n }\n },\n updatedAt: new Date().toISOString()\n };\n await this.branchRepo.update(updatedBranch, branchesDocId);\n }\n async finalizeProposalBranch(proposalBranchId, user, branchesDocId) {\n const proposalBranch = await this.branchRepo.findById(proposalBranchId, branchesDocId);\n if (!proposalBranch || proposalBranch.metadata.type !== 'proposal' || !proposalBranch.parentBranchId) {\n throw new Error('Invalid proposal branch');\n }\n const parentBranch = await this.branchRepo.findById(proposalBranch.parentBranchId, branchesDocId);\n if (!parentBranch) {\n throw new Error('Parent branch not found');\n }\n const diffStatus = proposalBranch.metadata.proposalDiffStatus || {};\n const approvedFiles = Object.entries(diffStatus)\n .filter(([_, status]) => status === 'approved')\n .map(([fileId, _]) => fileId);\n if (approvedFiles.length === 0) {\n // No approved changes, just mark proposal as deleted\n await this.deleteBranch(proposalBranchId, branchesDocId);\n return null;\n }\n // Merge approved changes to parent branch\n const mergedFileHeads = { ...parentBranch.fileHeads };\n approvedFiles.forEach(fileId => {\n mergedFileHeads[fileId] = proposalBranch.fileHeads[fileId];\n });\n // Create commit for the merge\n const commit = await this.createCommit(parentBranch.id, user, `Merged proposal ${proposalBranchId}`, branchesDocId, proposalBranchId);\n // Update parent branch with merged changes and new commit\n const updatedParentBranch = {\n ...parentBranch,\n fileHeads: mergedFileHeads,\n commits: [...parentBranch.commits, commit],\n updatedAt: new Date().toISOString()\n };\n await this.branchRepo.update(updatedParentBranch, branchesDocId);\n // Mark proposal branch as merged\n const mergedProposalBranch = {\n ...proposalBranch,\n status: 'merged',\n updatedAt: new Date().toISOString()\n };\n await this.branchRepo.update(mergedProposalBranch, branchesDocId);\n return commit;\n }\n // File head tracking\n async getFileHead(branchId, fileId, branchesDocId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n return branch?.fileHeads[fileId];\n }\n async getFileHeads(branchId, branchesDocId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n return branch?.fileHeads || {};\n }\n // File head tracking - only stores fileHeads for files that are actually modified\n async updateFileHead(branchId, fileId, newHead, branchesDocId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n if (!branch) {\n throw new Error(`Branch ${branchId} not found`);\n }\n const updatedBranch = {\n ...branch,\n fileHeads: {\n ...branch.fileHeads,\n [fileId]: newHead\n },\n updatedAt: new Date().toISOString()\n };\n // If this is a proposal branch, update diff status for this file\n if (branch.metadata.type === 'proposal' && branch.parentBranchId) {\n const parentBranch = await this.branchRepo.findById(branch.parentBranchId, branchesDocId);\n if (parentBranch && parentBranch.fileHeads[fileId] !== newHead) {\n updatedBranch.metadata = {\n ...updatedBranch.metadata,\n proposalDiffStatus: {\n ...updatedBranch.metadata.proposalDiffStatus,\n [fileId]: 'pending'\n }\n };\n }\n }\n await this.branchRepo.update(updatedBranch, branchesDocId);\n }\n // Remove a file head from a branch (e.g., when a file is removed from the workspace on this branch)\n async removeFileHead(branchId, fileId, branchesDocId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n if (!branch) {\n throw new Error(`Branch ${branchId} not found`);\n }\n if (!(fileId in branch.fileHeads)) {\n return; // nothing to remove\n }\n const { [fileId]: _removed, ...rest } = branch.fileHeads;\n const updatedBranch = {\n ...branch,\n fileHeads: rest,\n updatedAt: new Date().toISOString()\n };\n await this.branchRepo.update(updatedBranch, branchesDocId);\n }\n // Active task persistence on branch\n async setActiveTaskId(branchId, taskId, branchesDocId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n if (!branch)\n throw new Error(`Branch ${branchId} not found`);\n const updated = {\n ...branch,\n activeTaskId: taskId || undefined,\n updatedAt: new Date().toISOString(),\n };\n await this.branchRepo.update(updated, branchesDocId);\n }\n async getActiveTaskId(branchId, branchesDocId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n return branch?.activeTaskId;\n }\n // Commit management\n async createCommit(branchId, author, message, branchesDocId, mergeSourceBranchId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n if (!branch) {\n throw new Error(`Branch ${branchId} not found`);\n }\n const commitId = `commit-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const lastCommit = branch.commits[branch.commits.length - 1];\n const commit = {\n id: commitId,\n branchId,\n parentCommitId: lastCommit?.id || null,\n author,\n message,\n timestamp: new Date().toISOString(),\n fileHeads: { ...branch.fileHeads }, // Snapshot current state\n mergeSourceBranchId: mergeSourceBranchId || null,\n conflicts: []\n };\n return commit;\n }\n async getCommits(branchId, branchesDocId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n return branch?.commits || [];\n }\n async getCommit(branchId, commitId, branchesDocId) {\n const commits = await this.getCommits(branchId, branchesDocId);\n return commits.find(commit => commit.id === commitId) || null;\n }\n // Branch operations\n async switchBranch(workspaceId, branchId, branchesDocId) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n if (!branch) {\n throw new Error('Branch not found');\n }\n // This would update the workspace's activeBranchId\n // For now, we just validate the branch exists\n console.log(`Switching to branch ${branchId} in workspace ${workspaceId}`);\n }\n async mergeBranch(sourceBranchId, targetBranchId, author, message, branchesDocId) {\n const sourceBranch = await this.branchRepo.findById(sourceBranchId, branchesDocId);\n const targetBranch = await this.branchRepo.findById(targetBranchId, branchesDocId);\n if (!sourceBranch || !targetBranch) {\n throw new Error('Source or target branch not found');\n }\n // Detect conflicts\n const conflicts = this.detectConflicts(sourceBranch, targetBranch);\n if (conflicts.length > 0) {\n throw new Error(`Merge conflicts detected: ${conflicts.map(c => c.description).join(', ')}`);\n }\n // Merge file heads\n const mergedFileHeads = { ...targetBranch.fileHeads };\n Object.entries(sourceBranch.fileHeads).forEach(([fileId, head]) => {\n mergedFileHeads[fileId] = head;\n });\n // Create merge commit\n const commit = await this.createCommit(targetBranchId, author, message, branchesDocId, sourceBranchId);\n // Update target branch\n const updatedTargetBranch = {\n ...targetBranch,\n fileHeads: mergedFileHeads,\n commits: [...targetBranch.commits, commit],\n updatedAt: new Date().toISOString()\n };\n await this.branchRepo.update(updatedTargetBranch, branchesDocId);\n // Mark source branch as merged\n const mergedSourceBranch = {\n ...sourceBranch,\n status: 'merged',\n updatedAt: new Date().toISOString()\n };\n await this.branchRepo.update(mergedSourceBranch, branchesDocId);\n return commit;\n }\n async setThreadId(branchId, threadId, branchesDocId) {\n await this.branchRepo.setThreadId(branchId, threadId, branchesDocId);\n }\n /**\n * Update branch metadata fields (partial update)\n */\n async updateBranchMetadata(branchId, branchesDocId, metadataUpdates) {\n const branch = await this.branchRepo.findById(branchId, branchesDocId);\n if (!branch) {\n throw new Error(`Branch ${branchId} not found`);\n }\n const specificationDataUpdates = metadataUpdates.specificationData;\n const restMetadata = { ...metadataUpdates };\n delete restMetadata.specificationData;\n const updatedBranch = {\n ...branch,\n metadata: {\n ...branch.metadata,\n ...restMetadata,\n specificationData: specificationDataUpdates\n ? this.mergeSpecificationData(branch.metadata.specificationData, specificationDataUpdates)\n : branch.metadata.specificationData,\n },\n updatedAt: new Date().toISOString(),\n };\n await this.branchRepo.update(updatedBranch, branchesDocId);\n }\n async getBranchDiff(branchIdA, branchIdB, branchesDocId) {\n const branchA = await this.branchRepo.findById(branchIdA, branchesDocId);\n const branchB = await this.branchRepo.findById(branchIdB, branchesDocId);\n if (!branchA || !branchB) {\n throw new Error('One or both branches not found');\n }\n const fileChanges = {};\n const allFileIds = new Set([\n ...Object.keys(branchA.fileHeads),\n ...Object.keys(branchB.fileHeads)\n ]);\n let filesAdded = 0;\n let filesModified = 0;\n let filesDeleted = 0;\n allFileIds.forEach(fileId => {\n const headA = branchA.fileHeads[fileId];\n const headB = branchB.fileHeads[fileId];\n if (!headA && headB) {\n fileChanges[fileId] = { status: 'added', headB };\n filesAdded++;\n }\n else if (headA && !headB) {\n fileChanges[fileId] = { status: 'deleted', headA };\n filesDeleted++;\n }\n else if (headA !== headB) {\n fileChanges[fileId] = { status: 'modified', headA, headB };\n filesModified++;\n }\n });\n return {\n fileChanges,\n summary: {\n filesAdded,\n filesModified,\n filesDeleted\n }\n };\n }\n // Helper method to create BranchesDoc for new workspaces\n async createBranchesDoc() {\n const branchDoc = await this.branchRepo.createBranchesDoc();\n // Ensure the document is properly initialized\n await new Promise(resolve => setTimeout(resolve, 10)); // Small delay to ensure initialization\n const docId = branchDoc.documentId;\n if (!docId) {\n throw new Error(\"Failed to create branches document: documentId is undefined\");\n }\n return {\n docId: docId,\n doc: branchDoc\n };\n }\n buildSpecificationData(input, context) {\n if (!input) {\n return undefined;\n }\n const specDocId = input.specDocId ?? context.specDocId;\n if (!specDocId) {\n console.warn('[BranchService] Unable to build specification metadata without specDocId');\n return undefined;\n }\n const createdAt = input.createdAt ?? context.createdAt;\n const data = {\n specDocId,\n specFilePath: input.specFilePath,\n title: input.title,\n branchName: input.branchName ?? context.branchName,\n branchDescription: input.branchDescription ?? context.branchDescription ?? undefined,\n createdAt,\n updatedAt: input.updatedAt ?? createdAt,\n workspaceId: input.workspaceId ?? context.workspaceId,\n lifecycleStatus: input.lifecycleStatus ?? 'active',\n activeTrackingEnabled: input.activeTrackingEnabled ?? true,\n baseline: input.baseline ?? this.buildBaselineSnapshot(createdAt, context.workspaceId, context.initialFileHeads),\n changeSummary: input.changeSummary,\n coverage: input.coverage,\n git: input.git,\n lastSetActiveAt: input.activeTrackingEnabled === false ? undefined : createdAt\n };\n if (!data.branchDescription) {\n delete data.branchDescription;\n }\n if (!data.changeSummary) {\n delete data.changeSummary;\n }\n if (!data.coverage) {\n delete data.coverage;\n }\n if (!data.git) {\n delete data.git;\n }\n if (input.abstract) {\n data.abstract = input.abstract;\n }\n return data;\n }\n buildBaselineSnapshot(capturedAt, workspaceId, fileHeads) {\n return {\n capturedAt,\n workspaceHead: fileHeads[workspaceId],\n fileHeads: { ...fileHeads },\n trackedFiles: Object.keys(fileHeads)\n };\n }\n mergeSpecificationData(existing, updates) {\n if (!existing) {\n if (!updates.specDocId) {\n throw new Error('[BranchService] specificationData requires specDocId when initializing metadata');\n }\n const now = new Date().toISOString();\n const created = {\n specDocId: updates.specDocId,\n specFilePath: updates.specFilePath ?? '',\n title: updates.title ?? 'Specification Branch',\n branchName: updates.branchName ?? 'spec-branch',\n createdAt: updates.createdAt ?? now,\n updatedAt: updates.updatedAt ?? now,\n workspaceId: updates.workspaceId,\n lifecycleStatus: updates.lifecycleStatus ?? 'active',\n activeTrackingEnabled: updates.activeTrackingEnabled ?? true,\n baseline: updates.baseline,\n changeSummary: updates.changeSummary,\n coverage: updates.coverage,\n git: updates.git,\n lastSetActiveAt: updates.lastSetActiveAt ?? (updates.activeTrackingEnabled === false ? undefined : now)\n };\n if (updates.abstract) {\n created.abstract = updates.abstract;\n }\n if (updates.branchDescription) {\n created.branchDescription = updates.branchDescription;\n }\n if (!created.changeSummary) {\n delete created.changeSummary;\n }\n return created;\n }\n const merged = {\n ...existing,\n ...updates,\n baseline: updates.baseline\n ? { ...existing.baseline, ...updates.baseline }\n : existing.baseline,\n changeSummary: updates.changeSummary\n ? { ...existing.changeSummary, ...updates.changeSummary }\n : existing.changeSummary,\n coverage: updates.coverage\n ? { ...existing.coverage, ...updates.coverage }\n : existing.coverage,\n git: updates.git\n ? { ...existing.git, ...updates.git }\n : existing.git,\n updatedAt: updates.updatedAt ?? new Date().toISOString(),\n lastSetActiveAt: updates.lastSetActiveAt ?? existing.lastSetActiveAt,\n activeTrackingEnabled: updates.activeTrackingEnabled ?? existing.activeTrackingEnabled,\n lifecycleStatus: updates.lifecycleStatus ?? existing.lifecycleStatus,\n workspaceId: updates.workspaceId ?? existing.workspaceId\n };\n if (!merged.abstract) {\n delete merged.abstract;\n }\n if (!merged.branchDescription) {\n delete merged.branchDescription;\n }\n if (!merged.changeSummary) {\n delete merged.changeSummary;\n }\n return merged;\n }\n generateSpecBranchName(title, timestamp) {\n const slug = this.slugifyBranchName(title);\n const safeTimestamp = timestamp\n ? timestamp.replace(/[:\\sT]/g, '-').split('.')[0]\n : new Date().toISOString().split('T')[0];\n return `spec-${slug}-${safeTimestamp}`;\n }\n slugifyBranchName(input) {\n const slug = input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48);\n return slug || 'branch';\n }\n detectConflicts(sourceBranch, targetBranch) {\n const conflicts = [];\n // Check for file head conflicts\n Object.entries(sourceBranch.fileHeads).forEach(([fileId, sourceHead]) => {\n const targetHead = targetBranch.fileHeads[fileId];\n if (targetHead && targetHead !== sourceHead) {\n // Both branches have different changes to the same document\n conflicts.push({\n documentId: fileId,\n type: 'content',\n description: `Both branches modified document ${fileId}`\n });\n }\n });\n return conflicts;\n }\n /**\n * Calculate differences between two workspace branches\n */\n async calculateWorkspaceDiff(workspaceId, sourceBranchId, targetBranchId, branchFileHeads, sourceBranchName, targetBranchName) {\n try {\n // Get the repo instance from branchService\n const repo = this.repo;\n if (!repo) {\n throw new Error('Repository not available');\n }\n // Find the workspace document handle\n const workspaceHandle = await repo.find(workspaceId);\n if (!workspaceHandle) {\n throw new Error('Workspace document not found');\n }\n // Get the workspace document at the current branch head (source branch)\n const currentWorkspaceHead = branchFileHeads[workspaceId];\n if (!currentWorkspaceHead) {\n throw new Error(`Workspace head not found for workspaceId: ${workspaceId}`);\n }\n // Get the current workspace document (source branch)\n const handleWithOptions = workspaceHandle;\n const sourceWorkspace = await handleWithOptions.doc({ heads: [currentWorkspaceHead] });\n // Now we need to get the target branch's workspace head\n // First, let's find the branches document and get the target branch's fileHeads\n const currentWorkspace = await workspaceHandle.doc();\n const branchesDocId = currentWorkspace.branchesDocId;\n if (!branchesDocId) {\n throw new Error('Workspace does not have branches document ID');\n }\n // Get the target branch to find its workspace head\n const targetBranch = await this.getBranch(targetBranchId, branchesDocId);\n if (!targetBranch) {\n throw new Error(`Target branch ${targetBranchId} not found`);\n }\n const targetWorkspaceHead = targetBranch.fileHeads[workspaceId];\n if (!targetWorkspaceHead) {\n // If target branch doesn't have a specific head for this workspace,\n // it means the workspace hasn't been modified in that branch\n // We'll use the current head as baseline\n }\n // Get the workspace document at the target branch head\n let targetWorkspace;\n if (targetWorkspaceHead && targetWorkspaceHead !== currentWorkspaceHead) {\n targetWorkspace = await handleWithOptions.doc({ heads: [targetWorkspaceHead] });\n }\n else {\n // Use the same workspace if no differences in heads\n targetWorkspace = sourceWorkspace;\n }\n // Compare the fileRefs between source and target workspaces\n const diffData = {\n diffFileIds: [],\n diffFileChanges: {},\n sourceBranchName: sourceBranchName || 'Source Branch',\n targetBranchName: targetBranchName || 'Target Branch',\n sourceBranchFileHeads: {},\n targetBranchFileHeads: {}\n };\n // Create maps for efficient lookup\n const sourceFileMap = new Map((sourceWorkspace?.fileRefs || []).map(file => [file.id, file]));\n const targetFileMap = new Map((targetWorkspace?.fileRefs || []).map(file => [file.id, file]));\n // Find all unique file IDs from both workspaces\n const allFileIds = new Set([\n ...sourceFileMap.keys(),\n ...targetFileMap.keys()\n ]);\n const resolveHeadForBranch = async (fileId, branchId, directHead) => {\n if (directHead && directHead !== '')\n return directHead;\n if (!branchId || !branchesDocId)\n return undefined;\n try {\n const resolved = await this.resolveBranchHead(fileId, branchId, branchesDocId);\n return resolved.head || undefined;\n }\n catch {\n return undefined;\n }\n };\n // Compare each file\n for (const fileId of allFileIds) {\n const typedFileId = fileId;\n const sourceFile = sourceFileMap.get(typedFileId);\n const targetFile = targetFileMap.get(typedFileId);\n const directSourceHead = branchFileHeads[typedFileId];\n const directTargetHead = targetBranch.fileHeads?.[typedFileId];\n if (sourceFile && !targetFile) {\n // File exists in source but not in target - it was added in source branch\n diffData.diffFileIds.push(typedFileId);\n diffData.diffFileChanges[typedFileId] = 'added';\n const sourceHead = await resolveHeadForBranch(typedFileId, sourceBranchId, directSourceHead);\n if (sourceHead) {\n diffData.sourceBranchFileHeads[typedFileId] = sourceHead;\n }\n }\n else if (!sourceFile && targetFile) {\n // File exists in target but not in source - it was removed in source branch\n diffData.diffFileIds.push(typedFileId);\n diffData.diffFileChanges[typedFileId] = 'removed';\n const targetHead = await resolveHeadForBranch(typedFileId, targetBranchId, directTargetHead);\n if (targetHead) {\n diffData.targetBranchFileHeads[typedFileId] = targetHead;\n }\n }\n else if (sourceFile && targetFile) {\n // File exists in both - check if it was modified\n // We can compare file properties or use the file heads from branch fileHeads\n const sourceHead = await resolveHeadForBranch(typedFileId, sourceBranchId, directSourceHead);\n const targetHead = await resolveHeadForBranch(typedFileId, targetBranchId, directTargetHead); // Target branch file head\n // Also compare file metadata that might have changed\n const sourceFileStr = JSON.stringify({\n name: sourceFile.name,\n type: sourceFile.type,\n folderId: sourceFile.folderId,\n updatedAt: sourceFile.updatedAt\n });\n const targetFileStr = JSON.stringify({\n name: targetFile.name,\n type: targetFile.type,\n folderId: targetFile.folderId,\n updatedAt: targetFile.updatedAt\n });\n const headsDiffer = (sourceHead || '') !== (targetHead || '');\n const metadataDiffer = sourceFileStr !== targetFileStr;\n if (headsDiffer || metadataDiffer) {\n diffData.diffFileIds.push(typedFileId);\n diffData.diffFileChanges[typedFileId] = 'modified';\n if (sourceHead)\n diffData.sourceBranchFileHeads[typedFileId] = sourceHead;\n if (targetHead)\n diffData.targetBranchFileHeads[typedFileId] = targetHead;\n }\n }\n }\n return diffData;\n }\n catch (error) {\n console.error('[BranchService] Error calculating workspace diff:', error);\n throw error;\n }\n }\n}\n", "import { handleStream } from '../services/stream-handler.js';\nimport { ThreadRepository } from '../repos/thread-repo.js';\nimport { BranchService } from './branch-service.js';\nexport class ThreadService {\n constructor(repo) {\n this.repo = repo;\n this.branchService = new BranchService(repo);\n this.threadRepo = new ThreadRepository(repo);\n }\n /**\n * Fetch a thread by its ID\n */\n async getThread(threadId) {\n const threadRepo = new ThreadRepository(this.repo);\n return threadRepo.get(threadId);\n }\n /**\n * Process a streaming thread (e.g., from orchestrator/agent)\n * @param stream AsyncIterable of StreamChunk (content, tool, transfer, error, finish)\n * @param initialState Initial state for the stream handler\n * @returns Final state after processing the stream\n */\n async processThreadStream(stream, initialState) {\n return handleStream(stream, {\n onContent: async (chunk, state) => {\n // Append content to buffer\n state.buffer = (state.buffer || '') + chunk.content;\n },\n onTool: async (chunk, state) => {\n // Push tool result to toolResults\n state.toolResults = [...(state.toolResults || []), chunk.content];\n },\n onTransfer: async (chunk, state) => {\n // Push transfer info to transferHistory\n state.transferHistory = [...(state.transferHistory || []), { from: chunk.fromAgent, to: chunk.toAgent }];\n },\n onError: async (chunk, state) => {\n // Push error to errors\n state.errors = [...(state.errors || []), chunk.error];\n },\n onFinish: async (state) => {\n // No-op for now\n },\n initialState,\n });\n }\n /**\n * Orchestrate thread item creation, content accumulation, and finalization using the repo.\n * Ports the logic from mod-app's processStreamingResponse.\n */\n async processThreadStreamWithRepo(stream, threadId, agent, repo) {\n const threadRepo = new ThreadRepository(repo);\n let currentThreadItem = null;\n let currentContent = '';\n let lastContentLength = 0;\n for await (const chunk of stream) {\n try {\n const hasContent = chunk.content?.trim() || (chunk.documentIds && chunk.documentIds.length > 0) || chunk.ui;\n // Create new thread item on \"start\" delimiter if we have content\n if ((chunk.delim === 'start' && hasContent) || (!currentThreadItem && hasContent)) {\n // Finalize current thread item if it exists and has content\n if (currentThreadItem && currentContent.trim()) {\n await threadRepo.addChunkToThreadItem(currentThreadItem.id, currentContent.slice(lastContentLength));\n lastContentLength = currentContent.length;\n const thread = await threadRepo.get(threadId);\n if (!thread.itemIds.includes(currentThreadItem.id)) {\n await threadRepo.update(threadId, {\n itemIds: [...(thread.itemIds || []), currentThreadItem.id],\n });\n }\n }\n // Create new thread item\n currentThreadItem = await threadRepo.addThreadItem(threadId, '', chunk.documentIds || [], false, 'assistant-1', chunk.sender || agent.name, agent.iconUrl, {\n type: chunk.type,\n data: chunk.data,\n ui: chunk.ui,\n });\n currentContent = '';\n lastContentLength = 0;\n }\n // Update the thread item with chunk data\n if (currentThreadItem) {\n // For content chunks, accumulate the content\n if (chunk.content) {\n currentContent += chunk.content;\n // Only append the new chunk\n await threadRepo.addChunkToThreadItem(currentThreadItem.id, chunk.content);\n lastContentLength = currentContent.length;\n }\n // Always add documentIds from chunk to thread item if present\n if (chunk.documentIds && chunk.documentIds.length > 0) {\n await threadRepo.addDocumentIdsToThreadItem(currentThreadItem.id, chunk.documentIds);\n }\n // On \"end\" delimiter, finalize and add to thread\n if (chunk.delim === 'end') {\n if (currentContent.trim() || (chunk.documentIds && chunk.documentIds.length > 0) || chunk.ui) {\n // Finalize with any remaining content (should be no-op if already added)\n // Add to thread if not already present\n const thread = await threadRepo.get(threadId);\n if (!thread.itemIds.includes(currentThreadItem.id)) {\n await threadRepo.update(threadId, {\n itemIds: [...(thread.itemIds || []), currentThreadItem.id],\n });\n }\n }\n currentThreadItem = null;\n currentContent = '';\n lastContentLength = 0;\n }\n }\n }\n catch (error) {\n console.error('[ThreadService] Error processing chunk:', error);\n }\n }\n // Finalize any remaining thread item if it has content\n if (currentThreadItem && (currentContent.trim() || (currentThreadItem.documentIds && currentThreadItem.documentIds.length > 0) || currentThreadItem.ui)) {\n await threadRepo.addChunkToThreadItem(currentThreadItem.id, currentContent.slice(lastContentLength));\n const thread = await threadRepo.get(threadId);\n if (!thread.itemIds.includes(currentThreadItem.id)) {\n await threadRepo.update(threadId, {\n itemIds: [...(thread.itemIds || []), currentThreadItem.id],\n });\n }\n }\n }\n /**\n * Create a new thread with the given name\n */\n async createThread(name, branchId) {\n const threadRepo = new ThreadRepository(this.repo);\n return threadRepo.create({ name, branchId });\n }\n /**\n * Create a new thread with an associated branch\n */\n async createThreadWithBranch(workspaceId, branchesDocId, parentBranchId, name) {\n // 1. Create the branch first\n const threadBranch = await this.branchService.createBranch(parentBranchId, `thread-${Date.now()}`, workspaceId, 'thread', 'system', branchesDocId);\n // Defensive check: branchId must be valid\n if (!threadBranch || !threadBranch.id) {\n throw new Error(\"Failed to create branch for thread: missing branchId\");\n }\n // 2. Now create the thread with the branchId\n const threadId = await this.createThread(name || \"New Thread\", threadBranch.id);\n // 3. Persist the threadId on the branch to avoid reconciliation later\n try {\n await this.branchService.setThreadId(threadBranch.id, threadId, branchesDocId);\n }\n catch (e) {\n console.warn('[ThreadService] Failed to persist threadId on branch:', e);\n }\n return await this.threadRepo.get(threadId);\n }\n /**\n * Set the tasksDocId field on a thread\n */\n async setTasksDocId(threadId, tasksDocId) {\n const threadRepo = new ThreadRepository(this.repo);\n await threadRepo.update(threadId, { tasksDocId });\n }\n /**\n * Add a user message as a thread item to a thread (for agent orchestrator)\n * Now supports agentContext for LLM input context capture.\n */\n async addThreadItemToThread(threadId, content, userId, userName, userAvatar, agentContext, documentIds, contextItems) {\n return this.threadRepo.addThreadItem(threadId, content, (documentIds || []).map(id => id), true, // addToThread\n userId, userName, userAvatar, {\n type: 'message',\n agentContext,\n contextItems,\n });\n }\n /**\n * Add an assistant message as a thread item to a thread (for agent orchestrator)\n */\n async addAssistantMessageToThread(threadId, content, assistantName, assistantIconUrl, metadata) {\n return this.threadRepo.addThreadItem(threadId, content, [], // contextDocumentIds\n true, // addToThread\n 'assistant-1', assistantName, assistantIconUrl, {\n type: 'message',\n ...(metadata ? { data: metadata } : {})\n });\n }\n /**\n * Add a reasoning trace as a thread item to a thread (for agent orchestrator)\n */\n async addReasoningToThread(threadId, content, assistantName, assistantIconUrl) {\n return this.threadRepo.addThreadItem(threadId, content, [], true, 'assistant-1', assistantName, assistantIconUrl, {\n type: 'reasoning',\n reasoning: {\n summary: content\n }\n });\n }\n /**\n * Append content to an existing thread item (for agent orchestrator)\n */\n async addChunkToThreadItem(itemId, content) {\n return this.threadRepo.addChunkToThreadItem(itemId, content);\n }\n /**\n * Add a tool result as a thread item to a thread (for agent orchestrator)\n */\n async addToolResultToThread(threadId, toolResult, assistantName, assistantIconUrl) {\n // Handle direct output (leaf tool)\n let value = toolResult?.value || toolResult?.result?.value;\n let documentIds = toolResult?.documentIds || toolResult?.result?.documentIds;\n let ui = toolResult?.ui || toolResult?.result?.ui;\n // Handle nested output (sub-agent tool)\n if ((!value || value.length === 0) && toolResult?.output?.value)\n value = toolResult.output.value;\n if ((!value || value.length === 0) && toolResult?.output?.result?.value)\n value = toolResult.output.result.value;\n if ((!documentIds || documentIds.length === 0) && toolResult?.output?.documentIds)\n documentIds = toolResult.output.documentIds;\n if ((!documentIds || documentIds.length === 0) && toolResult?.output?.result?.documentIds)\n documentIds = toolResult.output.result.documentIds;\n if (!ui && toolResult?.output?.ui)\n ui = toolResult.output.ui;\n if (!ui && toolResult?.output?.result?.ui)\n ui = toolResult.output.result.ui;\n const toolName = toolResult?.toolName || toolResult?.name || 'Unknown Tool';\n const content = value || `\u2705 Tool Result: ${toolName}`;\n // Build toolResult object, omitting undefined\n const toolResultObj = {\n tool: toolName,\n toolCallId: toolResult?.toolCallId || toolResult?.id,\n toolName: toolName,\n ...(toolResult?.result !== undefined ? { result: toolResult.result } : {}),\n isError: toolResult?.isError || false,\n ...((toolResult.data && typeof toolResult.data === 'object') ? Object.fromEntries(Object.entries(toolResult.data).filter(([_, v]) => v !== undefined)) : {})\n };\n return this.threadRepo.addThreadItem(threadId, content, documentIds || [], true, 'assistant-1', assistantName, assistantIconUrl, {\n type: 'tool-result',\n toolResult: toolResultObj,\n ui,\n });\n }\n /**\n * Add a tool call as a thread item to a thread (for agent orchestrator)\n */\n async addToolCallToThread(threadId, toolCall, assistantName, assistantIconUrl) {\n // Build toolCall object, omitting undefined\n const toolCallObj = {\n tool: toolCall.toolName || toolCall.name,\n toolCallId: toolCall.toolCallId || toolCall.id,\n toolName: toolCall.toolName || toolCall.name,\n ...(toolCall.args !== undefined ? { args: toolCall.args } : {}),\n ...(toolCall.arguments !== undefined ? { args: toolCall.arguments } : {}),\n };\n return this.threadRepo.addThreadItem(threadId, `\uD83D\uDD27 Tool Call: ${toolCall.toolName || toolCall.name || 'Unknown Tool'}`, [], true, 'assistant-1', assistantName, assistantIconUrl, {\n type: 'tool-call',\n toolCall: toolCallObj,\n });\n }\n /**\n * Fetch a thread item by id (for agent orchestrator)\n */\n async getThreadItem(id) {\n return this.threadRepo.getThreadItem(id);\n }\n // Sub-thread support\n async createSubThread(threadId, threadItemId, agentId) {\n // Use ThreadRepository to create the subthread\n const subThreadId = await this.threadRepo.createSubThread(threadItemId, agentId);\n // Update the parent thread item to reference this sub-thread\n const threadItemHandle = await this.threadRepo.getThreadItemHandle(threadItemId);\n threadItemHandle.change((doc) => {\n doc.subThreadId = subThreadId;\n });\n // Return the created subthread\n const subThread = await this.threadRepo.getSubThread(subThreadId);\n return subThread;\n }\n async getSubThread(subThreadId) {\n try {\n const subThread = await this.threadRepo.getSubThread(subThreadId);\n return subThread;\n }\n catch (error) {\n console.error('Error fetching sub-thread:', error);\n return null;\n }\n }\n async addItemToSubThread(subThreadId, itemId) {\n await this.threadRepo.addItemToSubThread(subThreadId, itemId);\n }\n}\n", "import { BranchService } from \"./branch-service.js\";\nimport { ThreadService } from \"./thread-service.js\";\n// Default timeout for repo.find() operations (5 seconds)\nconst DEFAULT_FIND_TIMEOUT_MS = 5000;\n/**\n * Wrap repo.find() with a timeout to prevent indefinite hangs\n * when documents are not available or network is slow.\n */\nasync function findWithTimeout(repo, documentId, timeoutMs = DEFAULT_FIND_TIMEOUT_MS) {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n console.warn(`[BranchableRepo] repo.find() timed out after ${timeoutMs}ms for ${documentId}`);\n resolve(null);\n }, timeoutMs);\n repo.find(documentId)\n .then((handle) => {\n clearTimeout(timeout);\n resolve(handle);\n })\n .catch((err) => {\n clearTimeout(timeout);\n console.warn(`[BranchableRepo] repo.find() failed for ${documentId}:`, err);\n resolve(null);\n });\n });\n}\n/**\n * BranchableRepo is a branch/task aware facade over an Automerge Repo.\n * It centralizes read-head resolution and write tracking so callers\n * don't need to implement branching logic.\n */\nexport class BranchableRepo {\n constructor(baseRepo) {\n this.baseRepo = baseRepo;\n // Serialize writes per document to avoid rebases during rapid local edits\n this.writeQueues = new Map();\n // Serialize writes to branches doc as well (branch heads updates)\n this.branchesWriteQueues = new Map();\n // Cache wrappers to ensure single wrapper per doc+branch (prevents stale currentHead in closures)\n this.wrapperCache = new Map();\n this.branchService = new BranchService(baseRepo);\n }\n // -------- New explicit APIs (no implicit active state) --------\n async openHandle(documentId, scope) {\n const baseHandle = await findWithTimeout(this.baseRepo, documentId, scope.timeoutMs);\n if (!baseHandle) {\n throw new Error(`[BranchableRepo] Document not found or timed out: ${documentId}`);\n }\n // Resolve branchesDocId if not provided\n let branchesDocId = scope.branchesDocId;\n if (!branchesDocId && scope.workspaceId) {\n try {\n const wsHandle = await findWithTimeout(this.baseRepo, scope.workspaceId, 2000);\n if (wsHandle) {\n const ws = wsHandle.doc();\n branchesDocId = ws?.branchesDocId || undefined;\n }\n }\n catch { }\n }\n // If still unavailable, proceed in a degraded mode without branch head updates\n const degraded = !branchesDocId;\n if (degraded) {\n // Note: proceeding without branch head updates due to unavailable branchesDocId\n }\n let resolvedHead = scope.head;\n if (!resolvedHead && branchesDocId) {\n // Try direct branch head, then ancestor resolution\n const direct = await this.branchService.getFileHead(scope.branchId, documentId, branchesDocId);\n // console.log('[BranchableRepo.openHandle] Resolved head for branch', {\n // branchId: scope.branchId,\n // documentId,\n // directHead: direct,\n // latestDocHead: baseHandle.heads()[0]\n // });\n if (direct) {\n resolvedHead = direct;\n }\n else {\n const resolved = await this.branchService.resolveBranchHead(documentId, scope.branchId, branchesDocId);\n resolvedHead = resolved.head;\n // console.log('[BranchableRepo.openHandle] No direct head, used ancestor resolution:', resolvedHead);\n }\n }\n // console.log('[BranchableRepo.openHandle] Creating handle with head:', resolvedHead);\n // Cache key: unique per document+branch combination\n const cacheKey = `${documentId}::${scope.branchId}`;\n // Check if we already have a wrapper for this doc+branch\n const cached = this.wrapperCache.get(cacheKey);\n if (cached) {\n // console.log('[BranchableRepo.openHandle] Returning cached wrapper for:', cacheKey, 'current head:', cached.head, 'resolved head:', resolvedHead);\n // IMPORTANT: Don't update the cached wrapper's head based on resolvedHead!\n // The wrapper may have updated its currentHead internally (via change()),\n // and we should trust that value, not overwrite it with potentially stale data\n // from the branch document which may not have synced yet.\n return cached;\n }\n // Create new wrapper and cache it\n const wrapper = this.createBranchedDocHandle({\n documentId,\n handle: baseHandle,\n head: resolvedHead,\n activeBranchId: scope.branchId,\n branchesDocId: branchesDocId,\n });\n this.wrapperCache.set(cacheKey, wrapper);\n // console.log('[BranchableRepo.openHandle] Created and cached new wrapper for:', cacheKey);\n return wrapper;\n }\n async getFileSnapshot(documentId, scope) {\n const baseHandle = await findWithTimeout(this.baseRepo, documentId, scope.timeoutMs);\n if (!baseHandle) {\n throw new Error(`[BranchableRepo] Document not found or timed out: ${documentId}`);\n }\n let branchesDocId = scope.branchesDocId;\n if (!branchesDocId && scope.workspaceId) {\n try {\n const wsHandle = await findWithTimeout(this.baseRepo, scope.workspaceId, 2000);\n if (wsHandle) {\n const ws = wsHandle.doc();\n branchesDocId = ws?.branchesDocId || undefined;\n }\n }\n catch { }\n }\n if (!branchesDocId) {\n // Degraded snapshot: return latest doc without branch scoping\n // Note: returning unscoped doc due to unavailable branchesDocId\n return baseHandle.doc();\n }\n const head = scope.version\n || (await this.branchService.getFileHead(scope.branchId, documentId, branchesDocId))\n || (await this.branchService.resolveBranchHead(documentId, scope.branchId, branchesDocId)).head;\n if (head) {\n return baseHandle.view([head]).doc();\n }\n return baseHandle.doc();\n }\n /**\n * Create a lightweight branch-aware wrapper around an Automerge handle.\n * The wrapper:\n * - Reads via the resolved head when present (task/branch/ancestor)\n * - Writes via change/changeAt and automatically updates the branch fileHead\n */\n createBranchedDocHandle(params) {\n const { documentId, handle, head, activeBranchId, branchesDocId } = params;\n const baseRepo = this.baseRepo;\n const self = this; // Capture reference to BranchableRepo instance\n // Maintain a current head so successive writes remain consistent\n let currentHead = head;\n const getViewHandle = () => (currentHead ? handle.view([currentHead]) : handle);\n const enqueueWrite = async (docId, fn) => {\n const prev = this.writeQueues.get(docId) || Promise.resolve();\n let resolveNext = () => { };\n const next = new Promise((r) => { resolveNext = r; });\n this.writeQueues.set(docId, prev.then(() => next));\n try {\n const result = await fn();\n resolveNext(undefined);\n return result;\n }\n catch (e) {\n resolveNext(undefined);\n throw e;\n }\n finally {\n // Best-effort cleanup\n const tail = this.writeQueues.get(docId);\n if (tail === next)\n this.writeQueues.delete(docId);\n }\n };\n const enqueueBranchesWrite = async (branchesDocId, fn) => {\n const key = String(branchesDocId);\n const prev = this.branchesWriteQueues.get(key) || Promise.resolve();\n let resolveNext = () => { };\n const next = new Promise((r) => { resolveNext = r; });\n this.branchesWriteQueues.set(key, prev.then(() => next));\n try {\n const result = await fn();\n resolveNext(undefined);\n return result;\n }\n catch (e) {\n resolveNext(undefined);\n throw e;\n }\n finally {\n const tail = this.branchesWriteQueues.get(key);\n if (tail === next)\n this.branchesWriteQueues.delete(key);\n }\n };\n return {\n // Expose the underlying handle in case advanced consumers need it\n handle,\n head: currentHead,\n // Internal method to update the head from cache\n _updateHead(newHead) {\n // console.log('[Wrapper._updateHead] Updating currentHead from', currentHead, 'to', newHead);\n currentHead = newHead;\n },\n // Synchronous doc read using the correct view\n doc() {\n // Some historical branches may contain invalid head hashes. Guard against\n // bs58check decode failures by falling back to the unscoped handle.\n // Also handle Automerge WASM \"recursive use\" errors which occur during concurrent access.\n try {\n // IMPORTANT: For reading, use the view at currentHead to get branch-scoped state\n // But for writing (in change()), we must use the base handle\n const v = getViewHandle();\n return v.doc();\n }\n catch (err) {\n const message = String(err?.message || '');\n // Detect common invalid-head failures from AutomergeUrl/bs58check\n if (message.includes('Invalid checksum') || message.includes('decodeHeads')) {\n try {\n // Clear the bad head and return the latest unscoped document\n currentHead = undefined;\n return handle.doc();\n }\n catch {\n throw err;\n }\n }\n // Handle Automerge WASM \"recursive use of an object\" error - this happens when\n // doc() is called while the document is being modified elsewhere (e.g., during sync).\n // Return undefined to let the caller handle gracefully rather than crashing.\n if (message.includes('recursive use of an object') || message.includes('unsafe aliasing')) {\n console.warn('[BranchableRepo] Concurrent access detected, returning undefined');\n return undefined;\n }\n throw err;\n }\n },\n // Heads - ALWAYS return single head for ProseMirror compatibility\n // When we have a currentHead (branch-scoped), return only that\n // This hides forked history from ProseMirror which can't handle multiple heads\n heads() {\n if (currentHead)\n return [currentHead];\n return handle.heads();\n },\n // Change with automatic branch fileHead update\n change(changeFn, options) {\n return enqueueWrite(documentId, async () => {\n const beforeHead = handle.heads()[0];\n // console.log('[BranchContext.change] BEFORE', { documentId, beforeHead, currentHead, activeBranchId });\n try {\n // Always use regular change() - all edits go to linear history\n // Branch isolation comes from each branch tracking different points\n // in the shared history via fileHeads\n handle.change(changeFn, options);\n }\n catch (err) {\n if (err && typeof err.message === 'string' && err.message.includes('outdated document')) {\n await new Promise(r => setTimeout(r, 0));\n try {\n handle.change(changeFn, options);\n }\n catch (err2) {\n const fresh = await baseRepo.find(documentId);\n fresh.change(changeFn, options);\n }\n }\n else {\n throw err;\n }\n }\n const newHead = (await baseRepo.find(documentId)).heads()[0];\n currentHead = newHead;\n // Defer branch head update to avoid re-entrancy/aliasing with Automerge change lifecycle\n setTimeout(() => {\n this.updateBranchHead(documentId, newHead).catch((err) => console.error('[BranchContext] updateBranchHead failed:', err));\n }, 0);\n // console.log('[BranchContext.change] COMPLETE', { documentId, beforeHead, newHead, currentHead, activeBranchId, branchesDocId, usedChangeAt: currentHead && currentHead !== beforeHead, headsMatch: beforeHead === newHead });\n // Task tracking disabled during refactor; branch head updates only\n return newHead;\n });\n },\n // Explicit changeAt that also updates branch fileHead\n changeAt(scope, changeFn, options) {\n // Keep available for tooling/migrations; not used in normal typing\n const beforeHead = handle.heads()[0];\n try {\n handle.changeAt(scope, changeFn, options);\n }\n catch (err) {\n if (err && typeof err.message === 'string' && err.message.includes('outdated document')) {\n // Retry once after yielding\n return enqueueWrite(documentId, async () => {\n await new Promise(r => setTimeout(r, 0));\n try {\n handle.changeAt(scope, changeFn, options);\n }\n catch (err2) {\n const fresh = await baseRepo.find(documentId);\n fresh.changeAt(scope, changeFn, options);\n }\n const newHeadRetry = (await baseRepo.find(documentId)).heads()[0];\n currentHead = newHeadRetry;\n setTimeout(() => {\n this.updateBranchHead(documentId, newHeadRetry).catch((err) => console.error('[BranchContext] updateBranchHead failed:', err));\n }, 0);\n // console.log('[BranchContext.changeAt]', { documentId, beforeHead, newHead: newHeadRetry, activeBranchId, branchesDocId });\n // Task tracking disabled during refactor; branch head updates only\n return newHeadRetry;\n });\n }\n else {\n throw err;\n }\n }\n const newHead = handle.heads()[0];\n currentHead = newHead;\n // Defer branch head update to avoid re-entrancy/aliasing with Automerge change lifecycle\n setTimeout(() => {\n this.updateBranchHead(documentId, newHead).catch((err) => console.error('[BranchContext] updateBranchHead failed:', err));\n }, 0);\n // console.log('[BranchContext.changeAt]', { documentId, beforeHead, newHead, activeBranchId, branchesDocId });\n // Task tracking disabled during refactor; branch head updates only\n return newHead;\n },\n // Internal helper bound to this wrapper via lexical closure\n updateBranchHead: async (fileId, newHead) => {\n if (!activeBranchId || !branchesDocId) {\n console.warn('[Wrapper.updateBranchHead] Skipping - no activeBranchId or branchesDocId', { activeBranchId, branchesDocId });\n return;\n }\n // console.log('[Wrapper.updateBranchHead] Updating branch fileHead', { branchId: activeBranchId, fileId, newHead });\n await enqueueBranchesWrite(branchesDocId, () => this.branchService.updateFileHead(activeBranchId, fileId, newHead, branchesDocId));\n },\n };\n }\n /**\n * Get the current branch context for a workspace\n */\n async getBranchContext(workspaceId) {\n try {\n const wsHandle = await this.baseRepo.find(workspaceId);\n const workspace = wsHandle.doc();\n // Prefer workspace.activeBranchId; fall back to thread.branchId for compatibility\n let activeBranchId = workspace.activeBranchId ?? null;\n if (!activeBranchId && workspace.activeThreadId) {\n try {\n const threadService = new ThreadService(this.baseRepo);\n const thread = await threadService.getThread(workspace.activeThreadId);\n activeBranchId = thread.branchId || null;\n }\n catch (error) {\n console.error('Error getting activeBranchId from thread:', error);\n }\n }\n if (!activeBranchId || !workspace.branchesDocId) {\n return null;\n }\n const fileHeads = await this.branchService.getFileHeads(activeBranchId, workspace.branchesDocId);\n return {\n workspace,\n activeBranchId,\n branchesDocId: workspace.branchesDocId,\n branchFileHeads: fileHeads\n };\n }\n catch (error) {\n console.error('Error getting branch context:', error);\n return null;\n }\n }\n /**\n * Ensure there's an active task for file tracking\n * Auto-creates an \"Untitled Task\" if none exists\n */\n async ensureActiveTask(branchId, branchesDocId, fileId, beforeHead, afterHead) {\n // TaskService integration removed during refactor\n void branchId;\n void branchesDocId;\n void fileId;\n void beforeHead;\n void afterHead;\n }\n /**\n * Generate a task title from file changes if task is still \"Untitled\"\n */\n async maybeGenerateTaskTitle(taskId, branchId, branchesDocId) {\n // TaskService integration removed during refactor\n void taskId;\n void branchId;\n void branchesDocId;\n }\n /**\n * Resolve a file name from its ID by looking in workspace fileRefs\n */\n async resolveFileName(fileId, branchId, branchesDocId) {\n try {\n // Get workspace from branch context\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n if (!branch)\n return null;\n // Find workspace doc ID from branch fileHeads (workspace is always tracked)\n const workspaceIds = Object.keys(branch.fileHeads).filter(id => {\n // Heuristic: workspace docs typically don't have file extensions\n return !id.includes('.');\n });\n for (const wsId of workspaceIds) {\n try {\n const wsHandle = await this.baseRepo.find(wsId);\n const workspace = wsHandle.doc();\n if (workspace.fileRefs) {\n const fileRef = workspace.fileRefs.find(fr => fr.id === fileId);\n if (fileRef) {\n return fileRef.name;\n }\n }\n }\n catch {\n continue;\n }\n }\n return null;\n }\n catch {\n return null;\n }\n }\n /**\n * Resolve a read head according to adaptive rules (task \u2192 branch \u2192 ancestor \u2192 baseline \u2192 last resort)\n */\n // Legacy resolver retained for internal use only; prefer explicit APIs\n async resolveReadHead(fileId, ctx, _options) {\n const activeBranchId = ctx?.activeBranchId || null;\n const branchesDocId = ctx?.branchesDocId || null;\n if (!ctx || !branchesDocId || !activeBranchId) {\n const h = (await this.baseRepo.find(fileId)).heads()[0];\n return { head: h, activeBranchId, branchesDocId };\n }\n const branchHead = await this.branchService.getFileHead(activeBranchId, fileId, branchesDocId);\n if (branchHead)\n return { head: branchHead, activeBranchId, branchesDocId };\n const resolved = await this.branchService.resolveBranchHead(fileId, activeBranchId, branchesDocId);\n if (resolved.head)\n return { head: resolved.head, activeBranchId, branchesDocId };\n return { head: undefined, activeBranchId, branchesDocId };\n }\n // Removed legacy getBranchAware*/mutate* methods. Use find/repo/findForBranch/change instead.\n /**\n * Create a new document and automatically add it to workspace fileRefs\n * This is the primary method for agent tools to create files\n *\n * Note: This method automatically detects hierarchical workspaces and routes\n * to folder-based storage when appropriate\n */\n async createFileWithWorkspaceRef(workspaceId, branchId, fileName, initialData, options) {\n // Check if this is a hierarchical workspace\n const wsHandle = await this.baseRepo.find(workspaceId);\n const wsDoc = wsHandle.doc();\n const isHierarchical = wsDoc.folderStructure && wsDoc.searchIndex;\n if (isHierarchical) {\n // Use hierarchical approach\n return this.createFileWithFolderRef(workspaceId, branchId, fileName, initialData, {\n ...options,\n targetFolderId: options?.targetFolderId || 'root'\n });\n }\n // Fallback to traditional flat workspace structure\n // 1. Create new document\n const docHandle = await this.baseRepo.create();\n const documentId = docHandle.documentId;\n // 2. Initialize document content\n const fileWrap = await this.openHandle(documentId, { branchId, workspaceId });\n await fileWrap.change((doc) => {\n Object.assign(doc, initialData);\n }, { taskId: options?.taskId });\n // 3. Add fileRef to workspace\n const wsWrap = await this.openHandle(workspaceId, { branchId, workspaceId });\n await wsWrap.change((doc) => {\n if (!doc.fileRefs)\n doc.fileRefs = [];\n // Remove duplicates by id or name\n const normalized = (name) => String(name).replace(/\\.(md|txt)$/i, '');\n const targetName = fileName;\n const targetBase = normalized(targetName);\n for (let i = doc.fileRefs.length - 1; i >= 0; i--) {\n const r = doc.fileRefs[i];\n const rName = String(r?.name || '');\n if ((typeof r.id === 'string' && r.id === documentId) ||\n rName === targetName ||\n normalized(rName) === targetBase) {\n doc.fileRefs.splice(i, 1);\n }\n }\n // Add new fileRef\n doc.fileRefs.push({\n id: String(documentId),\n name: fileName,\n type: this.inferFileType(fileName),\n folderId: null,\n metadata: {\n type: this.inferFileType(fileName),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n });\n }, { taskId: options?.taskId });\n return { documentId, handle: fileWrap };\n }\n /**\n * Create a new document and add it to a specific folder in hierarchical workspace\n * This is the folder-aware version for hierarchical workspaces\n */\n async createFileWithFolderRef(workspaceId, branchId, fileName, initialData, options) {\n console.log('[BranchableRepo] Creating file with folder ref:', {\n workspaceId, branchId, fileName, targetFolderId: options?.targetFolderId\n });\n // Determine target folder (default to root)\n const folderId = options?.targetFolderId || this.determineFolderId(fileName);\n // 1. Create new document\n const docHandle = await this.baseRepo.create();\n const documentId = docHandle.documentId;\n // 2. Initialize document content\n const fileWrap = await this.openHandle(documentId, { branchId, workspaceId });\n await fileWrap.change((doc) => {\n Object.assign(doc, initialData);\n }, { taskId: options?.taskId });\n // 3. Ensure folder exists if needed\n if (options?.createFolderIfMissing) {\n await this.ensureFolderExists(workspaceId, branchId, folderId, options?.taskId);\n }\n // 4. Add fileRef to folder document\n const folderDocumentId = await this.resolveFolderDocumentId(workspaceId, branchId, folderId);\n if (!folderDocumentId) {\n throw new Error(`Folder document not found: ${folderId}`);\n }\n const folderWrap = await this.openHandle(folderDocumentId, { branchId, workspaceId });\n await folderWrap.change((doc) => {\n if (!doc.fileRefs)\n doc.fileRefs = [];\n // Check capacity limit\n if (doc.fileRefs.length >= 200) {\n throw new Error(`Folder ${folderId} exceeds maximum capacity of 200 files`);\n }\n // Remove duplicates by id or name\n const normalized = (name) => String(name).replace(/\\.(md|txt)$/i, '');\n const targetName = fileName;\n const targetBase = normalized(targetName);\n for (let i = doc.fileRefs.length - 1; i >= 0; i--) {\n const r = doc.fileRefs[i];\n const rName = String(r?.name || '');\n if ((typeof r.id === 'string' && r.id === documentId) ||\n rName === targetName ||\n normalized(rName) === targetBase) {\n doc.fileRefs.splice(i, 1);\n }\n }\n // Add new fileRef to folder\n doc.fileRefs.push({\n id: String(documentId),\n name: fileName,\n type: this.inferFileType(fileName),\n folderId,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n metadata: {\n type: this.inferFileType(fileName),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n });\n // Update folder metadata\n if (doc.metadata) {\n doc.metadata.fileCount = doc.fileRefs.length;\n doc.metadata.lastFileModified = new Date().toISOString();\n doc.metadata.updatedAt = new Date().toISOString();\n }\n }, { taskId: options?.taskId });\n // 5. Update workspace folder references if this is a new folder\n await this.updateWorkspaceFolderRefs(workspaceId, branchId, folderId, fileName, options?.taskId);\n console.log('[BranchableRepo] Successfully created file with folder ref');\n return { documentId, handle: fileWrap };\n }\n /**\n * Determine appropriate folder ID for a file based on its name\n */\n determineFolderId(fileName) {\n // Simple logic - could be enhanced with more sophisticated folder organization\n const ext = fileName.split('.').pop()?.toLowerCase();\n // Group by file type for better organization\n const codeExtensions = ['js', 'ts', 'tsx', 'jsx', 'py', 'java', 'c', 'cpp', 'cs', 'go', 'rs'];\n const configExtensions = ['json', 'yaml', 'yml', 'toml', 'xml'];\n if (ext && codeExtensions.includes(ext)) {\n return 'src';\n }\n else if (ext && configExtensions.includes(ext)) {\n return 'config';\n }\n else if (fileName.toLowerCase().includes('readme') || ext === 'md') {\n return 'docs';\n }\n return 'root'; // Default folder\n }\n /**\n * Ensure a folder exists, creating it if necessary\n */\n async ensureFolderExists(workspaceId, branchId, folderId, taskId) {\n console.log('[BranchableRepo] Ensuring folder exists:', { workspaceId, branchId, folderId });\n try {\n const existingFolderDocId = await this.resolveFolderDocumentId(workspaceId, branchId, folderId);\n if (existingFolderDocId) {\n // Folder already exists\n return;\n }\n // Create new folder document\n const folderDocHandle = await this.baseRepo.create();\n const folderDocumentId = folderDocHandle.documentId;\n const folderWrap = await this.openHandle(folderDocumentId, { branchId, workspaceId });\n await folderWrap.change((doc) => {\n doc.id = folderId;\n doc.metadata = {\n name: this.extractFolderName(folderId),\n path: folderId,\n workspaceId,\n fileCount: 0,\n totalSize: 0,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastFileModified: new Date().toISOString(),\n type: 'folder-document'\n };\n doc.fileRefs = [];\n doc.subfolders = [];\n }, { taskId });\n console.log('[BranchableRepo] Created new folder document:', folderDocumentId);\n }\n catch (error) {\n console.error('[BranchableRepo] Failed to ensure folder exists:', error);\n // Continue anyway - the calling code will handle the error\n }\n }\n /**\n * Resolve folder document ID from folder ID\n */\n async resolveFolderDocumentId(workspaceId, branchId, folderId) {\n try {\n // First check if the folderId is already a valid document ID\n const directDoc = await this.baseRepo.find(folderId);\n if (directDoc) {\n return folderId;\n }\n }\n catch {\n // Not a direct document ID, need to resolve through workspace\n }\n try {\n // Get the workspace document to find the folder reference\n const workspace = await this.openHandle(workspaceId, {\n branchId,\n workspaceId\n });\n const workspaceDoc = workspace.doc();\n // Look up the folder reference by ID to get the actual document ID\n if (Array.isArray(workspaceDoc.folderRefs)) {\n const folderRef = workspaceDoc.folderRefs.find((ref) => ref.id === folderId);\n if (folderRef && folderRef.documentId) {\n return folderRef.documentId;\n }\n }\n console.warn('[BranchableRepo] Folder reference not found in workspace folderRefs:', folderId);\n return null;\n }\n catch (error) {\n console.error('[BranchableRepo] Failed to resolve folder document ID:', error);\n return null;\n }\n }\n /**\n * Update workspace folder references when files are added\n */\n async updateWorkspaceFolderRefs(workspaceId, branchId, folderId, fileName, taskId) {\n try {\n const wsWrap = await this.openHandle(workspaceId, { branchId, workspaceId });\n await wsWrap.change((doc) => {\n // Initialize folderRefs if needed\n if (!Array.isArray(doc.folderRefs)) {\n doc.folderRefs = [];\n }\n // Check if folder reference already exists\n const existingRef = doc.folderRefs.find((ref) => ref.id === folderId);\n if (!existingRef) {\n // Add new folder reference\n doc.folderRefs.push({\n id: folderId,\n name: this.extractFolderName(folderId),\n path: folderId,\n documentId: folderId,\n fileCount: 1,\n totalSize: 0,\n lastModified: new Date().toISOString(),\n metadata: {\n hasSubfolders: false,\n primaryFileType: this.inferFileType(fileName),\n isActive: true\n }\n });\n }\n else {\n // Update existing folder reference\n existingRef.fileCount = (existingRef.fileCount || 0) + 1;\n existingRef.lastModified = new Date().toISOString();\n if (existingRef.metadata) {\n existingRef.metadata.isActive = true;\n }\n }\n // Update folder structure metadata\n if (doc.folderStructure) {\n doc.folderStructure.totalFolders = doc.folderRefs.length;\n doc.folderStructure.lastStructureUpdate = new Date().toISOString();\n }\n }, { taskId });\n }\n catch (error) {\n console.warn('[BranchableRepo] Failed to update workspace folder refs:', error);\n // Non-critical error - continue execution\n }\n }\n /**\n * Extract display name from folder path/ID\n */\n extractFolderName(folderId) {\n if (!folderId || folderId === 'root') {\n return 'Root';\n }\n const parts = folderId.split('/');\n return parts[parts.length - 1] || 'Unnamed Folder';\n }\n /**\n * Infer file type from filename extension\n */\n inferFileType(fileName) {\n const ext = fileName.split('.').pop()?.toLowerCase();\n const codeExtensions = [\n 'js', 'ts', 'tsx', 'jsx', 'py', 'java', 'c', 'cpp', 'cs', 'go',\n 'rs', 'php', 'rb', 'swift', 'kt', 'scala', 'sh', 'bash', 'zsh',\n 'html', 'css', 'scss', 'sass', 'less', 'json', 'yaml', 'yml',\n 'toml', 'xml', 'sql'\n ];\n if (ext && codeExtensions.includes(ext)) {\n return 'code';\n }\n return 'text'; // Default to text for .md, .txt, and unknown extensions\n }\n /**\n * Get the BranchService for core branch operations\n */\n getBranchService() {\n return this.branchService;\n }\n}\n", "'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n", "'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n", "'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n", "'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n", "'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n", "'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n", "'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n", "'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst closeTimeout = 30 * 1000;\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch (e) {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n let chunk;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written and `readable.read()`\n // will return `null`. If instead, the socket is paused, any possible buffered\n // data will be read as a single chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n (chunk = websocket._socket.read()) !== null\n ) {\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n", "'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate(\n this.options.perMessageDeflate,\n true,\n this.options.maxPayload\n );\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n", "'use strict';\n\nconst WebSocket = require('./lib/websocket');\n\nWebSocket.createWebSocketStream = require('./lib/stream');\nWebSocket.Server = require('./lib/websocket-server');\nWebSocket.Receiver = require('./lib/receiver');\nWebSocket.Sender = require('./lib/sender');\n\nWebSocket.WebSocket = WebSocket;\nWebSocket.WebSocketServer = WebSocket.Server;\n\nmodule.exports = WebSocket;\n", "\"use strict\";\n\nmodule.exports = require('ws');", "export class BaseRepository {\n constructor(repo) {\n this.repo = repo;\n }\n async getHandle(id) {\n const handle = await this.repo.find(id);\n if (!handle) {\n throw new Error(`Document not found: ${id}`);\n }\n return handle;\n }\n validateId(id) {\n if (!id) {\n throw new Error('Document ID is required');\n }\n }\n getTimestamp() {\n return new Date().toISOString();\n }\n}\n", "import { z } from 'zod';\nexport const KanbanColumnSchema = z.object({\n id: z.string(),\n label: z.string(),\n order: z.number(),\n});\nexport const WorkspaceFolderSchema = z.object({\n id: z.string(), // DocumentId as string\n name: z.string(),\n parentId: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n currentView: z.enum(['list', 'kanban', 'grid', 'editor']),\n children: z.array(z.string()).optional(),\n kanban: z.object({\n columns: z.array(KanbanColumnSchema),\n fileColumnMap: z.record(z.string()),\n }).optional(),\n editorContent: z.string().optional(),\n});\n", "import * as fs from 'fs';\nimport * as path from 'path';\n// Persistent file-based storage for Node.js environments\nconst isNode = typeof window === 'undefined';\n// Initialize storage path and directory\nconst storageDir = '.mod';\nlet storageFilePath;\nif (isNode) {\n storageFilePath = path.join(storageDir, 'localStorage.json');\n}\nelse {\n storageFilePath = `${storageDir}/localStorage.json`;\n}\nif (isNode) {\n // Ensure .mod directory exists\n try {\n if (!fs.existsSync(storageDir)) {\n fs.mkdirSync(storageDir, { recursive: true });\n }\n }\n catch (error) {\n console.warn('[storage] Failed to create storage directory:', error);\n }\n}\n// Load existing storage from file in Node.js\nlet fileStorage = {};\nif (isNode) {\n try {\n if (fs.existsSync(storageFilePath)) {\n const data = fs.readFileSync(storageFilePath, 'utf8');\n fileStorage = JSON.parse(data);\n }\n }\n catch (error) {\n console.warn('[storage] Failed to load existing storage, starting fresh:', error);\n fileStorage = {};\n }\n}\n// Save storage to file in Node.js\nconst saveToFile = () => {\n if (!isNode)\n return;\n try {\n fs.writeFileSync(storageFilePath, JSON.stringify(fileStorage, null, 2));\n }\n catch (error) {\n console.error('[storage] Failed to save storage to file:', error);\n }\n};\nconst storage = isNode ? {\n getItem: (key) => fileStorage[key] || null,\n setItem: (key, value) => {\n fileStorage[key] = value;\n saveToFile();\n },\n removeItem: (key) => {\n delete fileStorage[key];\n saveToFile();\n },\n clear: () => {\n fileStorage = {};\n saveToFile();\n }\n} : localStorage;\nexport const get = async (key) => {\n try {\n const item = storage.getItem(key);\n if (item == null)\n return null;\n try {\n return JSON.parse(item);\n }\n catch (parseError) {\n if (typeof item === 'string') {\n console.warn(`[storage] Non-JSON value found for key \"${key}\", returning raw string`, parseError);\n try {\n await set(key, item);\n }\n catch (normalizeError) {\n console.warn(`[storage] Failed to normalize legacy value for key \"${key}\"`, normalizeError);\n }\n return item;\n }\n throw parseError;\n }\n }\n catch (e) {\n console.error('Error getting item from storage:', e);\n return null;\n }\n};\nexport const set = async (key, value) => {\n try {\n storage.setItem(key, JSON.stringify(value));\n }\n catch (e) {\n console.error('Error setting item in storage:', e);\n }\n};\nexport const remove = async (key) => {\n try {\n storage.removeItem(key);\n }\n catch (e) {\n console.error('Error removing item from storage:', e);\n }\n};\nexport const clear = async () => {\n try {\n storage.clear();\n }\n catch (e) {\n console.error('Error clearing storage:', e);\n }\n};\n", "import { BaseRepository } from './base-repo.js';\nimport { WorkspaceFolderSchema } from '../schemas/workspace-schemas.js';\nimport * as storage from '../utils/local-storage.js';\nconst MAX_ARCHIVED_TABS = 200;\n// Default timeout for repo.find() operations (15 seconds - allows time for sync)\nconst DEFAULT_FIND_TIMEOUT_MS = 15000;\n// Number of retries for finding documents\nconst DEFAULT_FIND_RETRIES = 3;\n// Delay between retries (increases each attempt)\nconst RETRY_DELAY_MS = 2000;\n/**\n * Wrap repo.find() with a timeout to prevent indefinite hangs\n * when documents are not available or network is slow.\n */\nasync function findWithTimeout(repo, documentId, timeoutMs = DEFAULT_FIND_TIMEOUT_MS) {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n console.warn(`[WorkspaceRepo] repo.find() timed out after ${timeoutMs}ms for ${documentId}`);\n resolve(null);\n }, timeoutMs);\n repo.find(documentId)\n .then((handle) => {\n clearTimeout(timeout);\n resolve(handle);\n })\n .catch((err) => {\n clearTimeout(timeout);\n console.warn(`[WorkspaceRepo] repo.find() failed for ${documentId}:`, err);\n resolve(null);\n });\n });\n}\n/**\n * Find a document with retries - useful for cross-device sync where\n * documents may take time to sync from the server.\n */\nasync function findWithRetry(repo, documentId, maxRetries = DEFAULT_FIND_RETRIES, timeoutMs = DEFAULT_FIND_TIMEOUT_MS) {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n const handle = await findWithTimeout(repo, documentId, timeoutMs);\n if (handle) {\n // Check if the document has actual content\n const doc = handle.doc?.();\n if (doc) {\n return handle;\n }\n // Handle exists but no content yet - wait for it\n try {\n await handle.whenReady?.();\n if (handle.doc?.()) {\n return handle;\n }\n }\n catch { }\n }\n if (attempt < maxRetries - 1) {\n console.log(`[WorkspaceRepo] Retry ${attempt + 1}/${maxRetries} for ${documentId}...`);\n await new Promise(r => setTimeout(r, RETRY_DELAY_MS * (attempt + 1)));\n }\n }\n return null;\n}\nfunction pruneArchivedTabsInPlace(tabs, limit = MAX_ARCHIVED_TABS) {\n if (!Array.isArray(tabs) || tabs.length <= limit) {\n return;\n }\n const deduped = new Map();\n for (const tab of tabs) {\n const key = String(tab?.documentId ?? tab?.id ?? Math.random());\n deduped.set(key, tab);\n }\n const ordered = Array.from(deduped.values()).sort((a, b) => {\n const aTime = Date.parse(a?.archivedAt ?? '') || 0;\n const bTime = Date.parse(b?.archivedAt ?? '') || 0;\n return aTime - bTime;\n });\n const start = ordered.length > limit ? ordered.length - limit : 0;\n const pruned = ordered.slice(start);\n tabs.splice(0, tabs.length, ...pruned);\n}\nfunction sanitizeStoredDocumentId(value) {\n if (typeof value !== \"string\")\n return null;\n const trimmed = value.trim();\n if (!trimmed)\n return null;\n // Some older code paths stored JSON-stringified ids, resulting in values like '\"abc123\"' or '\\\"abc123\\\"'.\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed === \"string\" && parsed.trim())\n return parsed.trim();\n }\n catch { }\n // Handle nested quotes like \"\\\"abc123\\\"\"\n let unquoted = trimmed.slice(1, -1).trim();\n if (unquoted.startsWith('\\\\\"') && unquoted.endsWith('\\\\\"')) {\n unquoted = unquoted.slice(2, -2).trim();\n }\n if (unquoted)\n return unquoted;\n }\n return trimmed;\n}\nexport class WorkspaceRepository extends BaseRepository {\n async waitForReadyOrTimeout(handle, timeoutMs) {\n try {\n if (handle?.isReady?.())\n return true;\n await Promise.race([\n handle.whenReady(),\n new Promise((_, reject) => setTimeout(() => reject(new Error(`timeout after ${timeoutMs}ms`)), timeoutMs)),\n ]);\n return Boolean(handle?.isReady?.());\n }\n catch {\n return false;\n }\n }\n async ensureRootDocId() {\n const rootRaw = await storage.get(\"rootDocId\");\n const rootId = sanitizeStoredDocumentId(rootRaw);\n if (rootId) {\n if (rootId !== rootRaw) {\n await storage.set(\"rootDocId\", rootId);\n }\n return rootId;\n }\n const createdId = await this.initAppRoot();\n return createdId;\n }\n /**\n * Initialize the app root document or find an existing one\n */\n async initAppRoot() {\n try {\n // Try to find existing root from storage\n const storedRootRaw = await storage.get(\"rootDocId\");\n const storedRootId = sanitizeStoredDocumentId(storedRootRaw);\n if (storedRootId) {\n try {\n if (storedRootId !== storedRootRaw) {\n await storage.set(\"rootDocId\", storedRootId);\n }\n const handle = await this.repo.find(storedRootId);\n if (handle) {\n const doc = handle.doc?.();\n if (doc)\n return handle.documentId;\n // Ensure the handle is loadable, but do not clear the id just because it isn't ready fast.\n // Stale IDs will still fail to produce docs; slow storage should not erase user data.\n const ready = await this.waitForReadyOrTimeout(handle, 1500);\n const readyDoc = handle.doc?.() ?? (ready ? handle.doc() : null);\n if (readyDoc)\n return handle.documentId;\n // Non-fatal: return the id and let callers use doc/short waits.\n console.warn('[WorkspaceRepository] Root document handle exists but content unavailable, returning handle anyway');\n return handle.documentId;\n }\n else {\n // No handle found - this indicates the document truly doesn't exist\n console.warn('[WorkspaceRepository] No handle found for stored root ID, removing stale reference:', storedRootId);\n await storage.remove(\"rootDocId\");\n }\n }\n catch (error) {\n console.error('Error finding existing root:', error);\n // Only remove rootDocId for genuine errors, not temporary unavailability\n const errorMessage = String(error?.message || error || '');\n if (errorMessage.includes('is unavailable')) {\n console.warn('[WorkspaceRepository] Root document temporarily unavailable, keeping ID for retry:', storedRootId);\n // Return the stored ID anyway - the document may become available later\n return storedRootId;\n }\n else {\n // Genuine error - remove the stale reference\n console.warn('[WorkspaceRepository] Removing stale root ID due to error:', errorMessage);\n await storage.remove(\"rootDocId\");\n }\n }\n }\n // Create new root if needed\n const handle = await this.repo.create();\n handle.change((doc) => {\n doc.workspaces = [];\n doc.metadata = {\n type: 'appRoot',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n });\n // Store the root ID immediately; do not block app startup on readiness.\n // Readiness may be delayed if IndexedDB is slow or the browser is under heavy load.\n await storage.set(\"rootDocId\", handle.documentId);\n // Best-effort readiness wait (non-fatal).\n await this.waitForReadyOrTimeout(handle, 1500);\n return handle.documentId;\n }\n catch (error) {\n console.error('Error initializing app root:', error);\n throw error;\n }\n }\n /**\n * Get the app root document\n */\n async getAppRoot() {\n try {\n const rootRaw = await storage.get(\"rootDocId\");\n const rootId = sanitizeStoredDocumentId(rootRaw);\n if (!rootId) {\n console.warn('[WorkspaceRepository] No rootDocId found in storage');\n return null;\n }\n if (rootId !== rootRaw) {\n await storage.set(\"rootDocId\", rootId);\n }\n const handle = await this.repo.find(rootId);\n if (!handle) {\n console.warn('[WorkspaceRepository] App root handle not found for', rootId);\n return null;\n }\n const doc = handle.doc?.();\n if (doc)\n return doc;\n const ready = await this.waitForReadyOrTimeout(handle, 1500);\n const readyDoc = handle.doc?.() ?? (ready ? handle.doc() : null);\n if (!readyDoc) {\n console.warn('[WorkspaceRepository] App root document content not available, but handle exists for', rootId);\n // Return null but don't remove the ID - document may sync later\n return null;\n }\n return readyDoc;\n }\n catch (error) {\n const errorMessage = String(error?.message || error || '');\n if (errorMessage.includes('is unavailable')) {\n console.warn('[WorkspaceRepository] App root temporarily unavailable:', errorMessage);\n return null;\n }\n console.error('[WorkspaceRepository] Error getting app root:', error);\n return null;\n }\n }\n /**\n * Add a workspace to the app root document\n */\n async addWorkspaceToRoot(workspace) {\n try {\n const rootId = await this.ensureRootDocId();\n const handle = await findWithTimeout(this.repo, rootId);\n if (!handle)\n throw new Error('App root not found or timed out');\n // Ensure all workspace properties are defined\n const validWorkspace = {\n id: workspace.id,\n title: workspace.title || '',\n createdAt: workspace.createdAt || new Date().toISOString(),\n updatedAt: workspace.updatedAt || new Date().toISOString()\n };\n handle.change((doc) => {\n if (!doc.workspaces)\n doc.workspaces = [];\n if (!doc.metadata) {\n doc.metadata = {\n type: 'appRoot',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n }\n // Check if workspace with same ID already exists\n const workspaceExists = doc.workspaces.some(w => w.id === validWorkspace.id);\n if (!workspaceExists) {\n doc.workspaces.push(validWorkspace);\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n }\n catch (error) {\n console.error('Error adding workspace to root:', error);\n throw error;\n }\n }\n /**\n * Remove a workspace from the app root document\n */\n async removeWorkspaceFromRoot(workspaceId) {\n try {\n const rootId = await this.ensureRootDocId();\n const handle = await this.repo.find(rootId);\n if (!handle)\n throw new Error('App root not found');\n handle.change((doc) => {\n if (!doc.metadata) {\n doc.metadata = {\n type: 'appRoot',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n }\n doc.workspaces = doc.workspaces.filter(w => w.id !== workspaceId);\n doc.metadata.updatedAt = new Date().toISOString();\n });\n }\n catch (error) {\n console.error('Error removing workspace from root:', error);\n throw error;\n }\n }\n /**\n * Update a workspace reference in the app root document\n */\n async updateWorkspaceInRoot(workspaceId, updates) {\n try {\n const rootId = await this.ensureRootDocId();\n const handle = await this.repo.find(rootId);\n if (!handle)\n throw new Error('App root not found');\n handle.change((doc) => {\n if (!doc.workspaces)\n doc.workspaces = [];\n if (!doc.metadata) {\n doc.metadata = {\n type: 'appRoot',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n }\n // Find and update the workspace reference\n const workspaceIndex = doc.workspaces.findIndex(w => w.id === workspaceId);\n if (workspaceIndex !== -1) {\n const workspace = doc.workspaces[workspaceIndex];\n if (updates.title !== undefined)\n workspace.title = updates.title;\n if (updates.updatedAt !== undefined)\n workspace.updatedAt = updates.updatedAt;\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n }\n catch (error) {\n console.error('Error updating workspace in root:', error);\n throw error;\n }\n }\n /**\n * Create a workspace and add it to the app root\n */\n async createAndAddWorkspace(title) {\n try {\n // Create the workspace with explicit hierarchical structure\n const workspaceId = await this.create({\n title: title || 'Untitled Workspace',\n folderRefs: [], // Explicitly request hierarchical structure\n folderStructure: {\n totalFolders: 0,\n totalFiles: 0,\n maxDepth: 0,\n lastStructureUpdate: new Date().toISOString()\n },\n searchIndex: {\n lastIndexed: new Date().toISOString(),\n indexedFileCount: 0,\n indexVersion: '1.0'\n }\n });\n // Add to app root\n await this.addWorkspaceToRoot({\n id: workspaceId,\n title: title || 'Untitled Workspace',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n });\n return workspaceId;\n }\n catch (error) {\n console.error('Error creating and adding workspace:', error);\n throw error;\n }\n }\n async create(data) {\n const handle = await this.repo.create();\n handle.change((doc) => {\n // Initialize with empty arrays first\n doc.tabs = [];\n doc.archivedTabs = [];\n doc.activeAgents = [];\n // Always create hierarchical structure by default (per spec REQ-IMPL-6)\n // New workspaces should never use legacy fileRefs/folders\n doc.folderRefs = data.folderRefs || [];\n doc.folderStructure = data.folderStructure || {\n totalFolders: 0,\n totalFiles: 0,\n maxDepth: 0,\n lastStructureUpdate: new Date().toISOString()\n };\n doc.searchIndex = data.searchIndex || {\n lastIndexed: new Date().toISOString(),\n indexedFileCount: 0,\n indexVersion: '1.0'\n };\n // DO NOT create fileRefs or folders - hierarchical workspaces only use folderRefs\n // Set metadata with required fields first\n const metadata = {\n type: \"workspace\",\n name: data.title || 'Untitled Workspace',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n // Add optional metadata fields if they exist\n if (data.metadata?.description)\n metadata.description = data.metadata.description;\n if (data.metadata?.createdBy)\n metadata.createdBy = data.metadata.createdBy;\n if (data.metadata?.branchType)\n metadata.branchType = data.metadata.branchType;\n if (data.metadata?.originalDocumentId)\n metadata.originalDocumentId = data.metadata.originalDocumentId;\n doc.metadata = metadata;\n // Set scalar values\n doc.id = handle.documentId;\n doc.title = data.title || 'Untitled Workspace';\n doc.activeTabId = data.activeTabId !== undefined ? data.activeTabId : doc.activeTabId;\n doc.activeThreadId = data.activeThreadId !== undefined ? data.activeThreadId : doc.activeThreadId;\n if (data.activeBranchId !== undefined)\n doc.activeBranchId = data.activeBranchId;\n // Add array items one by one\n if (data.tabs) {\n data.tabs.forEach(tab => {\n doc.tabs.push({\n id: tab.documentId,\n documentId: tab.documentId,\n title: tab.title,\n type: tab.type,\n lastViewed: tab.lastViewed || new Date().toISOString()\n });\n });\n }\n if (data.fileRefs && doc.fileRefs) {\n data.fileRefs.forEach(ref => {\n const r = ref;\n if (doc.fileRefs) {\n doc.fileRefs.push({\n id: r.id,\n name: r.name,\n type: validDocumentType(r.type),\n folderId: r.folderId ?? null,\n createdAt: r.createdAt,\n updatedAt: r.updatedAt\n });\n }\n });\n }\n if (data.folders && doc.folders) {\n data.folders.forEach(folder => {\n if (doc.folders) {\n doc.folders.push({ ...folder });\n }\n });\n }\n if (data.archivedTabs) {\n data.archivedTabs.forEach(tab => {\n doc.archivedTabs.push({\n id: tab.id,\n documentId: tab.documentId,\n title: tab.title,\n type: tab.type,\n lastViewed: tab.lastViewed || new Date().toISOString(),\n archivedAt: tab.archivedAt || new Date().toISOString()\n });\n });\n }\n if (data.activeAgents) {\n data.activeAgents.forEach(agent => {\n doc.activeAgents.push(agent);\n });\n }\n });\n return handle.documentId;\n }\n /**\n * Update a workspace document with new data\n */\n async update(workspaceId, data) {\n try {\n const handle = await findWithTimeout(this.repo, workspaceId);\n if (!handle)\n throw new Error(`Workspace not found or timed out: ${workspaceId}`);\n handle.change((doc) => {\n // Update scalar values if provided\n if (data.title !== undefined)\n doc.title = data.title;\n if (data.activeTabId !== undefined)\n doc.activeTabId = data.activeTabId;\n if (data.branchesDocId !== undefined) {\n doc.branchesDocId = data.branchesDocId;\n }\n if (data.activeThreadId !== undefined)\n doc.activeThreadId = data.activeThreadId;\n if (data.activeBranchId !== undefined)\n doc.activeBranchId = data.activeBranchId;\n // Update metadata if provided\n if (data.metadata) {\n if (!doc.metadata) {\n doc.metadata = {\n type: \"workspace\",\n name: doc.title || 'Untitled Workspace',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n }\n if (data.metadata.name)\n doc.metadata.name = data.metadata.name;\n if (data.metadata.description)\n doc.metadata.description = data.metadata.description;\n if (data.metadata.createdBy)\n doc.metadata.createdBy = data.metadata.createdBy;\n if (data.metadata.branchType)\n doc.metadata.branchType = data.metadata.branchType;\n if (data.metadata.originalDocumentId)\n doc.metadata.originalDocumentId = data.metadata.originalDocumentId;\n }\n // Always update the updatedAt timestamp\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n // Handle arrays if provided\n if (data.tabs) {\n doc.tabs = [];\n data.tabs.forEach(tab => {\n doc.tabs.push({\n id: tab.documentId,\n documentId: tab.documentId,\n title: tab.title,\n type: tab.type,\n lastViewed: tab.lastViewed || new Date().toISOString()\n });\n });\n }\n if (data.fileRefs) {\n doc.fileRefs = [];\n data.fileRefs.forEach(ref => {\n const r = ref;\n if (doc.fileRefs) {\n doc.fileRefs.push({\n id: r.id,\n name: r.name,\n type: validDocumentType(r.type),\n folderId: r.folderId ?? null,\n createdAt: r.createdAt,\n updatedAt: r.updatedAt\n });\n }\n });\n }\n if (data.folders) {\n doc.folders = [];\n data.folders.forEach(folder => {\n if (doc.folders) {\n doc.folders.push({ ...folder });\n }\n });\n }\n if (data.archivedTabs) {\n doc.archivedTabs = [];\n data.archivedTabs.forEach(tab => {\n doc.archivedTabs.push({\n id: tab.id,\n documentId: tab.documentId,\n title: tab.title,\n type: tab.type,\n lastViewed: tab.lastViewed || new Date().toISOString(),\n archivedAt: tab.archivedAt || new Date().toISOString()\n });\n });\n }\n if (data.activeAgents) {\n doc.activeAgents = [];\n data.activeAgents.forEach(agent => {\n doc.activeAgents.push(agent);\n });\n }\n });\n return workspaceId;\n }\n catch (error) {\n console.error('Error updating workspace:', error);\n throw error;\n }\n }\n /**\n * Branch-aware update using BranchableRepo semantics (fileHeads/task tracking)\n */\n async updateBranchAware(workspaceId, data) {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n handle.change((doc) => {\n if (data.title !== undefined)\n doc.title = data.title;\n if (data.activeTabId !== undefined)\n doc.activeTabId = data.activeTabId;\n if (data.branchesDocId !== undefined)\n doc.branchesDocId = data.branchesDocId;\n if (data.activeThreadId !== undefined)\n doc.activeThreadId = data.activeThreadId;\n if (data.activeBranchId !== undefined)\n doc.activeBranchId = data.activeBranchId;\n if (data.metadata) {\n if (!doc.metadata) {\n ;\n doc.metadata = {\n type: 'workspace',\n name: doc.title || 'Untitled Workspace',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n }\n const md = doc.metadata;\n if (data.metadata.name)\n md.name = data.metadata.name;\n if (data.metadata.description)\n md.description = data.metadata.description;\n if (data.metadata.createdBy)\n md.createdBy = data.metadata.createdBy;\n if (data.metadata.branchType)\n md.branchType = data.metadata.branchType;\n if (data.metadata.originalDocumentId)\n md.originalDocumentId = data.metadata.originalDocumentId;\n }\n if (doc.metadata) {\n ;\n doc.metadata.updatedAt = new Date().toISOString();\n }\n if (data.tabs)\n doc.tabs = data.tabs;\n if (data.fileRefs) {\n const sanitized = data.fileRefs.map((r) => ({\n id: r.id,\n name: r.name || 'Untitled',\n type: validDocumentType(r.type),\n folderId: r.folderId ?? null,\n createdAt: r.createdAt || new Date().toISOString(),\n updatedAt: r.updatedAt || new Date().toISOString(),\n }));\n doc.fileRefs = sanitized;\n }\n if (data.folders) {\n const sanitizedFolders = data.folders.map((f) => ({\n id: f.id,\n name: f.name,\n parentId: f.parentId ?? null,\n currentView: ['list', 'kanban', 'grid', 'editor'].includes(f.currentView) ? f.currentView : 'list',\n children: Array.isArray(f.children) ? [...f.children] : [],\n kanban: f.kanban ? { columns: Array.isArray(f.kanban.columns) ? [...f.kanban.columns] : [], fileColumnMap: f.kanban.fileColumnMap ? { ...f.kanban.fileColumnMap } : {} } : { columns: [], fileColumnMap: {} },\n editorContent: f.editorContent || '',\n metadata: {\n type: 'workspace-folder',\n name: (f.metadata && f.metadata.name) || f.name,\n createdAt: (f.metadata && f.metadata.createdAt) || new Date().toISOString(),\n updatedAt: (f.metadata && f.metadata.updatedAt) || new Date().toISOString(),\n }\n }));\n doc.folders = sanitizedFolders;\n }\n if (data.archivedTabs)\n doc.archivedTabs = data.archivedTabs;\n if (data.activeAgents)\n doc.activeAgents = data.activeAgents;\n });\n return await this.get(workspaceId);\n }\n /**\n * Branch-aware: open a document in a tab\n */\n async openInTabBranchAware(workspaceId, options) {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n if (!doc.tabs)\n doc.tabs = [];\n if (!doc.fileRefs)\n doc.fileRefs = [];\n if (options.reuseTab) {\n const existingTabIndex = doc.tabs.findIndex(tab => tab.documentId === options.documentId);\n if (existingTabIndex !== -1) {\n doc.activeTabId = options.documentId;\n return;\n }\n }\n const existingFileRef = doc.fileRefs.find(ref => ref.id === options.documentId);\n if (!existingFileRef) {\n doc.fileRefs.push({\n id: options.documentId,\n name: options.title || 'Untitled',\n type: options.type || 'text',\n folderId: null,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n });\n }\n doc.tabs.push({ id: options.documentId, documentId: options.documentId, title: options.title || 'Untitled', type: options.type || 'text' });\n doc.activeTabId = options.documentId;\n });\n return await this.get(workspaceId);\n }\n async archiveTabBranchAware(workspaceId, tabId) {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n if (!doc.tabs)\n return;\n const idx = doc.tabs.findIndex(tab => tab.id === tabId);\n if (idx !== -1) {\n doc.tabs.splice(idx, 1);\n if (doc.activeTabId === tabId) {\n doc.activeTabId = doc.tabs.length > 0 ? doc.tabs[doc.tabs.length - 1].id : null;\n }\n }\n });\n }\n async addFileRefBranchAware(workspaceId, fileRef) {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n if (!doc.fileRefs)\n doc.fileRefs = [];\n const refs = doc.fileRefs;\n const existingIndex = refs.findIndex((ref) => ref.id === fileRef.id);\n if (existingIndex !== -1) {\n refs[existingIndex] = {\n id: fileRef.id,\n name: fileRef.name,\n type: fileRef.type || 'text',\n folderId: fileRef.folderId || null,\n createdAt: refs[existingIndex].createdAt,\n updatedAt: new Date().toISOString()\n };\n }\n else {\n refs.push({\n id: fileRef.id,\n name: fileRef.name,\n type: fileRef.type || 'text',\n folderId: fileRef.folderId || null,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n });\n }\n });\n return await this.get(workspaceId);\n }\n async deleteFileRefBranchAware(workspaceId, fileId) {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n const d = doc;\n if (!d.fileRefs)\n return;\n const idx = d.fileRefs.findIndex((ref) => ref.id === fileId);\n if (idx !== -1)\n d.fileRefs.splice(idx, 1);\n if (d.tabs) {\n const tabIndex = d.tabs.findIndex((tab) => tab.documentId === fileId);\n if (tabIndex !== -1) {\n d.tabs.splice(tabIndex, 1);\n if (d.activeTabId === fileId) {\n d.activeTabId = d.tabs.length > 0 ? d.tabs[0].id : null;\n }\n }\n }\n });\n return await this.get(workspaceId);\n }\n async moveFileRefBranchAware(workspaceId, fileId, newFolderId, options) {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n if (!doc.fileRefs)\n return;\n const fileIndex = doc.fileRefs.findIndex(file => file.id === fileId);\n if (fileIndex === -1)\n throw new Error(`File not found: ${fileId}`);\n // Update folderId and updatedAt in place\n const current = doc.fileRefs[fileIndex];\n doc.fileRefs[fileIndex] = { id: current.id, name: current.name, type: current.type, folderId: newFolderId, createdAt: current.createdAt || new Date().toISOString(), updatedAt: new Date().toISOString() };\n if (options) {\n // Create a plain copy for reinsertion to avoid referencing an existing doc object\n const movedFile = { ...doc.fileRefs[fileIndex] };\n doc.fileRefs.splice(fileIndex, 1);\n const destinationFiles = doc.fileRefs.filter(f => f.folderId === newFolderId);\n const insertIndex = Math.min(options.destinationIndex, destinationFiles.length);\n let actualInsertIndex = 0;\n let destinationCount = 0;\n for (let i = 0; i < doc.fileRefs.length; i++) {\n if (doc.fileRefs[i].folderId === newFolderId) {\n if (destinationCount === insertIndex) {\n actualInsertIndex = i;\n break;\n }\n destinationCount++;\n }\n if (i === doc.fileRefs.length - 1)\n actualInsertIndex = doc.fileRefs.length;\n }\n doc.fileRefs.splice(actualInsertIndex, 0, movedFile);\n }\n });\n return await this.get(workspaceId);\n }\n /**\n * Update the active thread for a workspace\n */\n async updateActiveThread(workspaceId, threadId) {\n try {\n return this.update(workspaceId, {\n activeThreadId: threadId\n });\n }\n catch (error) {\n console.error('Error updating active thread:', error);\n throw error;\n }\n }\n /**\n * Get a workspace by ID\n */\n async get(id) {\n try {\n // Use retry logic for cross-device sync scenarios\n const handle = await findWithRetry(this.repo, id);\n if (!handle) {\n throw new Error(`Workspace not found after retries: ${id}`);\n }\n let doc = handle.doc?.();\n if (!doc) {\n const ready = await this.waitForReadyOrTimeout(handle, 3000);\n doc = handle.doc?.() ?? (ready ? handle.doc() : undefined);\n }\n if (!doc) {\n console.error(`Workspace document is empty for ID: ${id}`);\n throw new Error(`Workspace document is not ready: ${id}`);\n }\n if (Array.isArray(doc.archivedTabs) && doc.archivedTabs.length > MAX_ARCHIVED_TABS) {\n await handle.change((mutableDoc) => {\n pruneArchivedTabsInPlace(mutableDoc.archivedTabs);\n });\n doc = handle.doc?.() ?? handle.doc();\n }\n if (!doc) {\n throw new Error(`Failed to get workspace document after archival cleanup: ${id}`);\n }\n return doc;\n }\n catch (error) {\n console.error(`Error getting workspace ${id}:`, error);\n // Handle AbortError and other transaction errors gracefully\n if (error?.name === 'AbortError' || error?.message?.includes('aborted')) {\n console.warn(`Transaction aborted while getting workspace ${id}, retrying...`);\n // Wait a bit and retry once\n await new Promise(resolve => setTimeout(resolve, 100));\n try {\n const handle = await findWithTimeout(this.repo, id);\n if (!handle)\n throw new Error(`Workspace not found after retry: ${id}`);\n const doc = handle.doc?.() ?? handle.doc();\n if (!doc)\n throw new Error(`Workspace document is not ready after retry: ${id}`);\n return doc;\n }\n catch (retryError) {\n console.error(`Failed to get workspace ${id} after retry:`, retryError);\n throw retryError;\n }\n }\n throw error;\n }\n }\n /**\n * List all workspaces\n */\n async list(_query) {\n const appRoot = await this.getAppRoot();\n if (!appRoot || !appRoot.workspaces)\n return [];\n const workspaces = [];\n const fixes = [];\n for (const wsRef of appRoot.workspaces) {\n try {\n const raw = wsRef?.id;\n const sanitized = sanitizeStoredDocumentId(raw);\n if (!sanitized)\n continue;\n if (typeof raw === \"string\" && raw !== sanitized) {\n fixes.push({ from: raw, to: sanitized });\n }\n const workspace = await this.get(sanitized);\n if (workspace)\n workspaces.push(workspace);\n }\n catch (error) {\n console.error(`Error loading workspace ${wsRef?.id}:`, error);\n }\n }\n // Best-effort: repair quoted/stale ids in the root doc to reduce repeated AutomergeUrl errors.\n if (fixes.length > 0) {\n try {\n const rootId = sanitizeStoredDocumentId(await storage.get(\"rootDocId\"));\n if (rootId) {\n const handle = await this.repo.find(rootId);\n if (handle) {\n await this.waitForReadyOrTimeout(handle, 800);\n await handle.change((doc) => {\n if (!Array.isArray(doc.workspaces))\n return;\n for (const fix of fixes) {\n const entry = doc.workspaces.find((w) => w?.id === fix.from);\n if (entry)\n entry.id = fix.to;\n }\n if (doc.metadata)\n doc.metadata.updatedAt = new Date().toISOString();\n });\n }\n }\n }\n catch { }\n }\n return workspaces;\n }\n /**\n * Delete a workspace\n */\n async delete(_id) {\n // Implementation needed\n }\n /**\n * Open a document in a tab\n */\n async openInTab(workspaceId, tab) {\n try {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n handle.change((doc) => {\n if (!doc.tabs)\n doc.tabs = [];\n // Check if tab already exists\n const existingTabIndex = doc.tabs.findIndex(t => t.documentId === tab.documentId);\n if (existingTabIndex !== -1) {\n // Update existing tab\n doc.tabs[existingTabIndex].lastViewed = new Date().toISOString();\n }\n else {\n // Add new tab\n doc.tabs.push({\n id: tab.documentId,\n documentId: tab.documentId,\n title: tab.title,\n type: tab.type,\n lastViewed: new Date().toISOString()\n });\n }\n // Set as active tab\n doc.activeTabId = tab.documentId;\n // Update metadata\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n return workspaceId;\n }\n catch (error) {\n console.error('Error opening document in tab:', error);\n throw error;\n }\n }\n /**\n * Archive a tab\n */\n async archiveTab(workspaceId, tabId) {\n try {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n handle.change((doc) => {\n if (!doc.tabs)\n doc.tabs = [];\n if (!doc.archivedTabs)\n doc.archivedTabs = [];\n // Find the tab to archive\n const tabIndex = doc.tabs.findIndex(t => t.documentId === tabId);\n if (tabIndex !== -1) {\n const tab = doc.tabs[tabIndex];\n // Create archived tab entry\n const archivedTab = {\n id: tab.id,\n documentId: tab.documentId,\n title: tab.title,\n type: tab.type,\n lastViewed: tab.lastViewed,\n archivedAt: new Date().toISOString()\n };\n // Remove any existing archived entry for this document to avoid duplication growth\n const existingArchivedIndex = doc.archivedTabs.findIndex((t) => String(t.documentId || t.id) === String(tab.documentId));\n if (existingArchivedIndex !== -1) {\n doc.archivedTabs.splice(existingArchivedIndex, 1);\n }\n // Add to archived tabs\n doc.archivedTabs.push(archivedTab);\n pruneArchivedTabsInPlace(doc.archivedTabs);\n // Remove from active tabs\n doc.tabs.splice(tabIndex, 1);\n }\n // Update metadata\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n return workspaceId;\n }\n catch (error) {\n console.error('Error archiving tab:', error);\n throw error;\n }\n }\n /**\n * Add a file reference to the workspace\n */\n async addFileRef(workspaceId, fileRef) {\n try {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n handle.change((doc) => {\n if (!doc.fileRefs)\n doc.fileRefs = [];\n // Check if file ref already exists\n const existingRefIndex = doc.fileRefs.findIndex(r => r.id === fileRef.id);\n if (existingRefIndex !== -1) {\n // Update existing ref\n doc.fileRefs[existingRefIndex].name = fileRef.name;\n doc.fileRefs[existingRefIndex].updatedAt = new Date().toISOString();\n if (fileRef.type)\n doc.fileRefs[existingRefIndex].type = validDocumentType(fileRef.type);\n if (fileRef.folderId)\n doc.fileRefs[existingRefIndex].folderId = fileRef.folderId;\n }\n else {\n // Add new file ref\n doc.fileRefs.push({\n id: fileRef.id,\n name: fileRef.name,\n type: validDocumentType(fileRef.type),\n folderId: fileRef.folderId ?? null,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n });\n }\n // Update metadata\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n return workspaceId;\n }\n catch (error) {\n console.error('Error adding file reference:', error);\n throw error;\n }\n }\n async createFolder(name, parentId) {\n const now = new Date().toISOString();\n // Prepare the folder object (id will be set after creation)\n const tempFolderObj = {\n id: 'temp-id', // placeholder for validation\n name,\n parentId,\n createdAt: now,\n updatedAt: now,\n currentView: 'list',\n kanban: { columns: [], fileColumnMap: {} },\n editorContent: '',\n children: [],\n metadata: {\n type: 'workspace-folder',\n name,\n createdAt: now,\n updatedAt: now,\n }\n };\n // Validate with Zod schema (ignore id for now)\n const parseResult = WorkspaceFolderSchema.safeParse({ ...tempFolderObj, id: 'dummy' });\n if (!parseResult.success) {\n throw new Error('Invalid folder schema: ' + JSON.stringify(parseResult.error.format()));\n }\n // Now create the Automerge doc and set the real id\n const folderHandle = this.repo.create();\n folderHandle.change((doc) => {\n Object.assign(doc, { ...tempFolderObj, id: folderHandle.documentId });\n });\n return { ...tempFolderObj, id: folderHandle.documentId };\n }\n // Hierarchical workspace support methods\n /**\n * Convert workspace to hierarchical structure with folderRefs instead of fileRefs\n */\n async convertToHierarchical(workspaceId) {\n console.log('[WorkspaceRepository] Converting workspace to hierarchical structure:', workspaceId);\n try {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n // Initialize folderRefs if not present\n if (!Array.isArray(doc.folderRefs)) {\n doc.folderRefs = [];\n }\n // Add folder structure metadata\n if (!doc.folderStructure) {\n doc.folderStructure = {\n totalFolders: 0,\n totalFiles: 0,\n maxDepth: 0,\n lastStructureUpdate: new Date().toISOString()\n };\n }\n // Add search index metadata\n if (!doc.searchIndex) {\n doc.searchIndex = {\n lastIndexed: new Date().toISOString(),\n indexedFileCount: 0,\n indexVersion: '1.0'\n };\n }\n // Mark as hierarchical by removing fileRefs (if any)\n if (doc.fileRefs) {\n console.log('[WorkspaceRepository] Removing old fileRefs array during conversion');\n delete doc.fileRefs;\n }\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n console.log('[WorkspaceRepository] Successfully converted workspace to hierarchical structure');\n return workspaceId;\n }\n catch (error) {\n console.error('[WorkspaceRepository] Failed to convert workspace to hierarchical:', error);\n throw error;\n }\n }\n /**\n * Check if workspace uses hierarchical folder structure\n */\n async isHierarchical(workspaceId) {\n try {\n const workspace = await this.get(workspaceId);\n // Check if workspace has folderRefs and no fileRefs\n return Array.isArray(workspace.folderRefs) && !workspace.fileRefs;\n }\n catch (error) {\n console.warn('[WorkspaceRepository] Error checking if workspace is hierarchical:', error);\n return false;\n }\n }\n /**\n * Add folder reference to hierarchical workspace\n */\n async addFolderRef(workspaceId, folderRef) {\n console.log('[WorkspaceRepository] Adding folder reference to workspace:', { workspaceId, folderId: folderRef.id });\n try {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n // Initialize folderRefs if needed\n if (!Array.isArray(doc.folderRefs)) {\n doc.folderRefs = [];\n }\n // Remove existing reference if it exists\n const existingIndex = doc.folderRefs.findIndex((ref) => ref.id === folderRef.id);\n if (existingIndex !== -1) {\n doc.folderRefs.splice(existingIndex, 1);\n }\n // Add new folder reference\n doc.folderRefs.push(folderRef);\n // Update folder structure metadata\n if (doc.folderStructure) {\n doc.folderStructure.totalFolders = doc.folderRefs.length;\n doc.folderStructure.lastStructureUpdate = new Date().toISOString();\n }\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n console.log('[WorkspaceRepository] Successfully added folder reference');\n return workspaceId;\n }\n catch (error) {\n console.error('[WorkspaceRepository] Failed to add folder reference:', error);\n throw error;\n }\n }\n /**\n * Remove folder reference from hierarchical workspace\n */\n async removeFolderRef(workspaceId, folderId) {\n console.log('[WorkspaceRepository] Removing folder reference from workspace:', { workspaceId, folderId });\n try {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n if (!Array.isArray(doc.folderRefs)) {\n return; // Nothing to remove\n }\n // Find and remove folder reference\n const folderIndex = doc.folderRefs.findIndex((ref) => ref.id === folderId);\n if (folderIndex !== -1) {\n doc.folderRefs.splice(folderIndex, 1);\n // Update folder structure metadata\n if (doc.folderStructure) {\n doc.folderStructure.totalFolders = doc.folderRefs.length;\n doc.folderStructure.lastStructureUpdate = new Date().toISOString();\n }\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n }\n });\n console.log('[WorkspaceRepository] Successfully removed folder reference');\n return workspaceId;\n }\n catch (error) {\n console.error('[WorkspaceRepository] Failed to remove folder reference:', error);\n throw error;\n }\n }\n /**\n * Update folder reference in hierarchical workspace\n */\n async updateFolderRef(workspaceId, folderId, updates) {\n console.log('[WorkspaceRepository] Updating folder reference in workspace:', { workspaceId, folderId, updates });\n try {\n const handle = await this.repo.find(workspaceId);\n if (!handle)\n throw new Error(`Workspace not found: ${workspaceId}`);\n await handle.change((doc) => {\n if (!Array.isArray(doc.folderRefs)) {\n return; // No folder refs to update\n }\n // Find and update folder reference\n const folderRef = doc.folderRefs.find((ref) => ref.id === folderId);\n if (folderRef) {\n Object.assign(folderRef, updates);\n folderRef.lastModified = new Date().toISOString();\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n }\n });\n console.log('[WorkspaceRepository] Successfully updated folder reference');\n return workspaceId;\n }\n catch (error) {\n console.error('[WorkspaceRepository] Failed to update folder reference:', error);\n throw error;\n }\n }\n /**\n * Get all folder references from hierarchical workspace\n */\n async getFolderRefs(workspaceId) {\n try {\n const workspace = await this.get(workspaceId);\n return Array.isArray(workspace.folderRefs) ? workspace.folderRefs : [];\n }\n catch (error) {\n console.error('[WorkspaceRepository] Failed to get folder references:', error);\n return [];\n }\n }\n}\nfunction validDocumentType(type) {\n const validTypes = [\n 'workspace', 'thread', 'github-account', 'linear-account', 'slack-account', 'document', 'folder', 'tab', 'strategy', 'release', 'source', 'pipeline', 'company', 'person', 'deal', 'email', 'issue', 'slideshow', 'slide', 'agent', 'flow', 'root', 'code', 'text', 'image', 'file', 'github-issues', 'github-pull-requests', 'github-releases', 'github-deployments', 'github-branches', 'repo-analysis', 'issue-board', 'release-plan', 'figma-file'\n ];\n return (typeof type === 'string' && validTypes.includes(type) ? type : 'file');\n}\n", "let activeTaskContext = null;\nexport function setActiveTaskContext(context) {\n activeTaskContext = context;\n}\nexport function getActiveTaskContext() {\n return activeTaskContext;\n}\n", "import { z } from 'zod';\nexport const TaskDocSchema = z.object({\n id: z.string(), // DocumentId\n branchId: z.string(), // DocumentId (was threadId)\n metadata: z.object({\n createdBy: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n status: z.enum(['pending', 'in-progress', 'complete', 'rejected']),\n }).passthrough(),\n description: z.string(),\n context: z.object({\n files: z.array(z.string()), // DocumentId[]\n links: z.array(z.string()),\n }),\n subtasks: z.array(z.string()), // DocumentId[]\n filesUpdated: z.array(z.object({\n fileId: z.string(), // DocumentId\n fileHeadBefore: z.string(),\n fileHeadAfter: z.string(),\n })),\n threadItemIds: z.array(z.string()), // DocumentId[]\n $schema: z.string(),\n});\nexport const TasksDocSchema = z.object({\n id: z.string(), // DocumentId\n branchId: z.string(), // DocumentId (was threadId)\n metadata: z.object({\n createdAt: z.string(),\n updatedAt: z.string(),\n }),\n tasks: z.array(z.string()), // DocumentId[]\n $schema: z.string(),\n});\n", "import { TaskDocSchema, TasksDocSchema } from '../schemas/task-schemas.js';\nexport class TasksRepo {\n constructor(repo) {\n this.repo = repo;\n }\n // TasksDoc CRUD\n async createTasksDoc(branchId, metadata) {\n const handle = this.repo.create();\n const docId = handle.documentId;\n handle.change((doc) => {\n doc.id = docId;\n doc.branchId = branchId;\n doc.metadata = metadata;\n doc.tasks = [];\n doc.$schema = 'mod-core/TasksDoc@v1';\n });\n const doc = handle.doc();\n return TasksDocSchema.parse(doc);\n }\n async getTasksDoc(docId) {\n const handle = await this.repo.find(docId);\n const doc = handle.doc();\n if (!doc)\n return null;\n return TasksDocSchema.parse(doc);\n }\n async updateTasksDoc(docId, updateFn) {\n const handle = await this.repo.find(docId);\n handle.change(updateFn);\n const doc = handle.doc();\n return TasksDocSchema.parse(doc);\n }\n async deleteTasksDoc(docId) {\n // Deletion logic depends on Automerge repo implementation\n // For now, just clear the doc\n const handle = await this.repo.find(docId);\n handle.change((doc) => {\n doc.tasks = [];\n });\n }\n // TaskDoc CRUD\n async createTask(tasksDocId, task) {\n const handle = this.repo.create();\n const docId = handle.documentId;\n handle.change((doc) => {\n Object.assign(doc, task);\n doc.id = docId;\n doc.$schema = 'mod-core/TaskDoc@v1';\n });\n // Add to tasksDoc (robust to sync races): wait for tasksDoc to be available\n let tasksDocHandle = null;\n const deadline = Date.now() + 5000; // up to 5s\n // Retry find until available\n while (!tasksDocHandle && Date.now() < deadline) {\n try {\n tasksDocHandle = await this.repo.find(tasksDocId);\n }\n catch {\n await new Promise(r => setTimeout(r, 120));\n }\n }\n if (!tasksDocHandle) {\n // Final attempt; if still unavailable, throw to let caller surface a clear error\n tasksDocHandle = await this.repo.find(tasksDocId);\n }\n // Apply append with guard\n tasksDocHandle.change((doc) => {\n if (!Array.isArray(doc.tasks))\n doc.tasks = [];\n if (!doc.tasks.includes(docId))\n doc.tasks.push(docId);\n if (!doc.metadata)\n doc.metadata = {};\n ;\n doc.metadata.updatedAt = new Date().toISOString();\n });\n const doc = handle.doc();\n return TaskDocSchema.parse(doc);\n }\n async getTask(docId) {\n const handle = await this.repo.find(docId);\n const doc = handle.doc();\n if (!doc)\n return null;\n return TaskDocSchema.parse(doc);\n }\n async updateTask(docId, updateFn) {\n const handle = await this.repo.find(docId);\n handle.change(updateFn);\n const doc = handle.doc();\n return TaskDocSchema.parse(doc);\n }\n async deleteTask(tasksDocId, taskId) {\n // Remove from tasksDoc\n const tasksDocHandle = await this.repo.find(tasksDocId);\n tasksDocHandle.change((doc) => {\n doc.tasks = doc.tasks.filter(id => id !== taskId);\n });\n // Optionally clear the task doc\n const handle = await this.repo.find(taskId);\n handle.change((doc) => {\n doc.description = '';\n doc.filesUpdated = [];\n doc.threadItemIds = [];\n });\n }\n}\n", "import { TasksRepo } from '../repos/tasks-repo.js';\nimport { BranchService } from './branch-service.js';\nexport class TaskService {\n constructor(repo) {\n this.tasksRepo = new TasksRepo(repo);\n this.branchService = new BranchService(repo);\n }\n // Create a new task and add to tasksDoc\n async createTask(tasksDocId, task) {\n return this.tasksRepo.createTask(tasksDocId, task);\n }\n /**\n * Get the per-file heads for a task: the first observed before-head (startHead)\n * and the last observed after-head (latestHead) for the specified file within\n * the task's `filesUpdated` timeline.\n */\n async getTaskHeads(taskId, fileId) {\n const task = await this.tasksRepo.getTask(taskId);\n if (!task || !Array.isArray(task.filesUpdated))\n return undefined;\n // Filter updates for this file, preserving original order\n const updates = task.filesUpdated.filter(u => u.fileId === fileId);\n if (updates.length === 0)\n return undefined;\n // Start head: prefer the first before-head we captured for the file in this task,\n // otherwise fall back to the first after-head if before-head is missing.\n const first = updates[0];\n const startHead = first.fileHeadBefore || first.fileHeadAfter || undefined;\n // Latest head: prefer the last after-head; if missing, fall back to its before-head.\n const last = updates[updates.length - 1];\n const latestHead = last.fileHeadAfter || last.fileHeadBefore || undefined;\n return { startHead, latestHead };\n }\n // Associate edits with an active task (or create new)\n async associateEditsWithTask(_tasksDocId, taskId, updateFn) {\n return this.tasksRepo.updateTask(taskId, updateFn);\n }\n // Check if a file should be tracked in task history (filter out internal files)\n shouldTrackFile(fileIdOrPath) {\n if (!fileIdOrPath)\n return false;\n const normalized = String(fileIdOrPath).toLowerCase().replace(/\\\\/g, '/');\n // Filter out .claude/ internal files\n if (normalized === '.claude')\n return false;\n if (normalized.startsWith('.claude/'))\n return false;\n if (normalized.includes('/.claude/'))\n return false;\n // Filter out .tmp files\n if (normalized.includes('.tmp.'))\n return false;\n if (normalized.endsWith('.tmp'))\n return false;\n return true;\n }\n // Track files updated for a task\n async addFileUpdateToTask(taskId, fileId, fileHeadBefore, fileHeadAfter) {\n console.log('[TaskService.addFileUpdateToTask]', { taskId, fileId, fileHeadBefore, fileHeadAfter });\n // Skip internal/temporary files\n if (!this.shouldTrackFile(String(fileId))) {\n console.log('[TaskService.addFileUpdateToTask] skipping internal file', { fileId });\n // Return the task unchanged\n return this.tasksRepo.getTask(taskId).then(task => {\n if (!task)\n throw new Error(`Task ${taskId} not found`);\n return task;\n });\n }\n return this.tasksRepo.updateTask(taskId, task => {\n if (!task.filesUpdated)\n task.filesUpdated = [];\n // Deduplicate no-op heads for the same file\n const lastIdx = [...task.filesUpdated].reverse().findIndex(u => u.fileId === fileId);\n if (lastIdx !== -1) {\n const idx = task.filesUpdated.length - 1 - lastIdx;\n const last = task.filesUpdated[idx];\n if (last && last.fileHeadAfter === fileHeadAfter) {\n return;\n }\n }\n task.filesUpdated.push({ fileId: fileId, fileHeadBefore, fileHeadAfter });\n // Track produced after-head for precise task-only diffs\n if (!Array.isArray(task.producedHeads))\n task.producedHeads = [];\n task.producedHeads.push({ fileId: fileId, head: fileHeadAfter });\n });\n }\n // Convenience accessors\n async getProducedHeads(taskId, fileId) {\n const t = await this.tasksRepo.getTask(taskId);\n if (!t)\n return [];\n const arr = t.producedHeads;\n if (!arr)\n return [];\n return (fileId ? arr.filter(x => x.fileId === fileId) : arr).map(x => x.head);\n }\n // Record agent/user trace (thread item IDs)\n async addThreadItemToTask(taskId, threadItemId) {\n return this.tasksRepo.updateTask(taskId, task => {\n if (!task.threadItemIds)\n task.threadItemIds = [];\n if (!task.threadItemIds.includes(threadItemId))\n task.threadItemIds.push(threadItemId);\n });\n }\n // Mark task as ready for review, approved, or rejected\n async setTaskStatus(taskId, status) {\n return this.tasksRepo.updateTask(taskId, task => {\n task.metadata.status = status;\n task.metadata.updatedAt = new Date().toISOString();\n });\n }\n /**\n * Ensure only a single active (in-progress) task exists for a branch/tasksDoc.\n * Sets the provided taskId to in-progress and all others in the same tasksDoc to pending.\n */\n async setActiveTaskExclusive(tasksDocId, taskId) {\n const tasksDoc = await this.tasksRepo.getTasksDoc(tasksDocId);\n if (!tasksDoc)\n return;\n // Update other tasks first to pending\n for (const otherId of tasksDoc.tasks) {\n const oid = otherId;\n if (oid === taskId)\n continue;\n try {\n await this.tasksRepo.updateTask(oid, t => {\n if (t.metadata.status === 'in-progress') {\n t.metadata.status = 'pending';\n t.metadata.updatedAt = new Date().toISOString();\n }\n });\n }\n catch (err) {\n console.error('[TaskService.setActiveTaskExclusive] failed updating other task', { otherId, err });\n }\n }\n // Finally set the chosen task to in-progress\n await this.setTaskStatus(taskId, 'in-progress');\n }\n // Retrieve all tasks for a branch\n async getTasksForBranch(tasksDocId) {\n const tasksDoc = await this.tasksRepo.getTasksDoc(tasksDocId);\n if (!tasksDoc)\n return [];\n const tasks = [];\n for (const taskId of tasksDoc.tasks) {\n try {\n const task = await this.tasksRepo.getTask(taskId);\n if (task)\n tasks.push(task);\n }\n catch (err) {\n const message = String(err?.message || err || '');\n if (message.includes('unavailable')) {\n console.warn('[TaskService.getTasksForBranch] Skipping unavailable task document', {\n taskId,\n tasksDocId,\n });\n continue;\n }\n throw err;\n }\n }\n return tasks;\n }\n // Retrieve a single task\n async getTask(taskId) {\n return this.tasksRepo.getTask(taskId);\n }\n async updateTask(taskId, updateFn) {\n return this.tasksRepo.updateTask(taskId, updateFn);\n }\n // Delete a task from its TasksDoc and clear its content\n async deleteTask(tasksDocId, taskId) {\n await this.tasksRepo.deleteTask(tasksDocId, taskId);\n }\n // Create a new tasksDoc for a branch\n async createTasksDoc(branchId) {\n const now = new Date().toISOString();\n return this.tasksRepo.createTasksDoc(branchId, { createdAt: now, updatedAt: now });\n }\n /**\n * Foundational API: get or create the single TasksDoc for a branch and\n * ensure the branch.tasksDocId points to it before returning.\n */\n async getOrCreateTasksDocForBranch(branchId, branchesDocId) {\n // 1) Prefer existing pointer, but ensure availability; self-heal if it never appears\n try {\n const b = await this.branchService.getBranch(branchId, branchesDocId);\n const existing = b?.tasksDocId;\n if (existing) {\n // Wait briefly for availability\n const until = Date.now() + 5000;\n while (Date.now() < until) {\n try {\n const doc = await this.tasksRepo.getTasksDoc(existing);\n if (doc)\n return existing;\n }\n catch { }\n await new Promise(r => setTimeout(r, 120));\n }\n // If still unavailable after waiting, treat as missing and repair below\n }\n }\n catch { }\n // 2) Create and attach, then confirm persistence\n const created = await this.createTasksDoc(branchId);\n const finalId = created?.id;\n await this.branchService.setTasksDocId(branchId, finalId, branchesDocId);\n const deadline = Date.now() + 3000;\n while (Date.now() < deadline) {\n try {\n const b = await this.branchService.getBranch(branchId, branchesDocId);\n if (String(b?.tasksDocId || '') === String(finalId))\n break;\n }\n catch { }\n await new Promise(r => setTimeout(r, 80));\n }\n return finalId;\n }\n // Get a tasksDoc\n async getTasksDoc(tasksDocId) {\n return this.tasksRepo.getTasksDoc(tasksDocId);\n }\n /**\n * Get ordered timeline of tasks for a branch. Uses the order in TasksDoc.tasks.\n */\n async getBranchTaskTimeline(branchId, branchesDocId) {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n const tasksDocId = branch?.tasksDocId || undefined;\n if (!tasksDocId)\n return [];\n const tasksDoc = await this.tasksRepo.getTasksDoc(tasksDocId);\n if (!tasksDoc)\n return [];\n return (tasksDoc.tasks || []);\n }\n /**\n * Replace the timeline order for a branch's tasks.\n * Only reorders existing taskIds; unknown ids are ignored.\n */\n async setBranchTaskTimeline(branchId, branchesDocId, taskIds) {\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n const tasksDocId = branch?.tasksDocId || undefined;\n if (!tasksDocId)\n return;\n await this.tasksRepo.updateTasksDoc(tasksDocId, (doc) => {\n const existing = new Set((doc.tasks || []));\n const reordered = [];\n for (const id of taskIds) {\n if (existing.has(id))\n reordered.push(id);\n }\n // Append any remaining existing tasks that were not specified to preserve them\n for (const id of existing) {\n if (!reordered.includes(id))\n reordered.push(id);\n }\n doc.tasks = reordered;\n doc.metadata.updatedAt = new Date().toISOString();\n });\n }\n /**\n * Compute cumulative snapshot heads for each file as of a given task in a branch.\n * Walks the ordered task list up to and including the target task and applies fileHeadAfter.\n * Initializes from parent branch fileHeads if present; otherwise starts empty.\n */\n async computeTaskSnapshotHeads(args) {\n const { branchId, branchesDocId, taskId } = args;\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n if (!branch)\n return {};\n const tasksDocId = branch.tasksDocId || undefined;\n if (!tasksDocId)\n return {};\n const tasksDoc = await this.tasksRepo.getTasksDoc(tasksDocId);\n if (!tasksDoc)\n return {};\n // Base heads from parent branch if any; else start empty\n let baseHeads = {};\n if (branch.parentBranchId) {\n try {\n const parent = await this.branchService.getBranch(branch.parentBranchId, branchesDocId);\n if (parent?.fileHeads)\n baseHeads = { ...parent.fileHeads };\n }\n catch { }\n }\n const timeline = (tasksDoc.tasks || []);\n const targetIndex = timeline.findIndex((id) => id === taskId);\n const applyUntil = targetIndex === -1 ? timeline.length : targetIndex + 1;\n const heads = { ...baseHeads };\n for (let i = 0; i < applyUntil; i++) {\n const tid = timeline[i];\n try {\n const t = await this.tasksRepo.getTask(tid);\n if (!t || !Array.isArray(t.filesUpdated))\n continue;\n for (const u of t.filesUpdated) {\n const fid = u.fileId;\n if (u.fileHeadAfter)\n heads[fid] = u.fileHeadAfter;\n }\n }\n catch { }\n }\n return heads;\n }\n /**\n * Return local diffs (before/after heads) for a specific task.\n */\n async computeTaskLocalDiffs(taskId) {\n const task = await this.tasksRepo.getTask(taskId);\n if (!task || !Array.isArray(task.filesUpdated))\n return [];\n return task.filesUpdated.map(u => ({\n fileId: u.fileId,\n beforeHead: u.fileHeadBefore,\n afterHead: u.fileHeadAfter,\n }));\n }\n}\n", "import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n", "import { randomFillSync } from 'crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n", "import { randomUUID } from 'crypto';\nexport default { randomUUID };\n", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n", "export { default as MAX } from './max.js';\nexport { default as NIL } from './nil.js';\nexport { default as parse } from './parse.js';\nexport { default as stringify } from './stringify.js';\nexport { default as v1 } from './v1.js';\nexport { default as v1ToV6 } from './v1ToV6.js';\nexport { default as v3 } from './v3.js';\nexport { default as v4 } from './v4.js';\nexport { default as v5 } from './v5.js';\nexport { default as v6 } from './v6.js';\nexport { default as v6ToV1 } from './v6ToV1.js';\nexport { default as v7 } from './v7.js';\nexport { default as validate } from './validate.js';\nexport { default as version } from './version.js';\n", "import { BaseRepository } from './base-repo.js';\nimport { v4 as uuidv4 } from 'uuid';\nexport class PermissionRepository extends BaseRepository {\n /**\n * Create document access control for a new document\n */\n async create(data) {\n const handle = this.repo.create();\n const now = this.getTimestamp();\n handle.change((doc) => {\n doc.id = handle.documentId;\n doc.documentId = data.documentId;\n doc.ownerId = data.ownerId;\n doc.permissions = [];\n doc.isPublic = data.isPublic || false;\n doc.metadata = {\n type: 'documentAccess',\n createdAt: now,\n updatedAt: now,\n };\n });\n // Store mapping from document ID to access control doc\n this.storeAccessMapping(data.documentId, handle.documentId);\n return handle.documentId;\n }\n /**\n * Update document access\n */\n async update(id, data) {\n const handle = await this.getHandle(id);\n const now = this.getTimestamp();\n handle.change((doc) => {\n if (data.permissions !== undefined)\n doc.permissions = data.permissions;\n if (data.isPublic !== undefined)\n doc.isPublic = data.isPublic;\n doc.metadata.updatedAt = now;\n });\n return handle.documentId;\n }\n /**\n * Get document access control\n */\n async get(id) {\n const handle = await this.getHandle(id);\n await handle.whenReady();\n const doc = handle.doc();\n if (!doc) {\n throw new Error(`Document access not found: ${id}`);\n }\n return doc;\n }\n /**\n * Delete document access control\n */\n async delete(id) {\n // In Automerge, we typically don't delete documents\n // Instead, we could mark them as deleted or remove the mapping\n const doc = await this.get(id);\n this.removeAccessMapping(doc.documentId);\n }\n /**\n * List (placeholder)\n */\n async list() {\n return [];\n }\n /**\n * Get access control by document ID\n */\n async getByDocumentId(documentId) {\n // First try localStorage mapping\n let accessDocId = this.getAccessDocId(documentId);\n // If not in localStorage, try to get it from the workspace metadata (synced)\n if (!accessDocId) {\n try {\n const workspaceHandle = await this.repo.find(documentId);\n await workspaceHandle.whenReady();\n const workspace = workspaceHandle.doc();\n const permDocId = workspace?.metadata?.permissionDocId;\n if (permDocId) {\n accessDocId = permDocId;\n // Store it in localStorage for faster future lookups\n this.storeAccessMapping(documentId, accessDocId);\n }\n }\n catch (e) {\n console.warn('Failed to read permission doc ID from workspace metadata:', e);\n }\n }\n if (!accessDocId)\n return null;\n try {\n return await this.get(accessDocId);\n }\n catch {\n return null;\n }\n }\n /**\n * Grant access to a user for a document\n */\n async grantAccess(documentId, userId, role, grantedBy) {\n let accessDoc = await this.getByDocumentId(documentId);\n if (!accessDoc) {\n throw new Error(`Document access not found for document: ${documentId}`);\n }\n const handle = await this.getHandle(accessDoc.id);\n const now = this.getTimestamp();\n handle.change((doc) => {\n // Remove existing permission for this user if any\n const existingIndex = doc.permissions.findIndex((p) => p.userId === userId);\n if (existingIndex >= 0) {\n doc.permissions.splice(existingIndex, 1);\n }\n // Add new permission\n doc.permissions.push({\n userId,\n role,\n grantedAt: now,\n grantedBy,\n });\n doc.metadata.updatedAt = now;\n });\n }\n /**\n * Revoke access for a user\n */\n async revokeAccess(documentId, userId) {\n const accessDoc = await this.getByDocumentId(documentId);\n if (!accessDoc)\n return;\n const handle = await this.getHandle(accessDoc.id);\n const now = this.getTimestamp();\n handle.change((doc) => {\n const index = doc.permissions.findIndex((p) => p.userId === userId);\n if (index >= 0) {\n doc.permissions.splice(index, 1);\n doc.metadata.updatedAt = now;\n }\n });\n }\n /**\n * Check if a user has permission for a document\n */\n async checkPermission(documentId, userId, requiredRole) {\n const accessDoc = await this.getByDocumentId(documentId);\n if (!accessDoc) {\n return { granted: false, reason: 'No access control found' };\n }\n // Owner has all permissions\n if (accessDoc.ownerId === userId) {\n return { granted: true, role: 'admin' };\n }\n // Public documents allow viewer access\n if (accessDoc.isPublic && !requiredRole) {\n return { granted: true, role: 'viewer' };\n }\n // Check explicit permissions\n const permission = accessDoc.permissions.find((p) => p.userId === userId);\n if (!permission) {\n return { granted: false, reason: 'No permission found for user' };\n }\n // If no specific role required, any permission grants access\n if (!requiredRole) {\n return { granted: true, role: permission.role };\n }\n // Check if user's role is sufficient\n const roleHierarchy = {\n viewer: 1,\n editor: 2,\n admin: 3,\n };\n const hasPermission = roleHierarchy[permission.role] >= roleHierarchy[requiredRole];\n return {\n granted: hasPermission,\n role: permission.role,\n reason: hasPermission ? undefined : 'Insufficient permissions',\n };\n }\n /**\n * Get all documents a user has access to\n */\n async getUserDocuments(userId) {\n // This would require proper indexing in a real implementation\n // For now, we'd need to scan all access documents\n // This is a placeholder that returns empty array\n return [];\n }\n /**\n * Create a share link for a document\n */\n async createShareLink(documentId, createdBy, role, expiresAt) {\n const handle = this.repo.create();\n const now = this.getTimestamp();\n const linkId = uuidv4();\n handle.change((doc) => {\n doc.id = handle.documentId;\n doc.documentId = documentId;\n doc.createdBy = createdBy;\n doc.role = role;\n if (expiresAt !== undefined) {\n doc.expiresAt = expiresAt.toISOString();\n }\n doc.accessCount = 0;\n doc.linkId = linkId;\n doc.metadata = {\n type: 'shareLink',\n createdAt: now,\n updatedAt: now,\n };\n });\n // Store mapping for lookup\n this.storeShareLinkMapping(linkId, handle.documentId);\n return handle.doc();\n }\n /**\n * Get a share link by ID\n */\n async getShareLink(linkId) {\n const docId = this.getShareLinkDocId(linkId);\n if (!docId)\n return null;\n try {\n const handle = await this.repo.find(docId);\n if (!handle)\n return null;\n await handle.whenReady();\n const doc = handle.doc();\n // Check if link has expired\n if (doc?.expiresAt && new Date(doc.expiresAt) < new Date()) {\n return null;\n }\n return doc;\n }\n catch {\n return null;\n }\n }\n /**\n * Redeem a share link (increment access count and grant permission)\n */\n async redeemShareLink(linkId, userId) {\n const shareLink = await this.getShareLink(linkId);\n if (!shareLink) {\n throw new Error('Share link not found or expired');\n }\n // Increment access count\n const handle = await this.repo.find(shareLink.id);\n if (handle) {\n handle.change((doc) => {\n doc.accessCount += 1;\n doc.metadata.updatedAt = this.getTimestamp();\n });\n }\n // Grant access to the user\n await this.grantAccess(shareLink.documentId, userId, shareLink.role, shareLink.createdBy);\n }\n // Private helper methods\n storeAccessMapping(documentId, accessDocId) {\n if (typeof localStorage === 'undefined')\n return;\n localStorage.setItem(`access:${documentId}`, accessDocId);\n }\n getAccessDocId(documentId) {\n if (typeof localStorage === 'undefined')\n return null;\n return localStorage.getItem(`access:${documentId}`);\n }\n removeAccessMapping(documentId) {\n if (typeof localStorage === 'undefined')\n return;\n localStorage.removeItem(`access:${documentId}`);\n }\n storeShareLinkMapping(linkId, docId) {\n if (typeof localStorage === 'undefined')\n return;\n localStorage.setItem(`shareLink:${linkId}`, docId);\n }\n getShareLinkDocId(linkId) {\n if (typeof localStorage === 'undefined')\n return null;\n return localStorage.getItem(`shareLink:${linkId}`);\n }\n}\n", "import { PermissionRepository } from '../repos/permission-repo.js';\n/**\n * PermissionService handles all permission and access control logic.\n * It coordinates document sharing, permission checking, and share link management.\n */\nexport class PermissionService {\n constructor(repo) {\n this.repo = repo;\n this.permissionRepo = new PermissionRepository(repo);\n }\n /**\n * Initialize permissions for a new document\n */\n async initializeDocumentPermissions(documentId, ownerId, isPublic = false) {\n const accessDocId = await this.permissionRepo.create({\n documentId,\n ownerId,\n isPublic,\n });\n // Store the permission doc ID in the workspace metadata so it syncs\n try {\n const workspaceHandle = await this.repo.find(documentId);\n workspaceHandle.change((doc) => {\n if (!doc.metadata)\n doc.metadata = {};\n doc.metadata.permissionDocId = accessDocId;\n });\n }\n catch (e) {\n console.warn('Failed to store permission doc ID in workspace metadata:', e);\n }\n return await this.permissionRepo.get(accessDocId);\n }\n /**\n * Grant access to a user for a document\n */\n async grantAccess(documentId, userId, role, grantedBy) {\n // Verify that the granter has admin permissions\n const granterCheck = await this.checkPermission(documentId, grantedBy, 'admin');\n if (!granterCheck.granted) {\n throw new Error('Only admins can grant access to documents');\n }\n await this.permissionRepo.grantAccess(documentId, userId, role, grantedBy);\n }\n /**\n * Revoke access for a user\n */\n async revokeAccess(documentId, userId, revokedBy) {\n // Verify that the revoker has admin permissions\n const revokerCheck = await this.checkPermission(documentId, revokedBy, 'admin');\n if (!revokerCheck.granted) {\n throw new Error('Only admins can revoke access to documents');\n }\n // Can't revoke owner's access\n const accessDoc = await this.permissionRepo.getByDocumentId(documentId);\n if (accessDoc?.ownerId === userId) {\n throw new Error('Cannot revoke owner access');\n }\n await this.permissionRepo.revokeAccess(documentId, userId);\n }\n /**\n * Check if a user has permission for a document\n */\n async checkPermission(documentId, userId, requiredRole) {\n return await this.permissionRepo.checkPermission(documentId, userId, requiredRole);\n }\n /**\n * Get all permissions for a document\n */\n async getDocumentPermissions(documentId) {\n return await this.permissionRepo.getByDocumentId(documentId);\n }\n /**\n * Get all documents a user has access to\n */\n async getUserDocuments(userId) {\n return await this.permissionRepo.getUserDocuments(userId);\n }\n /**\n * Make a document public\n */\n async makeDocumentPublic(documentId, userId) {\n const check = await this.checkPermission(documentId, userId, 'admin');\n if (!check.granted) {\n throw new Error('Only admins can change document visibility');\n }\n const accessDoc = await this.permissionRepo.getByDocumentId(documentId);\n if (!accessDoc) {\n throw new Error('Document access not found');\n }\n await this.permissionRepo.update(accessDoc.id, { isPublic: true });\n }\n /**\n * Make a document private\n */\n async makeDocumentPrivate(documentId, userId) {\n const check = await this.checkPermission(documentId, userId, 'admin');\n if (!check.granted) {\n throw new Error('Only admins can change document visibility');\n }\n const accessDoc = await this.permissionRepo.getByDocumentId(documentId);\n if (!accessDoc) {\n throw new Error('Document access not found');\n }\n await this.permissionRepo.update(accessDoc.id, { isPublic: false });\n }\n /**\n * Create a share link for a document\n */\n async createShareLink(documentId, createdBy, options) {\n // Verify user has share permissions\n const check = await this.checkPermission(documentId, createdBy, 'editor');\n if (!check.granted) {\n throw new Error('You need at least editor access to create share links');\n }\n return await this.permissionRepo.createShareLink(documentId, createdBy, options.role, options.expiresAt);\n }\n /**\n * Get a share link by ID\n */\n async getShareLink(linkId) {\n return await this.permissionRepo.getShareLink(linkId);\n }\n /**\n * Redeem a share link\n */\n async redeemShareLink(linkId, userId) {\n const shareLink = await this.getShareLink(linkId);\n if (!shareLink) {\n throw new Error('Share link not found or expired');\n }\n await this.permissionRepo.redeemShareLink(linkId, userId);\n }\n /**\n * Transfer document ownership\n */\n async transferOwnership(documentId, newOwnerId, currentOwnerId) {\n const accessDoc = await this.permissionRepo.getByDocumentId(documentId);\n if (!accessDoc) {\n throw new Error('Document access not found');\n }\n // Verify current owner\n if (accessDoc.ownerId !== currentOwnerId) {\n throw new Error('Only the current owner can transfer ownership');\n }\n // Update owner\n await this.permissionRepo.update(accessDoc.id, { ownerId: newOwnerId });\n // Grant admin access to new owner if they don't already have it\n const newOwnerPermission = accessDoc.permissions.find((p) => p.userId === newOwnerId);\n if (!newOwnerPermission || newOwnerPermission.role !== 'admin') {\n await this.permissionRepo.grantAccess(documentId, newOwnerId, 'admin', currentOwnerId);\n }\n }\n /**\n * Share workspace with another user\n */\n async shareWorkspace(workspaceId, targetUserId, role, sharedBy) {\n await this.grantAccess(workspaceId, targetUserId, role, sharedBy);\n }\n /**\n * Get all users who have access to a document\n */\n async getDocumentCollaborators(documentId) {\n const accessDoc = await this.permissionRepo.getByDocumentId(documentId);\n if (!accessDoc) {\n return [];\n }\n return accessDoc.permissions;\n }\n /**\n * Check if a document is public\n */\n async isDocumentPublic(documentId) {\n const accessDoc = await this.permissionRepo.getByDocumentId(documentId);\n return accessDoc?.isPublic || false;\n }\n /**\n * Get document owner\n */\n async getDocumentOwner(documentId) {\n const accessDoc = await this.permissionRepo.getByDocumentId(documentId);\n return accessDoc?.ownerId || null;\n }\n // ============================================================================\n // BRANCH PERMISSIONS\n // ============================================================================\n /**\n * Initialize permissions for a new branch\n */\n async initializeBranchPermissions(branchId, workspaceId, ownerId, isWorkspaceShared = false) {\n const accessDocId = await this.permissionRepo.create({\n documentId: branchId,\n ownerId,\n isPublic: false,\n });\n // Store the permission doc ID in the branch metadata\n try {\n const branchHandle = await this.repo.find(branchId);\n branchHandle.change((doc) => {\n if (!doc.metadata)\n doc.metadata = {};\n doc.metadata.permissionDocId = accessDocId;\n doc.metadata.workspaceId = workspaceId;\n doc.metadata.isWorkspaceShared = isWorkspaceShared;\n });\n }\n catch (e) {\n console.warn('Failed to store permission doc ID in branch metadata:', e);\n }\n return accessDocId;\n }\n /**\n * Make branch accessible to all workspace members\n */\n async shareBranchWithWorkspace(branchId, workspaceId, sharedBy) {\n // Verify admin permission on branch\n const check = await this.checkPermission(branchId, sharedBy, 'admin');\n if (!check.granted) {\n throw new Error('Only admins can share branches with workspace');\n }\n // Update branch metadata to mark as workspace-shared\n try {\n const branchHandle = await this.repo.find(branchId);\n branchHandle.change((doc) => {\n if (!doc.metadata)\n doc.metadata = {};\n doc.metadata.isWorkspaceShared = true;\n doc.metadata.workspaceSharedBy = sharedBy;\n doc.metadata.workspaceSharedAt = new Date().toISOString();\n });\n }\n catch (e) {\n console.error('Failed to update branch metadata:', e);\n throw new Error('Failed to share branch with workspace');\n }\n }\n /**\n * Check if a branch is shared with all workspace members\n */\n async isBranchWorkspaceShared(branchId) {\n try {\n const branchHandle = await this.repo.find(branchId);\n await branchHandle.whenReady();\n const branch = branchHandle.doc();\n return branch?.metadata?.isWorkspaceShared || false;\n }\n catch {\n return false;\n }\n }\n /**\n * Check branch permission (includes workspace-shared check)\n */\n async checkBranchPermission(branchId, workspaceId, userId, requiredRole) {\n // First check if branch is workspace-shared\n const isWorkspaceShared = await this.isBranchWorkspaceShared(branchId);\n if (isWorkspaceShared) {\n // Check if user has workspace access\n const workspaceCheck = await this.checkPermission(workspaceId, userId, requiredRole);\n if (workspaceCheck.granted) {\n return workspaceCheck;\n }\n }\n // Fall back to direct branch permission check\n return await this.checkPermission(branchId, userId, requiredRole);\n }\n /**\n * Get all members with access to a branch\n */\n async getBranchMembers(branchId, workspaceId) {\n const isWorkspaceShared = await this.isBranchWorkspaceShared(branchId);\n if (isWorkspaceShared) {\n // Return all workspace members\n return await this.getDocumentCollaborators(workspaceId);\n }\n // Return only direct branch members\n return await this.getDocumentCollaborators(branchId);\n }\n // ============================================================================\n // FILE PERMISSIONS\n // ============================================================================\n /**\n * Initialize permissions for a new file\n */\n async initializeFilePermissions(fileId, workspaceId, ownerId, branchId, fileName) {\n const accessDocId = await this.permissionRepo.create({\n documentId: fileId,\n ownerId,\n isPublic: false,\n });\n // Store the permission doc ID in the file metadata\n try {\n const fileHandle = await this.repo.find(fileId);\n fileHandle.change((doc) => {\n if (!doc.metadata)\n doc.metadata = {};\n doc.metadata.permissionDocId = accessDocId;\n doc.metadata.workspaceId = workspaceId;\n if (branchId)\n doc.metadata.branchId = branchId;\n if (fileName)\n doc.metadata.fileName = fileName;\n });\n }\n catch (e) {\n console.warn('Failed to store permission doc ID in file metadata:', e);\n }\n return accessDocId;\n }\n /**\n * Check file permission with proper inheritance\n * Inheritance: File members \u2192 Branch members (includes files) \u2192 Workspace members (workspace-wide branches only)\n */\n async checkFilePermission(fileId, workspaceId, userId, requiredRole, branchId) {\n // 1. Check direct file permission first (most specific)\n const fileCheck = await this.checkPermission(fileId, userId, requiredRole);\n if (fileCheck.granted) {\n return fileCheck;\n }\n // 2. Check branch permission if file is in a branch\n // Branch members have access to all files in their branches\n if (branchId) {\n const branchCheck = await this.checkBranchPermission(branchId, workspaceId, userId, requiredRole);\n if (branchCheck.granted) {\n return branchCheck;\n }\n }\n // 3. Workspace members don't automatically get file access\n // (they only get workspace-wide branches, not all files)\n return { granted: false, reason: 'No file access' };\n }\n /**\n * Get all members with access to a file\n */\n async getFileMembers(fileId, workspaceId, branchId) {\n // Get direct file members\n const fileMembers = await this.getDocumentCollaborators(fileId);\n // If file has specific permissions, return those\n if (fileMembers.length > 0) {\n return fileMembers;\n }\n // Otherwise inherit from branch or workspace\n if (branchId) {\n return await this.getBranchMembers(branchId, workspaceId);\n }\n return await this.getDocumentCollaborators(workspaceId);\n }\n}\n", "import { BaseRepository } from './base-repo.js';\nimport { getActiveTaskContext } from '../services/task-tracking.js';\n/**\n * FolderRepository manages folder document persistence and operations\n * Supports branch-aware operations for hierarchical workspace architecture\n */\nexport class FolderRepository extends BaseRepository {\n constructor(repo, branchableRepo) {\n super(repo);\n this.branchableRepo = branchableRepo;\n }\n /**\n * Create a new folder document (not branch-aware)\n */\n async create(data) {\n console.log('[FolderRepository] Creating folder document:', data.id);\n const handle = await this.repo.create();\n const documentId = handle.documentId;\n const now = this.getTimestamp();\n await handle.change((doc) => {\n // Set required fields\n doc.id = data.id || documentId;\n doc.metadata = {\n type: 'folder-document',\n name: data.metadata?.name || 'Untitled Folder',\n path: data.metadata?.path || '',\n workspaceId: data.metadata?.workspaceId || '',\n fileCount: 0,\n totalSize: 0,\n createdAt: now,\n updatedAt: now,\n lastFileModified: now,\n ...(data.metadata || {})\n };\n doc.fileRefs = data.fileRefs || [];\n doc.subfolders = data.subfolders || [];\n if (data.permissions) {\n doc.permissions = data.permissions;\n }\n });\n console.log('[FolderRepository] Created folder document:', documentId);\n return documentId;\n }\n /**\n * Create folder document with branch awareness\n */\n async createBranchAware(data, branchContext) {\n console.log('[FolderRepository] Creating branch-aware folder:', { folderId: data.id, branchContext });\n const handle = await this.repo.create();\n const documentId = handle.documentId;\n // Get folder handle with branch context\n const folderHandle = await this.branchableRepo.openHandle(documentId, {\n branchId: branchContext.branchId,\n workspaceId: branchContext.workspaceId,\n });\n const now = this.getTimestamp();\n const taskContext = branchContext.taskId\n ? { taskId: branchContext.taskId }\n : await getActiveTaskContext();\n await folderHandle.change((doc) => {\n doc.id = data.id || documentId;\n doc.metadata = {\n type: 'folder-document',\n name: data.metadata?.name || 'Untitled Folder',\n path: data.metadata?.path || '',\n workspaceId: branchContext.workspaceId,\n fileCount: 0,\n totalSize: 0,\n createdAt: now,\n updatedAt: now,\n lastFileModified: now,\n ...(data.metadata || {})\n };\n doc.fileRefs = data.fileRefs || [];\n doc.subfolders = data.subfolders || [];\n if (data.permissions) {\n doc.permissions = data.permissions;\n }\n }, taskContext || undefined);\n console.log('[FolderRepository] Created branch-aware folder document:', documentId);\n return documentId;\n }\n /**\n * Update folder document\n */\n async update(id, data) {\n this.validateId(id);\n console.log('[FolderRepository] Updating folder document:', id);\n const handle = await this.getHandle(id);\n const now = this.getTimestamp();\n await handle.change((doc) => {\n if (data.metadata) {\n doc.metadata = {\n ...doc.metadata,\n ...data.metadata,\n updatedAt: now\n };\n }\n if (data.fileRefs) {\n doc.fileRefs = data.fileRefs;\n doc.metadata.fileCount = data.fileRefs.length;\n doc.metadata.lastFileModified = now;\n }\n if (data.subfolders) {\n doc.subfolders = data.subfolders;\n }\n if (data.permissions) {\n doc.permissions = data.permissions;\n }\n });\n console.log('[FolderRepository] Updated folder document:', id);\n return id;\n }\n /**\n * Update folder with branch awareness\n */\n async updateBranchAware(id, data, branchContext) {\n this.validateId(id);\n console.log('[FolderRepository] Updating branch-aware folder:', { id, branchContext });\n const folderHandle = await this.branchableRepo.openHandle(id, {\n branchId: branchContext.branchId,\n workspaceId: branchContext.workspaceId,\n });\n const now = this.getTimestamp();\n const taskContext = branchContext.taskId\n ? { taskId: branchContext.taskId }\n : await getActiveTaskContext();\n await folderHandle.change((doc) => {\n if (data.metadata) {\n doc.metadata = {\n ...doc.metadata,\n ...data.metadata,\n updatedAt: now\n };\n }\n if (data.fileRefs) {\n doc.fileRefs = data.fileRefs;\n doc.metadata.fileCount = data.fileRefs.length;\n doc.metadata.lastFileModified = now;\n }\n if (data.subfolders) {\n doc.subfolders = data.subfolders;\n }\n if (data.permissions) {\n doc.permissions = data.permissions;\n }\n }, taskContext || undefined);\n console.log('[FolderRepository] Updated branch-aware folder:', id);\n return id;\n }\n /**\n * Get folder document\n */\n async get(id) {\n this.validateId(id);\n const handle = await this.getHandle(id);\n return handle.doc();\n }\n /**\n * Get folder document with branch awareness\n */\n async getBranchAware(id, branchContext) {\n this.validateId(id);\n const folderHandle = await this.branchableRepo.openHandle(id, {\n branchId: branchContext.branchId,\n workspaceId: branchContext.workspaceId,\n });\n return folderHandle.doc();\n }\n /**\n * Delete folder document\n */\n async delete(id) {\n this.validateId(id);\n console.log('[FolderRepository] Deleting folder document:', id);\n const handle = await this.getHandle(id);\n // Note: Automerge doesn't have built-in delete, so we mark as deleted\n await handle.change((doc) => {\n doc.metadata.deletedAt = this.getTimestamp();\n doc.metadata.updatedAt = this.getTimestamp();\n });\n console.log('[FolderRepository] Marked folder as deleted:', id);\n }\n /**\n * List folder documents (basic implementation)\n */\n async list(query) {\n // Note: This is a basic implementation\n // In production, you'd want proper querying/indexing\n console.log('[FolderRepository] Listing folders with query:', query);\n return [];\n }\n // File reference management within folders\n /**\n * Add file reference to folder\n */\n async addFileRef(folderId, fileRef, branchContext) {\n console.log('[FolderRepository] Adding file reference to folder:', { folderId, fileId: fileRef.id, branchContext });\n const folderHandle = await this.branchableRepo.openHandle(folderId, {\n branchId: branchContext.branchId,\n workspaceId: branchContext.workspaceId,\n });\n const taskContext = branchContext.taskId\n ? { taskId: branchContext.taskId }\n : await getActiveTaskContext();\n await folderHandle.change((doc) => {\n // Initialize arrays if needed\n if (!Array.isArray(doc.fileRefs)) {\n doc.fileRefs = [];\n }\n // Check capacity limit (200 files per folder)\n if (doc.fileRefs.length >= 200) {\n throw new Error(`Folder ${folderId} exceeds maximum capacity of 200 files`);\n }\n // Remove existing reference if it exists\n const existingIndex = doc.fileRefs.findIndex((ref) => ref.id === fileRef.id);\n if (existingIndex !== -1) {\n doc.fileRefs.splice(existingIndex, 1);\n }\n // Add new file reference\n doc.fileRefs.push(fileRef);\n // Update folder metadata\n if (doc.metadata) {\n doc.metadata.fileCount = doc.fileRefs.length;\n doc.metadata.updatedAt = this.getTimestamp();\n doc.metadata.lastFileModified = this.getTimestamp();\n }\n }, taskContext || undefined);\n console.log('[FolderRepository] Added file reference to folder:', folderId);\n }\n /**\n * Remove file reference from folder\n */\n async removeFileRef(folderId, fileId, branchContext) {\n console.log('[FolderRepository] Removing file reference from folder:', { folderId, fileId, branchContext });\n const folderHandle = await this.branchableRepo.openHandle(folderId, {\n branchId: branchContext.branchId,\n workspaceId: branchContext.workspaceId,\n });\n const taskContext = branchContext.taskId\n ? { taskId: branchContext.taskId }\n : await getActiveTaskContext();\n await folderHandle.change((doc) => {\n if (!Array.isArray(doc.fileRefs)) {\n return; // Nothing to remove\n }\n // Find and remove file reference\n const fileIndex = doc.fileRefs.findIndex((ref) => ref.id === fileId);\n if (fileIndex !== -1) {\n doc.fileRefs.splice(fileIndex, 1);\n // Update folder metadata\n if (doc.metadata) {\n doc.metadata.fileCount = doc.fileRefs.length;\n doc.metadata.updatedAt = this.getTimestamp();\n }\n }\n }, taskContext || undefined);\n console.log('[FolderRepository] Removed file reference from folder:', folderId);\n }\n /**\n * Move file reference between folders\n */\n async moveFileRef(sourceFolderId, targetFolderId, fileId, branchContext) {\n console.log('[FolderRepository] Moving file reference between folders:', {\n sourceFolderId, targetFolderId, fileId, branchContext\n });\n // Get the file reference from source folder\n const sourceFolder = await this.getBranchAware(sourceFolderId, branchContext);\n const fileRef = sourceFolder.fileRefs?.find(ref => ref.id === fileId);\n if (!fileRef) {\n throw new Error(`File ${fileId} not found in source folder ${sourceFolderId}`);\n }\n // Add to target folder\n await this.addFileRef(targetFolderId, fileRef, branchContext);\n // Remove from source folder\n await this.removeFileRef(sourceFolderId, fileId, branchContext);\n console.log('[FolderRepository] Moved file reference between folders:', {\n sourceFolderId, targetFolderId, fileId\n });\n }\n /**\n * Get all file references in a folder\n */\n async getFileRefs(folderId, branchContext) {\n const folder = await this.getBranchAware(folderId, branchContext);\n return Array.isArray(folder.fileRefs) ? folder.fileRefs : [];\n }\n /**\n * Check if folder exists\n */\n async exists(id) {\n try {\n await this.getHandle(id);\n return true;\n }\n catch (error) {\n return false;\n }\n }\n /**\n * Check if folder exists with branch awareness\n */\n async existsBranchAware(id, branchContext) {\n try {\n await this.branchableRepo.openHandle(id, {\n branchId: branchContext.branchId,\n workspaceId: branchContext.workspaceId,\n });\n return true;\n }\n catch (error) {\n return false;\n }\n }\n}\n", "import { FolderRepository } from '../repos/folder-repo.js';\nimport { getActiveTaskContext } from './task-tracking.js';\n/**\n * FolderService manages hierarchical folder document operations\n * Provides scalable file organization by distributing files across folder documents\n */\nexport class FolderService {\n constructor(repo, branchableRepo) {\n this.folderCache = new Map();\n this.MAX_FILES_PER_FOLDER = 200;\n this.CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes\n this.MAX_CACHE_SIZE = 50;\n this.repo = repo;\n this.branchableRepo = branchableRepo;\n this.folderRepo = new FolderRepository(repo, branchableRepo);\n this.startCacheCleanup();\n }\n /**\n * @spec workspace/REQ-INFRA-1.2.3 Start periodic cache cleanup timer\n */\n startCacheCleanup() {\n // Run cleanup every 5 minutes\n setInterval(() => {\n this.cleanupExpiredCache().catch(error => {\n console.error('[FolderService] Cache cleanup error:', error);\n });\n }, 5 * 60 * 1000);\n }\n /**\n * Create a new folder document with metadata\n */\n async createFolderDocument(folderId, folderPath, workspaceId, branchId, options = {}) {\n console.log('[FolderService] Creating folder document:', { folderId, folderPath, workspaceId, branchId });\n try {\n const branchContext = {\n branchId,\n workspaceId\n };\n const folderData = {\n id: folderId,\n metadata: {\n name: options.name || this.extractFolderName(folderPath),\n path: folderPath,\n workspaceId,\n fileCount: 0,\n totalSize: 0,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n lastFileModified: new Date().toISOString(),\n type: 'folder-document',\n ...(options.description && { description: options.description })\n },\n fileRefs: [],\n subfolders: []\n };\n const documentId = await this.folderRepo.createBranchAware(folderData, branchContext);\n console.log('[FolderService] Created folder document successfully:', documentId);\n this.folderCache.delete(folderId);\n return documentId;\n }\n catch (error) {\n console.error('[FolderService] Failed to create folder document:', error);\n throw new Error(`Failed to create folder document: ${error}`);\n }\n }\n /**\n * @spec workspace/REQ-INFRA-1.1.1 Get folder document by ID with LRU caching\n */\n async getFolderDocument(folderId, branchId, workspaceId) {\n const cached = this.folderCache.get(folderId);\n if (cached) {\n const now = Date.now();\n if (now - cached.lastAccessed < this.CACHE_TTL_MS) {\n // Update last accessed time for LRU\n cached.lastAccessed = now;\n this.folderCache.set(folderId, cached);\n return cached.document;\n }\n else {\n // Remove expired entry\n this.folderCache.delete(folderId);\n }\n }\n try {\n const documentId = await this.resolveFolderDocumentId(folderId, branchId, workspaceId);\n if (!documentId) {\n console.log('[FolderService] Folder document not found:', folderId);\n return null;\n }\n const branchContext = {\n branchId,\n workspaceId: workspaceId || '' // Will be resolved from context\n };\n const doc = await this.folderRepo.getBranchAware(documentId, branchContext);\n await this.addToCache(folderId, doc);\n return doc;\n }\n catch (error) {\n console.error('[FolderService] Failed to get folder document:', error);\n return null;\n }\n }\n /**\n * Add file reference to folder document\n */\n async addFileToFolder(folderId, fileRef, branchId, workspaceId) {\n console.log('[FolderService] Adding file to folder:', { folderId, fileId: fileRef.id, branchId });\n try {\n const documentId = await this.resolveFolderDocumentId(folderId, branchId, workspaceId);\n if (!documentId) {\n throw new Error(`Folder document not found: ${folderId}`);\n }\n const branchContext = {\n branchId,\n workspaceId: workspaceId || '' // Will be resolved from folder metadata\n };\n await this.folderRepo.addFileRef(documentId, fileRef, branchContext);\n // Clear cache to ensure fresh data\n this.folderCache.delete(folderId);\n console.log('[FolderService] Successfully added file to folder');\n }\n catch (error) {\n console.error('[FolderService] Failed to add file to folder:', error);\n throw error;\n }\n }\n /**\n * Remove file reference from folder document\n */\n async removeFileFromFolder(folderId, fileId, branchId, workspaceId) {\n console.log('[FolderService] Removing file from folder:', { folderId, fileId, branchId });\n try {\n const documentId = await this.resolveFolderDocumentId(folderId, branchId, workspaceId);\n if (!documentId) {\n throw new Error(`Folder document not found: ${folderId}`);\n }\n const folderHandle = await this.branchableRepo.openHandle(documentId, {\n branchId,\n workspaceId: (workspaceId || ''),\n });\n const taskContext = await getActiveTaskContext();\n await folderHandle.change((doc) => {\n if (!Array.isArray(doc.fileRefs)) {\n return; // Nothing to remove\n }\n // Find and remove file reference\n const fileIndex = doc.fileRefs.findIndex((ref) => ref.id === fileId);\n if (fileIndex !== -1) {\n doc.fileRefs.splice(fileIndex, 1);\n // Update folder metadata\n if (doc.metadata) {\n doc.metadata.fileCount = doc.fileRefs.length;\n doc.metadata.updatedAt = new Date().toISOString();\n }\n }\n }, taskContext || undefined);\n // Clear cache\n this.folderCache.delete(folderId);\n console.log('[FolderService] Successfully removed file from folder');\n }\n catch (error) {\n console.error('[FolderService] Failed to remove file from folder:', error);\n throw error;\n }\n }\n /**\n * glassware[type=implementation, id=impl-rename-file-in-folder, requirements=req-fd-rename-4]\n * Rename a file within a folder document\n */\n async renameFileInFolder(folderId, fileId, newName, branchId, workspaceId) {\n console.log('[FolderService] Renaming file in folder:', { folderId, fileId, newName, branchId });\n try {\n const documentId = await this.resolveFolderDocumentId(folderId, branchId, workspaceId);\n if (!documentId) {\n throw new Error(`Folder document not found: ${folderId}`);\n }\n const folderHandle = await this.branchableRepo.openHandle(documentId, {\n branchId,\n workspaceId: (workspaceId || ''),\n });\n const taskContext = await getActiveTaskContext();\n await folderHandle.change((doc) => {\n if (!Array.isArray(doc.fileRefs)) {\n return;\n }\n // Find and rename file reference\n const fileRef = doc.fileRefs.find((ref) => ref.id === fileId);\n if (fileRef) {\n fileRef.name = newName;\n fileRef.updatedAt = new Date().toISOString();\n // Update folder metadata\n if (doc.metadata) {\n doc.metadata.updatedAt = new Date().toISOString();\n doc.metadata.lastFileModified = new Date().toISOString();\n }\n }\n }, taskContext || undefined);\n // Clear cache\n this.folderCache.delete(folderId);\n console.log('[FolderService] Successfully renamed file in folder');\n }\n catch (error) {\n console.error('[FolderService] Failed to rename file in folder:', error);\n throw error;\n }\n }\n /**\n * glassware[type=implementation, id=impl-get-file-ref-from-folder, requirements=req-fd-move-3]\n * Get a file reference from a folder (for move operations)\n */\n async getFileRefFromFolder(folderId, fileId, branchId, workspaceId) {\n const folderDoc = await this.getFolderDocument(folderId, branchId, workspaceId);\n if (!folderDoc || !Array.isArray(folderDoc.fileRefs)) {\n return null;\n }\n return folderDoc.fileRefs.find((ref) => ref.id === fileId) || null;\n }\n /**\n * List all file references in a folder\n */\n async listFolderContents(folderId, branchId, workspaceId) {\n const folderDoc = await this.getFolderDocument(folderId, branchId, workspaceId);\n if (!folderDoc) {\n return [];\n }\n return Array.isArray(folderDoc.fileRefs) ? folderDoc.fileRefs : [];\n }\n /**\n * Organize files into logical folder groups\n */\n organizeFolderStructure(files, options = {}) {\n console.log('[FolderService] Organizing folder structure for', files.length, 'files');\n const opts = {\n maxFilesPerFolder: options.maxFilesPerFolder || 200,\n preferDirectoryStructure: options.preferDirectoryStructure !== false,\n respectPackageBoundaries: options.respectPackageBoundaries !== false,\n groupSimilarFileTypes: options.groupSimilarFileTypes || false,\n createRootFolder: options.createRootFolder !== false,\n customGroupingRules: options.customGroupingRules || []\n };\n const folders = new Map();\n const unassignedFiles = [];\n const warnings = [];\n // Group files by folder path\n for (const file of files) {\n const folderPath = this.determineFolderPath(file.relativePath, opts);\n if (!folderPath) {\n unassignedFiles.push(file);\n continue;\n }\n if (!folders.has(folderPath)) {\n folders.set(folderPath, {\n path: folderPath,\n name: this.extractFolderName(folderPath),\n files: [],\n estimatedSize: 0,\n organizationReason: this.getOrganizationReason(folderPath),\n requiresSplit: false\n });\n }\n const folder = folders.get(folderPath);\n folder.files.push(file);\n folder.estimatedSize += file.size;\n }\n // Check for oversized folders and mark them for splitting\n for (const [path, folder] of folders) {\n if (folder.files.length > opts.maxFilesPerFolder) {\n folder.requiresSplit = true;\n warnings.push({\n type: 'oversized_folder',\n message: `Folder \"${folder.name}\" contains ${folder.files.length} files, exceeds limit of ${opts.maxFilesPerFolder}`,\n affectedFiles: folder.files.map(f => f.relativePath),\n suggestion: 'Consider splitting into subfolders or adjusting grouping rules'\n });\n }\n }\n const folderArray = Array.from(folders.values());\n // Calculate statistics\n const statistics = {\n totalFiles: files.length,\n totalFolders: folderArray.length,\n averageFilesPerFolder: folderArray.length > 0 ? files.length / folderArray.length : 0,\n oversizedFolders: folderArray.filter(f => f.requiresSplit).length\n };\n console.log('[FolderService] Organization complete:', statistics);\n return {\n folders: folderArray,\n unassignedFiles,\n warnings,\n statistics\n };\n }\n /**\n * Split an oversized folder into multiple smaller folders\n */\n async splitOversizedFolder(folderId, branchId) {\n console.log('[FolderService] Splitting oversized folder:', folderId);\n const folderDoc = await this.getFolderDocument(folderId, branchId);\n if (!folderDoc || !folderDoc.fileRefs || folderDoc.fileRefs.length <= this.MAX_FILES_PER_FOLDER) {\n return [folderId]; // No split needed\n }\n const files = folderDoc.fileRefs;\n const newFolderIds = [];\n try {\n // Split files into chunks\n const chunkSize = this.MAX_FILES_PER_FOLDER;\n const chunks = this.chunkArray(files, chunkSize);\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const newFolderId = `${folderId}-${i + 1}`;\n const newFolderPath = `${folderDoc.metadata.path}-${i + 1}`;\n // Create new folder document\n await this.createFolderDocument(newFolderId, newFolderPath, folderDoc.metadata.workspaceId, branchId, {\n name: `${folderDoc.metadata.name} (${i + 1})`,\n description: `Split from ${folderDoc.metadata.name}`\n });\n // Add files to new folder\n for (const fileRef of chunk) {\n await this.addFileToFolder(newFolderId, fileRef, branchId);\n }\n newFolderIds.push(newFolderId);\n }\n console.log('[FolderService] Split folder into', newFolderIds.length, 'parts');\n return newFolderIds;\n }\n catch (error) {\n console.error('[FolderService] Failed to split folder:', error);\n throw error;\n }\n }\n /**\n * Get complete workspace folder structure\n */\n async getWorkspaceFolderStructure(workspaceId, branchId) {\n // This would integrate with workspace service to load the hierarchical structure\n // For now, return a basic structure\n console.log('[FolderService] Getting workspace folder structure:', workspaceId);\n return {\n workspace: {}, // Would be loaded from workspace service\n folders: new Map(),\n hierarchy: {\n root: {\n folderId: 'root',\n name: 'Root',\n path: '',\n children: [],\n fileCount: 0,\n totalSize: 0,\n depth: 0,\n isLoaded: true\n },\n nodesByPath: new Map(),\n totalNodes: 0,\n maxDepth: 0\n },\n loadedAt: new Date().toISOString(),\n isComplete: false\n };\n }\n // Private helper methods\n async resolveFolderDocumentId(folderId, branchId, workspaceId) {\n try {\n // First check if the folderId is already a valid document ID\n const directDoc = await this.repo.find(folderId);\n if (directDoc) {\n return folderId;\n }\n }\n catch {\n // Not a direct document ID, need to resolve through workspace\n }\n // If no workspaceId provided, we can't resolve the folder reference\n if (!workspaceId) {\n console.warn('[FolderService] Cannot resolve folder document ID without workspace context:', folderId);\n return null;\n }\n try {\n // Get the workspace document to find the folder reference\n const workspace = await this.branchableRepo.openHandle(workspaceId, {\n branchId,\n workspaceId: workspaceId\n });\n const workspaceDoc = workspace.doc();\n // Look up the folder reference by ID to get the actual document ID\n if (Array.isArray(workspaceDoc.folderRefs)) {\n const folderRef = workspaceDoc.folderRefs.find((ref) => ref.id === folderId);\n if (folderRef && folderRef.documentId) {\n return folderRef.documentId;\n }\n }\n console.warn('[FolderService] Folder reference not found in workspace folderRefs:', folderId);\n return null;\n }\n catch (error) {\n console.error('[FolderService] Failed to resolve folder document ID:', error);\n return null;\n }\n }\n determineFolderPath(relativePath, options) {\n // Extract directory path from file\n const parts = relativePath.split('/');\n if (parts.length <= 1) {\n return options.createRootFolder ? 'root' : null;\n }\n if (options.preferDirectoryStructure) {\n // Use immediate parent directory\n return parts.slice(0, -1).join('/');\n }\n if (options.respectPackageBoundaries && parts[0] === 'packages' && parts.length > 2) {\n // Use package name for package-based structure\n return parts.slice(0, 2).join('/');\n }\n // Default to parent directory\n return parts.slice(0, -1).join('/');\n }\n extractFolderName(folderPath) {\n const parts = folderPath.split('/');\n return parts[parts.length - 1] || 'Root';\n }\n getOrganizationReason(folderPath) {\n if (folderPath.includes('packages/'))\n return 'package';\n if (folderPath.includes('/'))\n return 'directory';\n return 'fallback';\n }\n chunkArray(array, chunkSize) {\n const chunks = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n chunks.push(array.slice(i, i + chunkSize));\n }\n return chunks;\n }\n /**\n * @spec workspace/REQ-INT-1.2 Validate folder capacities across workspace\n */\n async validateFolderCapacities(workspaceId) {\n console.log('[FolderService] Validating folder capacities for workspace:', workspaceId);\n try {\n // Get workspace to access folder references\n const workspace = await this.branchableRepo.openHandle(workspaceId, {\n branchId: 'main', // Use main branch for validation\n workspaceId\n });\n const doc = workspace.doc();\n if (!Array.isArray(doc.folderRefs)) {\n return {\n isValid: true,\n violatingFolders: [],\n totalViolations: 0,\n recommendedActions: []\n };\n }\n const violatingFolders = [];\n for (const folderRef of doc.folderRefs) {\n if (folderRef.fileCount > this.MAX_FILES_PER_FOLDER) {\n violatingFolders.push({\n folderId: folderRef.id,\n currentFileCount: folderRef.fileCount,\n capacityLimit: this.MAX_FILES_PER_FOLDER,\n utilizationPercentage: Math.round((folderRef.fileCount / this.MAX_FILES_PER_FOLDER) * 100),\n requiresAction: true\n });\n }\n }\n const recommendedActions = violatingFolders.map(folder => `Split folder ${folder.folderId} (${folder.currentFileCount} files exceeds ${folder.capacityLimit} limit)`);\n return {\n isValid: violatingFolders.length === 0,\n violatingFolders,\n totalViolations: violatingFolders.length,\n recommendedActions\n };\n }\n catch (error) {\n console.error('[FolderService] Failed to validate folder capacities:', error);\n throw error;\n }\n }\n /**\n * @spec workspace/REQ-INFRA-2.1.1 Automatic folder splitting at 200 files\n */\n async splitOversizedFolderById(folderId, branchId) {\n console.log('[FolderService] Splitting oversized folder:', folderId);\n try {\n const folder = await this.getFolderDocument(folderId, branchId || 'main');\n if (!folder || folder.fileRefs.length <= this.MAX_FILES_PER_FOLDER) {\n return [folderId]; // No split needed\n }\n const chunkSize = this.MAX_FILES_PER_FOLDER;\n const chunks = this.chunkArray(folder.fileRefs, chunkSize);\n const splitFolderIds = [];\n for (let i = 0; i < chunks.length; i++) {\n const splitId = i === 0 ? folderId : `${folderId}-${i + 1}`;\n splitFolderIds.push(splitId);\n if (i > 0) {\n // Create new folder document for additional chunks\n await this.createFolderDocument(splitId, `${folder.metadata.path}-${i + 1}`, folder.metadata.workspaceId, branchId || 'main', { name: `${folder.metadata.name} (${i + 1})` });\n // Add files to the new folder\n for (const fileRef of chunks[i]) {\n await this.addFileToFolder(splitId, fileRef, branchId || 'main');\n }\n }\n else {\n // Update original folder with first chunk\n await this.updateFolderFiles(splitId, chunks[i], branchId);\n }\n }\n console.log(`[FolderService] Split folder ${folderId} into ${splitFolderIds.length} folders`);\n return splitFolderIds;\n }\n catch (error) {\n console.error('[FolderService] Failed to split oversized folder:', error);\n throw error;\n }\n }\n /**\n * @spec workspace/REQ-INFRA-1.1.2 LRU cache management with capacity limits\n */\n async addToCache(folderId, document) {\n const now = Date.now();\n if (this.folderCache.size >= this.MAX_CACHE_SIZE) {\n await this.evictLRUEntry();\n }\n // Add new entry to cache\n this.folderCache.set(folderId, {\n document,\n lastAccessed: now\n });\n }\n /**\n * @spec workspace/REQ-INFRA-1.2.2 Automatic cleanup of unused document handles\n */\n async evictLRUEntry() {\n let oldestKey = null;\n let oldestTime = Date.now();\n // Find the least recently used entry\n for (const [key, value] of this.folderCache.entries()) {\n if (value.lastAccessed < oldestTime) {\n oldestTime = value.lastAccessed;\n oldestKey = key;\n }\n }\n if (oldestKey) {\n console.log('[FolderService] Evicting LRU cache entry:', oldestKey);\n this.folderCache.delete(oldestKey);\n }\n }\n /**\n * @spec workspace/REQ-INFRA-1.2.3 Memory pressure monitoring with proactive eviction\n */\n async cleanupExpiredCache() {\n const now = Date.now();\n const expiredKeys = [];\n for (const [key, value] of this.folderCache.entries()) {\n if (now - value.lastAccessed > this.CACHE_TTL_MS) {\n expiredKeys.push(key);\n }\n }\n for (const key of expiredKeys) {\n console.log('[FolderService] Removing expired cache entry:', key);\n this.folderCache.delete(key);\n }\n console.log(`[FolderService] Cache cleanup: removed ${expiredKeys.length} expired entries, ${this.folderCache.size} remaining`);\n }\n /**\n * Helper method to update folder files\n */\n async updateFolderFiles(folderId, fileRefs, branchId) {\n try {\n const documentId = await this.resolveFolderDocumentId(folderId, branchId || 'main', undefined);\n if (!documentId) {\n throw new Error(`Cannot resolve document ID for folder: ${folderId}`);\n }\n const folderHandle = await this.branchableRepo.openHandle(documentId, {\n branchId: branchId || 'main',\n workspaceId: documentId // Use folder document as workspace context\n });\n const taskContext = await getActiveTaskContext();\n await folderHandle.change((doc) => {\n doc.fileRefs = fileRefs;\n doc.metadata.fileCount = fileRefs.length;\n doc.metadata.updatedAt = new Date().toISOString();\n doc.metadata.lastFileModified = new Date().toISOString();\n }, taskContext || undefined);\n }\n catch (error) {\n console.error('[FolderService] Failed to update folder files:', error);\n throw error;\n }\n }\n}\n", "import { WorkspaceRepository } from '../repos/workspace-repo.js';\nimport { ThreadService } from './thread-service.js';\nimport { BranchService } from './branch-service.js';\nimport { BranchableRepo } from \"./branchable-repo.js\";\nimport { getActiveTaskContext } from './task-tracking.js';\nimport { TaskService } from './task-service.js';\nimport { PermissionService } from './permission-service.js';\nimport { FolderService } from './folder-service.js';\n// Utility to deeply clone a folder and strip Automerge proxies\nfunction toPlainFolder(folder) {\n return {\n id: folder.id,\n name: folder.name,\n parentId: folder.parentId,\n createdAt: folder.createdAt,\n updatedAt: folder.updatedAt,\n currentView: (folder.currentView === 'list' || folder.currentView === 'kanban' || folder.currentView === 'grid' || folder.currentView === 'editor') ? folder.currentView : 'list',\n kanban: {\n columns: Array.isArray(folder.kanban?.columns) ? [...folder.kanban.columns] : [],\n fileColumnMap: folder.kanban?.fileColumnMap ? { ...folder.kanban.fileColumnMap } : {},\n },\n editorContent: folder.editorContent || '',\n children: Array.isArray(folder.children) ? [...folder.children] : [],\n // Ensure metadata is a plain object, not an Automerge proxy\n metadata: folder.metadata ? {\n type: folder.metadata.type,\n name: folder.metadata.name,\n createdAt: folder.metadata.createdAt,\n updatedAt: folder.metadata.updatedAt,\n } : {\n type: 'workspace-folder',\n name: folder.name,\n createdAt: folder.createdAt,\n updatedAt: folder.updatedAt,\n },\n };\n}\n/**\n * WorkspaceService handles all workspace-related business logic.\n * It coordinates between the repository layer (WorkspaceRepository) and other services.\n */\nexport class WorkspaceService {\n constructor(repo) {\n this.repo = repo;\n this.workspaceRepo = new WorkspaceRepository(repo);\n this.branchService = new BranchService(repo);\n this.branchableRepo = new BranchableRepo(repo);\n this.threadService = new ThreadService(repo);\n this.permissionService = new PermissionService(repo);\n this.folderService = new FolderService(repo, this.branchableRepo);\n }\n /**\n * Initialize the app root document or find an existing one\n */\n async initAppRoot() {\n return this.workspaceRepo.initAppRoot();\n }\n /**\n * Create a new workspace with optional branching\n * @param data - Workspace data\n * @param options - Creation options\n * @param options.skipBranching - If true, skip branching setup (faster, simpler workspaces)\n */\n async createWorkspace(data, options) {\n try {\n const skipBranching = options?.skipBranching ?? false;\n // Create the workspace as hierarchical by default\n const now = new Date().toISOString();\n const workspaceId = await this.workspaceRepo.create({\n title: data?.title || 'Untitled Workspace',\n activeThreadId: null,\n activeBranchId: null,\n activeTabId: null,\n branchesDocId: '', // Empty - will be set if branching is enabled\n activeAgents: [],\n tabs: [],\n // Create hierarchical workspace structure from the start (per REQ-IMPL-6)\n folderRefs: [], // Use folderRefs instead of fileRefs\n fileRefs: [], // Also initialize fileRefs for non-hierarchical access\n folderStructure: {\n totalFolders: 0,\n totalFiles: 0,\n maxDepth: 0,\n lastStructureUpdate: now\n },\n searchIndex: {\n lastIndexed: now,\n indexedFileCount: 0,\n indexVersion: '1.0'\n },\n archivedTabs: [],\n metadata: {\n type: \"workspace\",\n name: data?.title || 'Untitled Workspace',\n createdAt: now,\n updatedAt: now,\n ...data?.metadata\n },\n ...data\n });\n // Get the created workspace\n let workspace = await this.workspaceRepo.get(workspaceId);\n // Skip branching and app root registration if requested - just return the simple workspace\n // This is used by mod-app-new which stores workspace IDs on the user document instead\n if (skipBranching) {\n console.log('[WorkspaceService] Created simple workspace (no branching, no app root):', workspaceId);\n return workspace;\n }\n // Add the workspace to the app root (only for full workspace setup)\n await this.workspaceRepo.addWorkspaceToRoot({\n id: workspaceId,\n title: data?.title || 'Untitled Workspace',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n });\n // Set up branching if not skipped\n let attempts = 0;\n while (!(workspace.branchesDocId && workspace.branchesDocId.trim() !== '') && attempts < 3) {\n workspace = await this.ensureBranchingSetup(workspace);\n attempts++;\n }\n if (!(workspace.branchesDocId && workspace.branchesDocId.trim() !== '')) {\n throw new Error(`Workspace creation failed to set up branching: branchesDocId=${workspace.branchesDocId}`);\n }\n return workspace;\n }\n catch (error) {\n // Handle AbortError and other transaction errors gracefully\n if (error?.name === 'AbortError' || error?.message?.includes('aborted')) {\n console.warn('Transaction aborted during workspace creation, retrying...');\n // Wait a bit and retry once\n await new Promise(resolve => setTimeout(resolve, 200));\n // Don't retry the full creation, just log and re-throw for now\n console.error(\"Workspace creation failed with AbortError, please try again\");\n }\n console.error(\"Failed to create workspace:\", error);\n console.error(\"Error details:\", {\n message: error?.message || 'Unknown error',\n stack: error?.stack || 'No stack trace'\n });\n throw error;\n }\n }\n /**\n * Create a new workspace with an empty thread\n */\n async createWorkspaceWithThread(data, initialMessage) {\n // Create the workspace with proper branching setup\n let workspace = await this.createWorkspace(data);\n // Defensive: ensure branching setup again after update\n let attempts = 0;\n while ((!(workspace.branchesDocId && workspace.branchesDocId.trim() !== '')) && attempts < 3) {\n workspace = await this.ensureBranchingSetup(workspace);\n attempts++;\n }\n if (!(workspace.branchesDocId && workspace.branchesDocId.trim() !== '')) {\n throw new Error(`Workspace post-creation invariant failed: missing branch or thread. branchesDocId: ${workspace.branchesDocId}`);\n }\n // Always use workspace from here on\n const threadService = new ThreadService(this.repo);\n // Ensure the main branch exists and has a thread without creating a new branch\n const branches = await this.branchService.getBranchesForWorkspace(workspace.branchesDocId);\n const mainBranch = branches.find((b) => b?.metadata?.type === 'main') || branches[0];\n if (!mainBranch?.id) {\n throw new Error('[createWorkspaceWithThread] Failed to resolve main branch for workspace');\n }\n await this.ensureBranchThread(workspace.id, mainBranch.id);\n let branchWithThread = await this.branchService.getBranch(mainBranch.id, workspace.branchesDocId);\n let threadId = branchWithThread?.threadId;\n if (!threadId) {\n // Fallback: create a thread doc without creating a new branch and persist it\n threadId = await threadService.createThread('New Thread', mainBranch.id);\n try {\n await this.branchService.setThreadId(mainBranch.id, threadId, workspace.branchesDocId);\n }\n catch (err) {\n console.warn('[createWorkspaceWithThread] Failed to persist threadId on main branch', err);\n }\n branchWithThread = await this.branchService.getBranch(mainBranch.id, workspace.branchesDocId);\n }\n await this.updateWorkspace(workspace.id, {\n activeThreadId: threadId,\n activeBranchId: mainBranch.id\n });\n // Get the updated workspace after thread assignment\n const updatedWorkspace = await this.getWorkspace(workspace.id);\n return {\n workspace: updatedWorkspace,\n threadId: threadId\n };\n }\n /**\n * Get a workspace by ID\n */\n async getWorkspace(id) {\n try {\n let workspace = await this.workspaceRepo.get(id);\n // Only attempt branching setup if we haven't already completed it for this workspace\n if (!WorkspaceService.branchingSetupCompleted.has(id)) {\n workspace = await this.ensureBranchingSetup(workspace);\n // Mark as completed regardless of success/failure to prevent repeated attempts\n WorkspaceService.branchingSetupCompleted.add(id);\n // Always use the workspace returned by ensureBranchingSetup\n return workspace;\n }\n return workspace;\n }\n catch (error) {\n // Handle AbortError and other transaction errors gracefully\n if (error?.name === 'AbortError' || error?.message?.includes('aborted')) {\n console.warn(`Transaction aborted while getting workspace ${id}, retrying...`);\n // Wait a bit and retry once\n await new Promise(resolve => setTimeout(resolve, 100));\n try {\n let workspace = await this.workspaceRepo.get(id);\n // Only attempt branching setup if we haven't already completed it for this workspace\n if (!WorkspaceService.branchingSetupCompleted.has(id)) {\n workspace = await this.ensureBranchingSetup(workspace);\n // Mark as completed regardless of success/failure to prevent repeated attempts\n WorkspaceService.branchingSetupCompleted.add(id);\n // Always use the workspace returned by ensureBranchingSetup\n return workspace;\n }\n return workspace;\n }\n catch (retryError) {\n console.error(`Failed to get workspace ${id} after retry:`, retryError);\n throw retryError;\n }\n }\n throw error;\n }\n }\n /**\n * Ensure workspace has proper branching setup (migration helper)\n */\n async ensureBranchingSetup(workspace) {\n // Check if workspace already has branching setup\n if (workspace.branchesDocId && workspace.branchesDocId.trim() !== '') {\n // If it's the temporary setup values, treat as setup in progress\n if (workspace.branchesDocId === 'SETUP_IN_PROGRESS') {\n console.warn(\"Workspace has temporary setup values, treating as setup in progress:\", workspace.id);\n return workspace;\n }\n // Mark as completed so we don't try again\n WorkspaceService.branchingSetupCompleted.add(workspace.id);\n return workspace;\n }\n // Check if setup is already in progress for this workspace to prevent infinite loops\n if (WorkspaceService.branchingSetupInProgress.has(workspace.id)) {\n console.warn(\"Branching setup already in progress for workspace:\", workspace.id, \"- skipping\");\n return workspace;\n }\n // Check if this workspace looks like it came from sync but just hasn't loaded the branchesDocId yet\n // If it has fileRefs or other data, it's probably syncing from another peer - don't set up branching\n if ((workspace.fileRefs && workspace.fileRefs.length > 0) || workspace.tabs?.length || workspace.folders?.length) {\n console.log(\"[ensureBranchingSetup] Workspace appears to be syncing from peer, skipping setup:\", workspace.id);\n return workspace;\n }\n WorkspaceService.branchingSetupInProgress.add(workspace.id);\n try {\n console.log('[ensureBranchingSetup] Starting branching setup for workspace:', workspace.id);\n // Only use in-memory flag to prevent concurrent setup; do not persist 'SETUP_IN_PROGRESS'\n // Create branches document for this workspace\n console.log('[ensureBranchingSetup] Creating branches document...');\n const { docId: branchesDocId } = await this.branchService.createBranchesDoc();\n console.log('[ensureBranchingSetup] Branches document created:', branchesDocId);\n if (!branchesDocId) {\n console.error(`[ensureBranchingSetup] Failed to create branchesDocId for workspace: ${workspace.id}`);\n throw new Error(`[ensureBranchingSetup] Failed to create branchesDocId for workspace: ${workspace.id}`);\n }\n // Create main branch for the workspace\n // Gather all fileRefs (and workspace doc) to initialize fileHeads\n console.log('[ensureBranchingSetup] Creating main branch...');\n const fileHeads = { [workspace.id]: '' };\n if (Array.isArray(workspace.fileRefs)) {\n for (const ref of workspace.fileRefs) {\n fileHeads[ref.id] = '';\n }\n }\n const mainBranch = await this.branchService.createBranch(null, // No parent for main branch\n 'main', workspace.id, 'main', 'system', branchesDocId, fileHeads);\n // After main branch creation, update its fileHeads for the workspace doc to the actual current head\n const mainBranchRepo = this.branchService['branchRepo'];\n if (mainBranchRepo && typeof mainBranchRepo.getWorkspaceHead === 'function') {\n const wsHead = await mainBranchRepo.getWorkspaceHead(workspace.id);\n if (wsHead) {\n mainBranch.fileHeads[workspace.id] = wsHead;\n await this.branchService['branchRepo'].update({ ...mainBranch, fileHeads: { ...mainBranch.fileHeads } }, branchesDocId);\n }\n }\n if (!mainBranch || !mainBranch.id) {\n console.error(`[ensureBranchingSetup] Failed to create main branch for workspace: ${workspace.id}`);\n throw new Error(`[ensureBranchingSetup] Failed to create main branch for workspace: ${workspace.id}`);\n }\n console.log('[ensureBranchingSetup] Main branch created:', mainBranch.id);\n // Update workspace with real branching setup using direct repository call to avoid circular dependency\n console.log('[ensureBranchingSetup] Updating workspace with branchesDocId...');\n await this.workspaceRepo.update(workspace.id, {\n branchesDocId\n });\n console.log('[ensureBranchingSetup] Workspace updated with branchesDocId');\n // Return updated workspace using direct repository call\n console.log('[ensureBranchingSetup] Getting updated workspace...');\n const updatedWorkspace = await this.workspaceRepo.get(workspace.id);\n console.log('[ensureBranchingSetup] Got updated workspace');\n if (!updatedWorkspace.branchesDocId) {\n console.error(`[ensureBranchingSetup] Branching setup failed: branchesDocId=${updatedWorkspace.branchesDocId}`);\n throw new Error(`[ensureBranchingSetup] Branching setup failed: branchesDocId=${updatedWorkspace.branchesDocId}`);\n }\n // Patch: After branchesDocId is set, update main branch's fileHeads for workspace doc\n // Use a timeout to prevent hangs in deployed environments\n try {\n const wsHandlePromise = this.repo.find(workspace.id);\n const wsHandle = await Promise.race([\n wsHandlePromise,\n new Promise((resolve) => setTimeout(() => resolve(null), 3000))\n ]);\n if (wsHandle) {\n const wsHead = wsHandle.heads()[0];\n await this.branchService.updateFileHead(mainBranch.id, workspace.id, wsHead, branchesDocId);\n }\n else {\n console.warn('[ensureBranchingSetup] Timeout waiting for workspace handle, skipping fileHead update');\n }\n }\n catch (err) {\n console.error('[ensureBranchingSetup] Failed to update main branch fileHead for workspace doc:', err);\n }\n // Ensure main branch has a thread and persist its threadId on the branch\n // Use a timeout to prevent hangs - thread creation is not critical for workspace creation\n try {\n await Promise.race([\n this.ensureBranchThread(workspace.id, mainBranch.id),\n new Promise((resolve) => setTimeout(() => {\n console.warn('[ensureBranchingSetup] Timeout waiting for branch thread setup, continuing...');\n resolve();\n }, 3000))\n ]);\n }\n catch (e) {\n console.warn('[ensureBranchingSetup] ensureBranchThread failed:', e);\n }\n return updatedWorkspace;\n }\n catch (error) {\n console.error(\"[ensureBranchingSetup] Failed to setup branching for workspace:\", workspace.id, error);\n console.error(\"Error details:\", {\n message: error?.message || 'Unknown error',\n stack: error?.stack || 'No stack trace',\n workspaceId: workspace.id\n });\n // Reset the workspace to original state if setup failed\n try {\n await this.workspaceRepo.update(workspace.id, {\n branchesDocId: workspace.branchesDocId\n });\n }\n catch (resetError) {\n console.error(\"[ensureBranchingSetup] Failed to reset workspace after failed branching setup:\", resetError);\n }\n throw error;\n }\n finally {\n // Always remove from in-progress set\n WorkspaceService.branchingSetupInProgress.delete(workspace.id);\n }\n }\n /**\n * Ensure a branch has an attached thread (id stored on branch). No UI-side creation.\n */\n async ensureBranchThread(workspaceId, branchId) {\n try {\n const workspace = await this.workspaceRepo.get(workspaceId);\n const branchesDocId = workspace?.branchesDocId;\n if (!branchesDocId)\n return;\n const branch = await this.branchService.getBranch(branchId, branchesDocId);\n const threadService = new ThreadService(this.repo);\n let threadId = branch?.threadId;\n // Ensure a thread doc exists for this branch and the pointer is persisted\n const ensureThread = async () => {\n if (!threadId) {\n threadId = await threadService.createThread('Thread', branchId);\n try {\n await this.branchService.setThreadId(branchId, threadId, branchesDocId);\n }\n catch (err) {\n console.warn('[WorkspaceService] Failed to persist threadId on branch:', err);\n }\n }\n else {\n try {\n await threadService.getThread(threadId);\n }\n catch {\n threadId = await threadService.createThread('Thread', branchId);\n try {\n await this.branchService.setThreadId(branchId, threadId, branchesDocId);\n }\n catch (err) {\n console.warn('[WorkspaceService] Failed to repair missing threadId on branch:', err);\n }\n }\n }\n };\n await ensureThread();\n // Ensure the workspace tracks branch selection for legacy consumers\n const updates = {};\n if (threadId && !workspace?.activeThreadId) {\n updates.activeThreadId = threadId;\n }\n if (!workspace?.activeBranchId) {\n updates.activeBranchId = branchId;\n }\n if (Object.keys(updates).length > 0) {\n await this.workspaceRepo.updateBranchAware(workspaceId, updates);\n }\n // Ensure a tasks doc exists for this branch to avoid missing-document races on refresh\n try {\n const taskService = new TaskService(this.repo);\n await taskService.getOrCreateTasksDocForBranch(branchId, branchesDocId);\n }\n catch (err) {\n console.warn('[WorkspaceService] Failed to ensure tasks doc for branch:', err);\n }\n }\n catch (e) {\n console.warn('[WorkspaceService] ensureBranchThread failed:', e);\n }\n }\n /**\n * Get all workspaces from the app root\n */\n async getAllWorkspaces() {\n const appRoot = await this.workspaceRepo.getAppRoot();\n return appRoot?.workspaces || [];\n }\n /**\n * Get workspaces that the current user has permission to access\n */\n async getUserWorkspaces(userId) {\n const allWorkspaces = await this.getAllWorkspaces();\n // If no userId, return empty array (require authentication)\n if (!userId) {\n return [];\n }\n // Filter workspaces by checking permissions\n const accessibleWorkspaces = [];\n for (const workspace of allWorkspaces) {\n try {\n const permissionDoc = await this.permissionService.getDocumentPermissions(workspace.id);\n // If no permission doc exists, grant access (backward compatibility for legacy workspaces)\n if (!permissionDoc) {\n accessibleWorkspaces.push(workspace);\n continue;\n }\n const hasAccess = await this.permissionService.checkPermission(workspace.id, userId);\n if (hasAccess.granted) {\n accessibleWorkspaces.push(workspace);\n }\n }\n catch (error) {\n // If permission check fails, grant access (fail open for now)\n console.warn(`Permission check failed for workspace ${workspace.id}, granting access:`, error);\n accessibleWorkspaces.push(workspace);\n }\n }\n return accessibleWorkspaces;\n }\n /**\n * Update a workspace\n */\n async updateWorkspace(id, data) {\n // Delegate to repository branch-aware update to keep service thin\n const updatedWorkspace = await this.workspaceRepo.updateBranchAware(id, data);\n // If the title was updated, also update the workspace reference in AppRoot\n if (data.title !== undefined) {\n await this.workspaceRepo.updateWorkspaceInRoot(id, {\n title: data.title,\n updatedAt: new Date().toISOString()\n });\n }\n return updatedWorkspace;\n }\n /**\n * Delete a workspace and its associated branches\n */\n async deleteWorkspace(id) {\n const workspace = await this.getWorkspace(id);\n // TODO: Clean up branches document\n await this.workspaceRepo.delete(id);\n }\n /**\n * Get the branch service for external use\n */\n getBranchService() {\n return this.branchService;\n }\n /**\n * Open a document in a tab (branch-aware)\n */\n async openInTab(workspaceId, options) {\n return await this.workspaceRepo.openInTabBranchAware(workspaceId, options);\n }\n /**\n * Get tabs filtered by active branch's fileHeads (BRANCH FILTERING ENABLED)\n * Now derives activeBranchId from activeThread instead of workspace.activeBranchId\n */\n async getBranchAwareTabs(workspaceId, opts) {\n const workspace = await this.getWorkspace(workspaceId);\n // Prefer workspace.activeBranchId; fallback to thread.branchId\n let activeBranchId = opts?.branchId ?? workspace.activeBranchId ?? undefined;\n // Return all tabs if no active branch is set\n if (!activeBranchId || !workspace.branchesDocId) {\n return workspace.tabs || [];\n }\n // Filter using ancestor-resolved workspace head\n const resolved = await this.branchService.resolveWorkspaceHead(workspaceId, activeBranchId, workspace.branchesDocId);\n let workspaceView = workspace;\n if (resolved.head) {\n try {\n const wsHandle = await this.repo.find(workspaceId);\n workspaceView = wsHandle.view([resolved.head]).doc();\n }\n catch { }\n }\n const branchFileIds = new Set((workspaceView.fileRefs || []).map(fr => fr.id));\n const filteredTabs = (workspace.tabs || []).filter(tab => branchFileIds.has(tab.documentId) || tab.documentId === workspaceId);\n // Auto-close active tab if it is not visible on this branch view\n try {\n if (workspace.activeTabId && !filteredTabs.find(t => t.documentId === workspace.activeTabId)) {\n await this.updateWorkspace(workspaceId, { activeTabId: null });\n }\n }\n catch { }\n return filteredTabs;\n }\n /**\n * Get fileRefs filtered by active branch's fileHeads (BRANCH FILTERING ENABLED)\n * Now derives activeBranchId from activeThread instead of workspace.activeBranchId\n * Supports both flat and hierarchical workspace structures\n */\n async getBranchAwareFileRefs(workspaceId, opts) {\n const workspace = await this.getWorkspace(workspaceId);\n // Prefer workspace.activeBranchId; fallback to thread.branchId\n let activeBranchId = opts?.branchId ?? workspace.activeBranchId ?? undefined;\n // Return all fileRefs if no active branch is set\n if (!activeBranchId || !workspace.branchesDocId) {\n return await this.getFileRefsForWorkspace(workspace);\n }\n // Filter using ancestor-resolved workspace head\n const resolved = await this.branchService.resolveWorkspaceHead(workspaceId, activeBranchId, workspace.branchesDocId);\n let workspaceView = workspace;\n if (resolved.head) {\n try {\n const wsHandle = await this.repo.find(workspaceId);\n // Don't wait for ready - use current state to avoid blocking\n workspaceView = wsHandle.view([resolved.head]).doc();\n }\n catch { }\n }\n // Return the fileRefs for both flat and hierarchical workspaces\n return await this.getFileRefsForWorkspace(workspaceView);\n }\n /**\n * Get file references from workspace, supporting both flat and hierarchical structures\n */\n async getFileRefsForWorkspace(workspace) {\n const debugEnabled = typeof window !== \"undefined\" &&\n (() => {\n try {\n return window.localStorage.getItem(\"MOD_DEBUG_WORKSPACE_SERVICE\") === \"1\";\n }\n catch {\n return false;\n }\n })();\n // Check if this is a hierarchical workspace (has folderRefs and folderStructure)\n if (Array.isArray(workspace.folderRefs) && workspace.folderRefs.length > 0 && workspace.folderStructure) {\n if (debugEnabled) {\n console.log('[WorkspaceService] Getting files from hierarchical workspace, folders:', workspace.folderRefs?.length || 0);\n }\n return await this.flattenFolderRefsToFileRefs(workspace.folderRefs);\n }\n // Fallback to flat workspace structure\n if (debugEnabled) {\n console.log('[WorkspaceService] Getting files from flat workspace, files:', workspace.fileRefs?.length || 0);\n }\n return workspace.fileRefs || [];\n }\n /**\n * Convert hierarchical folder structure to flat FileReference array for UI compatibility\n * Uses parallel loading with timeout to prevent hangs in deployed environments\n */\n async flattenFolderRefsToFileRefs(folderRefs, branchId) {\n if (!Array.isArray(folderRefs)) {\n console.warn('[WorkspaceService] folderRefs is not an array:', folderRefs);\n return [];\n }\n // Filter out automerge system folders and paths containing .amrg\n const systemFolderNames = ['incremental', 'snapshot', 'sync-state', 'automerge', '.automerge'];\n const userFolders = folderRefs.filter((folder) => {\n const folderName = folder?.name || '';\n const isSystemFolder = systemFolderNames.includes(folderName);\n const hasAmrgPath = folderName.includes('.amrg') || folderName.includes('packages/mod-sync-server');\n return !isSystemFolder && !hasAmrgPath;\n });\n const debugEnabled = typeof window !== \"undefined\" &&\n (() => {\n try {\n return window.localStorage.getItem(\"MOD_DEBUG_WORKSPACE_SERVICE\") === \"1\";\n }\n catch {\n return false;\n }\n })();\n if (debugEnabled) {\n console.log(`[WorkspaceService] \uD83D\uDCC1 Loading files from ${userFolders?.length || 0} user folders (filtered from ${folderRefs?.length || 0} total)...`);\n console.log('[WorkspaceService] User folders:', userFolders?.map((f) => f.name) || []);\n }\n const allFileRefs = [];\n let successfulFolders = 0;\n let failedFolders = 0;\n try {\n // Timeout for individual folder loading (3 seconds per folder)\n const FOLDER_LOAD_TIMEOUT_MS = 3000;\n // Helper to load a single folder with timeout\n const loadFolderWithTimeout = async (folderRef) => {\n if (!folderRef?.documentId) {\n return [];\n }\n const folderDocumentId = folderRef.documentId;\n const currentBranchId = branchId || 'main';\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n if (debugEnabled) {\n console.warn(`[WorkspaceService] Folder load timed out: ${folderRef.path}`);\n }\n resolve([]);\n }, FOLDER_LOAD_TIMEOUT_MS);\n this.folderService.getFolderDocument(folderDocumentId, currentBranchId)\n .then((folderHandle) => {\n clearTimeout(timeout);\n if (!folderHandle || !Array.isArray(folderHandle.fileRefs)) {\n resolve([]);\n return;\n }\n const folderFileRefs = folderHandle.fileRefs.map((fileRef) => ({\n ...fileRef,\n folderId: folderRef.id,\n metadata: {\n ...fileRef.metadata,\n folderPath: folderRef.path,\n folderName: folderRef.name\n }\n }));\n resolve(folderFileRefs);\n })\n .catch((error) => {\n clearTimeout(timeout);\n if (debugEnabled) {\n console.warn(`[WorkspaceService] SKIP: Cannot load folder ${folderRef.path}:`, error.message);\n }\n resolve([]);\n });\n });\n };\n // Load all folders in parallel using Promise.allSettled\n const folderResults = await Promise.allSettled(userFolders.map(folderRef => loadFolderWithTimeout(folderRef)));\n // Collect results from successful loads\n for (let i = 0; i < folderResults.length; i++) {\n const result = folderResults[i];\n if (result.status === 'fulfilled' && result.value.length > 0) {\n allFileRefs.push(...result.value);\n successfulFolders++;\n if (debugEnabled) {\n console.log(`[WorkspaceService] \u2705 Loaded ${result.value.length} files from ${userFolders[i].path}`);\n }\n }\n else {\n failedFolders++;\n }\n }\n // Clear, prominent summary\n if (debugEnabled) {\n console.log(`[WorkspaceService] \uD83C\uDFAF SUMMARY: Loaded ${allFileRefs.length} files from ${successfulFolders}/${folderRefs.length} folders (${failedFolders} failed)`);\n if (allFileRefs.length > 0) {\n console.log(`[WorkspaceService] \uD83D\uDCC4 Sample files:`, allFileRefs.slice(0, 3).map((f) => f.name || 'unnamed'));\n }\n }\n return allFileRefs;\n }\n catch (error) {\n console.error('[WorkspaceService] Error flattening folder refs:', error);\n return [];\n }\n }\n /**\n * Close a tab\n */\n async closeTab(workspaceId, tabId) {\n const workspace = await this.getWorkspace(workspaceId);\n // Filter out the tab to close\n const updatedTabs = workspace.tabs?.filter(tab => tab.documentId !== tabId) || [];\n // Find the next tab to make active\n let nextActiveTabId = null;\n if (workspace.activeTabId === tabId && updatedTabs.length > 0) {\n nextActiveTabId = updatedTabs[updatedTabs.length - 1].documentId;\n }\n else if (workspace.activeTabId !== tabId) {\n nextActiveTabId = workspace.activeTabId;\n }\n // Update workspace\n return await this.updateWorkspace(workspaceId, {\n tabs: updatedTabs,\n activeTabId: nextActiveTabId\n });\n }\n /**\n * Archive a tab\n */\n async archiveTab(workspaceId, tabId) {\n await this.workspaceRepo.archiveTabBranchAware(workspaceId, tabId);\n }\n async createFolder(workspaceId, name, parentId) {\n // Use WorkspaceRepository to create the folder document\n const newFolderMeta = await this.workspaceRepo.createFolder(name, parentId);\n const workspace = await this.getWorkspace(workspaceId);\n // Only add plain metadata, not Automerge doc or proxies\n const folderMeta = {\n id: newFolderMeta.id,\n name: newFolderMeta.name,\n parentId: newFolderMeta.parentId,\n createdAt: newFolderMeta.createdAt,\n updatedAt: newFolderMeta.updatedAt,\n currentView: typeof newFolderMeta.currentView === 'string' ? newFolderMeta.currentView : 'list',\n kanban: { columns: [], fileColumnMap: {} },\n editorContent: '',\n children: [],\n metadata: {\n type: 'workspace-folder',\n name: newFolderMeta.name,\n createdAt: newFolderMeta.createdAt,\n updatedAt: newFolderMeta.updatedAt,\n }\n };\n const plainFolders = (workspace.folders || []).map(toPlainFolder);\n return await this.updateWorkspace(workspaceId, {\n folders: [...plainFolders, folderMeta]\n });\n }\n /**\n * Delete a folder\n */\n async deleteFolder(workspaceId, folderId) {\n const workspace = await this.getWorkspace(workspaceId);\n // Remove folder\n const updatedFolders = (workspace.folders?.filter(f => f.id !== folderId) || []).map(toPlainFolder);\n // Update file references to remove folder reference\n const updatedFileRefs = (workspace.fileRefs || []).map(file => ({\n id: file.id,\n name: file.name,\n type: file.type,\n folderId: file.folderId === folderId ? null : file.folderId,\n createdAt: file.createdAt || new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }));\n return await this.updateWorkspace(workspaceId, {\n folders: updatedFolders,\n fileRefs: updatedFileRefs\n });\n }\n /**\n * Add a file reference (branch-aware)\n */\n async addFileRef(workspaceId, fileRef) {\n const updated = await this.workspaceRepo.addFileRefBranchAware(workspaceId, fileRef);\n // File creation is now automatically tracked via BranchableRepo when the file is first edited\n // No manual tracking needed here\n return updated;\n }\n /**\n * Delete a file reference (branch-aware)\n */\n async deleteFileRef(workspaceId, fileId) {\n const ws = await this.getWorkspace(workspaceId);\n const updated = await this.workspaceRepo.deleteFileRefBranchAware(workspaceId, fileId);\n // Update branch fileHeads to reflect deletion\n try {\n const activeBranchId = ws?.activeBranchId;\n const branchesDocId = ws?.branchesDocId;\n if (activeBranchId && branchesDocId) {\n try {\n await this.branchService.removeFileHead(activeBranchId, fileId, branchesDocId);\n }\n catch { }\n // Persist updated workspace head for this branch so branch-aware views reflect deletion\n try {\n const wsHandle = await this.repo.find(workspaceId);\n const wsHead = wsHandle?.heads?.()[0];\n if (wsHead) {\n await this.branchService.updateFileHead(activeBranchId, workspaceId, wsHead, branchesDocId);\n }\n }\n catch { }\n // File deletion tracking now handled automatically via task system\n // No manual changelog tracking needed\n }\n }\n catch { }\n return updated;\n }\n /**\n * Move a file reference to a different folder (branch-aware)\n */\n async moveFileRef(workspaceId, fileId, newFolderId, options) {\n return await this.workspaceRepo.moveFileRefBranchAware(workspaceId, fileId, newFolderId, options);\n }\n /**\n * Set the active thread for a workspace\n */\n async setActiveThread(workspaceId, threadId) {\n await this.workspaceRepo.updateActiveThread(workspaceId, threadId);\n return await this.workspaceRepo.get(workspaceId);\n }\n /**\n * Archive old tabs (older than 24 hours)\n */\n async archiveOldTabs(workspaceId) {\n const workspace = await this.getWorkspace(workspaceId);\n if (!workspace.tabs?.length)\n return workspace;\n const now = new Date();\n const twentyFourHoursAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n const [tabsToKeep, tabsToArchive] = workspace.tabs.reduce(([keep, archive], tab) => {\n const lastViewed = new Date(tab.lastViewed || 0);\n if (lastViewed < twentyFourHoursAgo) {\n archive.push({\n ...tab,\n archivedAt: now.toISOString()\n });\n }\n else {\n keep.push(tab);\n }\n return [keep, archive];\n }, [[], []]);\n // Only update if we have tabs to archive\n if (tabsToArchive.length === 0)\n return workspace;\n // Make a single atomic update\n await this.workspaceRepo.update(workspaceId, {\n tabs: tabsToKeep,\n archivedTabs: [...(workspace.archivedTabs || []), ...tabsToArchive],\n metadata: {\n ...workspace.metadata,\n updatedAt: now.toISOString()\n }\n });\n return await this.getWorkspace(workspaceId);\n }\n /**\n * Set active agents for a workspace\n */\n async setActiveAgents(workspaceId, agentIds) {\n return await this.updateWorkspace(workspaceId, {\n activeAgents: agentIds\n });\n }\n /**\n * Save a file to a workspace\n */\n async saveFile(workspaceId, file) {\n const workspace = await this.getWorkspace(workspaceId);\n const existingFileIndex = workspace.fileRefs?.findIndex(f => f.id === file.id) ?? -1;\n const updatedFileRefs = [...(workspace.fileRefs || [])];\n if (existingFileIndex !== -1) {\n updatedFileRefs[existingFileIndex] = file;\n }\n else {\n updatedFileRefs.push(file);\n }\n return await this.updateWorkspace(workspaceId, {\n fileRefs: updatedFileRefs\n });\n }\n /**\n * Delete a file from a workspace\n */\n async deleteFile(workspaceId, fileId) {\n const workspace = await this.getWorkspace(workspaceId);\n const updatedFileRefs = workspace.fileRefs?.filter(f => f.id !== fileId) || [];\n return await this.updateWorkspace(workspaceId, {\n fileRefs: updatedFileRefs\n });\n }\n /**\n * Move a file to a different folder\n */\n async moveFile(workspaceId, fileId, newFolderId) {\n return await this.moveFileRef(workspaceId, fileId, newFolderId);\n }\n /**\n * Create a new tab\n */\n async createNewTab(workspaceId) {\n const threadService = new ThreadService(this.repo);\n const currentWorkspace = await this.getWorkspace(workspaceId);\n // Derive activeBranchId from workspace preference, else current active thread or use main branch\n let activeBranchId;\n if (currentWorkspace.activeBranchId) {\n activeBranchId = currentWorkspace.activeBranchId;\n }\n else if (currentWorkspace.activeThreadId) {\n try {\n const currentThread = await threadService.getThread(currentWorkspace.activeThreadId);\n activeBranchId = currentThread.branchId;\n }\n catch (error) {\n console.error('Error getting current thread:', error);\n // Fallback to main branch\n const branches = await this.branchService.getBranchesForWorkspace(currentWorkspace.branchesDocId);\n const mainBranch = branches.find(b => b.metadata.type === 'main');\n activeBranchId = mainBranch?.id || '';\n }\n }\n else {\n // No active thread, use main branch\n const branches = await this.branchService.getBranchesForWorkspace(currentWorkspace.branchesDocId);\n const mainBranch = branches.find(b => b.metadata.type === 'main');\n activeBranchId = mainBranch?.id || '';\n }\n const thread = await threadService.createThreadWithBranch(workspaceId, currentWorkspace.branchesDocId, activeBranchId, 'New Thread');\n // Update workspace with new thread and persist activeBranchId\n const workspace = await this.updateWorkspace(workspaceId, {\n activeTabId: null,\n activeThreadId: thread.id,\n activeBranchId: thread.branchId\n });\n return { workspace, thread };\n }\n /**\n * Update a tab's last viewed timestamp\n */\n async updateTabLastViewed(workspaceId, tabId) {\n const workspace = await this.getWorkspace(workspaceId);\n const updatedTabs = workspace.tabs?.map(tab => {\n if (tab.id === tabId) {\n return {\n ...tab,\n lastViewed: new Date().toISOString()\n };\n }\n return tab;\n }) || [];\n return await this.updateWorkspace(workspaceId, {\n tabs: updatedTabs\n });\n }\n /**\n * Manually set up branching for a workspace (use when automatic setup is disabled)\n */\n async setupBranchingForWorkspace(workspaceId) {\n const workspace = await this.workspaceRepo.get(workspaceId);\n return await this.ensureBranchingSetup(workspace);\n }\n /**\n * Clear branching setup flags (for debugging)\n */\n static clearBranchingSetupFlags() {\n WorkspaceService.branchingSetupInProgress.clear();\n WorkspaceService.branchingSetupCompleted.clear();\n }\n /**\n * Get current branch context info (via BranchableRepo)\n */\n async getBranchContext(workspaceId) {\n return this.branchableRepo.getBranchContext(workspaceId);\n }\n /**\n * Convenience: provide a repo-like facade that automatically uses branch heads\n * for the given workspace. Tools can call `find(id)` and then `doc()/change()`\n * without dealing with heads or updating fileHeads.\n */\n // Removed: implicit repo facade. Callers should use explicit `BranchableRepo.openHandle(documentId, { branchId, branchesDocId })`.\n /**\n * Initialize permissions for a workspace (called when creating)\n */\n async initializeWorkspacePermissions(workspaceId, ownerId, isPublic = false) {\n await this.permissionService.initializeDocumentPermissions(workspaceId, ownerId, isPublic);\n }\n /**\n * Share workspace with another user\n */\n async shareWorkspace(workspaceId, targetUserId, role, sharedBy) {\n await this.permissionService.shareWorkspace(workspaceId, targetUserId, role, sharedBy);\n }\n /**\n * Get shared workspaces for a user\n */\n async getSharedWorkspaces(userId) {\n return await this.permissionService.getUserDocuments(userId);\n }\n /**\n * Check if user has permission to access workspace\n */\n async checkWorkspacePermission(workspaceId, userId, requiredRole) {\n return await this.permissionService.checkPermission(workspaceId, userId, requiredRole);\n }\n async ensureWorkspaceRegistered(workspace) {\n try {\n const appRoot = await this.workspaceRepo.getAppRoot();\n const alreadyRegistered = appRoot?.workspaces?.some((w) => w.id === workspace.id);\n if (alreadyRegistered)\n return;\n await this.workspaceRepo.addWorkspaceToRoot({\n id: workspace.id,\n title: workspace.title || workspace.metadata?.name || 'Workspace',\n createdAt: workspace.metadata?.createdAt || new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n }\n catch (error) {\n console.warn('[WorkspaceService] Failed to register workspace in root:', error);\n }\n }\n /**\n * Get workspace collaborators\n */\n async getWorkspaceCollaborators(workspaceId) {\n return await this.permissionService.getDocumentCollaborators(workspaceId);\n }\n // ===== HIERARCHICAL WORKSPACE METHODS =====\n /**\n * Create a new hierarchical workspace with folder-based organization\n */\n async createHierarchicalWorkspace(data) {\n console.log('[WorkspaceService] Creating hierarchical workspace:', data.title);\n try {\n // Create workspace with folderRefs structure\n const workspaceId = await this.workspaceRepo.create({\n title: data.title,\n activeThreadId: null,\n activeBranchId: null,\n activeTabId: null,\n branchesDocId: '',\n activeAgents: [],\n tabs: [],\n fileRefs: [], // Keep for backward compatibility but empty\n folders: [], // Keep for backward compatibility but empty\n archivedTabs: [],\n metadata: {\n type: \"workspace\",\n name: data.title,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n });\n // Initialize with empty folderRefs\n const workspaceHandle = await this.branchableRepo.openHandle(workspaceId, {\n branchId: 'main', // Default branch\n workspaceId\n });\n await workspaceHandle.change((doc) => {\n // Add hierarchical structure\n doc.folderRefs = [];\n doc.folderStructure = {\n totalFolders: 0,\n totalFiles: 0,\n maxDepth: 0,\n lastStructureUpdate: new Date().toISOString()\n };\n doc.searchIndex = {\n lastIndexed: new Date().toISOString(),\n indexedFileCount: 0,\n indexVersion: '1.0.0'\n };\n // Mark as hierarchical workspace\n doc.metadata.isHierarchical = true;\n doc.metadata.version = '2.0.0';\n });\n console.log('[WorkspaceService] Created hierarchical workspace successfully:', workspaceId);\n const workspace = workspaceHandle.doc();\n return workspace;\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to create hierarchical workspace:', error);\n throw new Error(`Failed to create hierarchical workspace: ${error}`);\n }\n }\n /**\n * Get complete workspace folder structure\n */\n async getWorkspaceStructure(workspaceId, branchId) {\n console.log('[WorkspaceService] Getting workspace structure:', workspaceId);\n try {\n return await this.folderService.getWorkspaceFolderStructure(workspaceId, branchId);\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to get workspace structure:', error);\n throw error;\n }\n }\n /**\n * Search files across all folder documents in workspace\n */\n async searchFilesAcrossFolders(workspaceId, query, branchId, options = {}) {\n console.log('[WorkspaceService] Searching files across folders:', { workspaceId, query });\n const limit = options.limit || 100;\n const timeout = options.timeout || 2000;\n try {\n // Get workspace document\n const workspaceHandle = await this.branchableRepo.openHandle(workspaceId, {\n branchId,\n workspaceId\n });\n const workspace = workspaceHandle.doc();\n if (!workspace.folderRefs || workspace.folderRefs.length === 0) {\n return [];\n }\n const results = [];\n const searchPromises = [];\n // Search each folder concurrently\n for (const folderRef of workspace.folderRefs) {\n const searchPromise = this.searchInFolder(folderRef, query, branchId)\n .then(folderResults => {\n results.push(...folderResults);\n })\n .catch(error => {\n console.warn('[WorkspaceService] Failed to search folder:', folderRef.id, error);\n });\n searchPromises.push(searchPromise);\n }\n // Wait for all searches to complete with timeout\n await Promise.race([\n Promise.all(searchPromises),\n new Promise((_, reject) => setTimeout(() => reject(new Error('Search timeout')), timeout))\n ]);\n // Sort results by relevance score\n results.sort((a, b) => b.relevanceScore - a.relevanceScore);\n return results.slice(0, limit);\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to search files across folders:', error);\n throw error;\n }\n }\n /**\n * Add folder reference to hierarchical workspace\n */\n async addFolderToWorkspace(workspaceId, folderRef, branchId) {\n console.log('[WorkspaceService] Adding folder to workspace:', folderRef.id);\n try {\n const workspaceHandle = await this.branchableRepo.openHandle(workspaceId, {\n branchId,\n workspaceId\n });\n const taskContext = await getActiveTaskContext();\n await workspaceHandle.change((doc) => {\n if (!Array.isArray(doc.folderRefs)) {\n doc.folderRefs = [];\n }\n // Remove existing reference if it exists\n const existingIndex = doc.folderRefs.findIndex((ref) => ref.id === folderRef.id);\n if (existingIndex !== -1) {\n doc.folderRefs.splice(existingIndex, 1);\n }\n // Add folder reference\n doc.folderRefs.push(folderRef);\n // Update structure metadata\n if (doc.folderStructure) {\n doc.folderStructure.totalFolders = doc.folderRefs.length;\n doc.folderStructure.lastStructureUpdate = new Date().toISOString();\n }\n doc.metadata.updatedAt = new Date().toISOString();\n }, taskContext || undefined);\n console.log('[WorkspaceService] Successfully added folder to workspace');\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to add folder to workspace:', error);\n throw error;\n }\n }\n /**\n * Organize files into folder structure for hierarchical workspace\n */\n async organizeFilesIntoFolders(files, workspaceId, branchId) {\n console.log('[WorkspaceService] Organizing files into folders:', files.length);\n try {\n const organization = this.folderService.organizeFolderStructure(files);\n // Create folder documents for each organized folder\n for (const folder of organization.folders) {\n if (folder.requiresSplit) {\n // Handle oversized folders by splitting them\n const chunkSize = 200;\n const chunks = this.chunkArray(folder.files, chunkSize);\n for (let i = 0; i < chunks.length; i++) {\n const chunkFolder = {\n ...folder,\n path: `${folder.path}-${i + 1}`,\n name: `${folder.name} (${i + 1})`,\n files: chunks[i],\n requiresSplit: false\n };\n await this.createFolderFromOrganization(chunkFolder, workspaceId, branchId);\n }\n }\n else {\n await this.createFolderFromOrganization(folder, workspaceId, branchId);\n }\n }\n return organization;\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to organize files into folders:', error);\n throw error;\n }\n }\n // Private helper methods\n async searchInFolder(folderRef, query, branchId) {\n try {\n const folderContents = await this.folderService.listFolderContents(folderRef.id, branchId);\n const results = [];\n for (const fileRef of folderContents) {\n const relevanceScore = this.calculateRelevanceScore(fileRef, query);\n if (relevanceScore > 0) {\n results.push({\n fileRef,\n folderId: folderRef.id,\n folderPath: folderRef.path,\n relevanceScore,\n matchType: this.getMatchType(fileRef, query),\n matchDetails: {\n highlightedText: this.highlightMatch(fileRef.name, query)\n }\n });\n }\n }\n return results;\n }\n catch (error) {\n console.warn('[WorkspaceService] Failed to search in folder:', folderRef.id, error);\n return [];\n }\n }\n calculateRelevanceScore(fileRef, query) {\n const queryLower = query.toLowerCase();\n const nameLower = fileRef.name.toLowerCase();\n // Exact match gets highest score\n if (nameLower === queryLower)\n return 1.0;\n // Starts with query gets high score\n if (nameLower.startsWith(queryLower))\n return 0.8;\n // Contains query gets medium score\n if (nameLower.includes(queryLower))\n return 0.5;\n // No match\n return 0;\n }\n getMatchType(fileRef, query) {\n if (fileRef.name.toLowerCase().includes(query.toLowerCase())) {\n return 'filename';\n }\n return 'metadata'; // Default for now\n }\n highlightMatch(text, query) {\n const regex = new RegExp(`(${query})`, 'gi');\n return text.replace(regex, '<mark>$1</mark>');\n }\n async createFolderFromOrganization(folder, workspaceId, branchId) {\n const folderId = this.generateFolderId(folder.path);\n // Create folder document\n await this.folderService.createFolderDocument(folderId, folder.path, workspaceId, branchId, { name: folder.name });\n // Add files to folder\n for (const file of folder.files) {\n const fileRef = {\n id: file.absolutePath, // Use path as ID for now\n name: this.extractFileName(file.relativePath),\n type: this.inferFileType(file.relativePath),\n folderId,\n createdAt: new Date(file.mtimeMs).toISOString(),\n updatedAt: new Date(file.mtimeMs).toISOString()\n };\n await this.folderService.addFileToFolder(folderId, fileRef, branchId);\n }\n // Create folder reference for workspace\n const folderRef = {\n id: folderId,\n name: folder.name,\n path: folder.path,\n documentId: folderId, // Assuming document ID matches folder ID\n fileCount: folder.files.length,\n totalSize: folder.estimatedSize,\n lastModified: new Date().toISOString(),\n metadata: {\n hasSubfolders: false,\n primaryFileType: this.getPrimaryFileType(folder.files),\n isActive: true\n }\n };\n // Add to workspace\n await this.addFolderToWorkspace(workspaceId, folderRef, branchId);\n }\n generateFolderId(path) {\n // Generate deterministic ID from path\n return `folder-${path.replace(/[^a-zA-Z0-9]/g, '-')}-${Date.now()}`;\n }\n extractFileName(relativePath) {\n return relativePath.split('/').pop() || relativePath;\n }\n inferFileType(relativePath) {\n const ext = relativePath.split('.').pop()?.toLowerCase();\n const codeExtensions = ['ts', 'js', 'tsx', 'jsx', 'py', 'java', 'cpp', 'c', 'go', 'rs'];\n if (codeExtensions.includes(ext || ''))\n return 'code';\n if (['md', 'txt'].includes(ext || ''))\n return 'text';\n return 'file';\n }\n getPrimaryFileType(files) {\n const typeCount = new Map();\n for (const file of files) {\n const ext = file.relativePath.split('.').pop()?.toLowerCase() || 'unknown';\n typeCount.set(ext, (typeCount.get(ext) || 0) + 1);\n }\n let maxCount = 0;\n let primaryType = 'mixed';\n for (const [type, count] of typeCount) {\n if (count > maxCount) {\n maxCount = count;\n primaryType = type;\n }\n }\n return primaryType;\n }\n chunkArray(array, chunkSize) {\n const chunks = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n chunks.push(array.slice(i, i + chunkSize));\n }\n return chunks;\n }\n /**\n * Migrate an existing flat workspace to hierarchical structure\n */\n async migrateWorkspaceToHierarchical(workspaceId) {\n console.log('[WorkspaceService] Migrating workspace to hierarchical:', workspaceId);\n try {\n const workspace = await this.getWorkspace(workspaceId);\n // Check if already hierarchical\n console.log('[WorkspaceService] Checking if workspace is hierarchical:', {\n workspaceId,\n hasFolderRefs: workspace.folderRefs,\n folderRefsIsArray: Array.isArray(workspace.folderRefs),\n hasFileRefs: workspace.fileRefs,\n fileRefsLength: workspace.fileRefs?.length,\n notFileRefs: !workspace.fileRefs\n });\n const isAlreadyHierarchical = Array.isArray(workspace.folderRefs) && !workspace.fileRefs;\n console.log('[WorkspaceService] isAlreadyHierarchical result:', isAlreadyHierarchical);\n if (isAlreadyHierarchical) {\n console.log('[WorkspaceService] Skipping migration - workspace already hierarchical');\n return {\n success: true,\n message: 'Workspace is already hierarchical',\n foldersMigrated: 0,\n filesMigrated: 0\n };\n }\n // TODO: Temporarily disabled migration service due to build issues\n // const { WorkspaceMigrationService } = await import('./workspace-migration-service.js')\n // const migrationService = new WorkspaceMigrationService(this.repo, this.branchableRepo)\n // const migrationResult = await migrationService.migrateWorkspaceToHierarchical(\n // workspaceId,\n // workspace.activeBranchId || 'main'\n // )\n // Return migration not implemented for now\n const migrationResult = {\n success: false,\n foldersCreated: 0,\n filesMigrated: 0\n };\n if (migrationResult.success) {\n console.log('[WorkspaceService] Successfully migrated workspace to hierarchical');\n return {\n success: true,\n message: 'Successfully migrated to hierarchical structure',\n foldersMigrated: migrationResult.foldersCreated,\n filesMigrated: migrationResult.filesMigrated\n };\n }\n else {\n console.error('[WorkspaceService] Migration failed - not implemented');\n return {\n success: false,\n message: 'Migration not yet implemented',\n foldersMigrated: 0,\n filesMigrated: 0\n };\n }\n }\n catch (error) {\n console.error('[WorkspaceService] Migration error:', error);\n return {\n success: false,\n message: `Migration error: ${error}`,\n foldersMigrated: 0,\n filesMigrated: 0\n };\n }\n }\n /**\n * Check if a workspace is using hierarchical structure\n */\n async isHierarchicalWorkspace(workspaceId) {\n try {\n const workspace = await this.getWorkspace(workspaceId);\n return Array.isArray(workspace.folderRefs) && !workspace.fileRefs;\n }\n catch (error) {\n console.error('[WorkspaceService] Error checking workspace type:', error);\n return false;\n }\n }\n // ===== SPECIFICATION-REQUIRED API METHODS =====\n /**\n * @spec workspace/REQ-INT-1.1 Get migration status for workspace\n */\n async getMigrationStatus(workspaceId) {\n console.log('[WorkspaceService] Getting migration status:', workspaceId);\n try {\n const workspace = await this.getWorkspace(workspaceId);\n return workspace.migrationStatus || null;\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to get migration status:', error);\n return null;\n }\n }\n /**\n * @spec workspace/REQ-INT-1.1 Validate workspace integrity\n */\n async validateWorkspaceIntegrity(workspaceId) {\n console.log('[WorkspaceService] Validating workspace integrity:', workspaceId);\n try {\n const workspace = await this.getWorkspace(workspaceId);\n const errors = [];\n const warnings = [];\n if (!workspace.branchesDocId) {\n errors.push({\n type: 'invalid_reference',\n message: 'Workspace missing required branchesDocId',\n affectedResource: workspaceId,\n severity: 'error'\n });\n }\n // Validate hierarchical structure if present\n if (Array.isArray(workspace.folderRefs)) {\n for (const folderRef of workspace.folderRefs) {\n if (!folderRef.documentId) {\n errors.push({\n type: 'invalid_reference',\n message: `Folder reference missing documentId: ${folderRef.id}`,\n affectedResource: folderRef.id,\n severity: 'error'\n });\n }\n if (folderRef.fileCount > 200) {\n warnings.push({\n type: 'capacity',\n message: `Folder ${folderRef.name} exceeds 200 file capacity (${folderRef.fileCount} files)`,\n suggestion: 'Consider splitting this folder to improve performance',\n affectedFolders: [folderRef.id]\n });\n }\n }\n }\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n summary: {\n totalFolders: workspace.folderRefs?.length || 0,\n totalFiles: workspace.folderStructure?.totalFiles || 0,\n orphanedFiles: 0,\n oversizedFolders: warnings.filter(w => w.type === 'capacity').length\n }\n };\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to validate workspace integrity:', error);\n return {\n isValid: false,\n errors: [{\n type: 'corrupted_document',\n message: `Failed to load workspace: ${error}`,\n affectedResource: workspaceId,\n severity: 'error'\n }],\n warnings: [],\n summary: {\n totalFolders: 0,\n totalFiles: 0,\n orphanedFiles: 0,\n oversizedFolders: 0\n }\n };\n }\n }\n /**\n * @spec workspace-hierarchical-implementation/REQ-BUS-1.1.1 WorkspaceService.getHierarchicalFileRefs() loads from folderRefs only\n */\n async getHierarchicalFileRefs(workspaceId, branchId, options) {\n try {\n const workspace = await this.getWorkspace(workspaceId);\n if (!workspace) {\n return [];\n }\n // Check if this is a hierarchical workspace\n if (!Array.isArray(workspace.folderRefs) || workspace.folderRefs.length === 0) {\n return workspace.fileRefs || [];\n }\n // For tree view, we want all files organized hierarchically\n // Since tree command passes folderId: null, handle this case\n if (options?.folderId === null) {\n // Return all files from hierarchical structure with fallback\n try {\n const hierarchicalFiles = await this.flattenFolderRefsToFileRefs(workspace.folderRefs, branchId);\n return hierarchicalFiles.length > 0 ? hierarchicalFiles : (workspace.fileRefs || []);\n }\n catch (error) {\n return workspace.fileRefs || [];\n }\n }\n if (options?.folderId) {\n // Return files from specific folder\n return await this.getFilesFromFolder(options.folderId, branchId, workspaceId);\n }\n // Default: return all files from hierarchical structure\n try {\n const hierarchicalFiles = await this.flattenFolderRefsToFileRefs(workspace.folderRefs, branchId);\n return hierarchicalFiles.length > 0 ? hierarchicalFiles : (workspace.fileRefs || []);\n }\n catch (error) {\n return workspace.fileRefs || [];\n }\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to get file refs for workspace:', error);\n return [];\n }\n }\n /**\n * @spec workspace-hierarchical-implementation/REQ-BUS-1.2.1 Folder contents loaded only when accessed by UI components\n */\n async getRootLevelFiles(workspace, branchId) {\n // For tree view, we want ALL files from ALL folders, not just root folder\n // Since tree command expects hierarchical display, return all files\n return await this.flattenFolderRefsToFileRefs(workspace.folderRefs, branchId);\n }\n /**\n * @spec workspace-hierarchical-implementation/REQ-BUS-1.2.1 Folder contents loaded only when accessed by UI components\n */\n async getFilesFromFolder(folderId, branchId, workspaceId) {\n try {\n const folderDoc = await this.folderService.getFolderDocument(folderId, branchId, workspaceId);\n return folderDoc?.fileRefs || [];\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to load folder contents:', error);\n return [];\n }\n }\n /**\n * @spec workspace/REQ-INT-1.2 Validate folder capacities across workspace\n */\n async validateFolderCapacities(workspaceId) {\n console.log('[WorkspaceService] Validating folder capacities:', workspaceId);\n try {\n return await this.folderService.validateFolderCapacities(workspaceId);\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to validate folder capacities:', error);\n return {\n isValid: false,\n violatingFolders: [],\n totalViolations: 0,\n recommendedActions: ['Manual intervention required due to validation error']\n };\n }\n }\n /**\n * @spec workspace/REQ-BUS-1.1.1 Create workspace with hierarchical structure by default\n * Enhanced createWorkspace to always use hierarchical structure\n */\n async createWorkspaceData(data) {\n const now = new Date().toISOString();\n return {\n title: data.title || 'Untitled Workspace',\n activeThreadId: null,\n activeBranchId: null,\n activeTabId: null,\n branchesDocId: '',\n activeAgents: [],\n tabs: [],\n archivedTabs: [],\n folderRefs: [],\n folderStructure: {\n totalFolders: 0,\n totalFiles: 0,\n maxDepth: 0,\n lastStructureUpdate: now\n },\n searchIndex: {\n lastIndexed: now,\n indexedFileCount: 0,\n indexVersion: '1.0'\n },\n metadata: {\n type: \"workspace\",\n name: data.title || 'Untitled Workspace',\n createdAt: now,\n updatedAt: now,\n ...data.metadata\n },\n ...data\n };\n }\n /**\n * @spec workspace/REQ-BUS-2.1.1 Route file additions through folder determination\n * Enhanced addFileRef to use folder-based organization\n */\n async addFileRefToHierarchicalWorkspace(workspaceId, fileRef, branchId) {\n console.log('[WorkspaceService] Adding file to hierarchical workspace:', fileRef.name);\n try {\n const workspace = await this.getWorkspace(workspaceId);\n const activeBranchId = branchId || workspace.activeBranchId || 'main';\n const targetFolderId = await this.determineFolderForFile(fileRef.name, workspaceId, activeBranchId);\n // Add file to determined folder\n await this.folderService.addFileToFolder(targetFolderId, fileRef, activeBranchId);\n // Update workspace folder structure metadata\n await this.updateWorkspaceFolderStructure(workspaceId, activeBranchId);\n return await this.getWorkspace(workspaceId);\n }\n catch (error) {\n console.error('[WorkspaceService] Failed to add file to hierarchical workspace:', error);\n throw error;\n }\n }\n // Private helper methods for hierarchical operations\n /**\n * @spec workspace/REQ-BUS-1.2.4 Intelligent organization based on directory structure and package boundaries\n */\n async determineFolderForFile(fileName, workspaceId, branchId) {\n // Simple folder determination based on file type for now\n const extension = fileName.split('.').pop()?.toLowerCase();\n let folderPath = '';\n if (['ts', 'tsx', 'js', 'jsx'].includes(extension || '')) {\n folderPath = 'src';\n }\n else if (['md', 'txt'].includes(extension || '')) {\n folderPath = 'docs';\n }\n else if (['json', 'yml', 'yaml'].includes(extension || '')) {\n folderPath = 'config';\n }\n else {\n folderPath = 'files';\n }\n // Check if folder exists, create if not\n const workspace = await this.getWorkspace(workspaceId);\n const existingFolder = workspace.folderRefs?.find((ref) => ref.path === folderPath);\n if (existingFolder) {\n return existingFolder.id;\n }\n // Create new folder\n const folderId = `folder-${folderPath}-${Date.now()}`;\n await this.folderService.createFolderDocument(folderId, folderPath, workspaceId, branchId, { name: folderPath });\n // Add folder reference to workspace\n const folderRef = {\n id: folderId,\n name: folderPath,\n path: folderPath,\n documentId: folderId,\n fileCount: 0,\n totalSize: 0,\n lastModified: new Date().toISOString(),\n metadata: {\n hasSubfolders: false,\n primaryFileType: extension || 'file',\n isActive: true\n }\n };\n await this.addFolderToWorkspace(workspaceId, folderRef, branchId);\n return folderId;\n }\n /**\n * @spec workspace/REQ-BUS-1.2.1 Update workspace folder structure metadata\n */\n async updateWorkspaceFolderStructure(workspaceId, branchId) {\n try {\n const structure = await this.folderService.getWorkspaceFolderStructure(workspaceId, branchId);\n await this.updateWorkspace(workspaceId, {\n folderStructure: structure\n });\n }\n catch (error) {\n console.warn('[WorkspaceService] Failed to update folder structure:', error);\n }\n }\n}\nWorkspaceService.branchingSetupInProgress = new Set(); // Track workspaces being set up (static to share across instances)\nWorkspaceService.branchingSetupCompleted = new Set(); // Track workspaces that have completed setup (static to share across instances)\n", "// Helper function to calculate string similarity (0-1)\nexport function stringSimilarity(str1, str2) {\n // Handle undefined or null inputs\n if (!str1 || !str2)\n return 0;\n // Check for exact match first (case-insensitive)\n if (str1.toLowerCase() === str2.toLowerCase())\n return 1;\n // If either string is quoted, require exact match (case-insensitive)\n if ((str1.startsWith('\"') && str1.endsWith('\"')) ||\n (str2.startsWith('\"') && str2.endsWith('\"'))) {\n const s1 = str1.replace(/^\"|\"$/g, '').toLowerCase();\n const s2 = str2.replace(/^\"|\"$/g, '').toLowerCase();\n return s1 === s2 ? 1 : 0;\n }\n // Normalize strings and split into words\n const normalize = (s) => s.toLowerCase().trim();\n const s1 = normalize(str1);\n const s2 = normalize(str2);\n // Check for contains (weighted by length difference)\n if (s1.includes(s2) || s2.includes(s1)) {\n const lenRatio = Math.min(s1.length, s2.length) / Math.max(s1.length, s2.length);\n return 0.9 * lenRatio;\n }\n // Split into words and filter out empty strings\n const getWords = (s) => s.split(/\\s+/).filter(w => w.length > 0);\n const words1 = getWords(s1);\n const words2 = getWords(s2);\n // Calculate word-based similarity with position weights\n const wordSet1 = new Set(words1);\n const wordSet2 = new Set(words2);\n // Find common words\n const commonWords = Array.from(wordSet1).filter(word => wordSet2.has(word));\n // Calculate word order similarity\n let orderScore = 0;\n if (commonWords.length > 1) {\n const pos1 = commonWords.map(w => words1.indexOf(w));\n const pos2 = commonWords.map(w => words2.indexOf(w));\n const orderDiff = pos1.map((p, i) => Math.abs(p - pos2[i]));\n orderScore = 1 - (Math.min(...orderDiff) / Math.max(words1.length, words2.length));\n }\n // Calculate partial word matches using n-grams\n const ngramScore = ngramSimilarity(s1, s2, 3);\n // Weight and combine scores\n const wordScore = commonWords.length > 0\n ? (commonWords.length / Math.max(wordSet1.size, wordSet2.size))\n : 0;\n return Math.max(0.5 * wordScore + 0.3 * ngramScore + 0.2 * orderScore, ngramScore * 0.8 // Ensure good partial matches aren't penalized too much\n );\n}\n// Helper function to calculate n-gram similarity\nexport function ngramSimilarity(str1, str2, n) {\n if (str1.length < n || str2.length < n)\n return 0;\n // Generate n-grams for both strings\n const getNgrams = (str, n) => {\n const ngrams = new Set();\n for (let i = 0; i <= str.length - n; i++) {\n ngrams.add(str.slice(i, i + n));\n }\n return ngrams;\n };\n const ngrams1 = getNgrams(str1, n);\n const ngrams2 = getNgrams(str2, n);\n // Calculate Jaccard similarity coefficient\n const intersection = Array.from(ngrams1).filter(ng => ngrams2.has(ng)).length;\n const union = new Set([...Array.from(ngrams1), ...Array.from(ngrams2)]).size;\n return union > 0 ? intersection / union : 0;\n}\n// Helper to extract key terms from natural language query\nexport function extractKeyTerms(query, additionalStopWords = []) {\n if (!query)\n return [];\n // If query is quoted, return it as a single term with quotes removed\n if (query.startsWith('\"') && query.endsWith('\"')) {\n return [query.slice(1, -1)];\n }\n // Common stop words\n const defaultStopWords = new Set([\n 'the', 'and', 'or', 'but', 'in', 'with', 'about',\n 'for', 'to', 'of', 'at', 'by', 'a', 'an', 'is', 'are',\n 'was', 'were', 'will', 'be', 'has', 'have', 'had'\n ]);\n // Combine default and additional stop words\n const stopWords = Array.from(defaultStopWords).concat(additionalStopWords);\n // Split on spaces but preserve quoted strings\n const terms = query.match(/(\"[^\"]+\"|[^\"\\s]+)/g) || [];\n return terms\n .map(term => term.replace(/^\"|\"$/g, '')) // Remove quotes\n .filter(term => term.length > 2 && !stopWords.includes(term.toLowerCase()));\n}\n// Generic label/tag matching function\nexport function checkPartialMatch(target, source, threshold = 0.5) {\n // If either string is quoted, require exact match\n if ((target.startsWith('\"') && target.endsWith('\"')) ||\n (source.startsWith('\"') && source.endsWith('\"'))) {\n const t = target.replace(/^\"|\"$/g, '').toLowerCase();\n const s = source.replace(/^\"|\"$/g, '').toLowerCase();\n return t === s;\n }\n const normalizedTarget = target.toLowerCase();\n const normalizedSource = source.toLowerCase();\n return stringSimilarity(normalizedTarget, normalizedSource) > threshold ||\n normalizedSource.includes(normalizedTarget) ||\n normalizedTarget.includes(normalizedSource);\n}\n", "export class OpenAI {\n constructor(_opts?: { apiKey?: string; }) {}\n}\n\nexport default OpenAI;\n\n\n", "import { OpenAI } from \"openai\";\nimport { stringSimilarity } from \"../utils/search-utils.js\";\n// Base search service with common functionality\nexport class BaseSearchService {\n constructor(workspace, openaiApiKey) {\n this.workspace = workspace;\n this.openaiApiKey = openaiApiKey;\n this.openai = null;\n this.embeddingCache = {};\n this.cacheKey = 'default-cache';\n this.DEFAULT_MIN_SCORE = 0.1;\n this.DEFAULT_MAX_RESULTS = 10;\n // Initialize OpenAI client if API key is provided\n if (openaiApiKey) {\n this.openai = new OpenAI({\n apiKey: openaiApiKey,\n });\n }\n // Set cache key based on workspace ID if provided\n if (workspace) {\n this.cacheKey = `embedding-cache-${workspace.id}`;\n }\n // Load existing cache from localStorage\n this.loadEmbeddingCache();\n }\n // Check if vector search is available\n hasVectorSearch() {\n // Implement vector search availability check\n return false; // For now, default to false\n }\n // Get embedding for text\n async getEmbedding(_text) {\n // Implement embedding generation\n return null; // For now, return null to fall back to text search\n }\n // Calculate cosine similarity between two vectors\n cosineSimilarity(a, b) {\n if (a.length !== b.length) {\n return 0;\n }\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n if (normA === 0 || normB === 0) {\n return 0;\n }\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));\n }\n // Generate content hash for caching\n generateContentHash(content) {\n return content; // For now, just return content as hash\n }\n // Get cached embedding if available\n async getCachedEmbedding(_key, _contentHash, _lastModified) {\n // Implement embedding cache retrieval\n return null;\n }\n // Cache embedding for future use\n cacheEmbedding(_key, _embedding, _contentHash, _lastModified) {\n // Implement embedding caching\n }\n // Save embedding cache to localStorage\n saveEmbeddingCache() {\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(this.cacheKey, JSON.stringify(this.embeddingCache));\n }\n catch (error) {\n console.error(\"Error saving embedding cache:\", error);\n }\n }\n }\n // Load embedding cache from localStorage\n loadEmbeddingCache() {\n if (typeof localStorage !== 'undefined') {\n try {\n const cached = localStorage.getItem(this.cacheKey);\n if (cached) {\n this.embeddingCache = JSON.parse(cached);\n }\n }\n catch (error) {\n console.error(\"Error loading embedding cache:\", error);\n // If there's an error, reset the cache\n this.embeddingCache = {};\n }\n }\n }\n // Clear embedding cache\n clearEmbeddingCache() {\n this.embeddingCache = {};\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.removeItem(this.cacheKey);\n }\n catch (error) {\n console.error(\"Error clearing embedding cache:\", error);\n }\n }\n }\n // Check if cache is being used\n isUsingCache() {\n return Object.keys(this.embeddingCache).length > 0;\n }\n calculateTextSimilarity(text1, text2) {\n return stringSimilarity(text1.toLowerCase(), text2.toLowerCase());\n }\n}\n", "import { stringSimilarity, extractKeyTerms } from \"../utils/search-utils.js\";\nimport { BaseSearchService } from \"./base-search.js\";\nexport class DocumentSearchService extends BaseSearchService {\n constructor(repo, workspace) {\n super();\n this.repo = repo;\n this.workspace = workspace;\n }\n // Search documents in the workspace\n async search(query, options = {}) {\n const { minScore = this.DEFAULT_MIN_SCORE, maxResults = this.DEFAULT_MAX_RESULTS, includeGitHubData = true, useVectorSearch = this.hasVectorSearch() } = options;\n // Extract search terms for text search\n const searchTerms = extractKeyTerms(query);\n // Use vector search if available and not explicitly disabled\n if (useVectorSearch && this.hasVectorSearch()) {\n return this.vectorSearch(query, { minScore, maxResults, includeGitHubData });\n }\n // Fall back to text search\n return this.textSearch(query, searchTerms, { minScore, maxResults, includeGitHubData });\n }\n // Search specifically for GitHub repositories\n async searchGitHubRepos(query, options = {}) {\n const { minScore = this.DEFAULT_MIN_SCORE, maxResults = this.DEFAULT_MAX_RESULTS, useVectorSearch = this.hasVectorSearch() } = options;\n // console.log(`[DocumentSearch] Searching for repos with query: \"${query}\"`);\n // Build folder paths for all folders\n const folderPaths = new Map();\n this.buildFolderPaths(this.workspace.folders || [], folderPaths);\n // Create a map of repository folders with their paths\n // This will track both standard GitHub repos and local project repos\n const repositoryFolders = new Map();\n // First identify all repository folders in the workspace\n this.workspace.folders?.forEach(folder => {\n if (!folder || !folder.id || !folder.name)\n return;\n // Check for workspace folder patterns that indicate a repository\n const path = this.getFolderPath(folderPaths, folder.id);\n if (!path)\n return;\n // Criteria for repository folders:\n // 1. Under a \"Repositories\" folder structure\n // 2. Repository/repo-like name patterns\n // 3. Contains typical repository files\n // Check if path includes repository folder markers\n const isRepoPathPattern = path.some(segment => segment === 'Repositories' ||\n segment.includes('Repository') ||\n segment === 'repos' ||\n segment === 'github');\n // Check if the folder name itself looks like a repository name\n const isRepoNamePattern = folder.name.includes('-') ||\n folder.name.includes('_') ||\n folder.name.endsWith('.git') ||\n folder.name.endsWith('-repo') ||\n folder.name.endsWith('-backend') ||\n folder.name.endsWith('-frontend') ||\n folder.name.endsWith('-app');\n if (isRepoPathPattern || isRepoNamePattern) {\n repositoryFolders.set(folder.id, {\n id: folder.id,\n name: folder.name,\n path: path\n });\n // console.log(`[DocumentSearch] Identified repository folder: ${folder.name} (${path.join('/')})`);\n }\n });\n // console.log(`[DocumentSearch] Found ${repositoryFolders.size} potential repository folders`);\n // Find all files in repository folders\n const repoFiles = this.workspace.fileRefs?.filter(fileRef => {\n if (!fileRef || !fileRef.folderId)\n return false;\n // Direct match: file is in a repository folder\n if (repositoryFolders.has(fileRef.folderId)) {\n return true;\n }\n // Ancestor match: file is in a subfolder of a repository folder\n const path = this.getFolderPath(folderPaths, fileRef.folderId);\n if (!path)\n return false;\n // Check if any part of the path matches a repository folder id\n return Array.from(repositoryFolders.keys()).some(repoId => {\n const repoFolder = this.workspace.folders?.find(f => f.id === repoId);\n return repoFolder && repoFolder.name && path.includes(repoFolder.name);\n });\n }) || [];\n // console.log(`[DocumentSearch] Found ${repoFiles.length} potential repo files`);\n // Process search query into multiple variations\n const normalizedQuery = query.toLowerCase().trim();\n const queryTerms = normalizedQuery.split(/\\s+/);\n // Add the raw query to make sure we don't lose anything\n const searchTerms = [\n ...extractKeyTerms(query),\n normalizedQuery\n ];\n // Add hyphenated, underscored, and no-space variations\n if (queryTerms.length > 1) {\n searchTerms.push(queryTerms.join('-'), queryTerms.join('_'), queryTerms.join(''));\n }\n // console.log(`[DocumentSearch] Using search terms: ${JSON.stringify(searchTerms)}`);\n // Group files by repository folder for better repository-level matching\n const repoFilesByFolder = new Map();\n repoFiles.forEach(fileRef => {\n if (!fileRef || !fileRef.folderId)\n return;\n // Find parent repository folder (could be ancestor)\n let repoFolderId = null;\n // Direct parent is a repo folder\n if (repositoryFolders.has(fileRef.folderId)) {\n repoFolderId = fileRef.folderId;\n }\n else {\n // Check for ancestor repo folder\n const path = this.getFolderPath(folderPaths, fileRef.folderId);\n if (path) {\n // Check path segments against repo folder names\n for (const segment of path) {\n const matchingRepo = Array.from(repositoryFolders.values()).find(repo => repo.name === segment);\n if (matchingRepo) {\n repoFolderId = matchingRepo.id;\n break;\n }\n }\n }\n }\n if (repoFolderId) {\n if (!repoFilesByFolder.has(repoFolderId)) {\n repoFilesByFolder.set(repoFolderId, []);\n }\n repoFilesByFolder.get(repoFolderId)?.push(fileRef);\n }\n });\n // console.log(`[DocumentSearch] Grouped files into ${repoFilesByFolder.size} repositories`);\n // Now score repositories by matching their folders and key files against the query\n const scoredRepos = [];\n for (const [repoId, files] of repoFilesByFolder.entries()) {\n const repoFolder = repositoryFolders.get(repoId);\n if (!repoFolder)\n continue;\n let score = 0;\n const matchedFiles = [];\n // Score by name match\n const repoName = repoFolder.name.toLowerCase();\n for (const term of searchTerms) {\n if (repoName.includes(term)) {\n score += 0.5; // Boost for name match\n break;\n }\n }\n // Score by path match\n const pathString = repoFolder.path.join(' ').toLowerCase();\n for (const term of searchTerms) {\n if (pathString.includes(term)) {\n score += 0.3; // Boost for path match\n break;\n }\n }\n // Score by important file presence (package.json, README, etc.)\n const importantFiles = files.filter(file => file.name && [\n 'package.json',\n 'README.md',\n 'tsconfig.json',\n 'requirements.txt',\n 'Cargo.toml',\n 'pom.xml',\n 'build.gradle',\n '.gitignore'\n ].includes(file.name));\n score += importantFiles.length * 0.1; // Boost for each important file\n matchedFiles.push(...importantFiles);\n // Check file name matches\n for (const file of files) {\n if (!file.name)\n continue;\n const fileName = file.name.toLowerCase();\n for (const term of searchTerms) {\n if (fileName.includes(term)) {\n score += 0.2; // Boost for file name match\n matchedFiles.push(file);\n break;\n }\n }\n }\n // Only include repos with sufficient score\n if (score >= minScore) {\n scoredRepos.push({\n id: repoId,\n name: repoFolder.name,\n path: repoFolder.path,\n score,\n matchedFiles: [...new Set(matchedFiles)] // Remove duplicates\n });\n }\n }\n // Sort repos by score and limit results\n const topRepos = scoredRepos\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n // console.log(`[DocumentSearch] Found ${topRepos.length} repositories matching query`);\n // Create DocumentSearchResults for the matched repositories\n const results = topRepos.map(repo => {\n // Get the most relevant file from this repo to use as the documentId\n const bestMatchFile = repo.matchedFiles[0];\n const docId = bestMatchFile?.id;\n // Extract repo details from path\n const repoDetails = this.extractRepoDetailsFromPath(repo.path);\n return {\n id: docId?.toString() || repo.id,\n documentId: docId || repo.id, // Use folder ID if no file ID\n title: repo.name,\n type: \"repository\",\n content: `Repository: ${repo.name} (${repo.matchedFiles.length} relevant files)`,\n matchScore: repo.score,\n lastModified: bestMatchFile?.updatedAt || new Date().toISOString(),\n path: repo.path,\n repoDetails\n };\n });\n return results;\n }\n // Helper to extract repo details from a path\n extractRepoDetailsFromPath(path) {\n if (!path || path.length < 1) {\n return undefined;\n }\n // First look for standard GitHub repository pattern\n const repoIndex = path.findIndex(segment => segment === 'Repositories' ||\n segment.includes('Repository') ||\n segment === 'repos' ||\n segment === 'github');\n if (repoIndex !== -1 && repoIndex + 2 < path.length) {\n // Standard pattern: Repositories/owner/repo\n const owner = path[repoIndex + 1];\n const repo = path[repoIndex + 2];\n return {\n owner,\n repo,\n url: `https://github.com/${owner}/${repo}`\n };\n }\n // If no standard pattern, look for the repo name directly\n const repoName = path[path.length - 1];\n // Try to infer owner from path context or use a placeholder\n let owner = 'unknown';\n // Look for owner in path or use parent folder if available\n if (path.length >= 2) {\n owner = path[path.length - 2];\n }\n return {\n owner,\n repo: repoName,\n url: `https://github.com/${owner}/${repoName}`\n };\n }\n // Text-based search implementation\n async textSearch(query, searchTerms, options) {\n const { minScore = this.DEFAULT_MIN_SCORE, maxResults = this.DEFAULT_MAX_RESULTS } = options;\n const results = [];\n // Build folder paths for all folders\n const folderPaths = new Map();\n this.buildFolderPaths(this.workspace.folders || [], folderPaths);\n // Process each file reference\n for (const fileRef of this.workspace.fileRefs || []) {\n if (!fileRef || !fileRef.name || !fileRef.type || !fileRef.id || !fileRef.updatedAt)\n continue; // Skip invalid files\n const score = this.calculateFileScore(fileRef, searchTerms);\n // Add to results if score is above threshold\n if (score >= minScore) {\n const path = this.getFolderPath(folderPaths, fileRef.folderId);\n if (!path)\n continue; // Skip if path is undefined\n results.push({\n id: fileRef.id.toString(),\n documentId: fileRef.id,\n title: fileRef.name,\n type: fileRef.type,\n content: `${fileRef.name} ${fileRef.type}`,\n matchScore: score,\n lastModified: fileRef.updatedAt,\n path,\n repoDetails: options.includeGitHubData ? this.extractRepoDetails(path, fileRef) : undefined\n });\n }\n }\n // Sort by score and limit results\n return results\n .sort((a, b) => b.matchScore - a.matchScore)\n .slice(0, maxResults);\n }\n // Vector-based search implementation\n async vectorSearch(query, options) {\n const { minScore = this.DEFAULT_MIN_SCORE, maxResults = this.DEFAULT_MAX_RESULTS } = options;\n // Get query embedding\n const queryEmbedding = await this.getEmbedding(query);\n if (!queryEmbedding) {\n // Fall back to text search if embedding fails\n return this.textSearch(query, extractKeyTerms(query), options);\n }\n const results = [];\n // Build folder paths for all folders\n const folderPaths = new Map();\n this.buildFolderPaths(this.workspace.folders || [], folderPaths);\n // Process each file\n for (const fileRef of this.workspace.fileRefs || []) {\n if (!fileRef || !fileRef.name || !fileRef.type || !fileRef.id || !fileRef.updatedAt)\n continue; // Skip invalid files\n // Generate content for embedding\n const content = `${fileRef.name} ${fileRef.type}`;\n const contentHash = this.generateContentHash(content);\n // Try to get cached embedding\n let embedding = await this.getCachedEmbedding(fileRef.id.toString(), contentHash, fileRef.updatedAt);\n // If not cached, generate new embedding\n if (!embedding) {\n embedding = await this.getEmbedding(content);\n // Cache the embedding if successful\n if (embedding) {\n this.cacheEmbedding(fileRef.id.toString(), embedding, contentHash, fileRef.updatedAt);\n }\n }\n // Calculate similarity score\n let score = 0;\n if (embedding && queryEmbedding) {\n score = this.cosineSimilarity(queryEmbedding, embedding);\n }\n else {\n // Fall back to text similarity\n score = this.calculateFileScore(fileRef, extractKeyTerms(query));\n }\n // Add to results if score is above threshold\n if (score >= minScore) {\n const path = this.getFolderPath(folderPaths, fileRef.folderId);\n if (!path)\n continue; // Skip if path is undefined\n results.push({\n id: fileRef.id.toString(),\n documentId: fileRef.id,\n title: fileRef.name,\n type: fileRef.type,\n content: `${fileRef.name} ${fileRef.type}`,\n matchScore: score,\n lastModified: fileRef.updatedAt,\n path,\n repoDetails: options.includeGitHubData ? this.extractRepoDetails(path, fileRef) : undefined\n });\n }\n }\n // Sort by score and limit results\n return results\n .sort((a, b) => b.matchScore - a.matchScore)\n .slice(0, maxResults);\n }\n // Search for sources within a document's context data\n async searchSources(documentId, responseData) {\n if (!responseData.sources || !Array.isArray(responseData.sources)) {\n return [];\n }\n return responseData.sources.map(source => ({\n id: source.id,\n title: source.title,\n description: source.description,\n matchScore: source.matchScore || 0.5\n }));\n }\n // Build folder paths for all folders\n buildFolderPaths(folders, paths) {\n if (!folders)\n return;\n for (const folder of folders) {\n if (!folder || !folder.id || !folder.name)\n continue;\n const path = [];\n let currentFolder = folder;\n while (currentFolder) {\n if (!currentFolder.name)\n break;\n path.unshift(currentFolder.name);\n if (!currentFolder.parentId)\n break;\n const parentFolder = folders.find(f => f.id === currentFolder.parentId);\n if (!parentFolder)\n break;\n currentFolder = parentFolder;\n }\n paths.set(folder.id, path);\n }\n }\n // Get folder path\n getFolderPath(paths, folderId) {\n if (!folderId)\n return [];\n return paths.get(folderId) || [];\n }\n // Extract repo details\n extractRepoDetails(path, fileRef) {\n if (!path || path.length < 2) {\n // console.log(`[DocumentSearch] Path too short for repo details: ${path?.join('/')}`);\n return undefined;\n }\n // console.log(`[DocumentSearch] Checking path for repo details: ${path.join('/')}`);\n // First try standard repository pattern\n const repoIndex = path.findIndex(segment => segment === 'Repositories' ||\n segment.includes('Repository') ||\n segment === 'repos' ||\n segment === 'github');\n if (repoIndex !== -1 && repoIndex + 2 < path.length) {\n const owner = path[repoIndex + 1];\n const repo = path[repoIndex + 2];\n // console.log(`[DocumentSearch] Found repo in standard path: ${owner}/${repo}`);\n return {\n owner,\n repo,\n url: `https://github.com/${owner}/${repo}`\n };\n }\n // Try to find GitHub org/repo pattern anywhere in the path\n // Look for path segments that resemble GitHub username/org\n for (let i = 0; i < path.length - 1; i++) {\n // If this segment contains typical GitHub org/user name markers\n if (path[i] && path[i + 1] &&\n (path[i].length >= 2 && path[i + 1].length >= 2) && // Both segments have reasonable lengths\n !/^\\s*$/.test(path[i]) && !/^\\s*$/.test(path[i + 1])) { // No empty segments\n // console.log(`[DocumentSearch] Found potential owner/repo pattern: ${path[i]}/${path[i+1]}`);\n return {\n owner: path[i],\n repo: path[i + 1],\n url: `https://github.com/${path[i]}/${path[i + 1]}`\n };\n }\n }\n // As a last resort, try to use the folder name as repo name if it looks like a repo\n // Common repo indicators in last segment\n const lastSegment = path[path.length - 1];\n if (lastSegment && (lastSegment.includes('-') ||\n lastSegment.includes('_') ||\n /^[a-z0-9]+$/i.test(lastSegment) || // alphanumeric\n lastSegment.endsWith('.git') ||\n lastSegment.endsWith('-repo'))) {\n const repoName = lastSegment.replace(/\\.git$/, '');\n // If we have at least two path segments, assume the parent is the owner\n if (path.length >= 2) {\n const potentialOwner = path[path.length - 2];\n // console.log(`[DocumentSearch] Using folder name as repo details: ${potentialOwner}/${repoName}`);\n return {\n owner: potentialOwner,\n repo: repoName,\n url: `https://github.com/${potentialOwner}/${repoName}`\n };\n }\n // If we only have one path segment, use a placeholder owner\n // console.log(`[DocumentSearch] Using folder name as repo with default owner: unknown/${repoName}`);\n return {\n owner: 'unknown',\n repo: repoName,\n url: `https://github.com/unknown/${repoName}`\n };\n }\n // console.log(`[DocumentSearch] Could not extract repo details from path: ${path.join('/')}`);\n return undefined;\n }\n // Calculate file score\n calculateFileScore(source, searchTerms) {\n if (!source || !source.name)\n return 0;\n const nameScore = searchTerms.reduce((score, term) => {\n return score + stringSimilarity(source.name.toLowerCase(), term.toLowerCase());\n }, 0);\n return nameScore / searchTerms.length;\n }\n // Enhanced file score calculation that tries multiple matching approaches\n calculateFileScoreEnhanced(source, searchTerms) {\n if (!source || !source.name)\n return 0;\n // Try exact matching first\n for (const term of searchTerms) {\n if (source.name.toLowerCase() === term) {\n return 1.0; // Perfect match!\n }\n }\n // Calculate best match across all search terms \n let bestScore = 0;\n for (const term of searchTerms) {\n // Check if name contains the term directly (higher weight)\n if (source.name.toLowerCase().includes(term)) {\n const containsScore = 0.8 * (term.length / source.name.length);\n bestScore = Math.max(bestScore, containsScore);\n }\n // Calculate similarity score\n const similarityScore = stringSimilarity(source.name.toLowerCase(), term);\n bestScore = Math.max(bestScore, similarityScore);\n }\n return bestScore;\n }\n async getWorkspaceFiles(workspaceId) {\n try {\n const handle = await this.repo.find(workspaceId);\n if (!handle) {\n // console.log('[DocumentSearch] No workspace handle found for ID:', workspaceId)\n return [];\n }\n const workspace = handle.doc();\n if (!workspace.fileRefs) {\n // console.log('[DocumentSearch] No fileRefs array in workspace')\n return [];\n }\n return workspace.fileRefs;\n }\n catch (error) {\n console.error('[DocumentSearch] Error getting workspace files:', error);\n return [];\n }\n }\n}\n", "// @ts-nocheck\nimport { z } from 'zod';\nimport { tool } from 'ai';\nexport const searchDocuments = tool({\n description: 'Search documents in the workspace by query string.',\n parameters: z.object({\n query: z.string().describe('The exact search query from user. DO NOT modify or expand the search terms.'),\n }),\n // @ts-ignore\n async execute({ query, context }) {\n try {\n if (!query) {\n query = context?.variables?.thread?.items?.[0]?.content || '';\n }\n const searchQuery = query;\n const searchService = new (await import('../services/document-search.js')).DocumentSearchService(context.repo, context.activeWorkspace);\n const results = await searchService.search(searchQuery);\n const validDocumentIds = [];\n const validResults = [];\n for (const result of results) {\n try {\n if (!result.documentId)\n continue;\n const validation = await context.repo.find(result.documentId);\n if (validation) {\n validDocumentIds.push(result.documentId);\n validResults.push(result);\n }\n }\n catch { }\n }\n context.lastSearchResult = {\n query: searchQuery,\n documentIds: validDocumentIds,\n results: validResults\n };\n return {\n value: `Found ${validResults.length} results for \"${searchQuery}\"`,\n data: { results: validResults || [] },\n documentIds: validDocumentIds.length > 0 ? validDocumentIds : undefined,\n ui: {\n type: 'tool',\n name: 'search',\n status: 'success',\n component: 'search',\n connectorId: 'searchDocuments',\n data: {\n query: searchQuery,\n results: validResults.map(result => ({\n id: result.documentId,\n title: result.title,\n type: result.type\n }))\n }\n }\n };\n }\n catch (error) {\n return {\n value: `Error searching documents: ${error instanceof Error ? error.message : String(error)}`,\n ui: {\n type: 'tool',\n name: 'search',\n status: 'error',\n component: 'search',\n connectorId: 'searchDocuments',\n data: {\n query: query,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n };\n }\n }\n});\n// console.log('[DEBUG] searchDocuments tool:', searchDocuments);\n// console.log('[DEBUG] searchDocuments.parameters:', (searchDocuments as any).parameters);\n// console.log('[DEBUG] searchDocuments.inputSchema:', (searchDocuments as any).inputSchema);\n// console.log('[DEBUG] typeof searchDocuments.parameters:', typeof (searchDocuments as any).parameters);\n// console.log('[DEBUG] typeof searchDocuments.inputSchema:', typeof (searchDocuments as any).inputSchema);\n// console.log('[DEBUG] typeof searchDocuments.parameters.safeParse:', typeof (searchDocuments as any).parameters?.safeParse);\n// console.log('[DEBUG] typeof searchDocuments.inputSchema.safeParse:', typeof (searchDocuments as any).inputSchema?.safeParse);\n", "import { z } from 'zod';\nimport { tool } from 'ai';\nexport const readDocument = tool({\n description: 'Read the content of a document by filename.',\n parameters: z.object({\n filename: z.string().describe('Name of the document to read.'),\n context: z.any().describe('Current context')\n }),\n // @ts-ignore\n async execute(args) {\n const { filename, context } = args;\n // Try different sources for document ID in this priority:\n // 1. Last search result\n // 2. Context files with documentId\n // First try to get from search results\n let documentId = context.lastSearchResult?.documentIds?.[0];\n // If no documentId from search results, check context files\n if (!documentId && context.contextFiles && context.contextFiles.length > 0) {\n // Find first context file with documentId\n const contextFile = context.contextFiles.find((file) => file.documentId);\n if (contextFile?.documentId) {\n documentId = contextFile.documentId;\n console.log(`[readDocument] Using document ID from context file: ${documentId}`);\n }\n }\n // Validate documentId from context\n if (!documentId) {\n console.error('[readDocument] No document ID found in context');\n // Add helpful message about context files if they exist\n let errorMsg = 'No document ID found in context.';\n if (context.contextFiles && context.contextFiles.length > 0) {\n // If we have context files but no IDs, explain the situation\n const fileNames = context.contextFiles\n .filter((file) => file.name || file.path)\n .map((file) => file.name || file.path.split('/').pop() || file.path)\n .join(', ');\n if (context.contextFiles.some((file) => file.documentId)) {\n // Context files with IDs exist but none matched\n errorMsg = `Context files found but couldn't be accessed. Try searching for: ${fileNames}`;\n }\n else {\n // Context files exist but don't have IDs\n errorMsg = `Context files found but they don't have proper document IDs: ${fileNames}`;\n }\n }\n else {\n // No context files, suggest a search\n errorMsg = 'No document ID found in context. Please search for a document first.';\n }\n return {\n value: errorMsg,\n ui: {\n type: 'tool',\n name: 'reading',\n status: 'error',\n component: 'reading',\n connectorId: 'readDocument',\n data: {\n error: 'No document ID found in context'\n }\n }\n };\n }\n try {\n const { repo } = context;\n if (!repo)\n throw new Error('No repo instance in context');\n console.log('[readDocument] Attempting to read document:', documentId);\n // First check if this is a contextFile and we already have content\n if (context.contextFiles) {\n const contextFile = context.contextFiles.find((file) => file.documentId === documentId);\n if (contextFile && contextFile.content) {\n console.log(`[readDocument] Using content from context file: ${contextFile.name || contextFile.path}`);\n // Return the actual content of the context file\n return {\n value: contextFile.content,\n documentIds: [documentId],\n ui: {\n type: 'tool',\n name: 'reading',\n status: 'success',\n component: 'reading',\n connectorId: 'readDocument',\n data: {\n documentId: documentId,\n preview: contextFile.content.substring(0, 200) + (contextFile.content.length > 200 ? '...' : '')\n }\n }\n };\n }\n }\n // Validate document first\n const doc = await repo.getDocument(documentId);\n console.log('[readDocument] Successfully read document:', {\n id: documentId\n });\n // Return the actual content of the document\n return {\n value: '',\n documentIds: [documentId],\n ui: {\n type: 'tool',\n name: 'reading',\n status: 'success',\n component: 'reading',\n connectorId: 'readDocument',\n data: {\n documentId: documentId,\n preview: doc?.text?.substring(0, 200) + (doc?.text?.length > 200 ? '...' : '') || ''\n }\n },\n contextData: {\n state: {\n documentId: documentId,\n preview: doc?.text || ''\n }\n }\n };\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error('[readDocument] Error:', errorMessage);\n return {\n value: `Error reading document: ${errorMessage}`,\n documentIds: [documentId],\n ui: {\n type: 'tool',\n name: 'reading',\n status: 'error',\n component: 'reading',\n connectorId: 'readDocument',\n data: {\n documentId: documentId,\n error: errorMessage\n }\n }\n };\n }\n }\n});\n", "import { stringSimilarity } from \"../utils/search-utils.js\";\nimport { tool } from \"ai\";\nimport { z } from \"zod\";\nexport const searchDocumentsEnhanced = tool({\n name: 'searchDocumentsEnhanced',\n description: 'Search for documents by type and query with enhanced validation',\n parameters: z.object({\n query: z.string().describe('The search query to find documents'),\n documentType: z.string().describe('The type of document to search for'),\n context: z.any().describe('Current context (injected by orchestrator)'),\n }),\n // @ts-ignore\n execute: async (args) => {\n // Move searchQuery declaration outside the try block so it's available in the catch block\n const searchQuery = args.query;\n try {\n console.log(\"[searchDocumentsEnhanced] Starting search with query:\", searchQuery);\n const { repo } = args.context;\n if (!repo)\n throw new Error(\"No repo instance in context\");\n const documentType = args.documentType ?? \"strategy-document\";\n const documentType_enum = documentType;\n // Use workspace state to get document IDs\n const workspace = args.context.variables.state?.workspace || {};\n const knownDocIds = workspace?.documentIds || [];\n console.log(`[searchDocumentsEnhanced] Found ${knownDocIds.length} document IDs in workspace`);\n // Validate a sample of documents to diagnose issues\n const sampleSize = Math.min(knownDocIds.length, 3);\n if (knownDocIds.length > 0) {\n console.log(`[searchDocumentsEnhanced] Validating ${sampleSize} sample documents for diagnostics`);\n // Sample random documents for validation\n const sampleDocIds = [...knownDocIds]\n .sort(() => Math.random() - 0.5)\n .slice(0, sampleSize);\n for (const docId of sampleDocIds) {\n console.log(`[searchDocumentsEnhanced] Validating document: ${docId}`);\n const doc = await repo.getDocument(docId);\n console.log(`[searchDocumentsEnhanced] Validation result for ${docId}:`, doc ? 'Success' : `Failed: ${docId} not found`);\n }\n }\n // Find all valid documents of the specified type that match the query\n const docIds = [];\n const matchedDocs = [];\n for (const documentId of knownDocIds) {\n try {\n const doc = await repo.getDocument(documentId);\n if (doc?.metadata?.type === documentType_enum) {\n // Calculate match score based on title\n const titleScore = searchQuery && doc.title\n ? stringSimilarity(doc.title, searchQuery)\n : 0;\n // Check content if available\n let contentScore = 0;\n if (doc.text && searchQuery) {\n contentScore = stringSimilarity(doc.text.substring(0, 1000), // Limit content length for performance\n searchQuery) * 0.7; // Give content matches less weight than title matches\n }\n // Use the best score between title and content\n const matchScore = Math.max(titleScore, contentScore);\n if (matchScore > 0.3) { // Lower threshold to find more potential matches\n console.log(`[searchDocumentsEnhanced] Found matching document: ${documentId} with score ${matchScore}`);\n docIds.push(documentId);\n matchedDocs.push({\n id: documentId,\n title: doc.title || \"Untitled\",\n score: matchScore,\n summary: doc.text ? `${doc.text.substring(0, 100)}...` : undefined\n });\n }\n }\n }\n catch (e) {\n console.error(`[searchDocumentsEnhanced] Error checking document ${documentId}:`, e);\n }\n }\n // Sort by match score\n matchedDocs.sort((a, b) => b.score - a.score);\n const sortedDocIds = matchedDocs.map(doc => doc.id);\n if (sortedDocIds.length > 0) {\n console.log(`[searchDocumentsEnhanced] Found ${sortedDocIds.length} results for \"${searchQuery}\"`);\n // Store results in context for other tools to use\n args.context.lastSearchResult = {\n query: searchQuery,\n documentIds: sortedDocIds,\n results: matchedDocs\n };\n return {\n value: `Found ${sortedDocIds.length} results for \"${searchQuery}\"`,\n data: {\n results: matchedDocs\n },\n documentIds: sortedDocIds,\n ui: {\n type: 'tool',\n name: 'search',\n status: 'success',\n component: 'search',\n connectorId: 'searchDocumentsEnhanced',\n data: {\n query: searchQuery,\n results: matchedDocs.map(doc => ({\n id: doc.id,\n title: doc.title,\n score: doc.score,\n preview: doc.summary\n }))\n }\n }\n };\n }\n return {\n value: `No results found for \"${searchQuery}\"`,\n ui: {\n type: 'tool',\n name: 'search',\n status: 'warning',\n component: 'search',\n connectorId: 'searchDocumentsEnhanced',\n data: {\n query: searchQuery,\n results: []\n }\n }\n };\n }\n catch (error) {\n console.error(\"[searchDocumentsEnhanced] Error:\", error);\n return {\n value: `Error searching documents: ${error instanceof Error ? error.message : String(error)}`,\n ui: {\n type: 'tool',\n name: 'search',\n status: 'error',\n component: 'search',\n connectorId: 'searchDocumentsEnhanced',\n data: {\n query: searchQuery,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n };\n }\n }\n});\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport { WorkspaceService } from \"../services/workspace-service.js\";\nimport { BranchService } from \"../services/branch-service.js\";\nimport { extractKeyTerms, stringSimilarity } from \"../utils/search-utils.js\";\nconst searchWorkspaceInputSchema = z.object({\n query: z.string().optional().describe(\"Text or pattern to search for. When empty, returns a directory listing.\"),\n regex: z.boolean().optional().describe(\"When true, treat query as a regular expression (case insensitive).\"),\n fileType: z.string().optional().describe(\"Optional file extension (e.g. '.ts') to filter results.\"),\n listOnly: z.boolean().optional().describe(\"Return results without applying query filtering.\"),\n path: z.string().optional().describe(\"Limit results to files whose computed path begins with this prefix.\"),\n limit: z.number().int().min(1).max(200).optional().describe(\"Maximum number of results to return (default 20).\"),\n cursor: z.string().optional().describe(\"Opaque cursor representing the result offset for pagination.\"),\n context: z.any().describe(\"Session context injected by orchestrator.\"),\n});\nfunction computeFolderPath(folderMap, folderId) {\n if (!folderId)\n return \"\";\n const seen = new Set();\n const segments = [];\n let current = folderId;\n while (current) {\n if (seen.has(current))\n break;\n seen.add(current);\n const folder = folderMap.get(current);\n if (!folder)\n break;\n segments.unshift(folder.name);\n current = folder.parentId ?? null;\n }\n return segments.join(\"/\");\n}\nfunction toPath(folderPath, fileName) {\n return `/${[folderPath, fileName].filter(Boolean).join(\"/\")}`;\n}\nfunction scoreFile(query, file, path, highlights) {\n if (!query)\n return 0.5; // neutral baseline for listings\n const nameScore = stringSimilarity(query, file.name);\n const pathScore = stringSimilarity(query, path);\n const termBonus = highlights.length > 0 ? 0.1 * highlights.length : 0;\n const recencyBonus = file.updatedAt\n ? (() => {\n const updatedAt = new Date(file.updatedAt).getTime();\n if (Number.isNaN(updatedAt))\n return 0;\n const ageDays = (Date.now() - updatedAt) / (1000 * 60 * 60 * 24);\n const freshness = Math.max(0, 1 - Math.min(ageDays, 30) / 30); // fresh files (<30d) get bonus\n return 0.2 * freshness;\n })()\n : 0;\n return Math.max(nameScore, pathScore) + termBonus + recencyBonus;\n}\nfunction collectHighlights(query, path, terms) {\n if (!query)\n return [];\n const highlights = new Set();\n for (const term of terms) {\n if (!term)\n continue;\n const regex = new RegExp(term.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), \"i\");\n const match = path.match(regex);\n if (match?.[0])\n highlights.add(match[0]);\n }\n return Array.from(highlights);\n}\nasync function resolveWorkspaceView(repo, workspace, branchId) {\n if (!branchId || !workspace.branchesDocId)\n return workspace;\n try {\n const branchService = new BranchService(repo);\n const resolved = await branchService.resolveWorkspaceHead(workspace.id, branchId, workspace.branchesDocId);\n if (!resolved.head)\n return workspace;\n const handle = await repo.find(workspace.id);\n const viewHandle = handle.view([resolved.head]);\n if (typeof viewHandle.doc === \"function\") {\n return viewHandle.doc();\n }\n return await viewHandle.doc();\n }\n catch (error) {\n console.warn(\"[searchWorkspace] Failed to resolve branch-scoped workspace view; falling back to base\", error);\n return workspace;\n }\n}\nexport const searchWorkspace = tool({\n description: \"Search files in the active workspace with branch-aware indexing, fuzzy scoring, and pagination. Results include metadata and documentIds for follow-up reads.\",\n inputSchema: searchWorkspaceInputSchema,\n async execute(rawInput) {\n const { query = \"\", regex = false, fileType, listOnly = false, path, limit = 20, cursor, context, } = rawInput;\n try {\n const repo = context?.repo;\n const workspaceId = context?.activeWorkspace?.id ?? context?.workspaceId;\n if (!repo || !workspaceId) {\n throw new Error(\"searchWorkspace requires repo and activeWorkspace in context\");\n }\n const wsService = new WorkspaceService(repo);\n const workspace = await wsService.getWorkspace(workspaceId);\n const branchId = rawInput?.context?.branchId ??\n context?.activeThread?.branchId ??\n context?.activeBranch?.id ??\n context?.branchContext?.branchId ??\n workspace.activeBranchId ??\n null;\n const workspaceView = await resolveWorkspaceView(repo, workspace, branchId ?? undefined);\n const folderMap = new Map((workspaceView.folders ?? []).map((folder) => [folder.id, folder]));\n const branchFileRefs = await wsService.getBranchAwareFileRefs(workspaceId, {\n branchId: branchId ?? undefined,\n });\n let candidates = branchFileRefs.map((ref) => {\n const folderPath = computeFolderPath(folderMap, ref.folderId ?? null);\n const computedPath = toPath(folderPath, ref.name);\n return { ref, path: computedPath };\n });\n if (path) {\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n candidates = candidates.filter((candidate) => candidate.path.startsWith(normalizedPath));\n }\n if (fileType) {\n const normalizedType = fileType.startsWith(\".\") ? fileType : `.${fileType}`;\n candidates = candidates.filter((candidate) => candidate.ref.name.endsWith(normalizedType));\n }\n let regexFilter = null;\n const trimmedQuery = query.trim();\n if (regex && trimmedQuery) {\n try {\n regexFilter = new RegExp(trimmedQuery, \"i\");\n }\n catch (error) {\n return {\n type: \"error\",\n value: `Invalid regular expression: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n const terms = extractKeyTerms(trimmedQuery);\n const ranked = candidates\n .filter(({ ref, path }) => {\n if (!trimmedQuery || listOnly)\n return true;\n if (regexFilter)\n return regexFilter.test(path) || regexFilter.test(ref.name);\n const lowerQuery = trimmedQuery.toLowerCase();\n return (ref.name.toLowerCase().includes(lowerQuery) ||\n path.toLowerCase().includes(lowerQuery) ||\n terms.some((term) => path.toLowerCase().includes(term.toLowerCase())));\n })\n .map(({ ref, path }) => {\n const highlights = collectHighlights(trimmedQuery, path, terms);\n return {\n ref,\n path,\n highlights,\n score: listOnly ? 0.5 : scoreFile(trimmedQuery, ref, path, highlights),\n };\n })\n .sort((a, b) => b.score - a.score || a.path.localeCompare(b.path));\n const total = ranked.length;\n const start = cursor ? Number.parseInt(cursor, 10) || 0 : 0;\n const safeLimit = Math.max(1, Math.min(limit, 200));\n const paged = ranked.slice(start, start + safeLimit);\n const nextCursor = start + safeLimit < total ? String(start + safeLimit) : null;\n const files = paged.map(({ ref, path, score, highlights }) => ({\n documentId: ref.id,\n name: ref.name,\n type: ref.type,\n score,\n path,\n folderId: ref.folderId ?? null,\n createdAt: ref?.createdAt ?? null,\n updatedAt: ref?.updatedAt ?? null,\n highlights,\n }));\n const fileMap = files.reduce((acc, file) => {\n acc[file.path] = {\n documentId: file.documentId,\n path: file.path,\n score: file.score,\n };\n return acc;\n }, {});\n if (context) {\n context.lastSearchResult = {\n query: trimmedQuery,\n documentIds: files.map((file) => file.documentId),\n entries: files,\n total,\n cursor: nextCursor,\n };\n }\n return {\n type: \"success\",\n value: trimmedQuery\n ? `Found ${files.length} result(s) for \"${trimmedQuery}\"${nextCursor ? \" (more available)\" : \"\"}`\n : `Listed ${files.length} file(s)`,\n data: files,\n files,\n fileMap,\n meta: {\n total,\n nextCursor,\n },\n ui: {\n type: \"tool\",\n name: \"searchWorkspace\",\n status: \"success\",\n component: \"search\",\n data: {\n query: trimmedQuery,\n files,\n total,\n nextCursor,\n },\n },\n };\n }\n catch (error) {\n console.error(\"[searchWorkspace] Failed\", error);\n return {\n type: \"error\",\n value: error instanceof Error ? error.message : String(error),\n };\n }\n },\n});\n", "import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport { WorkspaceService } from \"../services/workspace-service.js\";\nimport { BranchableRepo } from \"../services/branchable-repo.js\";\nimport { BranchService } from \"../services/branch-service.js\";\nconst BYTE_LIMIT_DEFAULT = 64 * 1024; // 64KB\n// Use global Buffer if available (Node.js or polyfilled in browser)\nconst getBuffer = () => {\n if (typeof Buffer !== \"undefined\")\n return Buffer;\n // Fallback for browser - use TextEncoder/TextDecoder approach\n return {\n from: (data, encoding) => {\n if (data instanceof Uint8Array)\n return data;\n if (typeof data === 'string') {\n const encoder = new TextEncoder();\n return encoder.encode(data);\n }\n return new Uint8Array(0);\n },\n isBuffer: () => false\n };\n};\n/**\n * Computes SHA-256 hash of a string using Web Crypto API (browser-compatible)\n */\nasync function computeSha256Hash(content) {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\nconst readWorkspaceFileInputSchema = z\n .object({\n documentId: z.string().optional().describe(\"Automerge documentId of the file to read.\"),\n path: z.string().optional().describe(\"Path (or filename) of the file to read if documentId is not provided.\"),\n asOf: z.string().optional().describe(\"Branch ID to resolve for branch-aware reads. Defaults to active branch.\"),\n byteLimit: z.number().int().min(1024).max(512 * 1024).optional().describe(\"Max bytes of content to return (default 64KB).\"),\n includeHash: z.boolean().optional().describe(\"When true, include a SHA-256 hash of the returned bytes.\"),\n context: z.any().describe(\"Session context injected by orchestrator.\"),\n})\n .refine((value) => Boolean(value.documentId || value.path), {\n message: \"Either documentId or path must be provided.\",\n path: [\"documentId\"],\n});\nasync function resolveWorkspaceViewForFolders(repo, workspace, branchId) {\n if (!branchId || !workspace.branchesDocId)\n return workspace;\n try {\n const branchService = new BranchService(repo);\n const resolved = await branchService.resolveWorkspaceHead(workspace.id, branchId, workspace.branchesDocId);\n if (!resolved.head)\n return workspace;\n const handle = await repo.find(workspace.id);\n const viewHandle = handle.view([resolved.head]);\n if (typeof viewHandle.doc === \"function\") {\n return viewHandle.doc();\n }\n return await viewHandle.doc();\n }\n catch (error) {\n console.warn(\"[readWorkspaceFile] Failed to resolve branch-scoped workspace folder view; using base workspace\", error);\n return workspace;\n }\n}\nfunction computePath(workspace, file) {\n const folderMap = new Map((workspace.folders ?? []).map((folder) => [String(folder.id), folder]));\n const segments = [file.name];\n let cursor = file.folderId ? String(file.folderId) : null;\n const visited = new Set();\n while (cursor) {\n if (visited.has(cursor))\n break;\n visited.add(cursor);\n const folder = folderMap.get(cursor);\n if (!folder)\n break;\n segments.unshift(folder.name);\n cursor = folder.parentId ? String(folder.parentId) : null;\n }\n return `/${segments.join(\"/\")}`;\n}\nfunction normalisePath(path) {\n if (!path)\n return null;\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\nfunction resolveContentSnapshot(doc) {\n if (doc == null)\n return { content: \"\", isBinary: false, format: \"text\" };\n if (typeof doc === \"string\") {\n return { content: doc, isBinary: false, format: \"text\" };\n }\n if (typeof doc === \"object\") {\n // Common canvas/text docs expose `text`\n const maybeText = doc?.text;\n if (typeof maybeText === \"string\") {\n return { content: maybeText, isBinary: false, format: \"text\" };\n }\n const maybeContent = doc?.content;\n if (typeof maybeContent === \"string\") {\n return { content: maybeContent, isBinary: false, format: \"text\" };\n }\n if (Array.isArray(doc?.lines)) {\n const joined = doc.lines\n .map((line) => (\"text\" in line && typeof line.text === \"string\" ? line.text : \"\"))\n .join(\"\\n\");\n return { content: joined, isBinary: false, format: \"text\" };\n }\n if (doc?.bytes instanceof Uint8Array) {\n const BufferCtor = getBuffer();\n const buffer = BufferCtor.from(doc.bytes);\n return {\n content: buffer.toString(\"utf8\"),\n isBinary: detectBinary(buffer),\n format: \"text\",\n };\n }\n }\n const json = JSON.stringify(doc, null, 2);\n return { content: json, isBinary: false, format: \"json\" };\n}\nfunction detectBinary(data) {\n const BufferCtor = getBuffer();\n const buffer = typeof data === \"string\" ? BufferCtor.from(data, \"utf8\") : data;\n const sample = buffer.subarray(0, Math.min(buffer.length, 1024));\n for (const byte of sample) {\n if (byte === 0)\n return true;\n if (byte < 7 || (byte > 13 && byte < 32))\n return true;\n }\n return false;\n}\nfunction truncateContent(content, limit) {\n const BufferCtor = getBuffer();\n const buffer = BufferCtor.from(content, \"utf8\");\n if (buffer.length <= limit)\n return content;\n return buffer.subarray(0, limit).toString(\"utf8\");\n}\nfunction formatTextDocument(snapshot) {\n if (!snapshot)\n return \"\";\n const title = snapshot.title || snapshot.metadata?.name;\n const markdown = typeof snapshot.markdown === \"string\" ? snapshot.markdown : undefined;\n const body = typeof snapshot.text === \"string\" ? snapshot.text : markdown;\n const sections = [];\n if (title)\n sections.push(`# ${title}`);\n if (markdown) {\n sections.push(markdown);\n }\n else if (body) {\n sections.push(body);\n }\n return sections.join(\"\\n\\n\").trim();\n}\nfunction formatMarkdownDocument(snapshot) {\n if (!snapshot)\n return \"\";\n const title = snapshot.title || snapshot.metadata?.name;\n const markdown = snapshot.markdown || snapshot.text || snapshot.content || \"\";\n const sections = [];\n if (title)\n sections.push(`# ${title}`);\n if (markdown)\n sections.push(String(markdown));\n return sections.join(\"\\n\\n\").trim();\n}\nfunction formatCodeDocument(snapshot, path) {\n if (!snapshot)\n return \"\";\n const filename = snapshot.filename || snapshot.metadata?.name || path;\n const language = snapshot.language || snapshot.metadata?.language;\n const header = [`File: ${filename}`];\n if (language)\n header.push(`Language: ${language}`);\n const description = snapshot.metadata?.description;\n if (description)\n header.push(`Description: ${description}`);\n const text = typeof snapshot.text === \"string\" ? snapshot.text : \"\";\n return [...header, \"\", text].join(\"\\n\").trim();\n}\nfunction formatIssueBoardDocument(snapshot) {\n if (!snapshot)\n return \"\";\n const lines = [];\n const title = snapshot.title || snapshot.metadata?.name;\n if (title)\n lines.push(`Issue Board: ${title}`);\n if (Array.isArray(snapshot.labels) && snapshot.labels.length > 0) {\n lines.push(`Labels: ${snapshot.labels.join(\", \")}`);\n }\n if (Array.isArray(snapshot.workflowStates) && snapshot.workflowStates.length > 0) {\n const workflow = snapshot.workflowStates\n .map((state) => state?.name ?? state?.id)\n .filter(Boolean)\n .join(\", \");\n if (workflow)\n lines.push(`Workflow: ${workflow}`);\n }\n lines.push(\"\");\n lines.push(\"Issues:\");\n const issues = Array.isArray(snapshot.issues) ? snapshot.issues : [];\n issues.slice(0, 50).forEach((issue) => {\n if (!issue)\n return;\n const status = issue.status ? `[${issue.status}]` : \"\";\n const key = issue.key ? `(${issue.key})` : \"\";\n const priority = issue.priority ? `priority=${issue.priority}` : \"\";\n const labels = Array.isArray(issue.labels) && issue.labels.length > 0 ? `labels=${issue.labels.join(\", \")}` : \"\";\n const parts = [status, issue.title ?? \"Untitled issue\", key, priority, labels].filter(Boolean);\n lines.push(`- ${parts.join(\" \")}`.trim());\n if (issue.description) {\n const description = String(issue.description).split(\"\\n\").slice(0, 4).join(\"\\n\").trim();\n if (description) {\n lines.push(` ${description}`);\n }\n }\n });\n if (issues.length > 50) {\n lines.push(`... and ${issues.length - 50} more issue(s)`);\n }\n return lines.join(\"\\n\").trim();\n}\nasync function resolveFileReference(workspace, branchScopedWorkspace, documentId, path) {\n const normalizedPath = normalisePath(path);\n if (documentId) {\n const file = (branchScopedWorkspace.fileRefs ?? []).find((ref) => ref.id === documentId);\n if (file) {\n return { ref: file, path: computePath(branchScopedWorkspace, file) };\n }\n }\n if (normalizedPath) {\n const file = (branchScopedWorkspace.fileRefs ?? []).find((ref) => {\n const candidatePath = computePath(branchScopedWorkspace, ref);\n return candidatePath.toLowerCase() === normalizedPath.toLowerCase();\n });\n if (file) {\n return { ref: file, path: computePath(branchScopedWorkspace, file) };\n }\n }\n // Fall back to base workspace in case branch view lacks metadata\n if (documentId) {\n const file = (workspace.fileRefs ?? []).find((ref) => ref.id === documentId);\n if (file) {\n return { ref: file, path: computePath(workspace, file) };\n }\n }\n if (normalizedPath) {\n const file = (workspace.fileRefs ?? []).find((ref) => {\n const candidatePath = computePath(workspace, ref);\n return candidatePath.toLowerCase() === normalizedPath.toLowerCase();\n });\n if (file) {\n return { ref: file, path: computePath(workspace, file) };\n }\n }\n return null;\n}\nfunction formatDocumentForContext(snapshot, fileRef, path) {\n const docType = fileRef?.type || snapshot?.metadata?.type;\n switch (docType) {\n case \"text\":\n case \"markdown\":\n {\n const content = formatTextDocument(snapshot);\n return content\n ? { content, isBinary: false, format: \"text\" }\n : resolveContentSnapshot(snapshot);\n }\n case \"canvas-markdown\":\n {\n const content = formatMarkdownDocument(snapshot);\n return content\n ? { content, isBinary: false, format: \"text\" }\n : resolveContentSnapshot(snapshot);\n }\n case \"code\":\n {\n const content = formatCodeDocument(snapshot, path);\n return content\n ? { content, isBinary: false, format: \"text\" }\n : resolveContentSnapshot(snapshot);\n }\n case \"issue-board\":\n {\n const content = formatIssueBoardDocument(snapshot);\n return content\n ? { content, isBinary: false, format: \"text\" }\n : resolveContentSnapshot(snapshot);\n }\n default:\n return resolveContentSnapshot(snapshot);\n }\n}\nexport const readWorkspaceFile = tool({\n description: \"Read the content of a workspace file with branch-aware resolution. Adds the file to the agent context for subsequent steps.\",\n inputSchema: readWorkspaceFileInputSchema,\n async execute(rawInput) {\n const { documentId, path, asOf, byteLimit = BYTE_LIMIT_DEFAULT, includeHash = false, context, } = rawInput;\n try {\n const repo = context?.repo;\n const workspaceId = context?.activeWorkspace?.id ?? context?.workspaceId;\n if (!repo || !workspaceId) {\n throw new Error(\"readWorkspaceFile requires repo and activeWorkspace in context\");\n }\n const wsService = new WorkspaceService(repo);\n const workspace = await wsService.getWorkspace(workspaceId);\n const branchId = asOf ??\n context?.activeThread?.branchId ??\n context?.activeBranch?.id ??\n context?.branchContext?.branchId ??\n workspace.activeBranchId ??\n null;\n const branchScopedWorkspace = await resolveWorkspaceViewForFolders(repo, workspace, branchId);\n const resolved = await resolveFileReference(workspace, branchScopedWorkspace, documentId, path);\n if (!resolved) {\n return {\n type: \"error\",\n value: \"File not found in workspace index for the provided documentId/path.\",\n };\n }\n const effectiveBranchId = branchId ?? context?.activeBranchId ?? \"main\";\n const branchesDocId = workspace.branchesDocId;\n const branchableRepo = new BranchableRepo(repo);\n let snapshot;\n if (effectiveBranchId && branchesDocId) {\n snapshot = await branchableRepo.getFileSnapshot(resolved.ref.id, {\n branchId: effectiveBranchId,\n workspaceId,\n branchesDocId,\n });\n }\n else {\n const handle = await repo.find(resolved.ref.id);\n if (typeof handle.doc === \"function\") {\n snapshot = handle.doc();\n }\n else {\n snapshot = await handle.doc();\n }\n }\n const formatted = formatDocumentForContext(snapshot, resolved.ref, resolved.path);\n const baseContent = formatted.content ?? \"\";\n const truncated = formatted.isBinary ? \"\" : truncateContent(baseContent, byteLimit);\n const BufferCtor = getBuffer();\n const bytes = BufferCtor.from(baseContent, \"utf8\").length;\n const hash = includeHash ? await computeSha256Hash(baseContent) : undefined;\n const contextRef = `ctx-${resolved.ref.id}-${Date.now().toString(36)}`;\n if (!context.contextFiles) {\n context.contextFiles = [];\n }\n context.contextFiles.push({\n documentId: resolved.ref.id,\n name: resolved.ref.name,\n path: resolved.path,\n branchId: effectiveBranchId,\n content: truncated,\n isBinary: formatted.isBinary,\n contextRef,\n updatedAt: resolved.ref?.updatedAt ?? null,\n });\n return {\n type: \"success\",\n value: formatted.isBinary\n ? `Read binary file metadata for ${resolved.path}`\n : `Read ${resolved.path} (${bytes} bytes)`,\n documentIds: [resolved.ref.id],\n data: {\n documentId: resolved.ref.id,\n name: resolved.ref.name,\n path: resolved.path,\n branchId: effectiveBranchId,\n bytes,\n isBinary: formatted.isBinary,\n format: formatted.format,\n sha256: hash,\n contextRef,\n preview: formatted.isBinary ? undefined : truncated.slice(0, 400),\n },\n ui: {\n type: \"tool\",\n name: \"readWorkspaceFile\",\n status: \"success\",\n component: \"read\",\n data: {\n documentId: resolved.ref.id,\n path: resolved.path,\n branchId: effectiveBranchId,\n bytes,\n isBinary: formatted.isBinary,\n preview: formatted.isBinary ? undefined : truncated.slice(0, 200),\n contextRef,\n },\n },\n };\n }\n catch (error) {\n console.error(\"[readWorkspaceFile] Failed\", error);\n return {\n type: \"error\",\n value: error instanceof Error ? error.message : String(error),\n };\n }\n },\n});\n", "import { searchDocuments } from \"../tools/search-documents.js\";\nimport { readDocument } from \"../tools/read-document.js\";\nimport { transferToAgent } from \"../tools/transfer-to-agent.js\";\nimport { searchDocumentsEnhanced } from \"../tools/search-documents-enhanced.js\";\nimport { searchWorkspace } from \"../tools/search-workspace.js\";\nimport { readWorkspaceFile } from \"../tools/read-workspace-file.js\";\n// import { generateTextDocument } from \"../../../mod-canvases/text-editor/src/tools/generate-text-document.js\" // TODO: Move to mod-core if needed\n// Common tools that can be used across different agents\nexport const commonTools = {\n transfer: transferToAgent,\n search: searchDocuments,\n searchEnhanced: searchDocumentsEnhanced,\n read: readDocument,\n searchWorkspace,\n readWorkspaceFile,\n // generateTextDocument: generateTextDocument, // TODO: Move to mod-core if needed\n // Add other common tools here as needed\n};\n// Tool Registry class\nclass ToolRegistry {\n constructor() {\n this.tools = new Map();\n this.toolsByCategory = new Map();\n // Initialize with common tools\n this.registerCommonTools();\n }\n // Register all common tools\n registerCommonTools() {\n Object.values(commonTools).forEach(tool => {\n this.registerTool(tool);\n });\n }\n registerTool(tool) {\n if (!tool.definition)\n return;\n const toolId = tool.definition?.name; // Use function name as tool ID\n this.tools.set(toolId, tool);\n // Add to category index if category is specified\n const category = tool.definition.category || 'common';\n if (!this.toolsByCategory.has(category)) {\n this.toolsByCategory.set(category, new Set());\n }\n this.toolsByCategory.get(category).add(toolId);\n }\n getTool(toolId) {\n return this.tools.get(toolId);\n }\n getToolsByCategory(category) {\n const toolIds = this.toolsByCategory.get(category);\n if (!toolIds)\n return [];\n return Array.from(toolIds)\n .map(id => this.tools.get(id))\n .filter((tool) => tool !== undefined);\n }\n getAllTools() {\n return Array.from(this.tools.values());\n }\n getToolsForAgent(agent) {\n if (!agent.tools)\n return [];\n return agent.tools\n .map((toolId) => this.tools.get(toolId))\n .filter((tool) => tool !== undefined);\n }\n}\n// Export singleton instance\nexport const toolRegistry = new ToolRegistry();\n", "import { toolRegistry } from \"./tool-registry.js\";\n// AgentRegistry class for registering and retrieving agents\nexport class AgentRegistry {\n constructor() {\n this.agents = new Map();\n this.loadingPromises = new Map();\n this.normalizedIdMap = new Map();\n }\n registerAgent(agentId, agent) {\n this.agents.set(agentId, this.prepareAgentConfig(agentId, agent));\n }\n getAgent(agentId) {\n return this.agents.get(agentId);\n }\n // Optionally, load agent dynamically (if needed)\n async loadAgent(agentId) {\n const agent = this.getAgent(agentId);\n if (!agent) {\n throw new Error(`Agent ${agentId} is not registered.`);\n }\n return agent;\n }\n // Helper function to prepare agent config\n prepareAgentConfig(agentId, agentConfig) {\n // Clone the agentConfig to avoid mutating a frozen object\n const config = { ...agentConfig };\n // Validate functions array\n if (!Array.isArray(config.functions)) {\n config.functions = [];\n }\n // Get tools for this agent from registry if specified\n if (config.tools?.length) {\n // Call toolRegistry directly rather than going through agentRegistry\n const agentTools = toolRegistry.getToolsForAgent(config);\n // Ensure we don't add duplicate functions\n const existingFunctionNames = new Set(config.functions.map((f) => f.definition.name));\n // Only add tools that have both definition and execute properties\n const validTools = agentTools.filter((tool) => !!tool.definition &&\n typeof tool.execute === 'function' &&\n !existingFunctionNames.has(tool.definition.name));\n config.functions = [...config.functions, ...validTools];\n }\n // Ensure each function has required properties\n config.functions = config.functions.map((f) => {\n if (!f.definition) {\n throw new Error(`Function in agent ${agentId} missing definition`);\n }\n if (!f.execute || typeof f.execute !== 'function') {\n throw new Error(`Function ${f.definition.name} in agent ${agentId} missing execute method`);\n }\n return {\n definition: {\n name: f.definition.name,\n description: f.definition.description || '',\n parameters: {\n type: \"object\",\n properties: f.definition.parameters.properties || {},\n required: f.definition.parameters.required || []\n }\n },\n execute: f.execute\n };\n });\n return config;\n }\n // Register an agent and its sub-agents\n register(agent) {\n this.agents.set(agent.id, agent);\n // Register sub-agents if they exist\n if (agent.subAgents) {\n agent.subAgents.forEach(subAgent => this.register(subAgent));\n }\n }\n // Get list of available agents\n async getAvailableAgents() {\n try {\n // Get list of agent IDs from the registry\n const agentIds = [\n // 'pipeline',\n // 'data-analyst',\n // 'purchase-orders',\n // 'product',\n // 'slides',\n // 'agent-builder',\n // 'prd-builder',\n // 'code-analysis',\n // 'vibe-coder',\n // 'product-marketer'\n ];\n // Load each agent\n const agents = await Promise.all(agentIds.map(async (agentId) => {\n try {\n return await this.getAgent(agentId);\n }\n catch (error) {\n console.error(`Failed to load agent ${agentId}:`, error);\n return null;\n }\n }));\n // Filter out any agents that failed to load\n return agents.filter((agent) => agent !== null);\n }\n catch (error) {\n console.error('Failed to load available agents:', error);\n // Return empty array instead of throwing to prevent app from crashing\n return [];\n }\n }\n // Get tools for an agent\n getToolsForAgent(agent) {\n // Use the tool registry to get tools for this agent\n return toolRegistry.getToolsForAgent(agent);\n }\n}\n// Export singleton instance\nexport const agentRegistry = new AgentRegistry();\n", "import { tool } from 'ai';\nimport { z } from 'zod';\n// Avoid static import to break circular dependency with tool-registry\nasync function getAgentRegistry() {\n const mod = await import('../services/agent-registry.js');\n return mod.agentRegistry;\n}\nexport const transferToAgent = tool({\n description: 'Transfer the conversation to another agent.',\n inputSchema: z.object({\n agent: z.string().describe('The agent to transfer to.'),\n query: z.string().optional().describe('Optional query for the new agent.'),\n context: z.any().describe('Current context')\n }),\n async execute({ agent, query, context }) {\n // Get most recent user query if not provided directly\n const queryToUse = query || (() => {\n if (!context || !context.steps)\n return \"\";\n for (let i = context.steps.length - 1; i >= 0; i--) {\n const step = context.steps[i];\n if (step && 'type' in step && step.type === 'message' &&\n 'role' in step && step.role === 'user' &&\n 'content' in step && typeof step.content === 'string') {\n return step.content;\n }\n }\n return \"\";\n })();\n // Normalize the agent ID to handle variations\n const normalizedAgentId = agent;\n try {\n // Get the agent\n const agentRegistry = await getAgentRegistry();\n const agent = agentRegistry.getAgent(normalizedAgentId);\n if (!agent) {\n const errorMessage = `Failed to transfer to agent ${normalizedAgentId}: Agent not found`;\n console.error(`[transferToAgent] ${errorMessage}`);\n return {\n value: errorMessage,\n isComplete: false\n };\n }\n // Return the agent to transfer to\n return {\n value: `Transferring to ${agent.name}`,\n agent: agent,\n isComplete: true,\n query: query || queryToUse\n };\n }\n catch (error) {\n const errorMessage = `Failed to transfer to agent ${normalizedAgentId}: ${error instanceof Error ? error.message : String(error)}`;\n console.error(`[transferToAgent] Error getting agent ${normalizedAgentId}:`, error);\n return {\n value: errorMessage,\n isComplete: false\n };\n }\n }\n});\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nimport dotenv from 'dotenv';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { render } from 'ink';\nimport App from './app.js';\nimport { repo as getRepo } from '@mod/mod-core/repos/repo.node';\nimport { buildCommandRegistry } from './commands/index.js';\nimport meow from 'meow';\n// Background watch functionality removed - using automatic-file-tracker instead\nimport { getFeatureFlags } from './services/feature-flags.js';\nimport { FEATURES, isFeatureEnabled } from './config/features.js';\n// Load environment variables from multiple candidate locations\n// 1) CWD (project dir where user runs `mod`)\ndotenv.config({ override: false, debug: false, quiet: true });\n// 2) Package-local .env (e.g., packages/mod-cli/.env) for monorepo development\ntry {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n // dist/cli.js -> ../.env\n const pkgEnv = path.join(__dirname, '../.env');\n dotenv.config({ path: pkgEnv, override: true, debug: false, quiet: true });\n // monorepo root .env (two levels up from packages/mod-cli/dist)\n const rootEnv = path.join(__dirname, '../../../.env');\n dotenv.config({ path: rootEnv, override: true, debug: false, quiet: true });\n}\ncatch { }\n// Note: AI features are lazily imported in thread-service to keep bootstrap light.\n// Note: Startup logging removed to reduce noise in alpha mode\n// Suppress extremely chatty Automerge sync noise that breaks TTY input rendering\ntry {\n const noisy = [\n 'error receiving message',\n 'Attempting to change an outdated document',\n ];\n const shouldDrop = (args) => {\n try {\n const s = args.map(a => (typeof a === 'string' ? a : (a && a.stack) || JSON.stringify(a))).join(' ');\n return noisy.some(k => s.includes(k));\n }\n catch {\n return false;\n }\n };\n const origLog = console.log.bind(console);\n const origErr = console.error.bind(console);\n const origWarn = console.warn.bind(console);\n console.log = (...args) => { if (shouldDrop(args))\n return; origLog(...args); };\n console.error = (...args) => { if (shouldDrop(args))\n return; origErr(...args); };\n console.warn = (...args) => { if (shouldDrop(args))\n return; origWarn(...args); };\n}\ncatch { }\nconst cli = meow(`\n Usage\n $ mod <command> [options]\n Commands\n create-task <desc>\n set-task-status <id> <status>\n ...\n`, {\n importMeta: import.meta,\n flags: {\n preview: {\n type: 'boolean',\n default: false\n },\n verbose: {\n type: 'boolean',\n default: false\n },\n force: {\n type: 'boolean',\n default: false\n }\n },\n allowUnknownFlags: true\n});\nasync function main() {\n const repo = await getRepo();\n const availableCommands = buildCommandRegistry();\n const [cmd, ...args] = cli.input;\n // No user-facing banners or notifications about feature flags\n // Background watch now handled by automatic-file-tracker service\n // Handle command execution\n if (cmd && typeof availableCommands[cmd] === 'function') {\n // Pass both positional args and flags as a combined array\n const allArgs = [...args];\n // Add flags back to args array for backward compatibility\n if (cli.flags.preview)\n allArgs.push('--preview');\n if (cli.flags.verbose)\n allArgs.push('--verbose');\n if (cli.flags.force)\n allArgs.push('--force');\n await availableCommands[cmd](allArgs, repo);\n return;\n }\n if (!cmd) {\n console.log('Mod CLI\\n');\n console.log('Available commands:');\n for (const command of Object.keys(availableCommands).sort()) {\n console.log(` mod ${command}`);\n }\n return;\n }\n if (cmd && !availableCommands[cmd]) {\n console.error(`Unknown command: ${cmd}`);\n console.error('Run \"mod\" to see available commands.');\n process.exit(1);\n }\n // Ink UI rendering controlled by features, not exposed to users\n if (isFeatureEnabled(FEATURES.STATUS) || Object.keys(availableCommands).length > 1) {\n const featureFlags = getFeatureFlags(); // Keep for backward compatibility with App component\n render(_jsx(App, { repo: repo, featureFlags: featureFlags }));\n }\n}\nmain();\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\nimport WorkspacesContainer from './containers/workspaces-container.js';\nimport ThreadContainer from './containers/thread-container.js';\nimport DirectoryContainer from './containers/directory-container.js';\nimport BranchesContainer from './containers/branches-container.js';\nimport { useInput } from 'ink';\nimport { readModConfig, writeModConfig } from './services/mod-config.js';\n// Removed legacy sync commands and services\nimport { BranchService } from '@mod/mod-core/services/branch-service';\nimport { getFeatureFlags, shouldEnableBackgroundWatch } from './services/feature-flags.js';\nexport default function App({ repo, featureFlags: providedFeatureFlags, }) {\n const featureFlags = useMemo(() => providedFeatureFlags ?? getFeatureFlags(), [providedFeatureFlags]);\n const tasksEnabled = featureFlags['tasks-panel'];\n const directoryEnabled = featureFlags['directory-view'];\n // Routing: 'workspaces' | 'thread' | 'directory' | 'branches' | 'tasks'\n const [route, setRoute] = useState('workspaces');\n const [selectedWorkspace, setSelectedWorkspace] = useState(null);\n const [selectedThread, setSelectedThread] = useState(null);\n const [inputValue, setInputValue] = useState('');\n const [pendingChatInput, setPendingChatInput] = useState('');\n // const watcherRef = useRef<FileWatcherService | null>(null); // Removed\n const initialUploadDoneRef = useRef(false); // reserved (disabled)\n // Keyboard shortcuts for navigation (only Esc to reset)\n useInput((input, key) => {\n if (key.escape) {\n setRoute('workspaces');\n setSelectedWorkspace(null);\n setSelectedThread(null);\n setInputValue('');\n }\n });\n // Command prompt handler\n const handleInputSubmit = (value) => {\n const trimmed = value.trim();\n if (trimmed === '/workspaces') {\n setRoute('workspaces');\n setSelectedWorkspace(null);\n setSelectedThread(null);\n }\n else if ((trimmed === '/threads' || trimmed === '/branches') && selectedWorkspace) {\n setRoute('branches');\n setSelectedThread(null);\n }\n else if (trimmed === '/files' && directoryEnabled) {\n setRoute('directory');\n }\n else if (trimmed === '/tasks' && tasksEnabled && selectedWorkspace) {\n setRoute('tasks');\n }\n else if (trimmed === '/thread' && selectedWorkspace && selectedThread) {\n setRoute('thread');\n }\n else if (trimmed === '/exit') {\n process.exit(0);\n }\n else if (trimmed === '/upload') {\n // Upload all files in current working directory to active workspace/thread\n // uploadWorkspaceCommand([], repo).catch(err => console.error('[upload] Failed:', err)); // Removed\n }\n else if (trimmed === '/download') {\n // Download all workspace files to current working directory\n // downloadWorkspaceCommand([], repo).catch(err => console.error('[download] Failed:', err)); // Removed\n }\n else if (route === 'thread' && selectedThread) {\n // Send message to thread\n setPendingChatInput(value);\n }\n setInputValue('');\n };\n // Bootstrap: if .mod/config.json has workspace/branch, jump to thread view (branch-first)\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const cfg = readModConfig();\n if (!cfg?.workspaceId)\n return;\n const wsHandle = await repo.find(cfg.workspaceId);\n const wsDoc = await wsHandle.doc();\n // Branch-first: read branch.threadId\n const activeBranchId = (cfg.activeBranchId || wsDoc?.activeBranchId);\n let thread = null;\n const branchesDocId = wsDoc?.branchesDocId;\n if (activeBranchId && branchesDocId) {\n try {\n const branchService = new BranchService(repo);\n const branch = await branchService.getBranch(activeBranchId, branchesDocId);\n const tid = branch?.threadId;\n if (tid) {\n try {\n const tHandle = await repo.find(tid);\n const tDoc = await tHandle.doc();\n thread = { id: tDoc?.id || tid, name: tDoc?.name || 'Thread' };\n }\n catch {\n thread = { id: tid, name: 'Thread' };\n }\n }\n }\n catch { }\n }\n // No implicit thread creation on startup; prefer fast load and let user pick\n if (!cancelled) {\n setSelectedWorkspace({ id: wsDoc.id, name: wsDoc.name });\n if (thread) {\n setSelectedThread(thread);\n setRoute('thread');\n }\n else {\n setRoute('branches');\n }\n }\n }\n catch {\n // ignore\n }\n })();\n return () => { cancelled = true; };\n }, [repo]);\n // Background sync: start file watcher when workspace/thread are active (initial bulk upload disabled)\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const workspaceId = selectedWorkspace?.id || readModConfig()?.workspaceId;\n const threadId = selectedThread?.id;\n if (!repo || !workspaceId || !threadId)\n return;\n const autoWatch = shouldEnableBackgroundWatch();\n if (!autoWatch)\n return;\n // Initial bulk upload is intentionally disabled to avoid heavy concurrent writes\n // File watching removed - using AutomaticFileTracker instead\n /*\n if (!watcherRef.current) {\n try {\n const watcher = new FileWatcherService(repo);\n await watcher.startWatching({\n workspaceId: workspaceId as any,\n threadId: threadId as any,\n watchDirectory: process.cwd(),\n debounceMs: 300,\n verbose: false,\n });\n if (!cancelled) watcherRef.current = watcher;\n } catch (err) {\n // Non-blocking\n }\n }\n */\n }\n catch {\n // ignore\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [repo, selectedWorkspace, selectedThread]);\n let content = null;\n if (route === 'workspaces') {\n content = (_jsx(WorkspacesContainer, { repo: repo, onSelect: ws => {\n setSelectedWorkspace(ws);\n try {\n writeModConfig({ workspaceId: ws.id });\n }\n catch { }\n setRoute('branches');\n } }));\n }\n else if (route === 'thread' && selectedWorkspace && selectedThread) {\n content = (_jsx(ThreadContainer, { repo: repo, activeThread: selectedThread, workspace: selectedWorkspace, pendingChatInput: pendingChatInput, onChatInputHandled: () => setPendingChatInput(''), handleInputSubmit: handleInputSubmit }));\n }\n else if (route === 'branches' && selectedWorkspace) {\n content = (_jsx(BranchesContainer, { repo: repo, workspace: selectedWorkspace, onSelect: async (thread) => {\n setSelectedThread(thread);\n setRoute('thread');\n // Persist activeBranchId is handled inside BranchesContainer on select\n // Legacy sync and watcher removed - using AutomaticFileTracker instead\n /*\n // Stop watcher while syncing\n try { watcherRef.current?.stopWatching(); } catch {}\n // Perform web -> local sync for the selected branch/thread\n try {\n const wsId = (selectedWorkspace as any).id;\n const syncSvc = new WorkspaceSyncService(repo as any);\n await syncSvc.syncWorkspaceFiles(wsId as any, (thread as any).id as any, { force: true, verbose: true });\n } catch (err) {\n console.error('[branches] Sync after selection failed:', err);\n }\n // Restart watcher on the selected thread\n try {\n const watcher = watcherRef.current || new FileWatcherService(repo);\n await watcher.startWatching({\n workspaceId: (selectedWorkspace as any).id as any,\n threadId: (thread as any).id as any,\n watchDirectory: process.cwd(),\n debounceMs: 300,\n verbose: false,\n });\n watcherRef.current = watcher;\n } catch {}\n */\n } }));\n }\n else if (route === 'tasks' && tasksEnabled && selectedWorkspace) {\n content = ({ /* TasksContainer removed - legacy task management */});\n }\n else if (route === 'directory' && directoryEnabled) {\n content = (_jsx(DirectoryContainer, { repo: repo, selectedWorkspace: selectedWorkspace, selectedThread: selectedThread }));\n }\n else {\n content = _jsx(Text, { children: \"Unknown route.\" });\n }\n return (_jsxs(Box, { flexDirection: \"column\", children: [_jsx(Box, { flexDirection: \"column\", flexGrow: 1, children: content }), _jsxs(Box, { borderStyle: \"single\", paddingX: 1, borderColor: \"gray\", children: [_jsxs(Text, { color: \"gray\", children: ['>', \" \"] }), _jsx(TextInput, { value: inputValue, onChange: setInputValue, onSubmit: handleInputSubmit, focus: true, showCursor: true, placeholder: `Type ${[\n '/workspaces',\n '/branches',\n directoryEnabled ? '/files' : null,\n tasksEnabled ? '/tasks' : null,\n '/upload',\n '/download',\n '/exit',\n ].filter(Boolean).join(', ')}` })] })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect } from 'react';\nimport { Box, Text } from 'ink';\nimport SelectInput from 'ink-select-input';\nimport { useWorkspacesStore } from '../stores/use-workspaces-store.js';\nexport default function WorkspacesListContainer({ repo, onSelect }) {\n const workspaces = useWorkspacesStore(s => s.workspaces);\n const loading = useWorkspacesStore(s => s.loading);\n const error = useWorkspacesStore(s => s.error);\n const fetchWorkspaces = useWorkspacesStore(s => s.fetchWorkspaces);\n useEffect(() => {\n if (repo)\n fetchWorkspaces(repo);\n }, [repo, fetchWorkspaces]);\n if (loading)\n return _jsx(Text, { children: \"Loading workspaces...\" });\n if (error)\n return _jsxs(Text, { color: \"red\", children: [\"Error: \", error] });\n if (!workspaces.length)\n return _jsx(Text, { children: \"No workspaces found in root doc.\" });\n const items = workspaces.map(w => ({ label: w.name, value: w.id }));\n return (_jsxs(Box, { flexDirection: \"column\", children: [_jsx(Text, { children: \"Select a workspace:\" }), _jsx(SelectInput, { items: items, onSelect: item => {\n const ws = workspaces.find(w => w.id === item.value);\n if (ws)\n onSelect(ws);\n } })] }));\n}\n", "import { create } from 'zustand';\nexport const useWorkspacesStore = create((set) => ({\n workspaces: [],\n loading: false,\n error: null,\n fetchWorkspaces: async (repo) => {\n set({ loading: true, error: null });\n try {\n // const rootDocId = '3RrsuQCaieHkXPUNSsq3UhEAxnHW';\n // const rootDocId = 'rY75AHsEfNx1vKnrtpdfmo5dyjr';\n // const rootDocId = '2a9anXJNoBxstgrhRJfkBGS3uxs';\n // const rootDocId = '3pW2EWyQPrshmj4Y1KqEo7sMTqxV';\n const rootDocId = 'KRkJrMQeNQo9bTwSsoKZBxcpz1y';\n const wsHandle = await repo.find(rootDocId);\n const doc = wsHandle.doc();\n const workspacesRaw = doc.workspaces || [];\n const workspacesList = (Array.isArray(workspacesRaw)\n ? workspacesRaw\n : []).map((w) => ({\n id: w.id || '',\n name: w.name || w.title || 'Untitled',\n }));\n set({ workspaces: workspacesList });\n }\n catch (err) {\n set({ error: err.message || String(err) });\n }\n finally {\n set({ loading: false });\n }\n },\n}));\n", "import { jsx as _jsx, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState, useCallback } from 'react';\nimport ThreadView from '../components/thread.js';\nimport { CLIThreadService } from '../services/thread-service.js';\nimport { log } from '../services/logger.js';\nexport default function ThreadPageContainer({ repo, activeThread, workspace, pendingChatInput, onChatInputHandled, handleInputSubmit, }) {\n // Remove input state, only use for agent stream if needed\n const [messages, setMessages] = useState([]);\n const [agentChunks, setAgentChunks] = useState([]);\n const [threadService, setThreadService] = useState(null);\n // Helper to parse bold (**bold**) in content for CLI\n const parseContentSegments = useCallback((content) => {\n const segments = [];\n let currentIndex = 0;\n while (currentIndex < content.length) {\n const boldStart = content.indexOf('**', currentIndex);\n if (boldStart === -1) {\n segments.push({ text: content.slice(currentIndex), isBold: false });\n break;\n }\n if (boldStart > currentIndex) {\n segments.push({ text: content.slice(currentIndex, boldStart), isBold: false });\n }\n const boldEnd = content.indexOf('**', boldStart + 2);\n if (boldEnd === -1) {\n segments.push({ text: content.slice(currentIndex), isBold: false });\n break;\n }\n segments.push({ text: content.slice(boldStart + 2, boldEnd), isBold: true });\n currentIndex = boldEnd + 2;\n }\n return segments;\n }, []);\n // Setup thread service\n useEffect(() => {\n setThreadService(new CLIThreadService(repo));\n }, [repo]);\n // Subscribe to thread changes for real-time updates\n useEffect(() => {\n if (!activeThread || !repo)\n return;\n let cancelled = false;\n let messageUnsubs = [];\n let threadUnsub;\n async function subscribe() {\n const threadId = activeThread.id;\n let tHandle;\n try {\n tHandle = await repo.find(threadId);\n }\n catch (e) {\n console.warn('[CLI][Thread] thread handle not available yet, will retry on next tick');\n return;\n }\n async function updateMessagesAndSubs() {\n if (cancelled)\n return;\n let tDoc;\n try {\n tDoc = tHandle.doc();\n }\n catch {\n return;\n }\n const itemIds = Array.isArray(tDoc?.itemIds) ? tDoc.itemIds : [];\n // Unsubscribe previous message listeners\n messageUnsubs.forEach(unsub => unsub());\n // Subscribe to all message docs\n const results = await Promise.allSettled(itemIds.map(id => repo.find(id)));\n const messageHandles = results\n .filter(r => r.status === 'fulfilled')\n .map(r => r.value);\n function updateMessages() {\n if (cancelled)\n return;\n const msgs = [];\n for (const h of messageHandles) {\n try {\n const mDoc = h.doc();\n msgs.push({\n id: mDoc.id,\n text: mDoc.content || mDoc.text || '',\n timestamp: mDoc.timestamp || Date.now(),\n userType: mDoc.userType || 'assistant',\n user: mDoc.user || null,\n _contentHash: (mDoc.content || mDoc.text || '').length,\n });\n }\n catch { }\n }\n setMessages(msgs);\n }\n messageUnsubs = messageHandles.map(h => {\n h.on('change', updateMessages);\n return () => h.off('change', updateMessages);\n });\n updateMessages();\n }\n tHandle.on('change', updateMessagesAndSubs);\n threadUnsub = () => tHandle.off('change', updateMessagesAndSubs);\n await updateMessagesAndSubs();\n }\n subscribe();\n return () => {\n cancelled = true;\n messageUnsubs.forEach(unsub => unsub());\n if (threadUnsub)\n threadUnsub();\n };\n }, [activeThread, repo]);\n // If pendingChatInput changes, send it as a message\n useEffect(() => {\n if (pendingChatInput && pendingChatInput.trim() !== '') {\n handleChatInput(pendingChatInput);\n onChatInputHandled();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pendingChatInput]);\n // Handle chat/command input\n const handleChatInput = async (value) => {\n // Navigation commands are handled by App\n if (value.trim().startsWith('/')) {\n handleInputSubmit(value);\n return;\n }\n if (!activeThread || !threadService || !workspace || !repo)\n return;\n const wsHandle = await repo.find(workspace.id);\n const wsDoc = await wsHandle.doc();\n // Support @agent mention override (e.g., \"@dev: fix this bug\")\n const extractAgentMention = (text) => {\n const leading = text.replace(/^\\s+/, '');\n const match = leading.match(/^@([a-zA-Z][\\w-]*)\\b:?\\s*/);\n if (!match)\n return null;\n const name = match[1].toLowerCase();\n const message = leading.slice(match[0].length);\n return { name, message };\n };\n async function loadAgentByName(name) {\n const n = String(name || '').toLowerCase();\n try {\n if (n === 'dev' || n === 'developer') {\n const url = new URL('../../../mod-agents/dev-agent/dist/index.mjs', import.meta.url).toString();\n const mod = await import(url);\n try {\n log('[ThreadContainer] loaded dev agent module keys:', Object.keys(mod));\n }\n catch { }\n return mod.devAgent || mod.default?.devAgent || mod.default || mod;\n }\n if (n === 'planner' || n === 'plan') {\n const url = new URL('../../../mod-agents/planner/dist/index.mjs', import.meta.url).toString();\n const mod = await import(url);\n try {\n log('[ThreadContainer] loaded planner agent module keys:', Object.keys(mod));\n }\n catch { }\n return mod.plannerAgent || mod.default?.plannerAgent || mod.default || mod;\n }\n if (n === 'general' || n === 'assistant') {\n const url = new URL('../../../mod-agents/dev-agent/dist/index.mjs', import.meta.url).toString();\n const mod = await import(url);\n try {\n log('[ThreadContainer] loaded general agent module keys:', Object.keys(mod));\n }\n catch { }\n return mod.devAgent || mod.default?.devAgent || mod.default || mod;\n }\n }\n catch (e) {\n try {\n log('[ThreadContainer] loadAgentByName error:', String(e));\n }\n catch { }\n }\n return undefined;\n }\n // Prefer explicit @agent mention without loading a default agent first to avoid unnecessary module graphs\n let textToSend = value;\n const mention = extractAgentMention(value);\n let agent;\n if (mention) {\n agent = (await loadAgentByName(mention.name)) || { id: mention.name, name: mention.name };\n textToSend = mention.message.trimStart();\n }\n else {\n const baseAgentId = (wsDoc.activeAgents && wsDoc.activeAgents[0]) || 'general';\n agent = (await loadAgentByName(baseAgentId)) || { id: baseAgentId, name: baseAgentId };\n }\n // 3. Stream agent chat (user message + agent response)\n let sawChunk = false;\n setAgentChunks([]); // Clear previous stream\n try {\n for await (const chunk of threadService.streamAgentChat({\n threadId: activeThread.id,\n userMessage: textToSend,\n user: { id: 'user-1', name: 'You' },\n workspace: wsDoc,\n agent,\n })) {\n sawChunk = true;\n setAgentChunks(prev => [...prev, chunk]); // Add chunk to static stream\n }\n if (!sawChunk) {\n // Optionally show a message or log\n }\n }\n catch (err) {\n // Optionally show error\n }\n };\n return (_jsx(_Fragment, { children: _jsx(ThreadView, { activeThread: activeThread, messages: Array.isArray(messages) ? messages : [], parseContentSegments: parseContentSegments, messageKeyProp: \"_contentHash\" }) }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport MessageList from './messages.js';\nconst ThreadView = React.memo(({ activeThread, messages, parseContentSegments, messageKeyProp }) => {\n return (_jsxs(Box, { flexDirection: \"column\", children: [_jsxs(Text, { children: [\"Thread: \", _jsx(Text, { color: \"green\", children: activeThread.name })] }), _jsx(MessageList, { messages: messages, parseContentSegments: parseContentSegments, messageKeyProp: messageKeyProp }), _jsxs(Text, { color: \"cyan\", children: [\"Type \", _jsx(Text, { bold: true, children: \"/branch\" }), \" to switch threads.\"] })] }));\n});\nexport default ThreadView;\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport React from 'react';\nimport { Box, Text } from 'ink';\nconst MessageList = React.memo(({ messages, parseContentSegments, messageKeyProp }) => (_jsx(Box, { flexDirection: \"column\", marginBottom: 1, children: messages.length === 0 ? (_jsx(Text, { color: \"gray\", children: \"No messages yet. Type to start the thread.\" })) : (messages.map((m, i) => (_jsxs(Text, { children: [_jsxs(Text, { color: \"yellow\", children: [new Date(m.timestamp).toLocaleTimeString(), \" \"] }), _jsxs(Text, { color: m.userType === 'user' ? 'cyan' : 'magenta', children: [m.userType === 'user' ? (m.user?.name || 'You') : 'Assistant', \":\"] }), ' ', parseContentSegments(m.text).map((seg, idx) => seg.isBold ? (_jsx(Text, { bold: true, color: \"whiteBright\", children: seg.text }, idx)) : (_jsx(Text, { children: seg.text }, idx)))] }, `${m.id || i}-${m._contentHash || m.text.length}`)))) })));\nexport default MessageList;\n", "import { ThreadService as CoreThreadService } from '@mod/mod-core/services/thread-service';\nimport { BranchService } from '@mod/mod-core/services/branch-service';\nimport { chatWithAgentCli } from './cli-orchestrator.js';\nimport { log } from './logger.js';\nexport class CLIThreadService {\n // private ai: typeof runAgentWithStream; // Placeholder for orchestrator/agent logic\n constructor(repo) {\n this.core = new CoreThreadService(repo);\n this.repo = repo;\n // this.ai = runAgentWithStream; // Assign orchestrator/agent logic as needed\n }\n async getThreads(workspaceId) {\n const wsHandle = await this.repo.find(workspaceId);\n const workspace = (await wsHandle.doc());\n if (!workspace || !workspace.branchesDocId)\n return [];\n const branchService = new BranchService(this.repo);\n const threads = [];\n try {\n const branches = await branchService.getBranchesForWorkspace(workspace.branchesDocId);\n for (const branch of branches) {\n const threadId = branch?.threadId;\n if (!threadId)\n continue;\n try {\n const thread = await this.core.getThread(threadId);\n if (thread)\n threads.push(thread);\n }\n catch (err) {\n log('[CLIThreadService] Failed to load thread', {\n branchId: branch?.id,\n threadId,\n err,\n });\n }\n }\n }\n catch (err) {\n log('[CLIThreadService] Failed to load branches for workspace', {\n workspaceId,\n err,\n });\n }\n return threads;\n }\n async getThread(threadId) {\n return this.core.getThread(threadId);\n }\n async createThread(name, branchId, workspaceId) {\n const threadId = await this.core.createThread(name, branchId);\n try {\n const branchService = new BranchService(this.repo);\n const wsHandle = await this.repo.find(workspaceId);\n const workspace = (await wsHandle.doc());\n if (workspace?.branchesDocId) {\n await branchService.setThreadId(branchId, threadId, workspace.branchesDocId);\n }\n wsHandle.change((doc) => {\n doc.activeThreadId = threadId;\n });\n }\n catch (err) {\n log('[CLIThreadService] Failed to persist threadId on branch', {\n branchId,\n workspaceId,\n err,\n });\n }\n return threadId;\n }\n /**\n * Stream agent chat for a thread in the CLI.\n * Yields agent response chunks for UI updates.\n */\n async *streamAgentChat({ threadId, userMessage, user = { id: 'user-1', name: 'You', avatarUrl: '' }, workspace, agent, files = [], images = [], maxMessages = 20, ...opts }) {\n // 1) Persist user message immediately\n await this.core.addThreadItemToThread(threadId, userMessage, user.id, user.name, user.avatarUrl, { workspaceId: workspace.id });\n // 2) Start CLI-native orchestrator stream\n const apiKey = (process.env.OPENAI_API_KEY || process.env.OPENAI_API_TOKEN || process.env.OPENAI || process.env.ANTHROPIC_API_KEY || '').trim();\n try {\n try {\n log('[CLIThreadService] Starting stream with agent:', {\n name: agent?.name,\n id: agent?.id,\n defaultModel: agent?.defaultModel,\n tools: agent?.tools ? Object.keys(agent.tools) : [],\n });\n }\n catch { }\n for await (const part of chatWithAgentCli({\n repo: this.repo,\n threadId,\n userMessage,\n user,\n workspace,\n agent: agent || { name: 'Assistant', instructions: 'Be helpful.' },\n files,\n images,\n apiKey,\n tools: (agent && agent.tools) || {},\n })) {\n const p = part;\n if (p.type === 'content' && p.content) {\n yield { type: 'content', content: p.content };\n }\n else if (p.type === 'tool-call') {\n yield p;\n }\n else if (p.type === 'tool-result') {\n yield { type: 'tool-result', output: p.output };\n }\n else if (p.type === 'error') {\n yield { type: 'error', error: String(p.error) };\n }\n }\n }\n catch (err) {\n const msg = `orchestrator import/stream failed: ${err?.message || String(err)}`;\n yield { type: 'error', error: msg };\n try {\n await this.core.addAssistantMessageToThread(threadId, msg, agent?.name || 'Assistant');\n }\n catch { }\n }\n }\n async sendUserMessage(threadId, message, agentConfig) {\n // 1. Add user message to thread (core)\n // const threadRepo = new ThreadRepository(this.repo);\n // await threadRepo.addThreadItem(\n // \tthreadId,\n // \tmessage,\n // \t[], // contextDocumentIds\n // \ttrue, // addToThread\n // \t'user-1', // userId\n // \t'You', // userName\n // \tundefined, // userAvatarUrl\n // \t{type: 'message'},\n // );\n // 2. TODO: Start agent stream (mod-ai)\n // 3. TODO: As agent responses stream in, append to thread\n // 4. TODO: Notify UI of updates (if needed)\n }\n subscribeToThread(threadId, callback) {\n // TODO: Implement Automerge doc subscription for reactivity\n }\n}\n", "import { ThreadService } from '@mod/mod-core/services/thread-service';\nimport { BranchableRepo } from '@mod/mod-core/services/branchable-repo';\nimport { streamText, stepCountIs } from 'ai';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { log } from './logger.js';\nfunction formatItemsToMessages(items, maxMessages = 20) {\n return items\n .sort((a, b) => {\n const aTime = new Date(a.metadata?.createdAt || 0).getTime();\n const bTime = new Date(b.metadata?.createdAt || 0).getTime();\n if (aTime !== bTime)\n return aTime - bTime;\n return String(a.id || '').localeCompare(String(b.id || ''));\n })\n .slice(-maxMessages)\n .map((item) => ({\n role: item.userType === 'user' ? 'user' : 'assistant',\n content: item.content,\n }));\n}\nexport async function* chatWithAgentCli({ repo, threadId, userMessage, user = { id: 'user-1', name: 'You', avatarUrl: '' }, workspace, agent, files = [], images = [], maxMessages = 20, tools = {}, apiKey, provider, modelName, ...opts }) {\n const threadService = new ThreadService(repo);\n // 1. Load thread and history\n const thread = await threadService.getThread(threadId);\n const items = await Promise.all((thread.itemIds || []).map((id) => threadService.getThreadItem(id)));\n // 2. Prepare messages and persist user message\n let messages = formatItemsToMessages(items, maxMessages);\n messages = [...messages, { role: 'user', content: userMessage }];\n // 3. Build session context with branch and task information\n const context = await buildCLISessionContext({\n repo,\n threadId,\n workspace,\n user,\n files,\n images,\n items,\n agent\n });\n const instructions = typeof agent?.instructions === 'function' ? await agent.instructions(context) : (agent?.instructions || `You are ${agent?.name || 'Assistant'}. Help the user with their request.`);\n const resolvedApiKey = (apiKey || process.env.OPENAI_API_KEY || process.env.OPENAI_API_TOKEN || process.env.OPENAI || process.env.ANTHROPIC_API_KEY || '').trim();\n const selectedProvider = provider || opts.provider || 'openai';\n let selectedModel = modelName || opts.modelName || agent?.defaultModel || 'gpt-4o';\n // Normalize common aliases to real provider model IDs\n if (selectedProvider === 'openai' && /^gpt-5\\b/i.test(selectedModel)) {\n selectedModel = 'gpt-4o';\n }\n const model = selectedProvider === 'openai'\n ? createOpenAI({ apiKey: resolvedApiKey })(selectedModel)\n : anthropic(selectedModel);\n // Merge and wrap tools with context injection (so tool.execute receives context)\n const mergedTools = {\n ...(agent?.tools || {}),\n ...(tools || {}),\n };\n const aiSDKTools = injectContextIntoTools(mergedTools, context);\n // Debug logs for visibility\n try {\n log('[CLI Orchestrator] Provider:', selectedProvider);\n log('[CLI Orchestrator] Model:', selectedModel);\n log('[CLI Orchestrator] Instructions (first 200):', String(instructions || '').slice(0, 200));\n log('[CLI Orchestrator] Tools:', Object.keys(aiSDKTools));\n log('[CLI Orchestrator] Messages:', messages);\n }\n catch { }\n const maxAgentSteps = Math.max(1, opts?.maxSteps ?? 6);\n let lastAssistantItemId;\n let lastReasoningItemId;\n const processedToolResultIds = new Set();\n async function* processStream(stream) {\n const iter = stream.fullStream ?? stream.textStream ?? stream;\n for await (const part of iter) {\n const partType = part.type;\n if (partType === 'reasoning' ||\n partType === 'reasoning-delta' ||\n partType === 'reasoning-start' ||\n partType === 'reasoning-end' ||\n partType === 'reasoning-part-delta' ||\n partType === 'reasoning-part-finish') {\n const delta = part.text || part.delta || '';\n if (delta && delta.length > 0) {\n if (!lastReasoningItemId) {\n const item = await threadService.addReasoningToThread(threadId, delta, agent?.name || 'Assistant', agent?.iconUrl);\n lastReasoningItemId = item.id;\n }\n else {\n await threadService.addChunkToThreadItem(lastReasoningItemId, delta);\n }\n }\n yield { type: 'reasoning', content: delta };\n continue;\n }\n if (part.type === 'text' || typeof part === 'string') {\n const content = typeof part === 'string' ? part : part.text;\n if (content) {\n if (!lastAssistantItemId) {\n const item = await threadService.addAssistantMessageToThread(threadId, content, agent?.name || 'Assistant', agent?.iconUrl);\n lastAssistantItemId = item.id;\n }\n else {\n await threadService.addChunkToThreadItem(lastAssistantItemId, content);\n }\n }\n yield { type: 'content', content };\n continue;\n }\n if (part.type === 'tool-call') {\n await threadService.addToolCallToThread(threadId, part, agent?.name || 'Assistant', agent?.iconUrl);\n yield part;\n continue;\n }\n if (part.type === 'tool-result') {\n const toolCallId = String(part?.toolCallId || part?.id || `tool-${Date.now()}`);\n if (toolCallId && processedToolResultIds.has(toolCallId)) {\n try {\n log('[CLI Orchestrator] duplicate tool-result skipped', toolCallId);\n }\n catch { }\n }\n else {\n if (toolCallId)\n processedToolResultIds.add(toolCallId);\n await threadService.addToolResultToThread(threadId, part, agent?.name || 'Assistant', agent?.iconUrl);\n }\n yield { type: 'tool-result', output: part };\n continue;\n }\n if (part.type === 'error') {\n yield { type: 'error', error: part.error };\n }\n }\n try {\n const summary = await stream.reasoningText?.catch(() => undefined);\n if (summary && summary.trim().length > 0) {\n if (!lastReasoningItemId) {\n const item = await threadService.addReasoningToThread(threadId, summary, agent?.name || 'Assistant', agent?.iconUrl);\n lastReasoningItemId = item.id;\n }\n else {\n await threadService.addChunkToThreadItem(lastReasoningItemId, summary);\n }\n yield { type: 'reasoning', content: summary };\n }\n }\n catch { }\n }\n const stream = streamText({\n model,\n system: instructions,\n tools: aiSDKTools,\n messages,\n stopWhen: stepCountIs(maxAgentSteps),\n });\n yield* processStream(stream);\n}\nfunction injectContextIntoTools(tools, context) {\n const wrapped = {};\n for (const [name, tool] of Object.entries(tools || {})) {\n if (!tool || typeof tool !== 'object')\n continue;\n const exec = tool.execute;\n if (exec && exec.constructor?.name === 'AsyncGeneratorFunction') {\n wrapped[name] = {\n ...tool,\n async *execute(args) {\n const result = exec.call(tool, { ...(args || {}), context });\n for await (const chunk of result)\n yield chunk;\n },\n };\n }\n else if (typeof exec === 'function') {\n wrapped[name] = {\n ...tool,\n async execute(args) {\n return exec.call(tool, { ...(args || {}), context });\n },\n };\n }\n else {\n // If it already looks like an ai tool with parameters, keep as-is\n wrapped[name] = tool;\n }\n }\n return wrapped;\n}\nasync function buildCLISessionContext({ repo, threadId, workspace, user, files = [], images = [], items, agent }) {\n // Get branch context\n const branchableRepo = new BranchableRepo(repo);\n let activeBranch = undefined;\n let activeThread = undefined;\n try {\n const branchCtx = await branchableRepo.getBranchContext(workspace.id);\n if (branchCtx && branchCtx.activeBranchId && branchCtx.branchesDocId) {\n const branchService = branchableRepo.getBranchService();\n activeBranch = await branchService.getBranch(branchCtx.activeBranchId, branchCtx.branchesDocId);\n // Get active task ID for this branch\n const activeTaskId = await branchService.getActiveTaskId(branchCtx.activeBranchId, branchCtx.branchesDocId).catch(() => null);\n // Build active thread context\n activeThread = {\n id: threadId,\n name: 'CLI Thread',\n branchId: activeBranch?.id || branchCtx.activeBranchId,\n tasksDocId: activeTaskId,\n metadata: {\n type: 'thread',\n },\n };\n }\n }\n catch (e) {\n console.warn('[CLI SessionContext] Could not fetch active branch:', e);\n }\n return {\n repo,\n user,\n activeWorkspace: workspace, // Expected by tools\n workspace, // For compatibility\n agent,\n files,\n images,\n items,\n ...(activeBranch ? { activeBranch } : {}),\n ...(activeThread ? { activeThread } : {}),\n };\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\n// Evaluate debug flag at call time to allow dotenv to load later\nfunction isDebugEnabled() {\n return Boolean(process.env.MOD_CLI_DEBUG) || Boolean(process.env.DEBUG);\n}\nconst LOG_DIR = path.resolve(process.cwd(), '.mod');\nconst LOG_FILE = path.join(LOG_DIR, 'cli-debug.log');\nfunction ensureLogDir() {\n try {\n fs.mkdirSync(LOG_DIR, { recursive: true });\n }\n catch { }\n}\nexport function log(...args) {\n if (!isDebugEnabled())\n return;\n try {\n ensureLogDir();\n const line = `[${new Date().toISOString()}] ${args.map(a => safeStringify(a)).join(' ')}\\n`;\n fs.appendFileSync(LOG_FILE, line, 'utf8');\n // Also mirror to stderr so it doesn't interfere with Ink UI\n try {\n console.error(line.trimEnd());\n }\n catch { }\n }\n catch { }\n}\nfunction safeStringify(v) {\n try {\n if (typeof v === 'string')\n return v;\n return JSON.stringify(v);\n }\n catch {\n try {\n return String(v);\n }\n catch {\n return '[unprintable]';\n }\n }\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useDirectoryStore, useDirectoryLoader } from '../stores/use-directory-store.js';\nimport fs from 'fs';\nimport path from 'path';\nexport default function DirectoryPageContainer({ repo, selectedWorkspace, selectedThread }) {\n const { loadRootDirectory } = useDirectoryLoader();\n const items = useDirectoryStore((s) => s.items);\n const rootIds = useDirectoryStore((s) => s.rootIds);\n const loading = useDirectoryStore((s) => s.loading);\n const error = useDirectoryStore((s) => s.error);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [status, setStatus] = useState(null);\n useEffect(() => {\n let cancelled = false;\n async function loadOnly() {\n loadRootDirectory({ repo, selectedWorkspace, selectedThread });\n }\n loadOnly();\n return () => {\n cancelled = true;\n };\n }, [repo, selectedWorkspace, selectedThread, loadRootDirectory]);\n useInput((input, key) => {\n if (key.downArrow) {\n setSelectedIndex(i => Math.min(i + 1, rootIds.length - 1));\n }\n else if (key.upArrow) {\n setSelectedIndex(i => Math.max(i - 1, 0));\n }\n else if (key.return && key.shift) {\n // TODO: Handle Shift+Enter (expand/collapse folder)\n }\n else if (key.return) {\n // Handle Enter (open file/folder)\n const id = rootIds[selectedIndex];\n const item = items[id];\n if (item && item.type === 'file') {\n openFileInEditor(item).catch(e => setStatus('Failed to open file: ' + e.message));\n }\n // TODO: Handle folder navigation\n }\n });\n async function openFileInEditor(item) {\n setStatus('Updating working directory...');\n // 1. Fetch file content from Automerge in branch context\n let content = '';\n let fileWrap = null;\n try {\n const { BranchableRepo } = await import('@mod/mod-core/services/branchable-repo');\n const br = new BranchableRepo(repo);\n const branchId = selectedThread?.branchId || selectedThread?.id;\n const workspaceId = selectedWorkspace?.id;\n fileWrap = await br.openHandle(item.id, { branchId, workspaceId });\n const fileDoc = fileWrap.doc();\n content = (fileDoc.content || fileDoc.text || fileDoc.markdown || '');\n }\n catch {\n // Fallback to plain repo handle\n const fh = await repo.find(item.id);\n const d = await fh.doc();\n content = d.content || d.text || '';\n fileWrap = fh;\n }\n // 2. Write to working directory (materialize)\n try {\n const fileName = (item?.name || `${item.id}.txt`);\n const outPath = path.resolve(process.cwd(), fileName);\n // Ensure parent directory exists\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n fs.writeFileSync(outPath, content ?? '', 'utf8');\n setStatus(`Wrote ${fileName} to working directory.`);\n }\n catch (e) {\n setStatus(`Failed to write file: ${e.message}`);\n }\n setTimeout(() => setStatus(null), 2000);\n }\n if (loading)\n return _jsx(Text, { children: \"Loading files...\" });\n if (error)\n return _jsx(Text, { color: \"red\", children: error });\n return (_jsxs(Box, { flexDirection: \"column\", children: [_jsx(Text, { bold: true, children: \"Files & Folders (root)\" }), rootIds.length === 0 ? (_jsx(Text, { color: \"gray\", children: \"No files or folders found.\" })) : (rootIds.map((id, idx) => {\n const item = items[id];\n if (!item)\n return null;\n // Make key unique by prefixing with type and index\n const key = `${item.type}-${item.id}-${idx}`;\n return (_jsxs(Text, { color: idx === selectedIndex ? 'green' : undefined, children: [item.type === 'folder' ? '\\ud83d\\udcc1' : '\\ud83d\\udcc4', \" \", item.name] }, key));\n })), status && _jsx(Text, { color: \"yellow\", children: status })] }));\n}\n", "import { createStore } from 'zustand';\nimport { useStore } from 'zustand';\nimport { BranchableRepo } from '@mod/mod-core/services/branchable-repo';\nimport { readModConfig } from '../services/mod-config.js';\nexport const directoryStore = createStore((set, get) => ({\n items: {},\n rootIds: [],\n currentPath: [],\n expandedFolders: {},\n loading: false,\n error: null,\n setItems: (items, rootIds) => set(() => ({\n items: Object.fromEntries(items.map((i) => [i.id, i])),\n rootIds,\n })),\n setCurrentPath: (path) => set(() => ({ currentPath: path })),\n setExpanded: (folderId, expanded) => set((state) => ({\n expandedFolders: { ...state.expandedFolders, [folderId]: expanded }\n })),\n setLoading: (loading) => set(() => ({ loading })),\n setError: (error) => set(() => ({ error })),\n reset: () => set(() => ({\n items: {},\n rootIds: [],\n currentPath: [],\n expandedFolders: {},\n loading: false,\n error: null,\n })),\n async loadRootDirectory({ repo, selectedWorkspace, selectedThread }) {\n set({ loading: true, error: null });\n try {\n if (!repo) {\n set({ error: 'No repo available', loading: false });\n return;\n }\n const effectiveWorkspaceId = (selectedWorkspace && selectedWorkspace.id) || readModConfig()?.workspaceId;\n if (!effectiveWorkspaceId) {\n set({ error: 'No workspace selected or configured (.mod/config.json)', loading: false });\n return;\n }\n const branchContext = new BranchableRepo(repo);\n // Resolve branchId for consistent branch-aware view (prefer config > workspace.activeBranchId > selectedThread)\n let resolvedBranchId = undefined;\n try {\n resolvedBranchId = readModConfig()?.activeBranchId;\n if (!resolvedBranchId) {\n const wsHandle = await repo.find(effectiveWorkspaceId);\n const wsDoc = await wsHandle.doc();\n resolvedBranchId = wsDoc?.activeBranchId;\n }\n if (!resolvedBranchId && selectedThread?.branchId) {\n resolvedBranchId = selectedThread.branchId;\n }\n }\n catch { }\n const wsWrap = await branchContext.openHandle(effectiveWorkspaceId, { branchId: (resolvedBranchId || undefined), workspaceId: effectiveWorkspaceId });\n const wsDoc = wsWrap.doc();\n const fileRefs = wsDoc.fileRefs || [];\n const folders = wsDoc.folders || [];\n // Build root-level items and dedupe by name to avoid duplicates\n const itemMapByName = {};\n for (const f of folders) {\n if (!f.parentId) {\n const item = { id: f.id, name: f.name, type: 'folder', parentId: f.parentId || null };\n if (!itemMapByName[item.name])\n itemMapByName[item.name] = item;\n }\n }\n for (const f of fileRefs) {\n if (!f.folderId) {\n const item = { id: f.id, name: f.name, type: 'file', parentId: f.folderId || null };\n if (!itemMapByName[item.name])\n itemMapByName[item.name] = item;\n }\n }\n const items = Object.values(itemMapByName).sort((a, b) => a.name.localeCompare(b.name));\n const rootIds = items.map(i => i.id);\n get().setItems(items, rootIds);\n }\n catch (err) {\n set({ error: err.message || 'Failed to load directory' });\n }\n finally {\n set({ loading: false });\n }\n },\n}));\n// React hook for using the vanilla store in components\nexport const useDirectoryStore = (selector) => useStore(directoryStore, selector);\n// Custom hook for loading directory (merged from use-directory)\nexport function useDirectoryLoader() {\n const loadRootDirectory = useDirectoryStore((s) => s.loadRootDirectory);\n const reset = useDirectoryStore((s) => s.reset);\n return { loadRootDirectory, reset };\n}\n", "import fs from 'fs';\nimport path from 'path';\nconst MOD_DIR = '.mod';\nconst CONFIG_FILE = 'config.json';\nfunction getConfigPath() {\n const override = process.env.MOD_CONFIG_PATH;\n if (override && typeof override === 'string' && override.trim() !== '') {\n return override;\n }\n return path.join(process.cwd(), MOD_DIR, CONFIG_FILE);\n}\nfunction ensureModDir() {\n const modDirPath = path.join(process.cwd(), MOD_DIR);\n if (!fs.existsSync(modDirPath)) {\n fs.mkdirSync(modDirPath, { recursive: true });\n }\n}\nexport function readModConfig() {\n // Preferred: .mod/config.json\n const cfgPath = getConfigPath();\n if (fs.existsSync(cfgPath)) {\n try {\n const config = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));\n return config || {};\n }\n catch {\n return null;\n }\n }\n // Legacy migration: root .mod file containing JSON\n const legacyPath = path.join(process.cwd(), '.mod');\n if (fs.existsSync(legacyPath) && fs.statSync(legacyPath).isFile()) {\n try {\n const legacy = JSON.parse(fs.readFileSync(legacyPath, 'utf8'));\n const migrated = {};\n if (legacy && typeof legacy.workspaceId === 'string')\n migrated.workspaceId = legacy.workspaceId;\n if (legacy && typeof legacy.activeBranchId === 'string')\n migrated.activeBranchId = legacy.activeBranchId;\n return migrated;\n }\n catch {\n return null;\n }\n }\n return null;\n}\nexport function writeModConfig(update) {\n try {\n ensureModDir();\n const cfgPath = getConfigPath();\n const current = fs.existsSync(cfgPath)\n ? JSON.parse(fs.readFileSync(cfgPath, 'utf8'))\n : {};\n const next = { ...current, ...update };\n fs.writeFileSync(cfgPath, JSON.stringify(next, null, 2), 'utf8');\n }\n catch (error) {\n console.error(`Failed to write .mod/config.json:`, error);\n }\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { readModConfig, writeModConfig } from '../services/mod-config.js';\nimport { BranchService } from '@mod/mod-core/services/branch-service';\nimport { ThreadService } from '@mod/mod-core/services/thread-service';\nexport default function BranchesContainer({ repo, workspace, onSelect }) {\n const [threads, setThreads] = useState([]);\n const [idx, setIdx] = useState(0);\n const [error, setError] = useState(null);\n const desiredBranchRef = useRef(null);\n useEffect(() => {\n try {\n desiredBranchRef.current = readModConfig()?.activeBranchId || null;\n }\n catch {\n desiredBranchRef.current = null;\n }\n }, []);\n useEffect(() => {\n let cancelled = false;\n let subHandle = null;\n (async () => {\n try {\n if (!workspace)\n return;\n const wsHandle = await repo.find(workspace.id);\n let wsDoc = await wsHandle.doc();\n if (!wsDoc && !cancelled) {\n const deadline = Date.now() + 5000;\n while (!wsDoc && Date.now() < deadline) {\n try {\n wsDoc = await wsHandle.doc();\n }\n catch { }\n if (wsDoc)\n break;\n await new Promise(r => setTimeout(r, 120));\n }\n }\n const branchesDocId = wsDoc?.branchesDocId;\n const buildList = async () => {\n try {\n const branchService = new BranchService(repo);\n const branches = await branchService.getBranchesForWorkspace(branchesDocId);\n const list = [];\n for (const b of (branches || [])) {\n const bId = String(b?.id || '');\n if (!bId)\n continue;\n const tId = b?.threadId ? String(b.threadId) : bId;\n list.push({\n id: tId,\n name: b?.name || 'Thread',\n branchId: bId,\n hasThread: Boolean(b?.threadId),\n });\n }\n if (!cancelled)\n setThreads(list);\n if (!cancelled && desiredBranchRef.current) {\n const matchIdx = list.findIndex(t => t.branchId === desiredBranchRef.current);\n if (matchIdx >= 0) {\n setIdx(matchIdx);\n desiredBranchRef.current = null;\n }\n }\n }\n catch (e) {\n if (!cancelled)\n setError(e?.message || 'Failed to load threads');\n }\n };\n if (!branchesDocId) {\n if (!cancelled)\n setThreads([]);\n return;\n }\n // Subscribe to branchesDoc hydration and rebuild on change\n try {\n subHandle = await repo.find(branchesDocId);\n const onChange = async () => { await buildList(); };\n try {\n subHandle.on && subHandle.on('change', onChange);\n }\n catch { }\n }\n catch { }\n await buildList();\n }\n catch (e) {\n if (!cancelled)\n setError(e?.message || 'Failed to load threads');\n }\n })();\n return () => { cancelled = true; try {\n subHandle && subHandle.off && subHandle.off('change');\n }\n catch { } ; };\n }, [repo, workspace]);\n useInput((input, key) => {\n if (key.downArrow)\n setIdx(i => Math.min(i + 1, Math.max(0, threads.length - 1)));\n else if (key.upArrow)\n setIdx(i => Math.max(i - 1, 0));\n else if (key.return) {\n (async () => {\n const t = threads[idx];\n if (!t)\n return;\n let next = t;\n if (t.branchId)\n writeModConfig({ activeBranchId: t.branchId });\n // If id equals branchId, there is no thread yet; create lazily now\n if (t.branchId && String(t.id) === String(t.branchId)) {\n try {\n const wsHandle = await repo.find(workspace.id);\n const threadService = new ThreadService(repo);\n const createdId = await threadService.createThread(t.name || 'New Thread', t.branchId);\n // Persist on branch for branch-first model\n try {\n const bService = new BranchService(repo);\n const wsDoc = await wsHandle.doc();\n if (wsDoc?.branchesDocId) {\n await bService.setThreadId(t.branchId, createdId, wsDoc.branchesDocId);\n }\n }\n catch { }\n next = { ...t, id: createdId, hasThread: true };\n }\n catch { }\n }\n onSelect(next);\n })();\n }\n });\n if (error)\n return _jsx(Text, { color: \"red\", children: error });\n return (_jsxs(Box, { flexDirection: \"column\", children: [_jsx(Text, { bold: true, children: \"Branches (threads)\" }), threads.length === 0 ? (_jsx(Text, { color: \"gray\", children: \"No threads\" })) : (threads.map((t, i) => (_jsxs(Text, { color: i === idx ? 'green' : undefined, children: [t.name, ' ', _jsxs(Text, { color: \"gray\", children: [\"(\", t.branchId || 'no-branch', \")\", t.hasThread === false ? ' \u2014 no thread (will create on select)' : ''] })] }, t.id)))), _jsx(Text, { color: \"cyan\", children: \"Enter to select\" })] }));\n}\n", "import fs from 'fs';\nimport path from 'path';\nconst FEATURE_DIR = '.mod';\nconst FEATURE_FILE = 'feature-flags.json';\nconst FLAG_LIST_ENV = 'MOD_FLAGS';\nconst FEATURE_FILE_ENV = 'MOD_FEATURE_FLAGS_PATH';\nconst FEATURE_DEFINITIONS = {\n 'tasks-panel': {\n description: 'Enable the Tasks view in the interactive TUI (/tasks).',\n defaultValue: true,\n },\n 'directory-view': {\n description: 'Enable the project file browser (/files).',\n defaultValue: true,\n },\n 'background-watch': {\n description: 'Allow automatic workspace file watching & background sync.',\n defaultValue: true,\n },\n 'agents-run-command': {\n description: 'Expose the experimental agents-run command.',\n defaultValue: true,\n },\n 'full-ui': {\n description: 'Enable full CLI functionality beyond alpha-safe commands.',\n defaultValue: false,\n },\n};\nconst FLAG_KEYS = Object.keys(FEATURE_DEFINITIONS);\nlet cachedFlags = null;\nconst TRUE_VALUES = new Set(['1', 'true', 'yes', 'on', 'enable', 'enabled']);\nconst FALSE_VALUES = new Set(['0', 'false', 'no', 'off', 'disable', 'disabled']);\nfunction canonicalizeFlagName(name) {\n if (!name)\n return null;\n const normalized = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n return (FLAG_KEYS.find(flag => flag === normalized) ?? null);\n}\nfunction parseBoolean(value) {\n if (typeof value === 'boolean')\n return value;\n if (typeof value === 'number')\n return value !== 0;\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (TRUE_VALUES.has(normalized))\n return true;\n if (FALSE_VALUES.has(normalized))\n return false;\n }\n return undefined;\n}\nfunction getFeatureFlagsFilePath() {\n const overridePath = process.env[FEATURE_FILE_ENV];\n if (overridePath && overridePath.trim().length > 0) {\n return path.resolve(overridePath.trim());\n }\n return path.join(process.cwd(), FEATURE_DIR, FEATURE_FILE);\n}\nfunction getPackageLocalConfigPath() {\n try {\n const __filename = new URL(import.meta.url).pathname;\n const __dirname = path.dirname(__filename);\n // From dist/services -> ../config/feature-flags.json\n return path.join(__dirname, '../../config/feature-flags.json');\n }\n catch {\n return '';\n }\n}\nfunction parseConfigFile(filePath) {\n if (!fs.existsSync(filePath))\n return {};\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, 'utf8'));\n const overrides = {};\n for (const [name, value] of Object.entries(raw)) {\n const key = canonicalizeFlagName(name);\n if (!key)\n continue;\n if (typeof value === 'boolean') {\n overrides[key] = value;\n }\n else if (typeof value === 'string') {\n const parsed = parseBoolean(value);\n if (typeof parsed === 'boolean')\n overrides[key] = parsed;\n }\n }\n return overrides;\n }\n catch {\n return {};\n }\n}\nfunction readJsonOverrides() {\n const globalOverrides = parseConfigFile(getFeatureFlagsFilePath());\n const packageOverrides = parseConfigFile(getPackageLocalConfigPath());\n // Package-local overrides take precedence over global ones\n return { ...globalOverrides, ...packageOverrides };\n}\nfunction parseListEnvOverrides() {\n const value = process.env[FLAG_LIST_ENV];\n if (!value)\n return {};\n const overrides = {};\n const tokens = value.split(/[, ]+/g).map(token => token.trim()).filter(Boolean);\n for (const token of tokens) {\n let enabled = true;\n let name = token;\n if (name.startsWith('!') || name.startsWith('-')) {\n enabled = false;\n name = name.slice(1);\n }\n else if (name.startsWith('+')) {\n name = name.slice(1);\n }\n const key = canonicalizeFlagName(name);\n if (key)\n overrides[key] = enabled;\n }\n return overrides;\n}\nfunction parsePerFlagEnvOverrides() {\n const overrides = {};\n for (const key of FLAG_KEYS) {\n const envName = `MOD_FLAG_${key.replace(/[^A-Z0-9]/gi, '_').toUpperCase()}`;\n const raw = process.env[envName];\n const parsed = parseBoolean(raw);\n if (typeof parsed === 'boolean') {\n overrides[key] = parsed;\n }\n }\n const fullUiEnv = process.env['MOD_CLI_FULL_UI'];\n const fullUiParsed = parseBoolean(fullUiEnv);\n if (typeof fullUiParsed === 'boolean') {\n overrides['full-ui'] = fullUiParsed;\n }\n return overrides;\n}\nfunction buildFlags() {\n const overrides = {\n ...readJsonOverrides(),\n ...parseListEnvOverrides(),\n ...parsePerFlagEnvOverrides(),\n };\n const resolved = {};\n for (const key of FLAG_KEYS) {\n resolved[key] = overrides[key] ?? FEATURE_DEFINITIONS[key].defaultValue;\n }\n return resolved;\n}\nexport function getFeatureFlags(options) {\n if (!cachedFlags || options?.refresh) {\n cachedFlags = buildFlags();\n }\n return cachedFlags;\n}\nexport function isFeatureEnabled(flag) {\n return getFeatureFlags()[flag];\n}\nexport function describeFeatureFlags() {\n const flags = getFeatureFlags();\n return FLAG_KEYS.map(key => ({\n key,\n description: FEATURE_DEFINITIONS[key].description,\n defaultValue: FEATURE_DEFINITIONS[key].defaultValue,\n enabled: flags[key],\n }));\n}\nexport function shouldEnableBackgroundWatch() {\n const env = process.env.MOD_CLI_AUTO_WATCH;\n if (env === '1')\n return true;\n if (env === '0')\n return false;\n return isFeatureEnabled('background-watch');\n}\nexport function shouldExposeFullUi() {\n return isFeatureEnabled('full-ui');\n}\nexport const FEATURE_FLAGS_FILE_NAME = FEATURE_FILE;\n", "import { Repo } from \"@automerge/automerge-repo\";\nimport { NodeFSStorageAdapter } from \"@automerge/automerge-repo-storage-nodefs\";\nimport { WebSocketClientAdapter } from \"@automerge/automerge-repo-network-websocket\";\nimport { resolveAutomergeWsUrl } from \"../utils/resolveAutomergeWsUrl.js\";\nimport { isAutomergeSyncAvailable } from \"../utils/automergeSyncAvailability.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nlet repoInstance = null;\nexport const repo = async () => {\n if (repoInstance)\n return repoInstance;\n const wsUrl = resolveAutomergeWsUrl();\n const syncAvailable = await isAutomergeSyncAvailable(wsUrl, { timeoutMs: 750 });\n if (!syncAvailable) {\n console.warn(`[mod-core] Automerge sync server not reachable at ${wsUrl}; will keep retrying from node repo.`);\n }\n const networkAdapters = [\n new WebSocketClientAdapter(wsUrl),\n ];\n const storageDir = process.env.MOD_AUTOMERGE_STORAGE_DIR\n ? path.resolve(process.env.MOD_AUTOMERGE_STORAGE_DIR)\n : path.resolve('./.automerge-data');\n try {\n fs.mkdirSync(storageDir, { recursive: true });\n }\n catch (error) {\n console.warn('[mod-core] Failed to ensure automerge storage directory:', storageDir, error);\n }\n repoInstance = new Repo({\n storage: new NodeFSStorageAdapter(storageDir),\n network: networkAdapters,\n sharePolicy: async () => true,\n });\n if (networkAdapters.length > 0) {\n // Best-effort: wait briefly for websocket to connect to reduce 'Websocket not ready' noise\n try {\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n catch { }\n }\n return repoInstance;\n};\n", "// const DEFAULT_AUTOMERGE_WS_URL = \"wss://brade-sync-server.onrender.com/\";\nconst DEFAULT_AUTOMERGE_WS_URL = \"ws://localhost:3031\";\nconst LOCAL_AUTOMERGE_WS_URL = \"ws://localhost:3031\";\nconst ENV_KEYS = [\n \"AUTOMERGE_WS_URL\",\n \"MOD_AUTOMERGE_WS_URL\",\n \"VITE_AUTOMERGE_WS_URL\",\n \"NEXT_PUBLIC_AUTOMERGE_WS_URL\",\n \"PUBLIC_AUTOMERGE_WS_URL\",\n];\nconst pickFromEnv = (source) => {\n if (!source || typeof source !== \"object\")\n return undefined;\n for (const key of ENV_KEYS) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n }\n return undefined;\n};\nconst normalizeUrl = (value) => {\n const raw = value?.trim() ?? \"\";\n if (!raw)\n return DEFAULT_AUTOMERGE_WS_URL;\n if (/^[a-zA-Z][\\w+.-]*:\\/\\//.test(raw)) {\n return raw;\n }\n if (raw.startsWith(\"//\")) {\n return `wss:${raw}`;\n }\n if (/^(localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0)(:\\d+)?(\\/.*)?$/.test(raw)) {\n return raw.startsWith(\"ws://\") ? raw : `ws://${raw}`;\n }\n return `wss://${raw}`;\n};\nexport const resolveAutomergeWsUrl = () => {\n const fromProcess = typeof process !== \"undefined\" ? pickFromEnv(process.env) : undefined;\n if (fromProcess)\n return normalizeUrl(fromProcess);\n try {\n const metaEnv = import.meta?.env;\n const fromMeta = pickFromEnv(metaEnv);\n if (fromMeta)\n return normalizeUrl(fromMeta);\n }\n catch { }\n const fromGlobal = pickFromEnv(typeof globalThis !== \"undefined\" ? globalThis : undefined);\n if (fromGlobal)\n return normalizeUrl(fromGlobal);\n if (typeof process !== \"undefined\" &&\n (process.env?.NODE_ENV === \"development\" || process.env?.NODE_ENV === \"test\")) {\n const local = normalizeUrl(LOCAL_AUTOMERGE_WS_URL);\n try {\n // Avoid mixed content in HTTPS dev: upgrade ws://localhost to wss://localhost\n const isHttps = typeof window !== 'undefined' && window.location?.protocol === 'https:';\n if (isHttps && local.startsWith('ws://')) {\n return local.replace(/^ws:\\/\\//, 'wss://');\n }\n }\n catch { }\n return local;\n }\n return DEFAULT_AUTOMERGE_WS_URL;\n};\nexport const DEFAULT_AUTOMERGE_WS = DEFAULT_AUTOMERGE_WS_URL;\n", "const getWebSocketCtor = async () => {\n if (typeof WebSocket !== \"undefined\")\n return WebSocket;\n try {\n // isomorphic-ws is already used by automerge websocket adapters; pull it in for node probes\n const wsModule = await import(\"isomorphic-ws\");\n return (wsModule.default ?? wsModule);\n }\n catch {\n return null;\n }\n};\nexport const isAutomergeSyncAvailable = async (wsUrl, { timeoutMs = 1000 } = {}) => {\n const WebSocketImpl = await getWebSocketCtor();\n if (!WebSocketImpl)\n return false;\n return await new Promise((resolve) => {\n let settled = false;\n let socket;\n let timer;\n const finish = (result) => {\n if (settled)\n return;\n settled = true;\n if (timer)\n clearTimeout(timer);\n try {\n socket?.close();\n }\n catch { }\n resolve(result);\n };\n const handleOpen = () => finish(true);\n const handleError = () => finish(false);\n const handleClose = () => finish(false);\n try {\n socket = new WebSocketImpl(wsUrl);\n }\n catch {\n return finish(false);\n }\n timer = setTimeout(() => finish(false), timeoutMs);\n if (typeof socket.addEventListener === \"function\") {\n socket.addEventListener(\"open\", handleOpen);\n socket.addEventListener(\"error\", handleError);\n socket.addEventListener(\"close\", handleClose);\n }\n else if (typeof socket.on === \"function\") {\n socket.on(\"open\", handleOpen);\n socket.on(\"error\", handleError);\n socket.on(\"close\", handleClose);\n }\n else {\n socket.onopen = handleOpen;\n socket.onerror = handleError;\n socket.onclose = handleClose;\n }\n });\n};\n", "import { readModConfig } from '../services/mod-config.js';\nimport { ThreadService } from '@mod/mod-core/services/thread-service';\nexport async function agentsRunCommand(args, repo) {\n // Usage: mod agents-run --prompt \"...\" [--agent dev|planner]\n const promptIndex = args.findIndex(a => a === '--prompt');\n const agentIndex = args.findIndex(a => a === '--agent');\n const prompt = promptIndex !== -1 ? args[promptIndex + 1] : undefined;\n const agentName = agentIndex !== -1 ? (args[agentIndex + 1] || 'dev') : 'dev';\n if (!prompt) {\n console.error('Usage: mod agents-run --prompt \"...\" [--agent dev|planner]');\n process.exit(1);\n }\n const config = readModConfig();\n if (!config?.workspaceId) {\n console.error('No active workspace found in .mod/config.json');\n process.exit(1);\n }\n const wsHandle = await repo.find(config.workspaceId);\n const workspace = await wsHandle.doc();\n if (!workspace) {\n console.error('Workspace not found');\n process.exit(1);\n }\n const threadService = new ThreadService(repo);\n const threadId = workspace.activeThreadId || (await (async () => {\n const t = await threadService.createThreadWithBranch(workspace.id, workspace.branchesDocId, workspace.activeBranchId, 'CLI Thread');\n return t.id;\n })());\n // Lazy import agents (shimmed types)\n // Agent packages not yet available - placeholder implementation\n console.error('Agent packages (@mod/mod-agents) are not yet implemented');\n console.log(`Requested agent: ${agentName}`);\n process.exit(1);\n /*\n let agent: any;\n if (agentName === 'planner' || agentName === 'plan') {\n const mod = await import('@mod/mod-agents/planner');\n agent = (mod as any).plannerAgent || (mod as any).default;\n } else {\n const mod = await import('@mod/mod-agents/dev-agent');\n agent = (mod as any).devAgent || (mod as any).default;\n }\n */\n /*\n const tools: Record<string, any> = {};\n const apiKey = process.env.OPENAI_API_KEY || process.env.OPENAI || process.env.ANTHROPIC_API_KEY || '';\n try {\n for await (const chunk of chatWithAgentCli({\n repo: repo as any,\n threadId: threadId as any,\n userMessage: prompt,\n workspace,\n agent,\n tools,\n apiKey,\n })) {\n if (chunk.type === 'content') {\n process.stdout.write(chunk.content);\n } else if (chunk.type === 'tool-call') {\n log('[tool-call]', (chunk as any).toolName || '');\n } else if (chunk.type === 'tool-result') {\n log('[tool-result]', (chunk as any).output?.toolName || '');\n }\n }\n } catch (e: any) {\n console.error('Agent run failed:', e?.message || e);\n } finally {\n setTimeout(() => process.exit(0), 500);\n }\n */\n}\n", "// glassware[type=implementation, id=cli-storage-utils, requirements=req-cli-storage-struct-1,req-cli-storage-app-1,req-cli-storage-app-2,req-cli-storage-app-3,req-cli-storage-conn-2,req-cli-storage-qual-1,req-cli-storage-qual-5]\nimport fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport os from 'os';\nimport { DEFAULT_CONFIG, DEFAULT_SETTINGS } from '../types/config.js';\n/**\n * Get the path to the ~/.mod/ directory.\n */\nexport function getModDir() {\n return path.join(os.homedir(), '.mod');\n}\n/**\n * Ensure the ~/.mod/ directory structure exists.\n * Creates: ~/.mod/, ~/.mod/workspaces/, ~/.mod/automerge/, ~/.mod/logs/\n */\nexport function ensureModDir() {\n const modDir = getModDir();\n const dirs = [\n modDir,\n path.join(modDir, 'workspaces'),\n path.join(modDir, 'automerge'),\n path.join(modDir, 'logs'),\n ];\n for (const dir of dirs) {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n }\n}\n/**\n * Get the path to the config file.\n */\nexport function getConfigPath() {\n return path.join(getModDir(), 'config');\n}\n/**\n * Read the global config from ~/.mod/config.\n * Returns default config if file doesn't exist or is invalid.\n */\nexport function readConfig() {\n const configPath = getConfigPath();\n if (!fs.existsSync(configPath)) {\n return { ...DEFAULT_CONFIG };\n }\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n const stored = JSON.parse(content);\n // Merge with defaults for missing fields\n return {\n version: stored.version ?? DEFAULT_CONFIG.version,\n auth: stored.auth ?? null,\n settings: {\n ...DEFAULT_SETTINGS,\n ...stored.settings,\n },\n };\n }\n catch (error) {\n // Return defaults if file is corrupted\n console.warn('Warning: Could not read ~/.mod/config, using defaults');\n return { ...DEFAULT_CONFIG };\n }\n}\n/**\n * Write config to ~/.mod/config atomically.\n * Creates the file with 0600 permissions (user read/write only).\n */\nexport function writeConfig(config) {\n ensureModDir();\n const configPath = getConfigPath();\n atomicWrite(configPath, JSON.stringify(config, null, 2), 0o600);\n}\n/**\n * Get the path to a workspace connection file for a directory.\n * Uses SHA-256 hash of the absolute path (first 16 chars).\n */\nexport function getWorkspaceConnectionPath(directoryPath) {\n const absolutePath = path.resolve(directoryPath);\n const hash = crypto\n .createHash('sha256')\n .update(absolutePath)\n .digest('hex')\n .slice(0, 16);\n return path.join(getModDir(), 'workspaces', hash);\n}\n/**\n * Read the workspace connection for a directory.\n * Returns null if no connection exists.\n */\nexport function readWorkspaceConnection(directoryPath) {\n const connectionPath = getWorkspaceConnectionPath(directoryPath);\n if (!fs.existsSync(connectionPath)) {\n return null;\n }\n try {\n const content = fs.readFileSync(connectionPath, 'utf-8');\n return JSON.parse(content);\n }\n catch (error) {\n console.warn(`Warning: Could not read workspace connection for ${directoryPath}`);\n return null;\n }\n}\n/**\n * Write a workspace connection for a directory atomically.\n */\nexport function writeWorkspaceConnection(directoryPath, connection) {\n ensureModDir();\n const connectionPath = getWorkspaceConnectionPath(directoryPath);\n atomicWrite(connectionPath, JSON.stringify(connection, null, 2), 0o600);\n}\n/**\n * Delete the workspace connection for a directory.\n */\nexport function deleteWorkspaceConnection(directoryPath) {\n const connectionPath = getWorkspaceConnectionPath(directoryPath);\n if (!fs.existsSync(connectionPath)) {\n return false;\n }\n try {\n fs.unlinkSync(connectionPath);\n return true;\n }\n catch (error) {\n console.warn(`Warning: Could not delete workspace connection for ${directoryPath}`);\n return false;\n }\n}\n/**\n * List all workspace connections.\n * Returns array of connections, filtering out corrupted files.\n */\nexport function listWorkspaceConnections() {\n const workspacesDir = path.join(getModDir(), 'workspaces');\n if (!fs.existsSync(workspacesDir)) {\n return [];\n }\n const files = fs.readdirSync(workspacesDir);\n const connections = [];\n for (const file of files) {\n const filePath = path.join(workspacesDir, file);\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const connection = JSON.parse(content);\n connections.push(connection);\n }\n catch (error) {\n // Skip corrupted files\n continue;\n }\n }\n return connections;\n}\n/**\n * Find workspace connection for the current directory or any parent.\n * Walks up the directory tree looking for a connection.\n */\nexport function findWorkspaceConnection(startPath) {\n let currentPath = path.resolve(startPath);\n const root = path.parse(currentPath).root;\n while (currentPath !== root) {\n const connection = readWorkspaceConnection(currentPath);\n if (connection) {\n return connection;\n }\n currentPath = path.dirname(currentPath);\n }\n return null;\n}\n/**\n * Atomic write: write to temp file then rename.\n * Ensures file is never partially written.\n */\nfunction atomicWrite(filePath, content, mode) {\n const tempPath = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tempPath, content, { mode });\n fs.renameSync(tempPath, filePath);\n}\n/**\n * Get the path to the sync daemon PID file.\n */\nexport function getPidFilePath() {\n return path.join(getModDir(), 'sync.pid');\n}\n/**\n * Get the path to the automerge storage directory.\n */\nexport function getAutomergeStoragePath() {\n return path.join(getModDir(), 'automerge');\n}\n/**\n * Get the path to the logs directory.\n */\nexport function getLogsDir() {\n return path.join(getModDir(), 'logs');\n}\n/**\n * Get the path to the sync daemon log file.\n */\nexport function getSyncLogPath() {\n return path.join(getLogsDir(), 'sync.log');\n}\n", "// glassware[type=implementation, id=cli-config-types, requirements=req-cli-storage-config-1,req-cli-storage-config-2]\n/**\n * Default settings values.\n */\nexport const DEFAULT_SETTINGS = {\n syncDebounceMs: 100,\n logLevel: 'info',\n};\n/**\n * Default config for new installations.\n */\nexport const DEFAULT_CONFIG = {\n version: 1,\n auth: null,\n settings: DEFAULT_SETTINGS,\n};\n", "// glassware[type=implementation, id=cli-browser-opener, requirements=req-cli-auth-ux-2,req-cli-auth-ux-4]\nimport { exec } from 'child_process';\nimport { platform } from 'os';\n/**\n * Open a URL in the default browser.\n * Returns true if successful, false if browser couldn't be opened.\n */\nexport async function openBrowser(url) {\n const command = getBrowserCommand(url);\n return new Promise((resolve) => {\n exec(command, (error) => {\n if (error) {\n resolve(false);\n }\n else {\n resolve(true);\n }\n });\n });\n}\n/**\n * Get the platform-specific command to open a URL.\n */\nfunction getBrowserCommand(url) {\n const escapedUrl = url.replace(/\"/g, '\\\\\"');\n switch (platform()) {\n case 'darwin':\n return `open \"${escapedUrl}\"`;\n case 'win32':\n return `start \"\" \"${escapedUrl}\"`;\n default:\n // Linux and others - try xdg-open\n return `xdg-open \"${escapedUrl}\"`;\n }\n}\n", "// glassware[type=implementation, id=cli-auth-server, requirements=req-cli-auth-app-2,req-cli-auth-app-4,req-cli-auth-qual-1]\nimport http from 'http';\nimport { URL } from 'url';\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n/**\n * Start a localhost HTTP server to receive OAuth callback.\n * Returns the port number and a promise that resolves with auth result.\n */\nexport async function startAuthServer(options = {}) {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n let resolveAuth;\n let rejectAuth;\n const resultPromise = new Promise((resolve, reject) => {\n resolveAuth = resolve;\n rejectAuth = reject;\n });\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || '/', `http://localhost`);\n if (url.pathname === '/callback') {\n const token = url.searchParams.get('token');\n const email = url.searchParams.get('email');\n const name = url.searchParams.get('name');\n const googleId = url.searchParams.get('googleId');\n if (token && email && googleId) {\n // Send success page to browser\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(getSuccessPage(name || email));\n // Resolve with auth result\n resolveAuth({\n googleIdToken: token,\n googleId,\n email,\n name: name || email.split('@')[0],\n });\n }\n else {\n // Missing parameters\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(getErrorPage('Missing authentication parameters'));\n rejectAuth(new Error('Missing authentication parameters in callback'));\n }\n }\n else {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not found');\n }\n });\n // Wait for server to start listening\n const port = await new Promise((resolve, reject) => {\n server.on('error', reject);\n server.listen(0, '127.0.0.1', () => {\n const address = server.address();\n const port = typeof address === 'object' && address ? address.port : 0;\n resolve(port);\n });\n });\n // Set timeout\n const timeoutId = setTimeout(() => {\n server.close();\n rejectAuth(new Error('Authentication timed out after 5 minutes'));\n }, timeoutMs);\n // Close server when auth completes\n resultPromise.finally(() => {\n clearTimeout(timeoutId);\n server.close();\n });\n return {\n port,\n result: resultPromise,\n close: () => {\n clearTimeout(timeoutId);\n server.close();\n rejectAuth(new Error('Authentication cancelled'));\n },\n };\n}\nfunction getSuccessPage(name) {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Signed in to Mod</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n }\n .container {\n text-align: center;\n padding: 2rem;\n background: rgba(255,255,255,0.1);\n border-radius: 12px;\n backdrop-filter: blur(10px);\n }\n h1 { margin-bottom: 0.5rem; }\n p { opacity: 0.9; }\n .check { font-size: 3rem; margin-bottom: 1rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"check\">\u2713</div>\n <h1>Welcome, ${escapeHtml(name)}!</h1>\n <p>You can close this window and return to your terminal.</p>\n </div>\n</body>\n</html>`;\n}\nfunction getErrorPage(message) {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Error</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n margin: 0;\n background: #1a1a2e;\n color: white;\n }\n .container {\n text-align: center;\n padding: 2rem;\n }\n h1 { color: #ff6b6b; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Authentication Error</h1>\n <p>${escapeHtml(message)}</p>\n <p>Please try again from your terminal.</p>\n </div>\n</body>\n</html>`;\n}\nfunction escapeHtml(str) {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n", "// glassware[type=implementation, id=cli-auth-command, requirements=req-cli-auth-ux-2,req-cli-auth-ux-3,req-cli-auth-ux-4,req-cli-auth-ux-5,req-cli-auth-ux-6,req-cli-auth-app-1,req-cli-auth-app-5]\nimport { readConfig, writeConfig } from '../lib/storage.js';\nimport { openBrowser } from '../lib/browser.js';\nimport { startAuthServer } from '../lib/auth-server.js';\n// Auth server base URL - configurable via environment variable\nconst AUTH_BASE_URL = process.env.MOD_AUTH_URL || 'https://auth.mod.app';\nconst API_BASE_URL = process.env.MOD_API_URL || 'https://api.mod.app';\nexport async function authCommand(args, repo) {\n const [subcommand] = args;\n switch (subcommand) {\n case 'login':\n await handleLogin();\n break;\n case 'logout':\n await handleLogout();\n break;\n case 'status':\n await handleStatus();\n break;\n default:\n if (!subcommand) {\n await handleStatus();\n }\n else {\n console.error('Usage: mod auth <login|logout|status>');\n console.error('Available commands:');\n console.error(' login Sign in with Google OAuth');\n console.error(' logout Sign out and clear credentials');\n console.error(' status Show current authentication state');\n process.exit(1);\n }\n }\n process.exit(0);\n}\nasync function handleLogin() {\n // Check if already authenticated\n const config = readConfig();\n if (config.auth) {\n console.log(`Already signed in as ${config.auth.email}`);\n console.log('');\n console.log('Run `mod auth logout` to sign out first.');\n return;\n }\n // Start localhost server to receive callback\n const { port, result, close } = await startAuthServer();\n // Build auth URL with callback port\n const authUrl = `${AUTH_BASE_URL}/cli?port=${port}`;\n console.log('Opening browser to sign in...');\n // Try to open browser\n const opened = await openBrowser(authUrl);\n if (!opened) {\n console.log('');\n console.log('Could not open browser. Please visit:');\n console.log(authUrl);\n console.log('');\n }\n console.log('Waiting for authentication...');\n try {\n // Wait for auth callback\n const authResult = await result;\n // Validate token with server (optional - server may not be available)\n let userDocId;\n try {\n userDocId = await validateAndGetUserDocId(authResult.googleIdToken);\n }\n catch (error) {\n // If validation fails, continue without userDocId\n // It will be set on first sync\n }\n // Store credentials in config\n const updatedConfig = readConfig();\n updatedConfig.auth = {\n googleIdToken: authResult.googleIdToken,\n googleId: authResult.googleId,\n email: authResult.email,\n name: authResult.name,\n userDocId: userDocId || '',\n };\n writeConfig(updatedConfig);\n console.log('');\n console.log(`Signed in as ${authResult.email}`);\n }\n catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('timed out')) {\n console.error('');\n console.error('Authentication timed out. Please try again.');\n }\n else if (error.message.includes('cancelled')) {\n console.error('');\n console.error('Authentication cancelled.');\n }\n else {\n console.error('');\n console.error(`Authentication failed: ${error.message}`);\n }\n }\n process.exit(1);\n }\n}\nasync function handleLogout() {\n const config = readConfig();\n if (!config.auth) {\n console.log('Not signed in.');\n return;\n }\n const email = config.auth.email;\n // Clear auth from config\n config.auth = null;\n writeConfig(config);\n console.log('Signed out successfully');\n console.log(`Removed credentials for ${email}`);\n}\nasync function handleStatus() {\n const config = readConfig();\n if (!config.auth) {\n console.log('Not signed in.');\n console.log('');\n console.log('Sign in to sync with collaborators: mod auth login');\n return;\n }\n console.log(`Signed in as ${config.auth.email}`);\n if (config.auth.name && config.auth.name !== config.auth.email) {\n console.log(`Name: ${config.auth.name}`);\n }\n console.log('Token expires: never');\n // Check if token is still valid (optional)\n try {\n await validateAndGetUserDocId(config.auth.googleIdToken);\n console.log('Token status: valid');\n }\n catch (error) {\n console.log('Token status: could not verify (server unavailable)');\n }\n}\n/**\n * Validate token with server and get user document ID.\n * Returns existing userDocId for returning users, or undefined for new users.\n */\nasync function validateAndGetUserDocId(token) {\n const response = await fetch(`${API_BASE_URL}/auth/me`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n if (!response.ok) {\n throw new Error('Token validation failed');\n }\n const data = (await response.json());\n return data.userDocId;\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport { createModWorkspace } from '@mod/mod-core/mod-workspace';\nimport { readModConfig, writeModConfig } from '../services/mod-config.js';\nimport { AutomaticFileTracker } from '../services/automatic-file-tracker.js';\nimport { SyncDaemon } from '../services/sync-daemon.js';\nclass MyersDiffCalculator {\n static calculateDiff(baseline, current) {\n const baselineLines = baseline.split('\\n');\n const currentLines = current.split('\\n');\n // Early exit optimization for identical content\n if (baseline === current) {\n return { linesAdded: 0, linesRemoved: 0, changes: [] };\n }\n // Simplified Myers algorithm implementation\n const changes = this.computeChanges(baselineLines, currentLines);\n let linesAdded = 0;\n let linesRemoved = 0;\n for (const change of changes) {\n if (change.type === 'add')\n linesAdded++;\n if (change.type === 'remove')\n linesRemoved++;\n }\n return { linesAdded, linesRemoved, changes };\n }\n static computeChanges(baseline, current) {\n const changes = [];\n const lcs = this.longestCommonSubsequence(baseline, current);\n let baselineIndex = 0;\n let currentIndex = 0;\n let lcsIndex = 0;\n while (baselineIndex < baseline.length || currentIndex < current.length) {\n if (lcsIndex < lcs.length &&\n baselineIndex < baseline.length &&\n baseline[baselineIndex] === lcs[lcsIndex] &&\n currentIndex < current.length &&\n current[currentIndex] === lcs[lcsIndex]) {\n // Lines match - unchanged\n changes.push({\n type: 'unchanged',\n line: baseline[baselineIndex],\n lineNumber: baselineIndex + 1\n });\n baselineIndex++;\n currentIndex++;\n lcsIndex++;\n }\n else if (currentIndex < current.length &&\n (lcsIndex >= lcs.length || current[currentIndex] !== lcs[lcsIndex])) {\n // Line added in current\n changes.push({\n type: 'add',\n line: current[currentIndex],\n lineNumber: currentIndex + 1\n });\n currentIndex++;\n }\n else if (baselineIndex < baseline.length &&\n (lcsIndex >= lcs.length || baseline[baselineIndex] !== lcs[lcsIndex])) {\n // Line removed from baseline\n changes.push({\n type: 'remove',\n line: baseline[baselineIndex],\n lineNumber: baselineIndex + 1\n });\n baselineIndex++;\n }\n }\n return changes;\n }\n static longestCommonSubsequence(a, b) {\n const m = a.length;\n const n = b.length;\n const dp = Array(m + 1).fill(0).map(() => Array(n + 1).fill(0));\n // Build LCS table\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (a[i - 1] === b[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n }\n else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n // Backtrack to find LCS\n const lcs = [];\n let i = m, j = n;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n lcs.unshift(a[i - 1]);\n i--;\n j--;\n }\n else if (dp[i - 1][j] > dp[i][j - 1]) {\n i--;\n }\n else {\n j--;\n }\n }\n return lcs;\n }\n}\nclass FileFilter {\n constructor() {\n this.ignorePatterns = [];\n this.loadIgnorePatterns();\n }\n loadIgnorePatterns() {\n const patterns = [\n // Common build artifacts that should be excluded\n '*.js', '*.d.ts', '*.js.map', // TypeScript build outputs\n 'node_modules/**',\n 'dist/**', 'build/**',\n '.cache/**',\n '*.log',\n '.DS_Store',\n 'coverage/**'\n ];\n // Load .gitignore if exists\n const gitignorePath = path.join(process.cwd(), '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n try {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n const gitignorePatterns = gitignoreContent\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line && !line.startsWith('#'));\n patterns.push(...gitignorePatterns);\n }\n catch (error) {\n console.warn('Could not read .gitignore:', error);\n }\n }\n // Load .modignore if exists \n const modignorePath = path.join(process.cwd(), '.modignore');\n if (fs.existsSync(modignorePath)) {\n try {\n const modignoreContent = fs.readFileSync(modignorePath, 'utf8');\n const modignorePatterns = modignoreContent\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line && !line.startsWith('#'));\n patterns.push(...modignorePatterns);\n }\n catch (error) {\n console.warn('Could not read .modignore:', error);\n }\n }\n this.ignorePatterns = patterns;\n }\n isSourceFile(filePath) {\n // Check if file should be ignored\n if (this.shouldIgnoreFile(filePath)) {\n return false;\n }\n // Check if it's a source file type\n const sourceExtensions = ['.ts', '.tsx', '.js', '.jsx', '.vue', '.py', '.go', '.rs', '.java', '.cpp', '.c', '.h', '.hpp', '.md', '.yaml', '.yml', '.json'];\n const ext = path.extname(filePath).toLowerCase();\n // Special case: exclude .js/.d.ts files if corresponding .ts file exists\n if (ext === '.js' || ext === '.d.ts') {\n const tsFile = filePath.replace(/\\.(js|d\\.ts)$/, '.ts');\n if (fs.existsSync(tsFile)) {\n return false; // This is a build artifact\n }\n }\n return sourceExtensions.includes(ext);\n }\n shouldIgnoreFile(filePath) {\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n return this.ignorePatterns.some(pattern => {\n // Simple glob pattern matching\n if (pattern.includes('**')) {\n const regex = new RegExp(pattern.replace(/\\*\\*/g, '.*').replace(/\\*/g, '[^/]*'));\n return regex.test(normalizedPath);\n }\n else if (pattern.includes('*')) {\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$');\n return regex.test(path.basename(normalizedPath));\n }\n else {\n return normalizedPath.includes(pattern) || path.basename(normalizedPath) === pattern;\n }\n });\n }\n filterSourceFiles(files) {\n return files.filter(file => {\n const filePath = file.path || file.name || '';\n return this.isSourceFile(filePath);\n });\n }\n}\nfunction generateBranchName(input) {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '') // Remove special chars except spaces and hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/-+/g, '-') // Collapse multiple hyphens\n .replace(/^-|-$/g, '') // Remove leading/trailing hyphens\n .substring(0, 50); // Limit length\n}\nexport async function branchCommand(args, repo) {\n const cfg = readModConfig();\n if (!cfg?.workspaceId) {\n console.error('No active workspace configured in .mod/config.json');\n process.exit(1);\n }\n const modWorkspace = createModWorkspace(repo);\n let workspaceHandle;\n try {\n workspaceHandle = await openExistingWorkspace(modWorkspace, cfg.workspaceId);\n }\n catch (error) {\n console.error('Failed to initialize workspace:', error);\n console.log('Try running: mod sync-workspace to repair workspace state');\n process.exit(1);\n }\n const [subcommand, ...rest] = args;\n switch (subcommand) {\n case 'create':\n await handleCreateBranch(workspaceHandle, rest);\n break;\n case 'switch':\n await handleSwitchBranch(workspaceHandle, rest);\n break;\n case 'list':\n await handleListBranches(workspaceHandle, rest);\n break;\n case 'status':\n await handleBranchStatus(workspaceHandle, rest);\n break;\n case 'coverage':\n await handleCoverageAnalysis(workspaceHandle, rest);\n break;\n case 'tree':\n await handleTreeView(workspaceHandle, rest);\n break;\n case 'auto-track':\n await handleAutoTrack(workspaceHandle, rest, repo);\n return; // Don't exit when auto-track is running\n default:\n await handleListBranches(workspaceHandle, []);\n }\n process.exit(0);\n}\nfunction detectBranchType(branchName, hasSpecFlag, hasLightweightFlag) {\n // Explicit flags override auto-detection\n if (hasSpecFlag)\n return 'specification';\n if (hasLightweightFlag)\n return 'lightweight';\n const lightweightPrefixes = ['fix-', 'hotfix-', 'patch-', 'deps-', 'chore-'];\n if (lightweightPrefixes.some(prefix => branchName.startsWith(prefix))) {\n return 'lightweight';\n }\n const specPrefixes = ['feature-', 'feat-', 'refactor-', 'implement-'];\n if (specPrefixes.some(prefix => branchName.startsWith(prefix))) {\n return 'specification';\n }\n return 'lightweight';\n}\nasync function handleCreateBranch(workspaceHandle, args) {\n if (args.length === 0) {\n console.error('Usage: mod branch create <branch-name> [--from <parent-branch>] [--spec <spec-path>] [--lightweight]');\n process.exit(1);\n }\n const branchName = args[0];\n const fromIndex = args.indexOf('--from');\n const specIndex = args.indexOf('--spec');\n const lightweightFlag = args.includes('--lightweight');\n const fromBranch = fromIndex >= 0 && fromIndex + 1 < args.length ? args[fromIndex + 1] : undefined;\n const specPath = specIndex >= 0 && specIndex + 1 < args.length ? args[specIndex + 1] : undefined;\n const branchType = detectBranchType(branchName, !!specPath, lightweightFlag);\n try {\n const typeIndicator = branchType === 'specification' ? 'specification' : 'lightweight';\n console.log(`Creating ${typeIndicator} branch: ${branchName}${fromBranch ? ` from ${fromBranch}` : ''}...`);\n const createOptions = {\n name: branchName,\n fromBranch: fromBranch,\n spec: (branchType === 'specification' && specPath) ? {\n file: specPath,\n title: branchName\n } : undefined\n };\n const branch = await workspaceHandle.branch.create(createOptions);\n console.log(`[DEBUG] Created branch: ${branch.name} (${branch.id})`);\n await workspaceHandle.branch.switchActive(branch.id);\n console.log(`[DEBUG] Switched to branch: ${branch.id}`);\n // Wait a moment and verify the branch appears in the list\n const branches = await workspaceHandle.branch.list();\n console.log(`[DEBUG] Branches after creation:`, branches.map((b) => `${b.name} (${b.id})`));\n const createdBranchExists = branches.find((b) => b.id === branch.id);\n console.log(`[DEBUG] Created branch exists in list: ${!!createdBranchExists}`);\n // Add delay and force persistence to ensure branch is saved\n await new Promise(resolve => setTimeout(resolve, 500));\n const cfg = readModConfig();\n const updatedConfig = {\n ...cfg,\n workspaceId: cfg?.workspaceId,\n activeBranchId: branch.id,\n lastSpecificationPath: specPath\n };\n writeModConfig(updatedConfig);\n console.log(`\u2713 Created and switched to ${typeIndicator} branch: ${branchName} (${branch.id})`);\n if (specPath && branchType === 'specification') {\n console.log(`\u2713 Linked to specification: ${specPath}`);\n }\n else if (branchType === 'lightweight') {\n console.log(`\uD83D\uDCA1 Lightweight branch - no specification tracking required`);\n }\n }\n catch (error) {\n console.error('Failed to create branch:', error);\n console.log('Try running: mod branches list --wait to check workspace sync status');\n process.exit(1);\n }\n}\nasync function handleSwitchBranch(workspaceHandle, args) {\n if (args.length === 0) {\n console.error('Usage: mod branch switch <branch-name>');\n process.exit(1);\n }\n const targetBranchName = args[0];\n try {\n const branches = await workspaceHandle.branch.list();\n const targetBranch = branches.find((b) => b.name === targetBranchName || b.id === targetBranchName);\n if (!targetBranch) {\n console.error(`Branch not found: ${targetBranchName}`);\n console.log('Available branches:');\n branches.forEach((b) => console.log(` ${b.name} (${b.id})`));\n process.exit(1);\n }\n await workspaceHandle.branch.switchActive(targetBranch.id);\n const cfg = readModConfig();\n const updatedConfig = {\n ...cfg,\n workspaceId: cfg?.workspaceId,\n activeBranchId: targetBranch.id\n };\n writeModConfig(updatedConfig);\n console.log(`\u2713 Switched to branch: ${targetBranch.name} (${targetBranch.id})`);\n }\n catch (error) {\n console.error('Failed to switch branch:', error);\n process.exit(1);\n }\n}\nasync function handleListBranches(workspaceHandle, args) {\n try {\n const branches = await workspaceHandle.branch.list();\n const activeBranch = await workspaceHandle.branch.getActive();\n if (branches.length === 0) {\n console.log('No branches found.');\n return;\n }\n console.log('Available branches:');\n branches.forEach((branch) => {\n const isActive = activeBranch && branch.id === activeBranch.id;\n const indicator = isActive ? '* ' : ' ';\n const parent = branch.parentBranchId ? ` \u2190 ${branch.parentBranchId}` : '';\n const branchType = detectBranchType(branch.name, false, false);\n const typeIndicator = branchType === 'specification' ? '[spec]' : '[lite]';\n console.log(`${indicator}${branch.name} ${typeIndicator} (${branch.id})${parent}`);\n });\n }\n catch (error) {\n const errorMessage = String(error?.message || error || '');\n // Handle specific Automerge corruption errors\n if (errorMessage.includes('corrupt deflate stream') || errorMessage.includes('unable to parse chunk')) {\n console.error('\u274C Document loading error during branch listing');\n console.error('Error details:', errorMessage);\n // Try to extract the problematic document ID from the error stack\n const cfg = readModConfig();\n if (cfg?.workspaceId) {\n console.log(`\\n\uD83D\uDCCD Workspace ID: ${cfg.workspaceId}`);\n console.log('\uD83D\uDCA1 The issue is likely with the branches document referenced by this workspace');\n }\n console.log('\\n\uD83D\uDD27 Recovery options:');\n console.log(' 1. Reset workspace: `mod recover workspace`');\n console.log(' 2. Try switching to a different workspace');\n console.log(' 3. Check for stale document references');\n console.log('\\n\uD83D\uDCA1 This error indicates a stale or invalid document reference, not file corruption');\n process.exit(1);\n }\n console.error('Failed to list branches:', error);\n process.exit(1);\n }\n}\nasync function getFileChangesSummary(workspaceHandle, branch) {\n const fileFilter = new FileFilter();\n try {\n const currentFiles = await workspaceHandle.file.list();\n const filteredCurrentFiles = fileFilter.filterSourceFiles(currentFiles);\n // Get baseline from parent branch or empty if this is root\n let parentFiles = [];\n if (branch.parentBranchId) {\n // Temporarily switch to parent to get its files\n const currentBranchId = branch.id;\n await workspaceHandle.branch.switchActive(branch.parentBranchId);\n const allParentFiles = await workspaceHandle.file.list();\n parentFiles = fileFilter.filterSourceFiles(allParentFiles);\n // Switch back\n await workspaceHandle.branch.switchActive(currentBranchId);\n }\n const parentFileMap = new Map(parentFiles.map((f) => [f.name, f]));\n const currentFileMap = new Map(filteredCurrentFiles.map((f) => [f.name, f]));\n const newFiles = [];\n const modifiedFiles = [];\n const deletedFiles = [];\n let totalLinesAdded = 0;\n let totalLinesRemoved = 0;\n // Process new and modified files\n for (const currentFile of filteredCurrentFiles) {\n const parentFile = parentFileMap.get(currentFile.name);\n if (!parentFile) {\n const currentContent = await getFileContent(workspaceHandle, currentFile, currentFile.name);\n const lines = currentContent ? currentContent.split('\\n').length : 0;\n newFiles.push({\n name: currentFile.name,\n path: currentFile.path || currentFile.name,\n status: 'A',\n linesAdded: lines,\n linesRemoved: 0,\n isSourceFile: true\n });\n totalLinesAdded += lines;\n }\n else {\n // Compare content for modifications\n const currentContent = await getFileContent(workspaceHandle, currentFile, currentFile.name);\n const parentContent = await getFileContent(workspaceHandle, parentFile, parentFile.name);\n if (currentContent !== parentContent) {\n const diffResult = MyersDiffCalculator.calculateDiff(parentContent || '', currentContent || '');\n modifiedFiles.push({\n name: currentFile.name,\n path: currentFile.path || currentFile.name,\n status: 'M',\n linesAdded: diffResult.linesAdded,\n linesRemoved: diffResult.linesRemoved,\n isSourceFile: true\n });\n totalLinesAdded += diffResult.linesAdded;\n totalLinesRemoved += diffResult.linesRemoved;\n }\n }\n }\n // Process deleted files\n for (const parentFile of parentFiles) {\n if (!currentFileMap.has(parentFile.name)) {\n const parentContent = await getFileContent(workspaceHandle, parentFile, parentFile.name);\n const lines = parentContent ? parentContent.split('\\n').length : 0;\n deletedFiles.push({\n name: parentFile.name,\n path: parentFile.path || parentFile.name,\n status: 'D',\n linesAdded: 0,\n linesRemoved: lines,\n isSourceFile: true\n });\n totalLinesRemoved += lines;\n }\n }\n return {\n totalFiles: filteredCurrentFiles.length,\n totalChanges: newFiles.length + modifiedFiles.length + deletedFiles.length,\n totalLinesAdded,\n totalLinesRemoved,\n newFiles,\n modifiedFiles,\n deletedFiles,\n branchCreatedAt: branch.createdAt || 'unknown'\n };\n }\n catch (error) {\n console.warn('Error getting file changes:', error);\n return {\n totalFiles: 0,\n totalChanges: 0,\n totalLinesAdded: 0,\n totalLinesRemoved: 0,\n newFiles: [],\n modifiedFiles: [],\n deletedFiles: [],\n branchCreatedAt: branch.createdAt || 'unknown'\n };\n }\n}\nasync function handleBranchStatus(workspaceHandle, args) {\n try {\n // Read active branch from CLI config first, then fall back to workspace default\n const cfg = readModConfig();\n let activeBranch = null;\n if (cfg?.activeBranchId) {\n // Find the branch by ID from CLI config\n const branches = await workspaceHandle.branch.list();\n activeBranch = branches.find((b) => b.id === cfg.activeBranchId);\n }\n // Fall back to workspace's default active branch if not found in config\n if (!activeBranch) {\n activeBranch = await workspaceHandle.branch.getActive();\n }\n if (!activeBranch) {\n console.log('No active branch');\n return;\n }\n console.log(`Active branch: ${activeBranch.name} (${activeBranch.id})`);\n if (activeBranch.parentBranchId) {\n console.log(`Parent branch: ${activeBranch.parentBranchId}`);\n }\n const changes = await getFileChangesSummary(workspaceHandle, activeBranch);\n console.log(`\\nFile changes since branch creation:`);\n if (changes.totalChanges === 0) {\n console.log(' No changes detected');\n }\n else {\n changes.newFiles.forEach(file => {\n console.log(` A +${file.linesAdded}/-${file.linesRemoved} ${file.path}`);\n });\n changes.modifiedFiles.forEach(file => {\n console.log(` M +${file.linesAdded}/-${file.linesRemoved} ${file.path}`);\n });\n changes.deletedFiles.forEach(file => {\n console.log(` D +${file.linesAdded}/-${file.linesRemoved} ${file.path}`);\n });\n console.log(`\\nTotal: ${changes.totalChanges} files changed, ${changes.totalLinesAdded} insertions(+), ${changes.totalLinesRemoved} deletions(-)`);\n }\n const files = await workspaceHandle.file.list();\n const trackedFiles = files || [];\n console.log(`\\nTracked files: ${trackedFiles.length}`);\n const daemon = new SyncDaemon();\n const daemonStatus = await daemon.status();\n console.log('\\n\uD83D\uDCE1 Sync Daemon Status:');\n if (daemonStatus && daemonStatus.status === 'running') {\n const uptimeSeconds = daemonStatus.uptime ? Math.floor(daemonStatus.uptime / 1000) : 0;\n const minutes = Math.floor(uptimeSeconds / 60);\n const seconds = uptimeSeconds % 60;\n console.log(` \uD83D\uDFE2 Running (${minutes}m ${seconds}s) - Watching ${daemonStatus.watchedFiles} files`);\n console.log(` \uD83D\uDCCA Last activity: ${new Date(daemonStatus.lastActivity).toLocaleString()}`);\n if (daemonStatus.crashCount > 0) {\n console.log(` \u26A0\uFE0F Crashes: ${daemonStatus.crashCount}`);\n }\n }\n else if (daemonStatus && daemonStatus.status === 'crashed') {\n console.log(` \uD83D\uDCA5 Crashed - ${daemonStatus.lastError || 'Unknown error'}`);\n console.log(' \uD83D\uDCA1 Run `mod sync restart` to restart daemon');\n }\n else {\n console.log(' \uD83D\uDD34 Not running');\n console.log(' \uD83D\uDCA1 Run `mod sync start` to enable real-time file tracking');\n }\n console.log('\\n\uD83D\uDCA1 File synchronization:');\n if (daemonStatus && daemonStatus.status === 'running') {\n console.log(' - Changes are being automatically synced to this branch in real-time');\n console.log(' - Use `mod sync status` for detailed daemon information');\n }\n else {\n console.log(' - Run `mod sync start` to enable background sync daemon');\n console.log(' - Changes will be automatically synced to this branch');\n }\n console.log(' - Use `mod branch auto-track status` for legacy tracking details');\n }\n catch (error) {\n console.error('Failed to get branch status:', error);\n process.exit(1);\n }\n}\nasync function handleCoverageAnalysis(workspaceHandle, args) {\n try {\n const activeBranch = await workspaceHandle.branch.getActive();\n if (!activeBranch) {\n console.error('No active branch found');\n process.exit(1);\n }\n // Get files modified in current branch\n const changes = await getFileChangesSummary(workspaceHandle, activeBranch);\n const modifiedFiles = [...changes.newFiles, ...changes.modifiedFiles];\n if (modifiedFiles.length === 0) {\n console.log('No files modified in current branch - no coverage analysis needed');\n return;\n }\n console.log(`Analyzing ${modifiedFiles.length} modified files for @spec traceability...`);\n const cacheDir = path.join(process.cwd(), '.mod', '.cache');\n const cachePath = path.join(cacheDir, 'coverage.json');\n // Ensure cache directory exists\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n }\n let totalSpecComments = 0;\n let filesWithSpecs = 0;\n const specReferences = [];\n const invalidRefs = [];\n const fileDetails = [];\n for (const fileObj of modifiedFiles) {\n try {\n const fileName = fileObj.name;\n const filePath = fileObj.path || fileName;\n // Skip non-code files\n if (!isCodeFile(fileName))\n continue;\n const content = await getFileContent(workspaceHandle, fileObj, filePath);\n if (!content) {\n fileDetails.push({\n path: filePath,\n specComments: 0,\n invalidRefs: 0,\n functions: 0,\n classes: 0,\n untraced: 0,\n hasCode: false\n });\n continue;\n }\n const analysis = analyzeFileForSpecComments(content, filePath);\n const codeStructure = analyzeCodeStructure(content);\n const fileInvalidRefs = analysis.invalidRefs.length;\n const fileSpecComments = analysis.specComments.length;\n if (fileSpecComments > 0) {\n filesWithSpecs++;\n totalSpecComments += fileSpecComments;\n specReferences.push(...analysis.specComments.map(spec => spec.requirementId));\n invalidRefs.push(...analysis.invalidRefs);\n }\n fileDetails.push({\n path: filePath,\n specComments: fileSpecComments,\n invalidRefs: fileInvalidRefs,\n functions: codeStructure.functions,\n classes: codeStructure.classes,\n untraced: Math.max(0, (codeStructure.functions + codeStructure.classes) - fileSpecComments),\n hasCode: analysis.hasCode\n });\n }\n catch (error) {\n console.warn(`Could not analyze file: ${fileObj.name}`);\n fileDetails.push({\n path: fileObj.name,\n specComments: 0,\n invalidRefs: 0,\n functions: 0,\n classes: 0,\n untraced: 0,\n hasCode: false\n });\n }\n }\n // Only count code files among the modified files\n const totalCodeFiles = fileDetails.filter(f => f.hasCode).length;\n const untracedFiles = fileDetails.filter(f => f.hasCode && f.specComments === 0);\n const coveragePercentage = totalCodeFiles > 0 ?\n Math.round((filesWithSpecs / totalCodeFiles) * 100) : 0;\n console.log(`\\nCoverage Analysis Results (Branch: ${activeBranch.name || activeBranch.branchId}):`);\n console.log(` Modified code files analyzed: ${totalCodeFiles}`);\n console.log(` Files with @spec comments: ${filesWithSpecs}`);\n console.log(` Total @spec comments found: ${totalSpecComments}`);\n console.log(` Coverage percentage: ${coveragePercentage}%`);\n console.log(`\\nPer-file traceability analysis:`);\n fileDetails\n .filter(f => f.hasCode)\n .sort((a, b) => b.specComments - a.specComments)\n .forEach(file => {\n const status = file.specComments > 0 ? '\u2713' : '\u2717';\n const tracedIndicator = file.untraced > 0 ? ` (${file.untraced} untraced)` : '';\n const invalidIndicator = file.invalidRefs > 0 ? ` \u26A0\uFE0F${file.invalidRefs}` : '';\n console.log(` ${status} ${file.path} - ${file.specComments} traces, ${file.functions}f/${file.classes}c${tracedIndicator}${invalidIndicator}`);\n });\n if (invalidRefs.length > 0) {\n console.log(`\\nInvalid @spec references found:`);\n invalidRefs.forEach(ref => console.log(` \u26A0\uFE0F ${ref}`));\n }\n if (untracedFiles.length > 0) {\n console.log(`\\nFiles lacking @spec traceability (${untracedFiles.length}):`);\n untracedFiles.forEach(file => {\n console.log(` - ${file.path} (${file.functions} functions, ${file.classes} classes)`);\n });\n }\n const analyzedFiles = {};\n fileDetails.forEach(file => {\n analyzedFiles[file.path] = {\n specReferences: [], // Would need detailed parsing for individual refs\n lastModified: new Date(),\n hash: '', // Would need content hash\n linesAdded: 0, // From file change summary\n linesRemoved: 0, // From file change summary \n isSourceFile: file.hasCode\n };\n });\n const cacheData = {\n specificationPath: readModConfig()?.lastSpecificationPath || '',\n lastAnalysis: new Date(),\n analyzedFiles,\n coverageResults: {\n totalRequirements: totalSpecComments,\n implementedRequirements: [...new Set(specReferences)],\n unimplementedRequirements: untracedFiles.map(f => f.path),\n coveragePercentage\n },\n unspecifiedFiles: untracedFiles.map(f => f.path)\n };\n fs.writeFileSync(cachePath, JSON.stringify(cacheData, null, 2));\n }\n catch (error) {\n console.error('Failed to analyze coverage:', error);\n process.exit(1);\n }\n}\nasync function scanWorkingDirectoryForCodeFiles() {\n const files = [];\n const cwd = process.cwd();\n try {\n const scanDir = (dir) => {\n const items = fs.readdirSync(dir);\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const relativePath = path.relative(cwd, fullPath);\n // Skip node_modules, .git, and other common excludes\n if (item.startsWith('.') || item === 'node_modules')\n continue;\n const stat = fs.statSync(fullPath);\n if (stat.isDirectory()) {\n scanDir(fullPath);\n }\n else if (isCodeFile(item)) {\n files.push({\n name: item,\n path: relativePath,\n fullPath\n });\n }\n }\n };\n scanDir(cwd);\n }\n catch (error) {\n console.warn('Error scanning working directory:', error);\n }\n return files;\n}\nfunction isCodeFile(fileName) {\n const fileFilter = new FileFilter();\n return fileFilter.isSourceFile(fileName);\n}\nasync function getFileContent(workspaceHandle, file, filePath) {\n try {\n // Try to get from workspace first\n if (file.id) {\n const docHandle = await workspaceHandle.file.get(file.id);\n if (docHandle?.head?.content) {\n return docHandle.head.content;\n }\n }\n // Fallback to filesystem\n if (file.fullPath && fs.existsSync(file.fullPath)) {\n return fs.readFileSync(file.fullPath, 'utf8');\n }\n // Try relative path from cwd\n const fullPath = path.resolve(process.cwd(), filePath);\n if (fs.existsSync(fullPath)) {\n return fs.readFileSync(fullPath, 'utf8');\n }\n // Try searching for the file in common locations\n const commonPaths = [\n path.resolve(process.cwd(), `packages/mod-cli/source/commands/${file.name}`),\n path.resolve(process.cwd(), `packages/mod-cli/source/${file.name}`),\n path.resolve(process.cwd(), `packages/mod-cli/${file.name}`),\n path.resolve(process.cwd(), `src/${file.name}`),\n path.resolve(process.cwd(), `source/${file.name}`)\n ];\n for (const tryPath of commonPaths) {\n if (fs.existsSync(tryPath)) {\n return fs.readFileSync(tryPath, 'utf8');\n }\n }\n return null;\n }\n catch (error) {\n return null;\n }\n}\nfunction analyzeFileForSpecComments(content, filePath) {\n const lines = content.split('\\n');\n const specComments = [];\n const invalidRefs = [];\n let hasCode = false;\n const specCommentRegex = /\\/\\/\\s*@spec\\s+([^\\s]+)\\s+(.+)/i;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n // Check if line has actual code (not just comments/whitespace)\n if (line && !line.startsWith('//') && !line.startsWith('/*') && !line.startsWith('*')) {\n hasCode = true;\n }\n const match = line.match(specCommentRegex);\n if (match) {\n const [, requirementId, description] = match;\n const isValid = validateSpecReference(requirementId);\n if (isValid) {\n specComments.push({\n requirementId,\n lineNumber: i + 1,\n description: description.trim(),\n valid: true\n });\n }\n else {\n invalidRefs.push(`${filePath}:${i + 1} - Invalid ref: ${requirementId}`);\n specComments.push({\n requirementId,\n lineNumber: i + 1,\n description: description.trim(),\n valid: false\n });\n }\n }\n }\n return {\n specComments,\n invalidRefs,\n hasCode\n };\n}\nfunction analyzeCodeStructure(content) {\n const lines = content.split('\\n');\n let functions = 0;\n let classes = 0;\n for (const line of lines) {\n const trimmedLine = line.trim();\n // Skip comments\n if (trimmedLine.startsWith('//') || trimmedLine.startsWith('/*') || trimmedLine.startsWith('*')) {\n continue;\n }\n // Count function declarations (various patterns)\n if (/^(export\\s+)?(async\\s+)?function\\s+\\w+/.test(trimmedLine) ||\n /^\\w+\\s*:\\s*(async\\s+)?\\([^)]*\\)\\s*=>/.test(trimmedLine) ||\n /^(async\\s+)?\\w+\\s*\\([^)]*\\)\\s*\\{/.test(trimmedLine) ||\n /^\\w+\\s*=\\s*(async\\s+)?\\([^)]*\\)\\s*=>/.test(trimmedLine)) {\n functions++;\n }\n // Count class declarations\n if (/^(export\\s+)?(abstract\\s+)?class\\s+\\w+/.test(trimmedLine)) {\n classes++;\n }\n // Count interface declarations (treat as classes for traceability purposes)\n if (/^(export\\s+)?interface\\s+\\w+/.test(trimmedLine)) {\n classes++;\n }\n }\n return { functions, classes };\n}\nfunction validateSpecReference(requirementId) {\n // Basic validation - should be in format: spec-name/REQ-CATEGORY-NUMBER or spec-name.spec.md/REQ-CATEGORY-NUMBER\n const specRefPattern = /^[a-zA-Z0-9\\-_]+(\\.spec\\.md)?\\/REQ-[A-Z]+-\\d+(\\.\\d+)*$/;\n return specRefPattern.test(requirementId);\n}\nasync function handleAutoTrack(workspaceHandle, args, repo) {\n const [action] = args;\n if (!action || !['start', 'stop', 'status'].includes(action)) {\n console.error('Usage: mod branch auto-track <start|stop|status>');\n console.error(' start - Enable automatic file tracking');\n console.error(' stop - Disable automatic file tracking');\n console.error(' status - Show tracking status');\n process.exit(1);\n }\n try {\n const cfg = readModConfig();\n if (!cfg?.workspaceId) {\n throw new Error('No workspace configured');\n }\n const tracker = new AutomaticFileTracker(repo);\n switch (action) {\n case 'start':\n console.log('\uD83D\uDE80 Starting automatic file tracking...');\n await tracker.enableAutoTracking({\n workspaceId: cfg.workspaceId,\n workspaceHandle: workspaceHandle,\n watchDirectory: process.cwd(),\n debounceMs: 500,\n verbose: true\n });\n console.log('\u2705 Automatic file tracking is now active!');\n console.log('\uD83D\uDCA1 Edit any file in this directory and it will be automatically tracked.');\n console.log('\uD83D\uDCA1 Run \"mod branch status\" to see changes.');\n console.log('\uD83D\uDCA1 Press Ctrl+C to stop tracking and exit.');\n // Keep the process running to maintain file watching\n process.on('SIGINT', async () => {\n console.log('\\n\uD83D\uDED1 Stopping automatic file tracking...');\n await tracker.disableAutoTracking();\n process.exit(0);\n });\n // Don't exit the process - keep watching\n await new Promise(() => { }); // Wait indefinitely\n break;\n case 'stop':\n await tracker.disableAutoTracking();\n console.log('\uD83D\uDED1 Automatic file tracking stopped');\n break;\n case 'status':\n const status = tracker.getTrackingStatus();\n console.log(`Tracking status: ${status.isTracking ? '\uD83D\uDFE2 Active' : '\uD83D\uDD34 Inactive'}`);\n console.log(`Tracked files: ${status.trackedFiles}`);\n break;\n }\n }\n catch (error) {\n console.error('Failed to manage auto-tracking:', error);\n process.exit(1);\n }\n}\nasync function openExistingWorkspace(modWorkspace, workspaceId) {\n // This function provides a proper way to open existing workspaces until openWorkspace is added to ModWorkspace\n // We temporarily access the internal method to create a handle, but this maintains the interface boundary\n const repo = modWorkspace.repo;\n const wsHandle = await repo.find(workspaceId);\n const workspace = await wsHandle.doc();\n if (!workspace || !workspace.branchesDocId) {\n throw new Error('Invalid workspace: missing branchesDocId');\n }\n const handle = modWorkspace.createWorkspaceHandle(workspaceId, workspace.title || 'Workspace', workspace.branchesDocId);\n const cfg = readModConfig();\n if (cfg?.activeBranchId) {\n try {\n await handle.branch.switchActive(cfg.activeBranchId);\n }\n catch (error) {\n console.warn(`Could not restore saved active branch ${cfg.activeBranchId}:`, error);\n }\n }\n return handle;\n}\nexport function generateBranchNameForSpec(specTitle, packageName) {\n const baseName = generateBranchName(specTitle);\n if (packageName) {\n const packageSlug = generateBranchName(packageName);\n return `feature-${packageSlug}-${baseName}`;\n }\n return `feature-${baseName}`;\n}\nexport async function createBranchForSpec(repo, specTitle) {\n const branchName = generateBranchNameForSpec(specTitle);\n // Use existing branch creation logic\n await branchCommand(['create', branchName, '--spec', `.mod/specs/${specTitle}.spec.md`], repo);\n return { branchName, branchId: branchName }; // Simplified return\n}\nexport function getActiveBranchSpec() {\n const cfg = readModConfig();\n return cfg?.lastSpecificationPath || null;\n}\nexport async function switchToSpecBranch(repo, specFileName) {\n const baseSpecName = specFileName.replace(/\\.spec\\.md$/, '');\n // Extract package name from path like \"mod-cli/branching-cli.spec.md\" \n let packageName;\n let specTitle = baseSpecName;\n if (baseSpecName.includes('/')) {\n const parts = baseSpecName.split('/');\n packageName = parts[0];\n specTitle = parts[1] || parts[0];\n }\n const expectedBranchName = generateBranchNameForSpec(specTitle, packageName);\n try {\n // Use existing branch switch logic\n await branchCommand(['switch', expectedBranchName], repo);\n return { success: true, branchName: expectedBranchName };\n }\n catch (error) {\n // Branch doesn't exist, create it\n try {\n await branchCommand(['create', expectedBranchName, '--spec', `.mod/specs/${specFileName}`], repo);\n return { success: true, branchName: expectedBranchName };\n }\n catch (createError) {\n console.error(`Failed to create/switch to branch for ${specFileName}:`, createError);\n return { success: false, branchName: expectedBranchName };\n }\n }\n}\nasync function handleTreeView(workspaceHandle, args) {\n try {\n const options = parseTreeCommandOptions(args);\n const activeBranch = await workspaceHandle.branch.getActive();\n if (!activeBranch) {\n console.error('No active branch. Run \\'mod branch list\\' to see available branches');\n process.exit(1);\n }\n const files = await workspaceHandle.file.list();\n const filteredFiles = filterSystemFiles(files);\n if (filteredFiles.length === 0) {\n console.log(`Branch '${activeBranch.name}': 0 files`);\n console.log('(empty branch)');\n return;\n }\n const changesSummary = await getFileChangesSummary(workspaceHandle, activeBranch);\n let displayFiles = filteredFiles;\n if (options.changesOnly) {\n const changedFilePaths = new Set([\n ...changesSummary.newFiles.map(f => f.path),\n ...changesSummary.modifiedFiles.map(f => f.path),\n ...changesSummary.deletedFiles.map(f => f.path)\n ]);\n displayFiles = filteredFiles.filter(file => changedFilePaths.has(file.path || file.name));\n if (displayFiles.length === 0) {\n console.log(`Branch '${activeBranch.name}': no changes to display`);\n return;\n }\n }\n const rootNode = await buildTreeStructure(displayFiles, workspaceHandle, changesSummary, options);\n const context = await createDisplayContext(activeBranch, workspaceHandle, rootNode, changesSummary);\n displayTreeHeader(context, options);\n displayTreeNodes(rootNode.children, '', options, context);\n }\n catch (error) {\n if (error.message?.includes('Branch not found')) {\n console.error('Branch not found. Run \\'mod branch list\\' to see available branches');\n }\n else if (error.message?.includes('timeout')) {\n console.error('Tree generation timed out. Try using --depth or --filter to limit scope');\n }\n else {\n console.error('Failed to generate tree view:', error.message);\n }\n process.exit(1);\n }\n}\nfunction parseTreeCommandOptions(args) {\n const options = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case '--depth':\n if (i + 1 < args.length) {\n const depthValue = parseInt(args[i + 1]);\n if (!isNaN(depthValue) && depthValue > 0) {\n options.depth = depthValue;\n i++; // Skip next argument\n }\n else {\n console.error('Invalid depth value. Must be a positive number.');\n process.exit(1);\n }\n }\n break;\n case '--dirs-only':\n options.dirsOnly = true;\n break;\n case '--filter':\n if (i + 1 < args.length) {\n options.filter = args[i + 1];\n i++; // Skip next argument\n }\n break;\n case '--size':\n options.showSize = true;\n break;\n case '--changes-only':\n options.changesOnly = true;\n break;\n case '--stat':\n options.showStats = true;\n break;\n case '--no-color':\n options.noColor = true;\n break;\n case '--help':\n displayTreeHelp();\n process.exit(0);\n break;\n default:\n if (arg.startsWith('--')) {\n console.error(`Unknown option: ${arg}`);\n console.error('Use --help for usage information');\n process.exit(1);\n }\n }\n }\n if (options.dirsOnly && options.showStats) {\n console.error('Cannot use --dirs-only with --stat (directories have no line counts)');\n process.exit(1);\n }\n if (options.filter) {\n try {\n // Simple validation - ensure no invalid regex characters\n new RegExp(options.filter.replace(/\\*/g, '.*').replace(/\\?/g, '.'));\n }\n catch {\n console.error(`Invalid filter pattern: ${options.filter}`);\n console.error('Use standard glob patterns like \"*.ts\" or \"src/**\"');\n process.exit(1);\n }\n }\n return options;\n}\nfunction displayTreeHelp() {\n console.log('Usage: mod branch tree [options]');\n console.log('');\n console.log('Display directory tree of current branch');\n console.log('');\n console.log('Options:');\n console.log(' --depth <N> Limit tree depth to N levels');\n console.log(' --dirs-only Show only directory structure, no files');\n console.log(' --filter <pattern> Show only paths matching glob pattern');\n console.log(' --size Include file sizes in human-readable format');\n console.log(' --changes-only Show only files with changes in current branch');\n console.log(' --stat Include line change counts (+N/-M) for modified files');\n console.log(' --filesystem Show filesystem files instead of workspace files');\n console.log(' --no-color Disable color output');\n console.log(' --help Show this help message');\n console.log('');\n console.log('Examples:');\n console.log(' mod branch tree --depth 3');\n console.log(' mod branch tree --filter \"*.ts\"');\n console.log(' mod branch tree --changes-only --stat');\n console.log(' mod branch tree --filesystem # Show all files in current directory');\n}\nfunction filterSystemFiles(files) {\n return files.filter(file => {\n const fileName = file.name || '';\n // Skip automerge internal files\n if (fileName.startsWith('automerge-') || fileName.includes('.automerge')) {\n return false;\n }\n // Skip system files \n if (fileName.startsWith('.') && fileName !== '.gitignore' && fileName !== '.modignore') {\n return false;\n }\n // For workspace files, use simpler extension-based filtering since we don't have filesystem context\n const ext = path.extname(fileName).toLowerCase();\n const allowedExtensions = ['.ts', '.tsx', '.js', '.jsx', '.vue', '.py', '.go', '.rs', '.java', '.cpp', '.c', '.h', '.hpp', '.md', '.yaml', '.yml', '.json', '.txt'];\n return allowedExtensions.includes(ext) || fileName === '.gitignore' || fileName === '.modignore';\n });\n}\nasync function buildTreeStructure(files, workspaceHandle, changesSummary, options) {\n // Create root node\n const root = {\n name: '',\n path: '',\n type: 'directory',\n children: [],\n metadata: {}\n };\n let filteredFiles = files;\n if (options.filter) {\n const pattern = options.filter.replace(/\\*/g, '.*').replace(/\\?/g, '.');\n const regex = new RegExp(pattern, 'i');\n filteredFiles = files.filter(file => regex.test(file.path || file.name));\n }\n // Create change status lookup for efficient access\n const changeStatusMap = new Map();\n [...changesSummary.newFiles, ...changesSummary.modifiedFiles, ...changesSummary.deletedFiles].forEach(change => {\n changeStatusMap.set(change.path, {\n status: change.status,\n stats: { additions: change.linesAdded, deletions: change.linesRemoved }\n });\n });\n // Get folder information to reconstruct paths for hierarchical files\n const folderMap = new Map();\n try {\n const folders = await workspaceHandle.folder.list();\n folders.forEach((folder) => {\n if (folder.folderId) {\n // Map logical folder ID to folder data\n folderMap.set(folder.folderId, folder);\n }\n });\n }\n catch (error) {\n // Silently continue if folder list fails - fallback will handle path reconstruction\n }\n for (const file of filteredFiles) {\n // For hierarchical files, reconstruct path from folder information\n let filePath = file.path || file.name;\n if (file.folderId && !file.path) {\n // Look up folder info to reconstruct path\n const folder = folderMap.get(file.folderId);\n if (folder && folder.folderPath) {\n filePath = folder.folderPath + '/' + file.name;\n }\n else {\n // Fallback: parse folder ID to extract path\n const folderIdMatch = file.folderId.match(/folder-(.+)-\\d+$/);\n if (folderIdMatch) {\n const folderPath = folderIdMatch[1].replace(/-/g, '/');\n filePath = folderPath + '/' + file.name;\n }\n }\n }\n const pathParts = filePath.split('/').filter(part => part.length > 0);\n let currentNode = root;\n // Create directory structure\n for (let i = 0; i < pathParts.length - 1; i++) {\n const dirName = pathParts[i];\n const dirPath = pathParts.slice(0, i + 1).join('/');\n let dirNode = currentNode.children.find(child => child.name === dirName && child.type === 'directory');\n if (!dirNode) {\n dirNode = {\n name: dirName,\n path: dirPath,\n type: 'directory',\n children: [],\n metadata: {}\n };\n currentNode.children.push(dirNode);\n }\n currentNode = dirNode;\n }\n if (!options.dirsOnly) {\n // Add file node\n const fileName = pathParts[pathParts.length - 1];\n const changeInfo = changeStatusMap.get(filePath);\n const fileNode = {\n name: fileName,\n path: filePath,\n type: 'file',\n children: [],\n metadata: {\n fileId: file.id,\n changeStatus: changeInfo?.status,\n changeStats: changeInfo?.stats,\n mimeType: getMimeType(fileName)\n }\n };\n if (options.showSize) {\n fileNode.metadata.size = await getFileSize(workspaceHandle, file);\n }\n currentNode.children.push(fileNode);\n }\n }\n sortTreeNodes(root);\n return root;\n}\nfunction sortTreeNodes(node) {\n node.children.sort((a, b) => {\n // Files before directories at root level\n if (a.type !== b.type) {\n if (node.path === '') { // Root level\n return a.type === 'file' ? -1 : 1;\n }\n else { // Nested levels - directories first\n return a.type === 'directory' ? -1 : 1;\n }\n }\n // Alphabetical within same type\n return a.name.localeCompare(b.name);\n });\n // Recursively sort children\n node.children.forEach(child => {\n if (child.type === 'directory') {\n sortTreeNodes(child);\n }\n });\n}\nasync function createDisplayContext(branch, workspaceHandle, rootNode, changesSummary) {\n // Count files and directories recursively\n const counts = countFilesAndDirectories(rootNode);\n return {\n branchName: branch.name,\n branchId: branch.id,\n totalFiles: counts.files,\n totalDirectories: counts.directories,\n changeSummary: {\n modified: changesSummary.modifiedFiles.length,\n added: changesSummary.newFiles.length,\n deleted: changesSummary.deletedFiles.length\n },\n workspaceName: 'Workspace', // Could be enhanced to get actual workspace name\n specificationPath: detectBranchType(branch.name, false, false) === 'specification' ?\n `${branch.name}.spec.md` : undefined\n };\n}\n// Helper function to count files and directories\nfunction countFilesAndDirectories(node) {\n let files = 0;\n let directories = 0;\n for (const child of node.children) {\n if (child.type === 'file') {\n files++;\n }\n else if (child.type === 'directory') {\n directories++;\n const childCounts = countFilesAndDirectories(child);\n files += childCounts.files;\n directories += childCounts.directories;\n }\n }\n return { files, directories };\n}\nfunction displayTreeHeader(context, options) {\n console.log(`Branch '${context.branchName}': ${context.totalFiles} files`);\n if (context.specificationPath) {\n console.log(`Specification: ${context.specificationPath}`);\n }\n if (context.changeSummary.added > 0 || context.changeSummary.modified > 0 || context.changeSummary.deleted > 0) {\n const changes = [];\n if (context.changeSummary.added > 0)\n changes.push(`${context.changeSummary.added} added`);\n if (context.changeSummary.modified > 0)\n changes.push(`${context.changeSummary.modified} modified`);\n if (context.changeSummary.deleted > 0)\n changes.push(`${context.changeSummary.deleted} deleted`);\n console.log(`Changes: ${changes.join(', ')}`);\n }\n console.log('');\n}\nfunction displayTreeNodes(nodes, prefix, options, context, currentDepth = 0) {\n if (options.depth && currentDepth >= options.depth) {\n return;\n }\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const isLast = i === nodes.length - 1;\n const connector = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n const newPrefix = prefix + (isLast ? ' ' : '\u2502 ');\n displaySingleNode(node, prefix + connector, options, context);\n if (node.type === 'directory') {\n if (node.children.length === 0) {\n console.log(prefix + (isLast ? ' ' : '\u2502 ') + '[empty]');\n }\n else {\n displayTreeNodes(node.children, newPrefix, options, context, currentDepth + 1);\n }\n }\n }\n}\nfunction displaySingleNode(node, prefix, options, context) {\n let output = prefix;\n if (node.metadata.changeStatus) {\n const colorCode = !options.noColor ? getStatusColor(node.metadata.changeStatus) : '';\n const resetCode = !options.noColor ? '\\x1b[0m' : '';\n output += `${colorCode}${node.metadata.changeStatus}${resetCode} `;\n }\n const nameColor = !options.noColor ? getFileTypeColor(node.metadata.mimeType) : '';\n const resetColor = !options.noColor ? '\\x1b[0m' : '';\n const displayName = node.type === 'directory' ? `${node.name}/` : node.name;\n output += `${nameColor}${displayName}${resetColor}`;\n if (options.showSize && node.metadata.size && node.type === 'file') {\n output += ` (${formatFileSize(node.metadata.size)})`;\n }\n if (options.showStats && node.metadata.changeStats && node.type === 'file') {\n const stats = node.metadata.changeStats;\n output += ` (+${stats.additions}/-${stats.deletions})`;\n }\n console.log(output);\n}\nfunction getStatusColor(status) {\n switch (status) {\n case 'A': return '\\x1b[32m'; // Green for added\n case 'M': return '\\x1b[33m'; // Yellow for modified\n case 'D': return '\\x1b[31m'; // Red for deleted\n default: return '';\n }\n}\nfunction getFileTypeColor(mimeType) {\n if (!mimeType)\n return '';\n if (mimeType.includes('code') || mimeType.includes('typescript') || mimeType.includes('javascript')) {\n return '\\x1b[34m'; // Blue for code\n }\n else if (mimeType.includes('text') || mimeType.includes('markdown')) {\n return '\\x1b[32m'; // Green for docs\n }\n else if (mimeType.includes('json') || mimeType.includes('yaml') || mimeType.includes('config')) {\n return '\\x1b[33m'; // Yellow for config\n }\n return '';\n}\nfunction formatFileSize(bytes) {\n if (bytes < 1024)\n return `${bytes}B`;\n if (bytes < 1024 * 1024)\n return `${Math.round(bytes / 1024)}KB`;\n return `${Math.round(bytes / (1024 * 1024))}MB`;\n}\n// Simple MIME type detection for file type coloring\nfunction getMimeType(fileName) {\n const ext = path.extname(fileName).toLowerCase();\n switch (ext) {\n case '.ts':\n case '.tsx': return 'code/typescript';\n case '.js':\n case '.jsx': return 'code/javascript';\n case '.py': return 'code/python';\n case '.go': return 'code/go';\n case '.rs': return 'code/rust';\n case '.java': return 'code/java';\n case '.md': return 'text/markdown';\n case '.json': return 'config/json';\n case '.yaml':\n case '.yml': return 'config/yaml';\n case '.txt': return 'text/plain';\n default: return 'application/octet-stream';\n }\n}\n// Get file size from workspace handle or filesystem\nasync function getFileSize(workspaceHandle, file) {\n try {\n if (file.id) {\n const docHandle = await workspaceHandle.file.get(file.id);\n if (docHandle?.head?.content) {\n return Buffer.byteLength(docHandle.head.content, 'utf8');\n }\n }\n // Fallback to filesystem if available\n const filePath = file.fullPath || file.path;\n if (filePath && fs.existsSync(filePath)) {\n const stats = fs.statSync(filePath);\n return stats.size;\n }\n }\n catch (error) {\n // Ignore errors, return 0\n }\n return 0;\n}\n", "import { WorkspaceService } from \"./services/workspace-service.js\";\nimport { BranchService } from \"./services/branch-service.js\";\nimport { ThreadService } from \"./services/thread-service.js\";\nimport { WorkingDirectoryService } from \"./services/working-directory-service.js\";\nimport { CommentService } from \"./services/comment-service.js\";\nimport { detectMimeType, mimeTypeToCanvasType } from \"./types/mod-file-types.js\";\nimport { BranchableRepo } from \"./services/branchable-repo.js\";\n// Helper for DocumentId casting\nfunction asDocumentId(id) {\n return id;\n}\nexport class ModWorkspace {\n constructor(repo, options = {}) {\n this.eventHandlers = new Map();\n this.repo = repo;\n this.workspaceService = new WorkspaceService(repo);\n this.branchService = new BranchService(repo);\n this.threadService = new ThreadService(repo);\n this.workingDirectoryService = new WorkingDirectoryService(repo, this.branchService);\n this.commentService = new CommentService(repo);\n this.branchableRepo = new BranchableRepo(repo);\n this.gitIntegrationService = this.initializeGitIntegration(options.config?.workspaceRoot);\n this.capabilities = options.capabilities || this.detectCapabilities();\n this.config = options.config || {};\n this.setupEventHandlers();\n }\n initializeGitIntegration(workspaceRoot) {\n // Check if we're in a Node.js environment\n if (typeof process !== 'undefined' && process.versions?.node) {\n try {\n // Dynamic import of Node.js-only service - use async import for ES modules\n // For now, disable git integration to avoid require() issues\n return null;\n }\n catch (error) {\n return null;\n }\n }\n return null;\n }\n async listWorkspaces() {\n try {\n const allWorkspaces = await this.workspaceService.getAllWorkspaces();\n // IMPORTANT: Avoid eagerly calling repo.find()/whenReady() for every workspace doc.\n // In browser environments, stale workspace references can cause long \"waiting for ready\" timeouts.\n // We return lightweight handles immediately; callers should call openWorkspace() for a fully-resolved handle.\n return (allWorkspaces || []).map((workspaceRef) => {\n const workspaceId = workspaceRef.id;\n const workspaceName = workspaceRef.title || `Workspace ${String(workspaceId).slice(0, 8)}`;\n // Default to workspaceId as branchesDocId until openWorkspace() is called.\n return this.createWorkspaceHandle(workspaceId, workspaceName, workspaceId);\n });\n }\n catch (error) {\n console.warn('Failed to list workspaces:', error);\n return [];\n }\n }\n async initAppRoot() {\n return await this.workspaceService.initAppRoot();\n }\n async openWorkspace(workspaceId) {\n const workspaceDoc = await this.workspaceService.getWorkspace(workspaceId);\n if (!workspaceDoc) {\n throw new Error(`Workspace ${workspaceId} not found`);\n }\n const workspaceName = workspaceDoc.title || `Workspace ${String(workspaceId).slice(0, 8)}`;\n const branchesDocId = (workspaceDoc.branchesDocId || workspaceId);\n return this.createWorkspaceHandle(workspaceId, workspaceName, branchesDocId);\n }\n async createWorkspace(config) {\n try {\n const skipBranching = config.skipBranching ?? false;\n console.log('[ModWorkspace] Creating workspace document...', { skipBranching });\n const workspaceDoc = await this.workspaceService.createWorkspace({\n title: config.name || 'Untitled Workspace',\n metadata: {\n type: 'workspace',\n name: config.name || 'Untitled Workspace',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n }\n }, { skipBranching });\n console.log('[ModWorkspace] Workspace document created:', workspaceDoc.id);\n // Only set up branching if not skipped (workspaceService already handles this,\n // but we need to get the branchesDocId if it was set up)\n const branchesDocId = workspaceDoc.branchesDocId || workspaceDoc.id;\n console.log('[ModWorkspace] Creating workspace handle...');\n return this.createWorkspaceHandle(workspaceDoc.id, workspaceDoc.title, branchesDocId);\n }\n catch (error) {\n console.error('[ModWorkspace] Failed to create workspace:', error);\n throw new Error(`Failed to create workspace: ${error.message}`);\n }\n }\n async importGitBranch(workspaceId, branchesDocId, options) {\n const startTime = new Date();\n const errors = [];\n const importedFiles = [];\n const skippedFiles = [];\n try {\n const gitBranches = await this.detectGitBranches();\n const targetBranch = gitBranches.find(b => b.name === options.branchName);\n if (!targetBranch) {\n throw new Error(`Git branch '${options.branchName}' not found`);\n }\n const gitFiles = await this.extractGitFiles(options.branchName, {\n includePatterns: options.includePatterns,\n excludePatterns: options.excludePatterns,\n maxFiles: options.maxFiles || 10000\n });\n const totalFiles = gitFiles.length;\n let filesProcessed = 0;\n const mainBranch = await this.branchService.createBranch(null, // No parent for main branch\n `git-import-${options.branchName}`, workspaceId, 'main', 'git-import', branchesDocId, {} // Initial empty fileHeads\n );\n for (const gitFile of gitFiles) {\n try {\n const fileDoc = await this.repo.create(gitFile.content);\n await this.workspaceService.addFileRef(workspaceId, {\n id: fileDoc.documentId,\n name: this.getFileName(gitFile.filePath),\n type: this.getFileType(gitFile.filePath),\n folderId: await this.ensureFolderPath(workspaceId, gitFile.filePath)\n });\n await this.branchService.updateFileHead(mainBranch.id, fileDoc.documentId, fileDoc.heads()[0], branchesDocId);\n importedFiles.push(fileDoc.documentId);\n filesProcessed++;\n this.emitEvent('import-progress', {\n phase: 'creating',\n filesProcessed,\n totalFiles,\n currentFile: gitFile.filePath\n });\n }\n catch (error) {\n skippedFiles.push(gitFile.filePath);\n errors.push({\n filePath: gitFile.filePath,\n error: error.message,\n code: 'UNKNOWN',\n recoverable: true\n });\n }\n }\n if (importedFiles.length > 1000) {\n await this.buildSearchIndex(workspaceId, importedFiles);\n }\n return {\n success: errors.length === 0,\n importedFiles,\n skippedFiles,\n errors,\n workspaceBranchId: mainBranch.id,\n totalImportTime: Date.now() - startTime.getTime(),\n statistics: {\n totalFilesScanned: gitFiles.length,\n filesImported: importedFiles.length,\n filesSkipped: skippedFiles.length,\n foldersCreated: await this.getFolderCount(workspaceId),\n totalSizeImported: gitFiles.reduce((sum, f) => sum + f.size, 0),\n averageFileSize: gitFiles.reduce((sum, f) => sum + f.size, 0) / gitFiles.length,\n largestFile: gitFiles.reduce((largest, f) => f.size > largest.size ? f : largest, gitFiles[0])?.filePath || ''\n }\n };\n }\n catch (error) {\n return {\n success: false,\n importedFiles,\n skippedFiles,\n errors: [{ filePath: '', error: error.message, code: 'GIT_ERROR', recoverable: false }],\n workspaceBranchId: '',\n totalImportTime: Date.now() - startTime.getTime(),\n statistics: {\n totalFilesScanned: 0,\n filesImported: 0,\n filesSkipped: 0,\n foldersCreated: 0,\n totalSizeImported: 0,\n averageFileSize: 0,\n largestFile: ''\n }\n };\n }\n }\n createWorkspaceHandle(workspaceId, name, branchesDocId) {\n let runtimeActiveBranchId = null;\n const getRuntimeActiveBranch = async () => {\n // If no branchesDocId is set, the workspace doesn't use branching\n if (!branchesDocId || branchesDocId === workspaceId) {\n return null;\n }\n // Add a timeout to prevent hangs in deployed environments\n const BRANCH_LOOKUP_TIMEOUT_MS = 3000;\n const withTimeout = (promise, fallback) => {\n return Promise.race([\n promise,\n new Promise((resolve) => setTimeout(() => resolve(fallback), BRANCH_LOOKUP_TIMEOUT_MS))\n ]);\n };\n try {\n if (runtimeActiveBranchId) {\n const existing = await withTimeout(this.branchService.getBranch(runtimeActiveBranchId, branchesDocId), null);\n if (existing) {\n return existing;\n }\n runtimeActiveBranchId = null;\n }\n const fallback = await withTimeout(this.branchService.getActiveBranch(workspaceId, branchesDocId), null);\n runtimeActiveBranchId = fallback?.id ?? null;\n return fallback;\n }\n catch (error) {\n console.warn('[ModWorkspace] getRuntimeActiveBranch failed:', error);\n return null;\n }\n };\n return {\n id: workspaceId,\n name,\n branchesDocId,\n branch: {\n create: async (options) => {\n const now = new Date().toISOString();\n let specDocId;\n let specificationMetadata;\n if (options.spec) {\n specDocId = asDocumentId(`spec:${options.spec.file}`);\n specificationMetadata = {\n specDocId,\n specFilePath: options.spec.file,\n title: options.spec.title ?? options.name,\n branchName: options.name,\n createdAt: now,\n updatedAt: now,\n workspaceId,\n lifecycleStatus: 'active',\n activeTrackingEnabled: true\n };\n if (options.spec.description) {\n specificationMetadata.abstract = options.spec.description;\n specificationMetadata.branchDescription = options.spec.description;\n }\n }\n const extras = {\n description: options.spec?.description,\n specDocId,\n specificationMetadata\n };\n return await this.branchService.createBranch(options.fromBranch || null, options.name, workspaceId, options.spec ? 'proposal' : 'thread', 'workspace-user', branchesDocId, undefined, extras);\n },\n list: async () => {\n return await this.branchService.getBranchesForWorkspace(branchesDocId);\n },\n getActive: async () => {\n return getRuntimeActiveBranch();\n },\n switchActive: async (branchId) => {\n const currentBranch = await getRuntimeActiveBranch();\n if (currentBranch) {\n await this.workingDirectoryService.captureWorkingDirectorySnapshot(currentBranch.id, branchesDocId, `Auto-capture before switching to ${branchId}`);\n }\n await this.branchService.setActiveSpecBranch(branchId, workspaceId, branchesDocId);\n runtimeActiveBranchId = branchId;\n try {\n await this.workingDirectoryService.restoreWorkingDirectorySnapshot(branchId, branchesDocId);\n }\n catch (error) {\n if (error instanceof Error && /No working directory snapshots found/i.test(error.message)) {\n // No snapshot found - this is normal for new branches, continue silently\n }\n else {\n throw error;\n }\n }\n },\n calculateDiff: async (sourceBranchId, targetBranchId) => {\n let actualTargetBranchId = targetBranchId;\n if (!actualTargetBranchId) {\n const sourceBranch = await this.branchService.getBranch(sourceBranchId, branchesDocId);\n if (!sourceBranch) {\n throw new Error(`Source branch ${sourceBranchId} not found`);\n }\n if (!sourceBranch.parentBranchId) {\n throw new Error(`Branch ${sourceBranchId} has no parent branch for comparison`);\n }\n actualTargetBranchId = sourceBranch.parentBranchId;\n }\n try {\n // Get branch file heads for the source branch\n const sourceBranch = await this.branchService.getBranch(sourceBranchId, branchesDocId);\n const branchFileHeads = sourceBranch?.fileHeads || {};\n const diffData = await this.branchService.calculateWorkspaceDiff(workspaceId, sourceBranchId, actualTargetBranchId, branchFileHeads);\n if (diffData.diffFileIds.length === 0 &&\n Object.keys(diffData.sourceBranchFileHeads).length === 0 &&\n Object.keys(diffData.targetBranchFileHeads).length === 0) {\n return {\n diffFileIds: [],\n diffFileChanges: {},\n sourceBranchName: diffData.sourceBranchName,\n targetBranchName: diffData.targetBranchName,\n sourceBranchFileHeads: {},\n targetBranchFileHeads: {}\n };\n }\n return diffData;\n }\n catch (error) {\n throw new Error(`Failed to calculate branch diff: ${error.message}`);\n }\n },\n getChangedFiles: async (branchId) => {\n const targetBranchId = branchId || (await getRuntimeActiveBranch())?.id;\n if (!targetBranchId) {\n throw new Error('No branch specified and no active branch found');\n }\n // Delegate to calculateDiff with the target branch as source and its parent as target\n const targetBranch = await this.branchService.getBranch(targetBranchId, branchesDocId);\n if (!targetBranch) {\n throw new Error(`Branch ${targetBranchId} not found`);\n }\n // Use parent branch as target for comparison\n const parentBranchId = targetBranch.parentBranchId;\n if (!parentBranchId) {\n // No parent, return empty diff\n return {\n diffFileIds: [],\n diffFileChanges: {},\n sourceBranchName: targetBranch.name,\n targetBranchName: '',\n sourceBranchFileHeads: {},\n targetBranchFileHeads: {}\n };\n }\n // Get branch file heads\n const branchFileHeads = targetBranch.fileHeads || {};\n return await this.branchService.calculateWorkspaceDiff(workspaceId, targetBranchId, parentBranchId, branchFileHeads);\n },\n getFileContentAtBranch: async (fileId, branchId) => {\n try {\n const docHandle = await this.repo.find(fileId);\n if (!docHandle) {\n return {\n content: '',\n head: '',\n exists: false\n };\n }\n const fileHead = await this.branchService.getFileHead(branchId, fileId, branchesDocId);\n if (!fileHead) {\n return {\n content: '',\n head: '',\n exists: false\n };\n }\n // Get document content at specific head\n const doc = await docHandle.doc();\n const content = doc?.content || JSON.stringify(doc) || '';\n return {\n content: typeof content === 'string' ? content : JSON.stringify(content),\n head: fileHead,\n exists: true\n };\n }\n catch (error) {\n return {\n content: '',\n head: '',\n exists: false\n };\n }\n },\n captureWorkingState: async () => {\n const activeBranch = await getRuntimeActiveBranch();\n if (!activeBranch) {\n throw new Error('No active branch to capture working state');\n }\n return await this.workingDirectoryService.captureWorkingDirectorySnapshot(activeBranch.id, branchesDocId, `Manual capture at ${new Date().toISOString()}`);\n },\n restoreWorkingState: async (snapshotId) => {\n const activeBranch = await getRuntimeActiveBranch();\n if (!activeBranch) {\n throw new Error('No active branch to restore working state');\n }\n await this.workingDirectoryService.restoreWorkingDirectorySnapshot(activeBranch.id, branchesDocId, snapshotId);\n },\n },\n file: {\n create: async (content, options) => {\n if (!options?.name) {\n throw new Error('File name is required');\n }\n const mimeType = options.mimeType || detectMimeType(options.name);\n const canvasType = mimeTypeToCanvasType(mimeType);\n // Use two-step pattern: create empty doc, then assign content via change()\n // This ensures text fields work correctly with automerge-prosemirror\n const doc = this.repo.create();\n await doc.change((d) => Object.assign(d, content));\n const fileMetadata = {\n type: 'file',\n name: options.name,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n createdBy: 'workspace-user',\n encoding: 'utf-8',\n language: canvasType === 'code' ? this.getLanguageFromMimeType(mimeType) : undefined,\n tags: options.metadata?.tags || [],\n typeData: options.metadata?.typeData || {}\n };\n // Add file to workspace\n await this.workspaceService.addFileRef(workspaceId, {\n id: doc.documentId,\n name: options.name,\n type: canvasType,\n folderId: options.folderId || null\n });\n if (options.folderId) {\n const fileRef = {\n id: doc.documentId,\n name: options.name,\n type: canvasType,\n folderId: options.folderId,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n try {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n // Need to find the actual folder document ID from the workspace\n // The options.folderId is the logical ID, we need the document ID\n const workspace = await this.workspaceService.getWorkspace(workspaceId);\n const folderRef = workspace.folderRefs?.find((f) => f.id === options.folderId);\n const folderDocumentId = folderRef?.documentId;\n if (folderDocumentId) {\n await this.workspaceService.folderService.addFileToFolder(folderDocumentId, fileRef, branchId, workspaceId);\n console.log(`[DEBUG FILE.CREATE] Added file ${options.name} to folder ${options.folderId} (${folderDocumentId})`);\n }\n else {\n console.warn(`[DEBUG FILE.CREATE] Could not find folder document ID for ${options.folderId}`);\n }\n }\n catch (error) {\n console.warn(`[DEBUG FILE.CREATE] Failed to add file to folder:`, error);\n }\n }\n const activeBranch = await getRuntimeActiveBranch();\n const targetBranchId = options.branchId || activeBranch?.id;\n console.log(`[DEBUG FILE.CREATE] Active branch: ${activeBranch?.name} (${activeBranch?.id})`);\n console.log(`[DEBUG FILE.CREATE] Target branch: ${targetBranchId}`);\n console.log(`[DEBUG FILE.CREATE] Document: ${options?.name} (${doc.documentId})`);\n if (targetBranchId) {\n try {\n await this.branchService.updateFileHead(targetBranchId, doc.documentId, doc.heads()[0], branchesDocId);\n console.log(`[DEBUG FILE.CREATE] File head updated successfully for ${options?.name}`);\n }\n catch (error) {\n console.error(`[DEBUG FILE.CREATE] Failed to update file head for ${options?.name}:`, error);\n throw error;\n }\n }\n else {\n console.warn(`[DEBUG FILE.CREATE] No target branch ID - file head not updated for ${options?.name}`);\n }\n return await this.createDocumentHandle(doc.documentId, targetBranchId);\n },\n update: async (documentId, content) => {\n const activeBranch = await getRuntimeActiveBranch();\n if (!activeBranch) {\n throw new Error('No active branch found');\n }\n const docHandle = await this.repo.find(documentId);\n if (!docHandle) {\n throw new Error(`Document ${documentId} not found`);\n }\n // Update document content with branch context\n docHandle.change((doc) => {\n if (typeof content === 'string') {\n doc.content = content;\n }\n else {\n Object.assign(doc, content);\n }\n });\n await this.branchService.updateFileHead(activeBranch.id, documentId, docHandle.heads()[0], branchesDocId);\n return await this.createDocumentHandle(documentId, activeBranch.id);\n },\n get: async (documentId) => {\n try {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id;\n // Check if file exists in current branch\n if (branchId) {\n const fileHead = await this.branchService.getFileHead(branchId, documentId, branchesDocId);\n if (fileHead) {\n return await this.createDocumentHandle(documentId, branchId);\n }\n // If not in current branch, try to find in parent branches\n let currentBranch = activeBranch;\n while (currentBranch?.parentBranchId) {\n const parentBranch = await this.branchService.getBranchesForWorkspace(branchesDocId)\n .then(branches => branches.find(b => b.id === currentBranch.parentBranchId));\n if (parentBranch) {\n const parentFileHead = await this.branchService.getFileHead(parentBranch.id, documentId, branchesDocId);\n if (parentFileHead) {\n return await this.createDocumentHandle(documentId, parentBranch.id);\n }\n currentBranch = parentBranch;\n }\n else {\n break;\n }\n }\n }\n // Try to find the document directly in repo if not found in branches\n const docHandle = await this.repo.find(documentId);\n if (docHandle && docHandle.doc()) {\n return await this.createDocumentHandle(documentId, branchId);\n }\n return null;\n }\n catch (error) {\n console.warn(`Error getting file ${documentId}:`, error);\n return null;\n }\n },\n // glassware[type=implementation, id=impl-file-gethandle, requirements=req-comment-int-0,req-comment-int-1]\n // Returns FileHandle with comments API for file-scoped operations\n getHandle: async (documentId, branchId) => {\n const activeBranch = branchId || (await getRuntimeActiveBranch())?.id || 'main';\n if (!activeBranch) {\n console.warn('[ModWorkspace] getHandle called without active branch');\n return null;\n }\n try {\n const branchable = new BranchableRepo(this.repo);\n const rawHandle = await branchable.openHandle(documentId, {\n branchId: activeBranch,\n branchesDocId,\n workspaceId,\n });\n if (!rawHandle)\n return null;\n // Create FileHandle by adding comments API to the raw handle\n const fileHandle = {\n ...rawHandle,\n documentId,\n url: `automerge:${documentId}`,\n on: (event, callback) => {\n rawHandle.handle?.on?.(event, callback);\n },\n off: (event, callback) => {\n rawHandle.handle?.off?.(event, callback);\n },\n comments: {\n list: async () => {\n const doc = rawHandle.doc();\n const threadIds = doc?.commentThreadIds || [];\n const threads = [];\n for (const threadId of threadIds) {\n try {\n const thread = await this.commentService.getThread(threadId);\n if (thread)\n threads.push(thread);\n }\n catch (e) {\n console.warn('[FileHandle] Failed to load thread:', threadId, e);\n }\n }\n return threads;\n },\n create: async (anchor, comment) => {\n const threadId = await this.commentService.createThread(anchor, comment);\n // Add thread ID to file's commentThreadIds\n rawHandle.change((doc) => {\n if (!doc.commentThreadIds)\n doc.commentThreadIds = [];\n doc.commentThreadIds.push(threadId);\n });\n return threadId;\n },\n reply: async (threadId, comment) => {\n await this.commentService.addComment(threadId, comment);\n },\n resolve: async (threadId) => {\n await this.commentService.resolveThread(threadId);\n },\n delete: async (threadId) => {\n // Remove from file's commentThreadIds\n rawHandle.change((doc) => {\n if (doc.commentThreadIds) {\n const idx = doc.commentThreadIds.indexOf(threadId);\n if (idx > -1)\n doc.commentThreadIds.splice(idx, 1);\n }\n });\n await this.commentService.deleteThread(threadId);\n }\n }\n };\n return fileHandle;\n }\n catch (error) {\n console.error('[ModWorkspace] getHandle failed:', error);\n return null;\n }\n },\n // Legacy: returns raw BranchScopedHandle without comments API\n getRawHandle: async (documentId, branchId) => {\n const activeBranch = branchId || (await getRuntimeActiveBranch())?.id || 'main';\n if (!activeBranch) {\n console.warn('[ModWorkspace] getRawHandle called without active branch');\n return null;\n }\n try {\n const branchable = new BranchableRepo(this.repo);\n return await branchable.openHandle(documentId, {\n branchId: activeBranch,\n branchesDocId,\n workspaceId,\n });\n }\n catch (error) {\n console.error('[ModWorkspace] getRawHandle failed:', error);\n return null;\n }\n },\n list: async (options) => {\n try {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n const fileHeads = activeBranch ? await this.branchService.getFileHeads(activeBranch.id, branchesDocId) : {};\n if (options?.folderId === null || options?.folderId === undefined) {\n const rootFiles = await this.workspaceService.getHierarchicalFileRefs(workspaceId, branchId, { folderId: null });\n return await this.convertFileRefsToEnhanced(rootFiles, fileHeads);\n }\n if (options?.folderId) {\n const folderFiles = await this.workspaceService.getHierarchicalFileRefs(workspaceId, branchId, { folderId: options.folderId });\n return await this.convertFileRefsToEnhanced(folderFiles, fileHeads);\n }\n // Legacy fallback: load all files from hierarchical structure (for backward compatibility)\n const allFiles = await this.workspaceService.getHierarchicalFileRefs(workspaceId, branchId);\n return await this.convertFileRefsToEnhanced(allFiles, fileHeads);\n }\n catch (error) {\n console.error('Error listing files:', error);\n return [];\n }\n },\n // glassware[type=implementation, id=impl-file-rename, requirements=req-fd-rename-4]\n rename: async (documentId, newName) => {\n console.log('[WorkspaceHandle] Renaming file:', documentId, 'to', newName);\n try {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n // Find the file to get its folderId\n const allFiles = await this.workspaceService.getHierarchicalFileRefs(workspaceId, branchId);\n const fileRef = allFiles.find(f => f.id === documentId || f.id === String(documentId));\n if (!fileRef) {\n throw new Error(`File not found: ${documentId}`);\n }\n const folderId = fileRef.folderId;\n let renamed = false;\n // Try to rename in folder document first (hierarchical structure)\n if (folderId) {\n try {\n await this.workspaceService.folderService.renameFileInFolder(folderId, String(documentId), newName, branchId, String(workspaceId));\n renamed = true;\n console.log('[WorkspaceHandle] File renamed in folder document');\n }\n catch (folderError) {\n console.log('[WorkspaceHandle] Could not rename in folder document, trying workspace fileRefs:', folderError);\n }\n }\n // Fallback: update workspace.fileRefs directly (flat/legacy structure)\n if (!renamed) {\n console.log('[WorkspaceHandle] Renaming file in workspace.fileRefs');\n const workspaceHandle = await this.branchableRepo.openHandle(workspaceId, {\n branchId,\n workspaceId\n });\n await workspaceHandle.change((doc) => {\n if (Array.isArray(doc.fileRefs)) {\n const fileIndex = doc.fileRefs.findIndex((ref) => ref.id === documentId || ref.id === String(documentId));\n if (fileIndex !== -1) {\n doc.fileRefs[fileIndex].name = newName;\n doc.fileRefs[fileIndex].updatedAt = new Date().toISOString();\n renamed = true;\n }\n }\n });\n }\n if (!renamed) {\n throw new Error(`Could not rename file: ${documentId}`);\n }\n console.log('[WorkspaceHandle] File renamed successfully');\n }\n catch (error) {\n console.error('[WorkspaceHandle] Failed to rename file:', error);\n throw error;\n }\n },\n // glassware[type=implementation, id=impl-file-delete, requirements=req-fd-delete-3]\n delete: async (documentId) => {\n console.log('[WorkspaceHandle] Deleting file:', documentId);\n try {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n // Find the file to get its folderId\n const allFiles = await this.workspaceService.getHierarchicalFileRefs(workspaceId, branchId);\n const fileRef = allFiles.find(f => f.id === documentId || f.id === String(documentId));\n if (!fileRef) {\n throw new Error(`File not found: ${documentId}`);\n }\n const folderId = fileRef.folderId;\n let deleted = false;\n // Try to delete from folder document first (hierarchical structure)\n if (folderId) {\n try {\n await this.workspaceService.folderService.removeFileFromFolder(folderId, String(documentId), branchId, String(workspaceId));\n deleted = true;\n console.log('[WorkspaceHandle] File deleted from folder document');\n }\n catch (folderError) {\n console.log('[WorkspaceHandle] Could not delete from folder document, trying workspace fileRefs:', folderError);\n }\n }\n // Fallback: remove from workspace.fileRefs directly (flat/legacy structure)\n if (!deleted) {\n console.log('[WorkspaceHandle] Deleting file from workspace.fileRefs');\n const workspaceHandle = await this.branchableRepo.openHandle(workspaceId, {\n branchId,\n workspaceId\n });\n await workspaceHandle.change((doc) => {\n if (Array.isArray(doc.fileRefs)) {\n const fileIndex = doc.fileRefs.findIndex((ref) => ref.id === documentId || ref.id === String(documentId));\n if (fileIndex !== -1) {\n doc.fileRefs.splice(fileIndex, 1);\n deleted = true;\n }\n }\n });\n }\n // Also remove from branch file heads\n if (activeBranch) {\n try {\n await this.branchService.removeFileHead(activeBranch.id, documentId, branchesDocId);\n }\n catch (e) {\n console.warn('[WorkspaceHandle] Failed to remove file head:', e);\n }\n }\n console.log('[WorkspaceHandle] File deleted successfully');\n }\n catch (error) {\n console.error('[WorkspaceHandle] Failed to delete file:', error);\n throw error;\n }\n },\n // glassware[type=implementation, id=impl-file-move, requirements=req-fd-move-3]\n move: async (documentId, targetFolderId) => {\n console.log('[WorkspaceHandle] Moving file:', documentId, 'to folder:', targetFolderId);\n try {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n // Find the file to get its current folderId\n const allFiles = await this.workspaceService.getHierarchicalFileRefs(workspaceId, branchId);\n const fileRef = allFiles.find(f => f.id === documentId || f.id === String(documentId));\n if (!fileRef) {\n throw new Error(`File not found: ${documentId}`);\n }\n const sourceFolderId = fileRef.folderId;\n // If moving to the same folder, do nothing\n if (sourceFolderId === targetFolderId) {\n console.log('[WorkspaceHandle] File already in target folder');\n return;\n }\n let moved = false;\n // Try hierarchical folder document operations first\n if (sourceFolderId) {\n try {\n const fileRefData = await this.workspaceService.folderService.getFileRefFromFolder(sourceFolderId, String(documentId), branchId, String(workspaceId));\n if (fileRefData) {\n // Remove from source folder\n await this.workspaceService.folderService.removeFileFromFolder(sourceFolderId, String(documentId), branchId, String(workspaceId));\n // Add to target folder (if not moving to root)\n if (targetFolderId) {\n const updatedFileRef = {\n ...fileRefData,\n folderId: targetFolderId,\n updatedAt: new Date().toISOString()\n };\n await this.workspaceService.folderService.addFileToFolder(targetFolderId, updatedFileRef, branchId, String(workspaceId));\n }\n moved = true;\n console.log('[WorkspaceHandle] File moved via folder documents');\n }\n }\n catch (folderError) {\n console.log('[WorkspaceHandle] Could not move via folder documents, trying workspace fileRefs:', folderError);\n }\n }\n // Fallback: update workspace.fileRefs directly (flat/legacy structure)\n if (!moved) {\n console.log('[WorkspaceHandle] Moving file in workspace.fileRefs');\n const workspaceHandle = await this.branchableRepo.openHandle(workspaceId, {\n branchId,\n workspaceId\n });\n await workspaceHandle.change((doc) => {\n if (Array.isArray(doc.fileRefs)) {\n const fileIndex = doc.fileRefs.findIndex((ref) => ref.id === documentId || ref.id === String(documentId));\n if (fileIndex !== -1) {\n doc.fileRefs[fileIndex].folderId = targetFolderId;\n doc.fileRefs[fileIndex].updatedAt = new Date().toISOString();\n moved = true;\n }\n }\n });\n }\n if (!moved) {\n throw new Error(`Could not move file: ${documentId}`);\n }\n console.log('[WorkspaceHandle] File moved successfully');\n }\n catch (error) {\n console.error('[WorkspaceHandle] Failed to move file:', error);\n throw error;\n }\n }\n },\n thread: {\n create: async (options) => {\n const threadId = await this.threadService.createThread(options?.title || 'New Thread', options?.branchId || '');\n return {\n id: threadId,\n name: options?.title || 'New Thread',\n itemIds: [],\n branchId: options?.branchId || '',\n created: Date.now(),\n updated: Date.now()\n };\n },\n list: async () => {\n try {\n const workspace = await this.workspaceService.getWorkspace(workspaceId);\n if (workspace?.threadIds && workspace.threadIds.length > 0) {\n const threads = await Promise.all(workspace.threadIds.map((id) => this.threadService.getThread(id)));\n return threads.filter((t) => t !== null);\n }\n return [];\n }\n catch (error) {\n console.warn(`Error listing threads for workspace ${workspaceId}:`, error);\n return [];\n }\n },\n get: async (threadId) => {\n try {\n const thread = await this.threadService.getThread(threadId);\n return thread;\n }\n catch (error) {\n console.warn(`Error getting thread ${threadId}:`, error);\n return null;\n }\n },\n update: async (threadId, updates) => {\n // ThreadService doesn't have updateThread, so this is a placeholder for future implementation\n console.warn('Thread update not implemented in ThreadService');\n throw new Error('Thread update not yet implemented');\n },\n delete: async (threadId) => {\n // ThreadService doesn't have deleteThread, so this is a placeholder for future implementation\n console.warn('Thread delete not implemented in ThreadService');\n throw new Error('Thread delete not yet implemented');\n }\n },\n // glassware[type=implementation, id=impl-comment-api, requirements=req-comment-int-1,req-comment-data-0]\n // Note: Primary comment API is now via FileHandle.comments.* (file-scoped)\n // This workspace-level API retained for backwards compatibility and cross-file operations\n comment: {\n createThread: async (anchor, initialComment) => {\n // Create the comment thread document\n const threadId = await this.commentService.createThread(anchor, initialComment);\n // Add thread ID to the file's commentThreadIds array\n const fileId = anchor.docId;\n if (fileId) {\n try {\n const fileHandle = await this.repo.find(fileId);\n await fileHandle.whenReady();\n fileHandle.change((doc) => {\n if (!doc.commentThreadIds) {\n doc.commentThreadIds = [];\n }\n doc.commentThreadIds.push(threadId);\n });\n console.log('[WorkspaceHandle] Added comment thread to file:', { fileId, threadId });\n }\n catch (error) {\n console.error('[WorkspaceHandle] Failed to add thread ID to file:', error);\n }\n }\n return threadId;\n },\n reply: async (threadId, comment) => {\n return await this.commentService.addComment(threadId, comment);\n },\n resolve: async (threadId) => {\n return await this.commentService.resolveThread(threadId);\n },\n getThread: async (threadId) => {\n return await this.commentService.getThread(threadId);\n },\n list: async () => {\n // Note: For file-scoped comments, use FileHandle.comments.list() instead\n return await this.commentService.listThreads();\n },\n delete: async (threadId) => {\n // Get the thread to find which file it belongs to\n try {\n const thread = await this.commentService.getThread(threadId);\n if (thread?.anchor?.docId) {\n const fileHandle = await this.repo.find(thread.anchor.docId);\n await fileHandle.whenReady();\n fileHandle.change((doc) => {\n if (doc.commentThreadIds) {\n const index = doc.commentThreadIds.indexOf(threadId);\n if (index > -1) {\n doc.commentThreadIds.splice(index, 1);\n }\n }\n });\n }\n }\n catch (error) {\n console.warn('[WorkspaceHandle] Failed to remove thread from file:', error);\n }\n return await this.commentService.deleteThread(threadId);\n }\n },\n folder: {\n create: async (path, options) => {\n console.log('[WorkspaceHandle] Creating folder:', path);\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n const folderId = `folder-${path.replace(/[^a-zA-Z0-9]/g, '-')}-${Date.now()}`;\n const folderDocumentId = await this.workspaceService.folderService.createFolderDocument(folderId, path, workspaceId, branchId, options || {});\n const folderRef = {\n id: folderId,\n name: options?.name || path,\n path: path,\n documentId: folderDocumentId,\n fileCount: 0,\n totalSize: 0,\n lastModified: new Date().toISOString(),\n metadata: {\n hasSubfolders: false,\n primaryFileType: 'mixed',\n isActive: true\n }\n };\n await this.workspaceService.addFolderToWorkspace(workspaceId, folderRef, branchId);\n return folderRef;\n },\n list: async () => {\n const workspace = await this.workspaceService.getWorkspace(workspaceId);\n return workspace.folderRefs || [];\n },\n get: async (folderId) => {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n return await this.workspaceService.folderService.getFolderDocument(folderId, branchId);\n },\n split: async (folderId) => {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n return await this.workspaceService.folderService.splitOversizedFolderById(folderId, branchId);\n },\n validateCapacity: async () => {\n return await this.workspaceService.validateFolderCapacities(workspaceId);\n },\n // glassware[type=implementation, id=impl-folder-rename, requirements=req-fd-rename-1]\n rename: async (folderId, newName) => {\n console.log('[WorkspaceHandle] Renaming folder:', folderId, 'to', newName);\n try {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n // Get the workspace to find folder reference with documentId\n const workspace = await this.workspaceService.getWorkspace(workspaceId);\n const folderRefs = workspace.folderRefs || [];\n const folderRef = folderRefs.find((ref) => ref.id === folderId);\n if (!folderRef) {\n throw new Error(`Folder not found: ${folderId}`);\n }\n const documentId = folderRef.documentId;\n if (!documentId) {\n throw new Error(`Folder document ID not found: ${folderId}`);\n }\n // Update folder document metadata\n const folderHandle = await this.branchableRepo.openHandle(documentId, {\n branchId,\n workspaceId\n });\n await folderHandle.change((doc) => {\n if (doc.metadata) {\n doc.metadata.name = newName;\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n // Update folder reference in workspace document\n const folderRefIndex = folderRefs.findIndex((ref) => ref.id === folderId);\n if (folderRefIndex !== -1) {\n const workspaceHandle = await this.branchableRepo.openHandle(workspaceId, {\n branchId,\n workspaceId\n });\n await workspaceHandle.change((doc) => {\n if (doc.folderRefs && doc.folderRefs[folderRefIndex]) {\n doc.folderRefs[folderRefIndex].name = newName;\n }\n });\n }\n console.log('[WorkspaceHandle] Folder renamed successfully');\n }\n catch (error) {\n console.error('[WorkspaceHandle] Failed to rename folder:', error);\n throw error;\n }\n },\n // glassware[type=implementation, id=impl-folder-delete, requirements=req-fd-delete-2]\n delete: async (folderId) => {\n console.log('[WorkspaceHandle] Deleting folder:', folderId);\n try {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n // Delete folder and remove from workspace (WorkspaceService already handles this)\n await this.workspaceService.deleteFolder(workspaceId, folderId);\n console.log('[WorkspaceHandle] Folder deleted successfully');\n }\n catch (error) {\n console.error('[WorkspaceHandle] Failed to delete folder:', error);\n throw error;\n }\n }\n },\n workspace: {\n getStructure: async () => {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n return await this.workspaceService.getWorkspaceStructure(workspaceId, branchId);\n },\n search: async (query) => {\n const activeBranch = await getRuntimeActiveBranch();\n const branchId = activeBranch?.id || 'main';\n return await this.workspaceService.searchFilesAcrossFolders(workspaceId, query, branchId);\n },\n migrate: async () => {\n return await this.workspaceService.migrateWorkspaceToHierarchical(workspaceId);\n },\n validate: async () => {\n return await this.workspaceService.validateWorkspaceIntegrity(workspaceId);\n }\n },\n createDocument: async (content, options) => {\n const doc = await this.repo.create(content);\n await this.workspaceService.addFileRef(workspaceId, {\n id: doc.documentId,\n name: options?.name || `document-${Date.now()}`,\n type: 'document',\n folderId: options?.folder ? await this.findOrCreateFolder(workspaceId, options.folder) : null\n });\n return await this.createDocumentHandle(doc.documentId, options?.branchId);\n },\n createThread: async (options) => {\n const threadId = await this.threadService.createThread(options?.title || 'New Thread', options?.branchId || '');\n return {\n id: threadId,\n name: options?.title || 'New Thread',\n itemIds: [],\n branchId: options?.branchId || '',\n created: Date.now(),\n updated: Date.now()\n };\n }\n };\n }\n async createDocumentHandle(documentId, branchId) {\n const docHandle = await this.repo.find(documentId);\n if (!docHandle) {\n throw new Error(`Document ${documentId} not found`);\n }\n const changeHandlers = new Set();\n return {\n documentId,\n url: docHandle.url,\n handle: docHandle,\n doc: (branchIdOverride) => {\n // In a real implementation, this would resolve the correct version based on branch context\n // For now, return the latest version\n return docHandle.doc();\n },\n heads: (branchIdOverride) => {\n return docHandle.heads();\n },\n change: (fn, options) => {\n docHandle.change(fn);\n },\n on: (event, callback) => {\n if (event === \"change\") {\n changeHandlers.add(callback);\n docHandle.on(\"change\", callback);\n }\n },\n off: (event, callback) => {\n if (event === \"change\") {\n changeHandlers.delete(callback);\n docHandle.off(\"change\", callback);\n }\n }\n };\n }\n detectCapabilities() {\n return {\n availableServices: ['workspace', 'branch', 'thread', 'workingDirectory'],\n features: {\n branching: true,\n fileTracking: true,\n collaboration: !!this.repo.networkSubsystem,\n workingDirectory: true,\n gitIntegration: true // Will be determined async when needed\n }\n };\n }\n async isGitAvailable() {\n try {\n if (!this.gitIntegrationService) {\n return false;\n }\n return await this.gitIntegrationService.isGitRepository();\n }\n catch (error) {\n return false;\n }\n }\n async detectGitBranches() {\n if (!this.gitIntegrationService) {\n return [];\n }\n return await this.gitIntegrationService.listBranches(true);\n }\n async extractGitFiles(branchName, options) {\n if (!this.gitIntegrationService) {\n throw new Error('Git integration not available in browser environment');\n }\n return await this.gitIntegrationService.extractFilesFromBranch(branchName, options);\n }\n // Utility methods\n getFileName(path) {\n return path.split('/').pop() || path;\n }\n getFileType(path) {\n const ext = path.split('.').pop()?.toLowerCase();\n switch (ext) {\n case 'md': return 'markdown';\n case 'ts':\n case 'js': return 'code';\n case 'json': return 'data';\n default: return 'document';\n }\n }\n getLanguageFromMimeType(mimeType) {\n const mimeToLanguageMap = {\n 'text/javascript': 'javascript',\n 'text/typescript': 'typescript',\n 'text/x-python': 'python',\n 'text/x-java-source': 'java',\n 'text/x-c': 'c',\n 'text/x-c++': 'cpp',\n 'text/x-c-header': 'c',\n 'text/css': 'css',\n 'text/x-scss': 'scss',\n 'text/x-less': 'less',\n 'text/x-sql': 'sql',\n 'text/x-shell': 'bash',\n 'text/x-go': 'go',\n 'text/x-rust': 'rust',\n 'text/x-php': 'php',\n 'text/x-ruby': 'ruby',\n 'text/x-swift': 'swift',\n 'text/x-kotlin': 'kotlin',\n 'text/x-scala': 'scala',\n 'text/x-clojure': 'clojure',\n 'text/x-haskell': 'haskell',\n 'text/x-lua': 'lua',\n 'text/x-r': 'r',\n 'text/x-matlab': 'matlab'\n };\n return mimeToLanguageMap[mimeType];\n }\n async ensureFolderPath(workspaceId, filePath) {\n // Placeholder - would implement folder creation logic\n return null;\n }\n async findOrCreateFolder(workspaceId, folderPath) {\n // Placeholder - would implement folder lookup/creation\n return null;\n }\n async convertFileRefsToEnhanced(fileRefs, fileHeads) {\n const enhancedRefs = [];\n for (const fileRef of fileRefs) {\n try {\n const hasHead = fileRef.id in fileHeads;\n // For hierarchical files, show all files since they're already properly organized\n // Branch head requirement is mainly for legacy flat file systems\n if (!hasHead && !fileRef.folderId) {\n continue; // Skip files not in current branch (legacy flat files only)\n }\n // Get file document to check for tracking data\n const docHandle = await this.repo.find(fileRef.id);\n const fileContent = docHandle?.doc();\n const enhancedRef = {\n id: fileRef.id,\n name: fileRef.name,\n type: fileRef.type || 'file',\n mimeType: detectMimeType(fileRef.name),\n size: 0, // Would need to calculate from content\n folderId: fileRef.folderId,\n createdAt: fileRef.createdAt || new Date().toISOString(),\n updatedAt: fileRef.updatedAt || new Date().toISOString(),\n metadata: {\n type: 'file',\n name: fileRef.name,\n createdAt: fileRef.createdAt || new Date().toISOString(),\n updatedAt: fileRef.updatedAt || new Date().toISOString(),\n createdBy: 'workspace-user'\n },\n hasTraces: Boolean(fileContent?.traces?.length),\n hasComments: Boolean(fileContent?.comments?.length),\n hasAgentEdits: Boolean(fileContent?.agentEdits?.length),\n traceCount: fileContent?.traces?.length || 0,\n commentCount: fileContent?.comments?.length || 0,\n agentEditCount: fileContent?.agentEdits?.length || 0\n };\n enhancedRefs.push(enhancedRef);\n }\n catch (error) {\n console.warn(`Error processing file ${fileRef.id}:`, error);\n }\n }\n return enhancedRefs;\n }\n async buildSearchIndex(workspaceId, fileIds) {\n // Placeholder implementation\n }\n async getFolderCount(workspaceId) {\n // Placeholder implementation\n return 0;\n }\n setupEventHandlers() {\n // Configure event handlers for workspace state changes\n }\n emitEvent(eventName, data) {\n const handlers = this.eventHandlers.get(eventName) || [];\n handlers.forEach(handler => {\n try {\n handler(data);\n }\n catch (error) {\n console.warn(`Event handler error for ${eventName}:`, error);\n }\n });\n }\n // Public event API\n on(eventName, handler) {\n if (!this.eventHandlers.has(eventName)) {\n this.eventHandlers.set(eventName, []);\n }\n this.eventHandlers.get(eventName).push(handler);\n }\n off(eventName, handler) {\n const handlers = this.eventHandlers.get(eventName);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index >= 0) {\n handlers.splice(index, 1);\n }\n }\n }\n}\nexport function createModWorkspace(repo, options) {\n return new ModWorkspace(repo, options);\n}\n", "import { BaseRepository } from './base-repo.js';\nexport class CommentRepository extends BaseRepository {\n async create(data) {\n const handle = this.repo.create();\n handle.change((doc) => {\n Object.assign(doc, {\n id: handle.documentId,\n anchor: data.anchor,\n comments: data.comments || [],\n status: data.status || 'active',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n ...data\n });\n });\n return handle.documentId;\n }\n async update(id, data) {\n const handle = await this.getHandle(id);\n handle.change((doc) => {\n Object.assign(doc, {\n ...data,\n updatedAt: new Date().toISOString()\n });\n });\n return handle.documentId;\n }\n async delete(_id) {\n // Automerge doesn't have built-in delete; mark as deleted or handle as needed\n console.warn('Delete operation not fully implemented for Automerge documents');\n }\n async get(id) {\n const handle = await this.getHandle(id);\n return handle.doc();\n }\n async list(_query) {\n // Placeholder: implement query/indexing as needed\n return [];\n }\n async addComment(threadId, comment) {\n const handle = await this.getHandle(threadId);\n handle.change((doc) => {\n if (!doc.comments)\n doc.comments = [];\n const normalized = { ...comment };\n if (!normalized.mentions || normalized.mentions.length === 0) {\n delete normalized.mentions;\n }\n if (!normalized.agentThreadId) {\n delete normalized.agentThreadId;\n }\n if (!normalized.agentThreadItemId) {\n delete normalized.agentThreadItemId;\n }\n doc.comments.push(normalized);\n if (!doc.metadata) {\n doc.metadata = {\n type: 'commentThread',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n }\n else {\n doc.metadata.updatedAt = new Date().toISOString();\n }\n });\n return handle.doc();\n }\n}\n", "import { CommentRepository } from '../repos/comment-repo.js';\nexport class CommentService {\n constructor(repo) {\n this.commentRepo = new CommentRepository(repo);\n }\n async createThread(anchor, initialComment) {\n const comment = {\n id: `comment-${Date.now()}`,\n author: initialComment.author,\n text: initialComment.text,\n createdAt: new Date().toISOString(),\n authorType: initialComment.authorType,\n userId: initialComment.userId,\n };\n if (!comment.userId) {\n delete comment.userId;\n }\n const thread = {\n anchor,\n comments: [comment],\n status: 'active',\n metadata: {\n type: 'commentThread',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n };\n return this.commentRepo.create(thread);\n }\n async addComment(threadId, comment) {\n const newComment = {\n id: `comment-${Date.now()}`,\n author: comment.author,\n text: comment.text,\n createdAt: new Date().toISOString(),\n authorType: comment.authorType,\n userId: comment.userId,\n agentThreadId: comment.agentThreadId,\n agentThreadItemId: comment.agentThreadItemId,\n };\n if (comment.mentions && comment.mentions.length > 0) {\n newComment.mentions = comment.mentions;\n }\n if (!newComment.userId) {\n delete newComment.userId;\n }\n if (!newComment.agentThreadId) {\n delete newComment.agentThreadId;\n }\n if (!newComment.agentThreadItemId) {\n delete newComment.agentThreadItemId;\n }\n return this.commentRepo.addComment(threadId, newComment);\n }\n async resolveThread(threadId) {\n return this.commentRepo.update(threadId, { status: 'resolved' });\n }\n async getThread(threadId) {\n return this.commentRepo.get(threadId);\n }\n async listThreads() {\n return this.commentRepo.list();\n }\n async deleteThread(threadId) {\n return this.commentRepo.delete(threadId);\n }\n}\n", "export const MIME_TYPE_MAP = {\n // Text files\n 'md': 'text/markdown',\n 'txt': 'text/plain',\n 'html': 'text/html',\n 'htm': 'text/html',\n 'xml': 'text/xml',\n 'csv': 'text/csv',\n // Code files\n 'js': 'text/javascript',\n 'jsx': 'text/javascript',\n 'ts': 'text/typescript', // REQ-INT-4.2 TypeScript files must use text/typescript\n 'tsx': 'text/typescript',\n 'py': 'text/x-python', // REQ-INT-4.1 Python files must consistently use text/x-python\n 'java': 'text/x-java-source',\n 'c': 'text/x-c',\n 'cpp': 'text/x-c++',\n 'h': 'text/x-c-header',\n 'css': 'text/css',\n 'scss': 'text/x-scss',\n 'less': 'text/x-less',\n 'sql': 'text/x-sql',\n 'sh': 'text/x-shell',\n 'bash': 'text/x-shell',\n 'zsh': 'text/x-shell',\n 'go': 'text/x-go',\n 'rs': 'text/x-rust',\n 'php': 'text/x-php',\n 'rb': 'text/x-ruby',\n 'swift': 'text/x-swift',\n 'kt': 'text/x-kotlin',\n 'scala': 'text/x-scala',\n 'clj': 'text/x-clojure',\n 'hs': 'text/x-haskell',\n 'lua': 'text/x-lua',\n 'r': 'text/x-r',\n 'matlab': 'text/x-matlab',\n // Data files\n 'json': 'application/json', // REQ-INT-4.3 JSON files must map to application/json universally\n 'yaml': 'text/yaml',\n 'yml': 'text/yaml',\n 'toml': 'text/toml',\n 'ini': 'text/plain',\n 'conf': 'text/plain',\n 'config': 'text/plain',\n // Image files\n 'png': 'image/png',\n 'jpg': 'image/jpeg',\n 'jpeg': 'image/jpeg',\n 'gif': 'image/gif',\n 'svg': 'image/svg+xml',\n 'webp': 'image/webp',\n 'bmp': 'image/bmp',\n 'ico': 'image/x-icon',\n // Document files\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n // Archive files\n 'zip': 'application/zip',\n 'tar': 'application/x-tar',\n 'gz': 'application/gzip',\n 'rar': 'application/vnd.rar',\n '7z': 'application/x-7z-compressed'\n};\n// MIME type registry for runtime customization\nconst customMimeTypes = new Map();\n// Performance cache for detection results\nconst detectionCache = new Map();\nconst CACHE_TTL = 300000; // 5 minutes\nexport function detectMimeType(fileName, content) {\n const cacheKey = content ? `${fileName}:${content.length}` : fileName;\n const cached = detectionCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return cached.mimeType;\n }\n const ext = fileName.split('.').pop()?.toLowerCase();\n if (ext && customMimeTypes.has(ext)) {\n const result = customMimeTypes.get(ext).mimeType;\n detectionCache.set(cacheKey, { mimeType: result, timestamp: Date.now() });\n return result;\n }\n if (ext && MIME_TYPE_MAP[ext]) {\n const result = MIME_TYPE_MAP[ext];\n detectionCache.set(cacheKey, { mimeType: result, timestamp: Date.now() });\n return result;\n }\n if (content && content.length > 0) {\n const detected = detectMimeTypeFromContent(content);\n if (detected !== 'application/octet-stream') {\n detectionCache.set(cacheKey, { mimeType: detected, timestamp: Date.now() });\n return detected;\n }\n }\n const result = 'application/octet-stream'; // Default binary\n detectionCache.set(cacheKey, { mimeType: result, timestamp: Date.now() });\n return result;\n}\nexport function mimeTypeToCanvasType(mimeType) {\n for (const [ext, customType] of customMimeTypes) {\n if (customType.mimeType === mimeType) {\n return customType.canvasType;\n }\n }\n if (mimeType.startsWith('text/')) {\n if (mimeType.includes('javascript') || mimeType.includes('typescript') ||\n mimeType.includes('python') || mimeType.includes('java') ||\n mimeType.includes('c++') || mimeType.includes('c-header') ||\n mimeType.includes('shell') || mimeType.includes('go') ||\n mimeType.includes('rust') || mimeType.includes('php') ||\n mimeType.includes('ruby') || mimeType.includes('swift') ||\n mimeType.includes('kotlin') || mimeType.includes('scala') ||\n mimeType.includes('clojure') || mimeType.includes('haskell') ||\n mimeType.includes('lua') || mimeType.includes('r') ||\n mimeType.includes('matlab') || mimeType.includes('sql')) {\n return 'code';\n }\n if (mimeType.includes('markdown')) {\n return 'text';\n }\n return 'text';\n }\n if (mimeType === 'application/json' || mimeType.includes('yaml') || mimeType.includes('toml')) {\n return 'data';\n }\n if (mimeType.startsWith('image/')) {\n return 'image';\n }\n return 'file'; // Default fallback\n}\nexport function registerMimeType(extension, mimeType, canvasType) {\n try {\n if (!isValidMimeType(mimeType)) {\n console.warn(`[MIME Registry] Invalid MIME type: ${mimeType}`);\n return false;\n }\n const cleanExt = extension.toLowerCase().replace(/[^a-z0-9]/g, '');\n if (cleanExt !== extension.toLowerCase().replace('.', '')) {\n console.warn(`[MIME Registry] Invalid extension: ${extension}`);\n return false;\n }\n if (customMimeTypes.has(cleanExt)) {\n console.warn(`[MIME Registry] Overriding existing registration for .${cleanExt}`);\n }\n customMimeTypes.set(cleanExt, { mimeType, canvasType });\n console.log(`[MIME Registry] Registered .${cleanExt} -> ${mimeType} (${canvasType}) at ${new Date().toISOString()}`);\n return true;\n }\n catch (error) {\n console.error(`[MIME Registry] Failed to register ${extension}: ${error}`);\n return false;\n }\n}\nexport function getMimeTypeInfo(mimeType) {\n const canvasType = mimeTypeToCanvasType(mimeType);\n // Check if it's a custom registered type\n const isCustom = Array.from(customMimeTypes.values()).some(t => t.mimeType === mimeType);\n const language = canvasType === 'code' ? getLanguageFromMimeType(mimeType) : undefined;\n // Categorize MIME type\n let category = 'binary';\n if (mimeType.startsWith('text/')) {\n category = canvasType === 'code' ? 'code' : 'text';\n }\n else if (mimeType.startsWith('image/')) {\n category = 'image';\n }\n else if (mimeType === 'application/json' || mimeType.includes('yaml') || mimeType.includes('toml')) {\n category = 'data';\n }\n else if (mimeType.includes('pdf') || mimeType.includes('word') || mimeType.includes('excel')) {\n category = 'document';\n }\n else if (mimeType.includes('zip') || mimeType.includes('tar') || mimeType.includes('gzip')) {\n category = 'archive';\n }\n return {\n mimeType,\n canvasType,\n isCustom,\n language,\n category\n };\n}\nfunction detectMimeTypeFromContent(content) {\n const header = content.slice(0, Math.min(512, content.length));\n // Magic number detection for common file types\n if (header.length >= 4) {\n const signature = Array.from(header.slice(0, 4))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n // Common file signatures\n const signatures = {\n '89504e47': 'image/png',\n 'ffd8ffe0': 'image/jpeg',\n 'ffd8ffe1': 'image/jpeg',\n 'ffd8ffe2': 'image/jpeg',\n '47494638': 'image/gif',\n '25504446': 'application/pdf',\n '504b0304': 'application/zip',\n '1f8b0800': 'application/gzip'\n };\n if (signatures[signature]) {\n return signatures[signature];\n }\n }\n // Text detection - check for valid UTF-8 and printable characters\n try {\n const text = content.toString('utf8', 0, Math.min(256, content.length));\n const printableRatio = (text.match(/[\\x20-\\x7E\\s]/g) || []).length / text.length;\n if (printableRatio > 0.7) {\n // Likely text content - try to detect specific formats\n if (text.includes('{\\n') || text.includes('[\\n') || text.match(/^\\s*[{\\[]]/)) {\n return 'application/json';\n }\n if (text.includes('<!DOCTYPE') || text.includes('<html')) {\n return 'text/html';\n }\n if (text.includes('<?xml')) {\n return 'text/xml';\n }\n return 'text/plain';\n }\n }\n catch {\n // Not valid UTF-8, likely binary\n }\n return 'application/octet-stream';\n}\nfunction isValidMimeType(mimeType) {\n // Basic MIME type validation\n const mimeRegex = /^[a-zA-Z0-9][a-zA-Z0-9!#$&\\-\\^]*\\/[a-zA-Z0-9][a-zA-Z0-9!#$&\\-\\^]*$/;\n return mimeRegex.test(mimeType);\n}\n// Helper function to get language from MIME type for code files\nfunction getLanguageFromMimeType(mimeType) {\n const mimeToLanguageMap = {\n 'text/javascript': 'javascript',\n 'text/typescript': 'typescript',\n 'text/x-python': 'python',\n 'text/x-java-source': 'java',\n 'text/x-c': 'c',\n 'text/x-c++': 'cpp',\n 'text/x-c-header': 'c',\n 'text/css': 'css',\n 'text/x-scss': 'scss',\n 'text/x-less': 'less',\n 'text/x-sql': 'sql',\n 'text/x-shell': 'bash',\n 'text/x-go': 'go',\n 'text/x-rust': 'rust',\n 'text/x-php': 'php',\n 'text/x-ruby': 'ruby',\n 'text/x-swift': 'swift',\n 'text/x-kotlin': 'kotlin',\n 'text/x-scala': 'scala',\n 'text/x-clojure': 'clojure',\n 'text/x-haskell': 'haskell',\n 'text/x-lua': 'lua',\n 'text/x-r': 'r',\n 'text/x-matlab': 'matlab'\n };\n return mimeToLanguageMap[mimeType];\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport chokidar from 'chokidar';\nimport { detectMimeType, mimeTypeToCanvasType } from '@mod/mod-core';\nimport { ModIgnoreService } from './modignore-service.js';\nimport crypto from 'crypto';\nexport class AutomaticFileTracker {\n constructor(repo) {\n this.debounceTimers = new Map();\n this.fileHashes = new Map();\n this.isTracking = false;\n this.watchedFileCount = 0;\n this.maxWatchedFiles = 2000;\n this.filePathToDocumentId = new Map();\n this.repo = repo;\n }\n async enableAutoTracking(options) {\n if (this.isTracking) {\n console.log('Automatic file tracking already enabled');\n return;\n }\n const watchDirectory = options.watchDirectory || process.cwd();\n const debounceMs = options.debounceMs || 500;\n const verbose = options.verbose || false;\n const preFilterEnabled = options.preFilterEnabled !== false; // Default true\n const maxWatchedFiles = options.maxWatchedFiles || 2000;\n const resourceMonitoring = options.resourceMonitoring !== false; // Default true\n this.maxWatchedFiles = maxWatchedFiles;\n if (resourceMonitoring) {\n await this.checkFileDescriptorLimits();\n }\n console.log(`\uD83D\uDD0D Starting automatic file tracking in: ${watchDirectory}`);\n this.modIgnoreService = new ModIgnoreService(watchDirectory);\n let trackableFiles = [];\n if (preFilterEnabled) {\n const filterResult = await this.modIgnoreService.preFilterDirectory(watchDirectory);\n trackableFiles = filterResult.trackableFiles;\n console.log(`\uD83D\uDCCA Pre-filter results: ${filterResult.totalFiles} total, ${filterResult.filteredFiles.length} passed filters, ${filterResult.trackableFiles.length} trackable`);\n console.log(`\uD83D\uDCCA Excluded ${filterResult.excludedCount} files (${((filterResult.excludedCount / filterResult.totalFiles) * 100).toFixed(1)}%)`);\n trackableFiles = this.validateResourceLimits(trackableFiles);\n }\n await this.initializeFileMappings(options.workspaceHandle, watchDirectory);\n if (preFilterEnabled && trackableFiles.length > 0) {\n // Watch specific pre-filtered files instead of entire directory\n this.watcher = chokidar.watch(trackableFiles, {\n ignoreInitial: true,\n persistent: true,\n followSymlinks: false\n });\n this.watchedFileCount = trackableFiles.length;\n }\n else {\n // Fallback to directory watching with ignore patterns\n this.watcher = chokidar.watch(watchDirectory, {\n ignored: (filePath) => {\n return this.modIgnoreService.shouldIgnore(filePath, watchDirectory);\n },\n ignoreInitial: true,\n persistent: true,\n followSymlinks: false\n });\n }\n this.watcher\n .on('add', filePath => {\n if (verbose)\n console.log(`[tracker] File added: ${filePath}`);\n this.handleFileEvent('add', filePath, options, debounceMs);\n })\n .on('change', filePath => {\n if (verbose)\n console.log(`[tracker] File changed: ${filePath}`);\n this.handleFileEvent('change', filePath, options, debounceMs);\n })\n .on('unlink', filePath => {\n if (verbose)\n console.log(`[tracker] File deleted: ${filePath}`);\n this.handleFileEvent('unlink', filePath, options, debounceMs);\n });\n this.isTracking = true;\n console.log(`\u2705 Automatic file tracking enabled`);\n }\n async initializeFileMappings(workspaceHandle, watchDirectory) {\n try {\n // Get all files currently tracked in the workspace\n const files = await workspaceHandle.file.list();\n for (const file of files) {\n // Create mapping from file path to document ID\n const filePath = path.join(watchDirectory, file.name);\n this.filePathToDocumentId.set(filePath, file.id);\n // Initialize content hash if file exists on disk\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, 'utf8');\n const hash = this.getContentHash(content);\n this.fileHashes.set(filePath, hash);\n }\n }\n console.log(`\uD83D\uDCC1 Initialized tracking for ${files.length} files`);\n }\n catch (error) {\n console.error('Failed to initialize file mappings:', error);\n }\n }\n handleFileEvent(eventType, filePath, options, debounceMs) {\n // Only track text/code files\n if (!this.isTrackableFile(filePath))\n return;\n // Clear existing timer\n const existingTimer = this.debounceTimers.get(filePath);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n // Set new debounced timer\n const timer = setTimeout(async () => {\n try {\n await this.processFileChange(eventType, filePath, options);\n }\n catch (error) {\n console.error(`Failed to process ${eventType} for ${filePath}:`, error);\n }\n }, debounceMs);\n this.debounceTimers.set(filePath, timer);\n }\n async processFileChange(eventType, filePath, options) {\n const { workspaceHandle, verbose } = options;\n switch (eventType) {\n case 'add':\n await this.handleFileAdd(filePath, workspaceHandle, verbose);\n break;\n case 'change':\n await this.handleFileChange(filePath, workspaceHandle, verbose);\n break;\n case 'unlink':\n await this.handleFileDelete(filePath, workspaceHandle, verbose);\n break;\n }\n }\n async handleFileAdd(filePath, workspaceHandle, verbose) {\n if (!fs.existsSync(filePath))\n return;\n const stat = fs.statSync(filePath);\n if (stat.isDirectory()) {\n if (verbose)\n console.log(`[tracker] Skipping directory: ${filePath}`);\n return;\n }\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n const fileName = path.basename(filePath);\n const hash = this.getContentHash(content);\n if (verbose) {\n console.log(`[DEBUG AUTO-TRACKER] Creating file ${fileName}...`);\n }\n const mimeType = this.getMimeType(fileName);\n const canvasType = mimeTypeToCanvasType(mimeType);\n const documentData = {\n text: content,\n metadata: {\n type: canvasType, // Required for workspace container routing\n originalFilename: fileName\n }\n };\n const documentHandle = await workspaceHandle.file.create(documentData, {\n name: fileName,\n mimeType: mimeType\n });\n this.filePathToDocumentId.set(filePath, documentHandle.documentId);\n this.fileHashes.set(filePath, hash);\n if (verbose) {\n console.log(`\u2705 Added file: ${fileName} (${documentHandle.documentId})`);\n }\n }\n catch (error) {\n console.error(`Failed to add file ${path.basename(filePath)}:`, error);\n }\n }\n async handleFileChange(filePath, workspaceHandle, verbose) {\n if (!fs.existsSync(filePath))\n return;\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n const newHash = this.getContentHash(content);\n const oldHash = this.fileHashes.get(filePath);\n if (newHash === oldHash)\n return;\n const documentId = this.filePathToDocumentId.get(filePath);\n if (!documentId) {\n // File not tracked yet, treat as new file\n await this.handleFileAdd(filePath, workspaceHandle, verbose);\n return;\n }\n const fileName = path.basename(filePath);\n const mimeType = this.getMimeType(fileName);\n const canvasType = mimeTypeToCanvasType(mimeType);\n const documentData = {\n text: content,\n metadata: {\n type: canvasType, // Required for workspace container routing\n originalFilename: fileName\n }\n };\n await workspaceHandle.file.update(documentId, documentData);\n this.fileHashes.set(filePath, newHash);\n if (verbose) {\n const fileName = path.basename(filePath);\n console.log(`\uD83D\uDD04 Updated file: ${fileName}`);\n }\n }\n catch (error) {\n console.error(`Failed to update file ${path.basename(filePath)}:`, error);\n }\n }\n async handleFileDelete(filePath, workspaceHandle, verbose) {\n const documentId = this.filePathToDocumentId.get(filePath);\n if (!documentId)\n return;\n try {\n // For now, clean up local mappings - file.delete() method will be implemented later\n this.filePathToDocumentId.delete(filePath);\n this.fileHashes.delete(filePath);\n if (verbose) {\n const fileName = path.basename(filePath);\n console.log(`\uD83D\uDDD1\uFE0F File deleted: ${fileName} (local cleanup completed)`);\n }\n }\n catch (error) {\n console.error(`Failed to handle deletion of ${path.basename(filePath)}:`, error);\n }\n }\n isTrackableFile(filePath) {\n const ext = path.extname(filePath).toLowerCase();\n const trackableExtensions = [\n '.md', '.txt', '.js', '.ts', '.jsx', '.tsx', '.json', '.yaml', '.yml',\n '.py', '.java', '.cpp', '.c', '.h', '.css', '.scss', '.html', '.xml',\n '.sql', '.go', '.rs', '.php', '.rb', '.swift', '.kt', '.scala'\n ];\n return trackableExtensions.includes(ext);\n }\n getMimeType(fileName) {\n // Use centralized MIME type detection from mod-core\n return detectMimeType(fileName);\n }\n getContentHash(content) {\n return crypto.createHash('sha256').update(content, 'utf8').digest('hex');\n }\n async disableAutoTracking() {\n if (!this.isTracking)\n return;\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = undefined;\n }\n // Clear all timers\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n this.isTracking = false;\n console.log('\uD83D\uDED1 Automatic file tracking disabled');\n }\n getTrackingStatus() {\n const capacityUsed = this.watchedFileCount / this.maxWatchedFiles;\n return {\n isTracking: this.isTracking,\n trackedFiles: this.filePathToDocumentId.size,\n watchedFiles: this.watchedFileCount,\n maxWatchedFiles: this.maxWatchedFiles,\n capacityUsed: Math.round(capacityUsed * 100)\n };\n }\n getModIgnoreStats() {\n return this.modIgnoreService?.getPatternStats() || null;\n }\n async checkFileDescriptorLimits() {\n try {\n // Get current file descriptor usage (Node.js specific)\n const fs = await import('fs');\n // Check if we're approaching system limits by attempting to open a temporary file\n // This is a simple heuristic since Node.js doesn't expose ulimit directly\n const testFile = '/tmp/.mod-fd-test';\n try {\n fs.writeFileSync(testFile, 'test');\n fs.unlinkSync(testFile);\n }\n catch (error) {\n console.warn('\u26A0\uFE0F Warning: Potential file descriptor limit approaching');\n throw new Error('File descriptor limit check failed - consider reducing maxWatchedFiles');\n }\n }\n catch (error) {\n console.warn('Could not check file descriptor limits:', error);\n }\n }\n validateResourceLimits(trackableFiles) {\n if (trackableFiles.length > this.maxWatchedFiles) {\n console.warn(`\u26A0\uFE0F Warning: ${trackableFiles.length} trackable files exceeds limit of ${this.maxWatchedFiles}`);\n console.warn('\u26A0\uFE0F Consider updating .modignore patterns or increasing maxWatchedFiles limit');\n const limitedFiles = trackableFiles.slice(0, this.maxWatchedFiles);\n console.warn(`\u26A0\uFE0F Limiting tracking to first ${this.maxWatchedFiles} files for performance`);\n return limitedFiles;\n }\n return trackableFiles;\n }\n}\n", "// Export tools\nexport * from './tools/search-documents.js';\nexport * from './tools/read-document.js';\nexport * from './tools/transfer-to-agent.js';\nexport * from './tools/search-documents-enhanced.js';\nexport * from './tools/create-tasks.js';\nexport * from './tools/set-active-task.js';\nexport * from './tools/set-task-status.js';\nexport * from './tools/search-workspace.js';\nexport * from './tools/read-workspace-file.js';\n// Export types\nexport * from './types/thread-types.js';\nexport * from './types/orchestrator-types.js';\nexport * from './types/agent-types.js';\nexport * from './types/repo-types.js';\nexport * from './types/connector-types.js';\nexport * from './types/user-types.js';\nexport * from './types/workspace-types.js';\nexport * from './types/task-types.js';\nexport * from './types/change-log-types.js';\nexport * from './types/comment-types.js';\nexport * from './types/branch-types.js';\nexport * from './types/specification-types.js';\nexport { detectMimeType, mimeTypeToCanvasType, registerMimeType, getMimeTypeInfo } from './types/mod-file-types.js';\n// Export schemas\nexport * from './schemas/user-schemas.js';\nexport * from './schemas/invitation-schemas.js';\n// Export services\nexport * from './services/branch-service.js';\nexport * from './services/thread-service.js';\nexport * from './services/workspace-service.js';\nexport * from './services/branchable-repo.js';\nexport * from './services/task-service.js';\nexport * from './services/task-tracking.js';\nexport * from './services/branch-heads.js';\nexport * from './services/user-service.js';\nexport * from './services/permission-service.js';\nexport * from './services/invitation-service.js';\nexport * from './services/user-search-service.js';\nexport * from './services/working-directory-service.js';\nexport * from './services/spec-branch-validator.js';\nexport * from './services/specification-parser.js';\n// Export repos\nexport * from './repos/user-repo.js';\nexport * from './repos/permission-repo.js';\nexport * from './repos/invitation-repo.js';\n// Export utils\nexport * from './utils/find-document.js';\nexport * from './utils/search-utils.js';\nexport * from './utils/debugSync.js';\nexport * from './utils/workspace-defaults.js';\nexport * from './utils/spec-parser-utils.js';\nexport { ModWorkspace, createModWorkspace } from './mod-workspace.js';\n", "import { tool } from 'ai';\nimport { z } from 'zod';\nimport { TaskService } from '../services/task-service.js';\nconst createTasksInputSchema = z.object({\n tasks: z.array(z.object({\n description: z.string(),\n subtasks: z.array(z.string()).optional(),\n })),\n context: z.unknown(),\n});\nexport const createTasks = tool({\n description: \"Create a new task and add it to the tasks list for the active branch. This tool allows for multiple tasks to be created at once, and is branch-centric.\",\n inputSchema: createTasksInputSchema,\n async execute({ tasks, context }) {\n try {\n const { repo, user, activeThread, activeBranch, branchContext } = context;\n if (!repo)\n throw new Error(\"No repo in session context\");\n if (!user?.id)\n throw new Error(\"No user in session context\");\n // Get branchId from context\n let branchId = undefined;\n if (activeThread?.branchId)\n branchId = activeThread.branchId;\n else if (activeBranch?.id)\n branchId = activeBranch.id;\n else if (branchContext?.branchId)\n branchId = branchContext.branchId;\n if (!branchId)\n throw new Error(\"No branchId found in session context (checked activeThread, activeBranch, branchContext)\");\n const taskService = new TaskService(repo);\n // Use tasksDocId from activeBranch if present, otherwise create a new one\n let tasksDocId = activeBranch?.tasksDocId;\n if (!tasksDocId) {\n const tasksDoc = await taskService.createTasksDoc(branchId);\n tasksDocId = tasksDoc.id;\n // Optionally: you may want to update the branch to reference this new tasksDocId\n }\n // Create the new tasks\n const now = new Date().toISOString();\n const createdTasks = [];\n for (const task of tasks) {\n const createdTask = await taskService.createTask(tasksDocId, {\n branchId,\n metadata: {\n createdBy: user.id,\n createdAt: now,\n updatedAt: now,\n status: 'pending',\n assigneeAgent: 'dev-agent',\n },\n description: task.description,\n subtasks: task.subtasks || [],\n context: {\n files: [],\n links: [],\n },\n filesUpdated: [],\n threadItemIds: [],\n });\n createdTasks.push(createdTask);\n }\n const list = createdTasks.map((t, i) => `${i + 1}. ${t.description}`).join('\\n');\n const result = {\n value: `Created ${createdTasks.length} task(s) for this branch:\\n${list}`,\n tasks: createdTasks,\n isComplete: true,\n type: \"success\",\n };\n return result;\n }\n catch (err) {\n console.error('[createTasks] Error:', err);\n throw err;\n }\n }\n});\n", "import { tool } from 'ai';\nimport { z } from 'zod';\nimport { TaskService } from '../services/task-service.js';\nconst setActiveTaskInputSchema = z.object({\n taskId: z.string().optional(),\n context: z.unknown(),\n});\nexport const setActiveTask = tool({\n description: \"Set the active task for the current session/agent, or list available tasks for the current branch if no taskId is provided.\",\n inputSchema: setActiveTaskInputSchema,\n async execute({ taskId, context }) {\n const { repo, activeBranch } = context;\n if (!repo || !activeBranch?.tasksDocId)\n throw new Error(\"Missing repo or activeBranch.tasksDocId in context\");\n const taskService = new TaskService(repo);\n if (!taskId) {\n // List tasks for selection\n const tasks = await taskService.getTasksForBranch(activeBranch.tasksDocId);\n return {\n value: \"Select a task to set as active\",\n tasks,\n isComplete: false,\n type: \"selection\"\n };\n }\n // Set the active task\n return {\n value: `Active task set to ${taskId}`,\n activeTaskId: taskId,\n isComplete: true,\n type: \"success\"\n };\n }\n});\n", "import { tool } from 'ai';\nimport { z } from 'zod';\nimport { TaskService } from '../services/task-service.js';\nconst setTaskStatusInputSchema = z.object({\n taskId: z.string(),\n status: z.enum([\"pending\", \"in-progress\", \"complete\", \"rejected\"]),\n context: z.unknown(),\n});\nexport const setTaskStatus = tool({\n description: \"Set the status of a task (pending, in-progress, complete, rejected).\",\n inputSchema: setTaskStatusInputSchema,\n async execute({ taskId, status, context }) {\n const { repo } = context;\n if (!repo)\n throw new Error(\"No repo in session context\");\n const taskService = new TaskService(repo);\n const updatedTask = await taskService.setTaskStatus(taskId, status);\n return {\n value: `Task ${taskId} status set to ${status}`,\n task: updatedTask,\n isComplete: true,\n type: \"success\",\n };\n }\n});\n", "export var RequirementCategory;\n(function (RequirementCategory) {\n RequirementCategory[\"UX\"] = \"UX\";\n RequirementCategory[\"BUS\"] = \"BUS\";\n RequirementCategory[\"DATA\"] = \"DATA\";\n RequirementCategory[\"INT\"] = \"INT\";\n RequirementCategory[\"INFRA\"] = \"INFRA\";\n RequirementCategory[\"QUAL\"] = \"QUAL\";\n})(RequirementCategory || (RequirementCategory = {}));\nexport var RequirementPriority;\n(function (RequirementPriority) {\n RequirementPriority[\"LOW\"] = \"low\";\n RequirementPriority[\"MEDIUM\"] = \"medium\";\n RequirementPriority[\"HIGH\"] = \"high\";\n RequirementPriority[\"CRITICAL\"] = \"critical\";\n})(RequirementPriority || (RequirementPriority = {}));\nexport var RequirementStatus;\n(function (RequirementStatus) {\n RequirementStatus[\"DRAFT\"] = \"draft\";\n RequirementStatus[\"APPROVED\"] = \"approved\";\n RequirementStatus[\"IMPLEMENTED\"] = \"implemented\";\n RequirementStatus[\"VERIFIED\"] = \"verified\";\n})(RequirementStatus || (RequirementStatus = {}));\nexport var MatchType;\n(function (MatchType) {\n MatchType[\"EXACT\"] = \"exact\";\n MatchType[\"PARTIAL\"] = \"partial\";\n MatchType[\"AMBIGUOUS\"] = \"ambiguous\";\n MatchType[\"INVALID\"] = \"invalid\";\n})(MatchType || (MatchType = {}));\n// Error types for specification parsing\nexport class SpecificationParseError extends Error {\n constructor(message, filePath, lineNumber, cause) {\n super(message);\n this.filePath = filePath;\n this.lineNumber = lineNumber;\n this.cause = cause;\n this.name = 'SpecificationParseError';\n }\n}\nexport class RequirementValidationError extends Error {\n constructor(message, requirementId, validationErrors) {\n super(message);\n this.requirementId = requirementId;\n this.validationErrors = validationErrors;\n this.name = 'RequirementValidationError';\n }\n}\n", "import { z } from 'zod';\n// Device schema for Keyhive support\nexport const DeviceSchema = z.object({\n id: z.string(),\n name: z.string(),\n publicKey: z.string().optional(),\n userId: z.string(),\n createdAt: z.string(),\n lastActiveAt: z.string(),\n revoked: z.boolean().optional(),\n});\n// glassware[type=implementation, id=impl-user-schema, requirements=req-auth-data-1]\n// User schema with workspaceIds for cross-device workspace discovery\nexport const UserSchema = z.object({\n id: z.string(),\n email: z.string(),\n name: z.string(),\n avatar: z.string().optional(),\n googleId: z.string().optional(),\n workspaceIds: z.array(z.string()).default([]), // User's workspace list\n rootDocId: z.string().optional(), // Backup of root workspace document\n publicKey: z.string().optional(), // For future Keyhive support\n keyhiveEnabled: z.boolean().optional(),\n createdAt: z.string(),\n lastActiveAt: z.string(),\n});\n// User profile schema\nexport const UserProfileSchema = z.object({\n userId: z.string(),\n displayName: z.string(),\n bio: z.string().optional(),\n preferences: z.object({\n theme: z.enum(['light', 'dark', 'system']),\n notifications: z.boolean(),\n }),\n});\n// Permission role enum\nexport const PermissionRoleSchema = z.enum(['viewer', 'editor', 'admin']);\n// Document permission schema\nexport const DocumentPermissionSchema = z.object({\n userId: z.string(),\n role: PermissionRoleSchema,\n grantedAt: z.string(),\n grantedBy: z.string(),\n});\n// Document access schema\nexport const DocumentAccessSchema = z.object({\n documentId: z.string(),\n ownerId: z.string(),\n permissions: z.array(DocumentPermissionSchema),\n isPublic: z.boolean(),\n createdAt: z.string(),\n});\n// Share link schema\nexport const ShareLinkSchema = z.object({\n id: z.string(),\n documentId: z.string(),\n createdBy: z.string(),\n expiresAt: z.string().optional(),\n role: PermissionRoleSchema,\n accessCount: z.number(),\n createdAt: z.string(),\n});\n", "import { z } from 'zod';\nimport { PermissionRoleSchema } from './user-schemas.js';\nexport const WorkspaceInvitationSchema = z.object({\n id: z.string(),\n workspaceId: z.string(),\n workspaceName: z.string(),\n invitedUserId: z.string(),\n invitedEmail: z.string().optional(),\n invitedBy: z.string(),\n role: PermissionRoleSchema,\n status: z.enum(['pending', 'accepted', 'declined', 'cancelled']),\n createdAt: z.string(),\n expiresAt: z.string().optional(),\n});\nexport const CreateInvitationInputSchema = z.object({\n workspaceId: z.string(),\n workspaceName: z.string(),\n invitedUserId: z.string(),\n invitedEmail: z.string().optional(),\n invitedBy: z.string(),\n role: PermissionRoleSchema,\n expiresAt: z.string().optional(),\n});\n", "import { BaseRepository } from './base-repo.js';\nimport { v4 as uuidv4 } from 'uuid';\nexport class UserRepository extends BaseRepository {\n constructor() {\n super(...arguments);\n this.currentUserId = null;\n }\n /**\n * Create a new user with empty workspaceIds array\n */\n async create(data) {\n const handle = this.repo.create();\n const now = this.getTimestamp();\n const userId = uuidv4();\n handle.change((doc) => {\n doc.id = handle.documentId;\n doc.email = data.email || '';\n doc.name = data.name || '';\n if (data.avatar !== undefined)\n doc.avatar = data.avatar;\n if (data.googleId !== undefined)\n doc.googleId = data.googleId;\n doc.workspaceIds = []; // Initialize empty workspace list\n if (data.rootDocId !== undefined) {\n doc.rootDocId = data.rootDocId;\n }\n if (data.publicKey !== undefined)\n doc.publicKey = data.publicKey;\n doc.keyhiveEnabled = data.keyhiveEnabled || false;\n doc.createdAt = now;\n doc.lastActiveAt = now;\n doc.metadata = {\n type: 'user',\n createdAt: now,\n updatedAt: now,\n };\n });\n // Store mappings for lookups\n if (data.email)\n this.storeUserMapping(userId, handle.documentId, data.email);\n if (data.googleId)\n this.storeGoogleIdMapping(data.googleId, handle.documentId);\n return handle.documentId;\n }\n /**\n * Update an existing user\n */\n async update(id, updates) {\n const handle = await this.getHandle(id);\n const now = this.getTimestamp();\n handle.change((doc) => {\n if (updates.name !== undefined)\n doc.name = updates.name;\n if (updates.email !== undefined)\n doc.email = updates.email;\n if (updates.avatar !== undefined)\n doc.avatar = updates.avatar;\n if (updates.googleId !== undefined)\n doc.googleId = updates.googleId;\n if (updates.rootDocId !== undefined)\n doc.rootDocId = updates.rootDocId;\n if (updates.publicKey !== undefined)\n doc.publicKey = updates.publicKey;\n if (updates.keyhiveEnabled !== undefined)\n doc.keyhiveEnabled = updates.keyhiveEnabled;\n doc.lastActiveAt = now;\n doc.metadata.updatedAt = now;\n });\n return handle.documentId;\n }\n /**\n * Get a user by document ID\n */\n async get(id) {\n const handle = await this.getHandle(id);\n await handle.whenReady();\n const doc = handle.doc();\n if (!doc) {\n throw new Error(`User document not found: ${id}`);\n }\n return doc;\n }\n /**\n * Delete a user (soft delete by marking as inactive)\n */\n async delete(id) {\n // For now, we'll just mark the user as inactive\n // In the future, we might want to actually delete the document\n await this.update(id, {});\n }\n /**\n * List all users (placeholder - needs proper implementation with indexing)\n */\n async list() {\n // This would require proper indexing in a real implementation\n // For now, return empty array\n return [];\n }\n /**\n * Get user by email\n */\n async getUserByEmail(email) {\n const docId = this.getUserDocIdByEmail(email);\n if (!docId)\n return null;\n try {\n return await this.get(docId);\n }\n catch {\n return null;\n }\n }\n /**\n * Get user by Google ID\n */\n async getUserByGoogleId(googleId) {\n const docId = this.getUserDocIdByGoogleId(googleId);\n if (!docId)\n return null;\n try {\n return await this.get(docId);\n }\n catch {\n return null;\n }\n }\n /**\n * Set the current authenticated user\n */\n setCurrentUser(userId, docId) {\n this.currentUserId = userId;\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('currentUserId', userId);\n localStorage.setItem('currentUserDocId', docId);\n }\n }\n /**\n * Get the current authenticated user\n */\n async getCurrentUser() {\n if (typeof localStorage === 'undefined')\n return null;\n const docId = localStorage.getItem('currentUserDocId');\n if (!docId)\n return null;\n try {\n return await this.get(docId);\n }\n catch {\n return null;\n }\n }\n /**\n * Clear the current user session\n */\n clearCurrentUser() {\n this.currentUserId = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem('currentUserId');\n localStorage.removeItem('currentUserDocId');\n }\n }\n /**\n * Update user's last active timestamp\n */\n async updateLastActive(id) {\n const handle = await this.getHandle(id);\n const now = this.getTimestamp();\n handle.change((doc) => {\n doc.lastActiveAt = now;\n doc.metadata.updatedAt = now;\n });\n }\n /**\n * Add a workspace ID to the user's workspace list\n */\n async addWorkspaceId(userDocId, workspaceId) {\n const handle = await this.getHandle(userDocId);\n const now = this.getTimestamp();\n handle.change((doc) => {\n // Initialize array if missing (for existing docs without workspaceIds)\n if (!doc.workspaceIds) {\n doc.workspaceIds = [];\n }\n // Avoid duplicates\n if (!doc.workspaceIds.includes(workspaceId)) {\n doc.workspaceIds.push(workspaceId);\n }\n doc.lastActiveAt = now;\n doc.metadata.updatedAt = now;\n });\n }\n /**\n * Remove a workspace ID from the user's workspace list\n */\n async removeWorkspaceId(userDocId, workspaceId) {\n const handle = await this.getHandle(userDocId);\n const now = this.getTimestamp();\n handle.change((doc) => {\n if (doc.workspaceIds) {\n const index = doc.workspaceIds.indexOf(workspaceId);\n if (index !== -1) {\n doc.workspaceIds.splice(index, 1);\n }\n }\n doc.lastActiveAt = now;\n doc.metadata.updatedAt = now;\n });\n }\n /**\n * Get user's workspace IDs (with safe handling for missing field)\n */\n async getWorkspaceIds(userDocId) {\n const user = await this.get(userDocId);\n return user.workspaceIds || [];\n }\n // Private helper methods for user mapping storage\n storeUserMapping(userId, docId, email) {\n if (typeof localStorage === 'undefined')\n return;\n const emailKey = `user:email:${email}`;\n const userIdKey = `user:id:${userId}`;\n localStorage.setItem(emailKey, docId);\n localStorage.setItem(userIdKey, docId);\n }\n getUserDocIdByEmail(email) {\n if (typeof localStorage === 'undefined')\n return null;\n const key = `user:email:${email}`;\n const docId = localStorage.getItem(key);\n return docId;\n }\n getUserDocIdByGoogleId(googleId) {\n if (typeof localStorage === 'undefined')\n return null;\n const key = `user:googleId:${googleId}`;\n const docId = localStorage.getItem(key);\n return docId;\n }\n storeGoogleIdMapping(googleId, docId) {\n if (typeof localStorage === 'undefined')\n return;\n localStorage.setItem(`user:googleId:${googleId}`, docId);\n }\n /**\n * Resolve a user docId from an external user identifier stored in localStorage mapping\n * (e.g. legacy numeric IDs or UUIDs saved under `user:id:<externalId>`)\n */\n getDocIdByExternalId(externalId) {\n if (typeof localStorage === 'undefined')\n return null;\n // Try internal user-id mapping\n let docId = localStorage.getItem(`user:id:${externalId}`);\n if (docId)\n return docId;\n // Try googleId mapping\n docId = localStorage.getItem(`user:googleId:${externalId}`);\n if (docId)\n return docId;\n return null;\n }\n}\n", "import { InvitationRepository } from '../repos/invitation-repo.js';\nimport { PermissionService } from './permission-service.js';\nexport class InvitationService {\n constructor(repo) {\n this.repo = repo;\n this.invitationRepo = new InvitationRepository(repo);\n this.permissionService = new PermissionService(repo);\n }\n /**\n * Create a new workspace invitation\n */\n async createInvitation(input) {\n // Validate that the inviter has permission to invite\n const inviterPermission = await this.permissionService.checkPermission(input.workspaceId, input.invitedBy, 'admin');\n if (!inviterPermission.granted) {\n throw new Error('Only admins can invite users to workspaces');\n }\n // Check if user already has access\n const existingPermission = await this.permissionService.checkPermission(input.workspaceId, input.invitedUserId);\n if (existingPermission.granted) {\n throw new Error('User already has access to this workspace');\n }\n // Check for existing pending invitation\n const existingInvitations = await this.invitationRepo.getWorkspaceInvitations(input.workspaceId);\n const pendingInvitation = existingInvitations.find((i) => i.invitedUserId === input.invitedUserId && i.status === 'pending');\n if (pendingInvitation) {\n throw new Error('User already has a pending invitation to this workspace');\n }\n const invitationId = await this.invitationRepo.create({\n workspaceId: input.workspaceId,\n workspaceName: input.workspaceName,\n invitedUserId: input.invitedUserId,\n invitedEmail: input.invitedEmail,\n invitedBy: input.invitedBy,\n role: input.role,\n expiresAt: input.expiresAt,\n status: 'pending',\n });\n const invitation = await this.invitationRepo.get(invitationId);\n if (!invitation) {\n throw new Error('Failed to create invitation');\n }\n return {\n id: invitation.id,\n workspaceId: invitation.workspaceId,\n workspaceName: invitation.workspaceName,\n invitedUserId: invitation.invitedUserId,\n invitedBy: invitation.invitedBy,\n role: invitation.role,\n status: invitation.status,\n createdAt: invitation.createdAt,\n expiresAt: invitation.expiresAt,\n };\n }\n /**\n * Get all invitations for a user\n */\n async getUserInvitations(userId) {\n const invitations = await this.invitationRepo.getUserInvitations(userId);\n return invitations\n .filter((i) => {\n // Filter out expired invitations\n if (i.expiresAt && new Date(i.expiresAt) < new Date()) {\n return false;\n }\n return true;\n })\n .map((i) => ({\n id: i.id,\n workspaceId: i.workspaceId,\n workspaceName: i.workspaceName,\n invitedUserId: i.invitedUserId,\n invitedEmail: i.invitedEmail,\n invitedBy: i.invitedBy,\n role: i.role,\n status: i.status,\n createdAt: i.createdAt,\n expiresAt: i.expiresAt,\n }));\n }\n async getUserInvitationsByEmail(email) {\n const invitations = await this.invitationRepo.getUserInvitationsByEmail(email);\n return invitations\n .filter((i) => !(i.expiresAt && new Date(i.expiresAt) < new Date()))\n .map((i) => ({\n id: i.id,\n workspaceId: i.workspaceId,\n workspaceName: i.workspaceName,\n invitedUserId: i.invitedUserId,\n invitedEmail: i.invitedEmail,\n invitedBy: i.invitedBy,\n role: i.role,\n status: i.status,\n createdAt: i.createdAt,\n expiresAt: i.expiresAt,\n }));\n }\n /**\n * Get all invitations for a workspace\n */\n async getWorkspaceInvitations(workspaceId) {\n const invitations = await this.invitationRepo.getWorkspaceInvitations(workspaceId);\n return invitations.map((i) => ({\n id: i.id,\n workspaceId: i.workspaceId,\n workspaceName: i.workspaceName,\n invitedUserId: i.invitedUserId,\n invitedBy: i.invitedBy,\n role: i.role,\n status: i.status,\n createdAt: i.createdAt,\n expiresAt: i.expiresAt,\n }));\n }\n /**\n * Accept an invitation\n */\n async acceptInvitation(invitationId, userId) {\n const invitation = await this.invitationRepo.get(invitationId);\n if (!invitation) {\n throw new Error('Invitation not found');\n }\n if (invitation.invitedUserId !== userId) {\n throw new Error('This invitation is not for you');\n }\n if (invitation.status !== 'pending') {\n throw new Error('Invitation is no longer pending');\n }\n // Check if expired\n if (invitation.expiresAt && new Date(invitation.expiresAt) < new Date()) {\n throw new Error('Invitation has expired');\n }\n // Grant permission to the workspace\n await this.permissionService.grantAccess(invitation.workspaceId, userId, invitation.role, invitation.invitedBy);\n // Update invitation status\n await this.invitationRepo.update(invitationId, {\n status: 'accepted',\n });\n }\n /**\n * Decline an invitation\n */\n async declineInvitation(invitationId, userId) {\n const invitation = await this.invitationRepo.get(invitationId);\n if (!invitation) {\n throw new Error('Invitation not found');\n }\n if (invitation.invitedUserId !== userId) {\n throw new Error('This invitation is not for you');\n }\n if (invitation.status !== 'pending') {\n throw new Error('Invitation is no longer pending');\n }\n // Update invitation status\n await this.invitationRepo.update(invitationId, {\n status: 'declined',\n });\n }\n /**\n * Cancel an invitation (by the inviter or admin)\n */\n async cancelInvitation(invitationId, cancelledBy) {\n const invitation = await this.invitationRepo.get(invitationId);\n if (!invitation) {\n throw new Error('Invitation not found');\n }\n // Check if user has permission to cancel\n const permission = await this.permissionService.checkPermission(invitation.workspaceId, cancelledBy, 'admin');\n if (!permission.granted && invitation.invitedBy !== cancelledBy) {\n throw new Error('Only admins or the inviter can cancel invitations');\n }\n if (invitation.status !== 'pending') {\n throw new Error('Can only cancel pending invitations');\n }\n // Update invitation status\n await this.invitationRepo.update(invitationId, {\n status: 'cancelled',\n });\n }\n}\n", "import * as path from 'path';\nimport { RequirementCategory, MatchType } from '../types/specification-types.js';\nexport const REQUIREMENT_PATTERNS = {\n // Top-level categories: REQ-UX, REQ-BUS, etc.\n CATEGORY: /^REQ-([A-Z]+)(?:\\s*:|\\s*$)/,\n // Numbered requirements: REQ-UX-1, REQ-BUS-2, etc. \n NUMBERED: /^REQ-([A-Z]+)-(\\d+)(?:\\s*:|\\s*$)/,\n // Dotted sub-requirements: REQ-UX-1.1, REQ-UX-1.2.3, etc.\n DOTTED: /^REQ-([A-Z]+)-(\\d+(?:\\.\\d+)*)(?:\\s*:|\\s*$)/,\n // Full requirement pattern with optional description\n FULL_REQUIREMENT: /^REQ-([A-Z]+)(?:-(\\d+(?:\\.\\d+)*))?(?:\\s*:\\s*(.+))?$/,\n SPEC_COMMENT_LEGACY: /@spec\\s+(REQ-[A-Z]+-[0-9]+(?:\\.[0-9]+)*)\\s+(.+)/,\n SPEC_COMMENT_PREFIXED: /@spec\\s+([^/\\s]+(?:-[^/\\s]+)*)\\/(REQ-[A-Z]+-[0-9]+(?:\\.[0-9]+)*)\\s+(.+)/,\n SPEC_COMMENT_FULL: /@spec\\s+(?:([^/\\s]+(?:-[^/\\s]+)*)\\/)?(REQ-[A-Z]+-[0-9]+(?:\\.[0-9]+)*)(?:\\s+(.+))?/\n};\nexport const MARKDOWN_PATTERNS = {\n FRONTMATTER: /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n/,\n HEADER: /^(#{1,6})\\s+(.+)$/gm,\n CODE_BLOCK: /```[\\s\\S]*?```/g,\n INLINE_CODE: /`[^`]+`/g\n};\nexport function parseRequirementId(requirementId) {\n const match = requirementId.match(REQUIREMENT_PATTERNS.FULL_REQUIREMENT);\n if (!match) {\n return { category: null, isValid: false };\n }\n const [, categoryStr, numberPart] = match;\n // Validate category\n const category = Object.values(RequirementCategory).find(cat => cat === categoryStr) || null;\n if (!category) {\n return { category: null, isValid: false };\n }\n // Parse number part if present\n if (numberPart) {\n const dottedParts = numberPart.split('.');\n return {\n category,\n number: dottedParts[0],\n dotted: dottedParts.slice(1),\n isValid: true\n };\n }\n return { category, isValid: true };\n}\nexport function determineParentRequirement(requirementId) {\n const parsed = parseRequirementId(requirementId);\n if (!parsed.isValid || !parsed.number) {\n return undefined;\n }\n // For REQ-UX-1.2.3, parent is REQ-UX-1.2\n // For REQ-UX-1, parent is REQ-UX\n if (parsed.dotted && parsed.dotted.length > 0) {\n const parentDotted = parsed.dotted.slice(0, -1);\n if (parentDotted.length > 0) {\n return `REQ-${parsed.category}-${parsed.number}.${parentDotted.join('.')}`;\n }\n else {\n return `REQ-${parsed.category}-${parsed.number}`;\n }\n }\n else {\n return `REQ-${parsed.category}`;\n }\n}\nexport function extractSpecReferences(content, filePath) {\n const matches = [];\n const lines = content.split('\\n');\n lines.forEach((line, lineIndex) => {\n // Try prefixed format first (mod-core/auth-spec/REQ-UX-1 description)\n let match = line.match(REQUIREMENT_PATTERNS.SPEC_COMMENT_PREFIXED);\n if (match) {\n const [fullMatch, specPath, requirementId, description] = match;\n const columnStart = line.indexOf(fullMatch);\n matches.push({\n matchedText: fullMatch,\n requirementId,\n confidence: calculateConfidence(requirementId, true),\n sourceLocation: createSourceLocation(filePath, lineIndex + 1, columnStart, fullMatch.length, line),\n matchType: MatchType.EXACT,\n specPath,\n description\n });\n return;\n }\n // Try legacy format (REQ-UX-1 description)\n match = line.match(REQUIREMENT_PATTERNS.SPEC_COMMENT_LEGACY);\n if (match) {\n const [fullMatch, requirementId, description] = match;\n const columnStart = line.indexOf(fullMatch);\n matches.push({\n matchedText: fullMatch,\n requirementId,\n confidence: calculateConfidence(requirementId, false),\n sourceLocation: createSourceLocation(filePath, lineIndex + 1, columnStart, fullMatch.length, line),\n matchType: MatchType.PARTIAL, // Partial because no spec path disambiguation\n description\n });\n }\n });\n return matches;\n}\nfunction calculateConfidence(requirementId, hasSpecPath) {\n const parsed = parseRequirementId(requirementId);\n if (!parsed.isValid) {\n return 0.1;\n }\n let confidence = 0.7; // Base confidence for valid format\n // Boost confidence for directory disambiguation\n if (hasSpecPath) {\n confidence += 0.2;\n }\n // Boost confidence for well-formed hierarchical IDs\n if (parsed.dotted && parsed.dotted.length > 0) {\n confidence += 0.1;\n }\n return Math.min(confidence, 1.0);\n}\nfunction createSourceLocation(filePath, lineNumber, columnStart, matchLength, lineContent) {\n return {\n filePath,\n lineNumber,\n columnRange: {\n start: columnStart,\n end: columnStart + matchLength\n },\n surroundingContext: lineContent.trim()\n };\n}\nexport function extractFrontmatter(content) {\n const match = content.match(MARKDOWN_PATTERNS.FRONTMATTER);\n if (!match) {\n return { frontmatter: null, contentWithoutFrontmatter: content };\n }\n const frontmatterYaml = match[1];\n const contentWithoutFrontmatter = content.slice(match[0].length);\n try {\n // Simple YAML parsing for basic frontmatter - could be enhanced with yaml library\n const frontmatter = {};\n frontmatterYaml.split('\\n').forEach(line => {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n frontmatter[key] = value;\n }\n });\n return { frontmatter, contentWithoutFrontmatter };\n }\n catch (error) {\n return { frontmatter: null, contentWithoutFrontmatter: content };\n }\n}\nexport function extractSections(content) {\n const sections = [];\n const lines = content.split('\\n');\n let currentSection = null;\n lines.forEach((line, index) => {\n const headerMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headerMatch) {\n // Save previous section content\n if (currentSection) {\n sections.push(currentSection);\n }\n const level = headerMatch[1].length;\n const title = headerMatch[2].trim();\n const id = generateSectionId(title, level);\n currentSection = {\n id,\n title,\n content: '',\n level,\n lineNumber: index + 1\n };\n }\n else if (currentSection) {\n currentSection.content += line + '\\n';\n }\n });\n // Add the last section\n if (currentSection) {\n sections.push(currentSection);\n }\n return sections;\n}\nfunction generateSectionId(title, level) {\n const cleaned = title\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .substring(0, 50);\n return `section-${level}-${cleaned}`;\n}\nexport function normalizeSpecPath(specPath, workspaceRoot) {\n let absolute;\n let relative;\n if (path.isAbsolute(specPath)) {\n absolute = specPath;\n relative = path.relative(workspaceRoot, absolute);\n }\n else {\n relative = specPath;\n absolute = path.resolve(workspaceRoot, relative);\n }\n return { relative, absolute };\n}\nexport function findPotentialSpecFiles(requirementId, specsDirectory) {\n // Return empty array in browser environment\n if (typeof window !== 'undefined') {\n return [];\n }\n // This function requires synchronous file system operations\n // For now, return empty array and let async methods handle file discovery\n console.warn('findPotentialSpecFiles: Synchronous file operations not supported with ES modules');\n return [];\n}\n", "// Dynamic imports for Node.js-only features\nimport { RequirementCategory, SpecificationParseError } from '../types/specification-types.js';\nimport { extractFrontmatter, extractSections, extractSpecReferences, parseRequirementId, determineParentRequirement, normalizeSpecPath, REQUIREMENT_PATTERNS } from '../utils/spec-parser-utils.js';\nexport class SpecificationParserService {\n constructor(options = {}) {\n this.cache = {\n specifications: new Map(),\n specIndex: new Map(),\n lastIndexed: 0\n };\n const defaultWorkspaceRoot = options.workspaceRoot ||\n (typeof process !== 'undefined' && typeof process.cwd === 'function' ? process.cwd() : '/');\n this.options = {\n workspaceRoot: defaultWorkspaceRoot,\n specsDirectory: options.specsDirectory || '.mod/specs',\n cacheEnabled: options.cacheEnabled ?? true,\n cacheTtlMs: options.cacheTtlMs ?? 300000, // 5 minutes\n includeImplementationFiles: options.includeImplementationFiles ?? true\n };\n }\n async parseSpecification(content, filePath) {\n try {\n const cacheKey = this.generateCacheKey(content, filePath);\n if (this.options.cacheEnabled && this.cache.specifications.has(cacheKey)) {\n const cached = this.cache.specifications.get(cacheKey);\n if (Date.now() - cached.lastModified < this.options.cacheTtlMs) {\n return cached.parsed;\n }\n }\n const { frontmatter, contentWithoutFrontmatter } = extractFrontmatter(content);\n const metadata = this.createSpecMetadata(frontmatter, filePath);\n const sections = this.extractSpecSections(contentWithoutFrontmatter);\n const requirements = this.extractRequirements(contentWithoutFrontmatter);\n const parsed = {\n metadata,\n sections,\n requirements,\n implementationFiles: this.options.includeImplementationFiles\n ? this.extractImplementationFiles(contentWithoutFrontmatter)\n : undefined\n };\n // Cache the result\n if (this.options.cacheEnabled) {\n this.cache.specifications.set(cacheKey, {\n parsed,\n lastModified: Date.now(),\n fileSize: content.length\n });\n }\n return parsed;\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SpecificationParseError(`Failed to parse specification: ${errorMessage}`, filePath || '<unknown>', undefined, error instanceof Error ? error : undefined);\n }\n }\n extractRequirementIds(text, contextPath) {\n return extractSpecReferences(text, contextPath || '<inline>');\n }\n findSpecReferences(content, filePath) {\n const matches = this.extractRequirementIds(content, filePath);\n return matches.map(match => ({\n specPath: match.specPath,\n requirementId: match.requirementId,\n description: match.description || '',\n lineRange: {\n start: match.sourceLocation.lineNumber,\n end: match.sourceLocation.lineNumber\n },\n filePath: filePath || match.sourceLocation.filePath\n }));\n }\n async validateRequirementId(reqId, specPath) {\n const errors = [];\n const parsed = parseRequirementId(reqId);\n if (!parsed.isValid) {\n errors.push({\n code: 'INVALID_FORMAT',\n message: `Invalid requirement ID format: ${reqId}`,\n severity: 'error'\n });\n return {\n isValid: false,\n errors,\n suggestedCorrections: this.generateRequirementSuggestions(reqId)\n };\n }\n if (specPath) {\n const specExists = await this.doesSpecFileExist(specPath);\n if (!specExists) {\n errors.push({\n code: 'SPEC_NOT_FOUND',\n message: `Specification file not found: ${specPath}`,\n severity: 'error'\n });\n }\n }\n return {\n isValid: errors.length === 0,\n errors,\n confidence: errors.length === 0 ? 1.0 : 0.3\n };\n }\n async scanWorkspaceForTraces() {\n // Check if we're in a Node.js environment\n if (typeof window !== 'undefined') {\n console.warn('Trace scanning is not available in browser environment');\n return new Map();\n }\n const traceMap = new Map();\n try {\n const path = await import('path');\n // Scan common source directories for @spec comments\n const scanDirs = [\n 'src',\n 'packages',\n 'webview/src',\n 'tests'\n ];\n for (const dir of scanDirs) {\n const dirPath = path.join(this.options.workspaceRoot, dir);\n try {\n await this.scanDirectoryForTraces(dirPath, traceMap);\n }\n catch (error) {\n // Directory might not exist, continue scanning others\n continue;\n }\n }\n }\n catch (error) {\n console.warn('Failed to scan workspace for traces:', error);\n }\n return traceMap;\n }\n async scanDirectoryForTraces(dirPath, traceMap) {\n try {\n const fs = await import('fs/promises');\n const path = await import('path');\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n if (entry.isDirectory()) {\n // Skip node_modules and other irrelevant directories\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules' && entry.name !== 'dist') {\n await this.scanDirectoryForTraces(fullPath, traceMap);\n }\n }\n else if (entry.isFile() && this.shouldScanFile(entry.name)) {\n await this.scanFileForTraces(fullPath, traceMap);\n }\n }\n }\n catch (error) {\n // Directory access error, skip silently\n }\n }\n shouldScanFile(fileName) {\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.java', '.go', '.rs', '.cpp', '.c', '.h'];\n return extensions.some(ext => fileName.endsWith(ext));\n }\n async scanFileForTraces(filePath, traceMap) {\n try {\n const fs = await import('fs/promises');\n const content = await fs.readFile(filePath, 'utf-8');\n const references = this.findSpecReferences(content, filePath);\n for (const ref of references) {\n if (!traceMap.has(ref.requirementId)) {\n traceMap.set(ref.requirementId, []);\n }\n traceMap.get(ref.requirementId).push(ref);\n }\n }\n catch (error) {\n // File read error, skip silently\n }\n }\n getRequirementStatus(requirementId, traces = []) {\n if (traces.length === 0) {\n return 'pending';\n }\n // Simple heuristic: if traces exist, consider it in progress or completed\n // This could be enhanced with more sophisticated analysis\n if (traces.length >= 2) {\n return 'completed'; // Multiple implementations suggest completion\n }\n else {\n return 'in_progress'; // Single trace suggests work in progress\n }\n }\n async indexSpecifications() {\n // Skip indexing in browser environment\n if (typeof window !== 'undefined') {\n return;\n }\n try {\n const path = await import('path');\n const fs = await import('fs/promises');\n const specsDir = path.join(this.options.workspaceRoot, this.options.specsDirectory);\n // Since findPotentialSpecFiles is disabled, we'll skip file discovery for now\n // This method is primarily used for optimization anyway\n console.warn('Specification indexing disabled for ES module compatibility');\n }\n catch (error) {\n console.warn('Failed to index specifications:', error);\n }\n }\n extractSpecSections(content) {\n const rawSections = extractSections(content);\n const sections = [];\n const sectionMap = new Map();\n rawSections.forEach(raw => {\n const section = {\n id: raw.id,\n title: raw.title,\n content: raw.content.trim(),\n lineRange: { start: raw.lineNumber, end: raw.lineNumber + raw.content.split('\\n').length },\n level: raw.level,\n childSectionIds: []\n };\n sectionMap.set(section.id, section);\n sections.push(section);\n });\n sections.forEach(section => {\n const parent = this.findParentSection(section, sections);\n if (parent) {\n section.parentSectionId = parent.id;\n parent.childSectionIds.push(section.id);\n }\n });\n return sections;\n }\n extractRequirements(content) {\n const requirements = [];\n const lines = content.split('\\n');\n lines.forEach((line, index) => {\n const trimmed = line.trim();\n // Match requirement patterns - try multiple formats for markdown support\n let match = null;\n let requirementId = '';\n let description = '';\n // 1. Header format: ### REQ-UX-1: Title\n const headerMatch = trimmed.match(/^#+\\s*(REQ-[A-Z]+(?:-\\d+(?:\\.\\d+)*)?):?\\s*(.*)$/i);\n if (headerMatch) {\n requirementId = headerMatch[1];\n description = headerMatch[2];\n }\n else {\n // 2. Bold format: **REQ-UX-1.1: Title**\n const boldMatch = trimmed.match(/^\\*\\*(REQ-[A-Z]+(?:-\\d+(?:\\.\\d+)*)?):?\\s*(.*?)\\*\\*$/i);\n if (boldMatch) {\n requirementId = boldMatch[1];\n description = boldMatch[2];\n }\n else {\n // 3. List format: - REQ-UX-1.1.1: Title\n const listMatch = trimmed.match(/^-\\s+(REQ-[A-Z]+(?:-\\d+(?:\\.\\d+)*)?):?\\s*(.*)$/i);\n if (listMatch) {\n requirementId = listMatch[1];\n description = listMatch[2];\n }\n else {\n // 4. Raw format: REQ-UX-1: Title (original)\n const rawMatch = trimmed.match(REQUIREMENT_PATTERNS.FULL_REQUIREMENT);\n if (rawMatch) {\n const [fullMatch, categoryStr, numberPart, desc] = rawMatch;\n requirementId = fullMatch.split(':')[0].trim();\n description = desc || '';\n }\n }\n }\n }\n if (!requirementId)\n return;\n const parsed = parseRequirementId(requirementId);\n if (!parsed.isValid || !parsed.category)\n return;\n const requirement = {\n id: requirementId,\n category: parsed.category,\n title: description || '',\n description: description || '',\n children: [],\n lineRange: { start: index + 1, end: index + 1 }\n };\n const parentId = determineParentRequirement(requirement.id);\n if (parentId && parentId !== requirement.id) {\n requirement.parent = parentId;\n }\n requirements.push(requirement);\n });\n // Build parent-child relationships\n this.buildRequirementHierarchy(requirements);\n return requirements;\n }\n buildRequirementHierarchy(requirements) {\n const reqMap = new Map();\n // Index all requirements\n requirements.forEach(req => reqMap.set(req.id, req));\n // Build children arrays\n requirements.forEach(req => {\n if (req.parent) {\n const parent = reqMap.get(req.parent);\n if (parent && !parent.children.includes(req.id)) {\n parent.children.push(req.id);\n }\n }\n });\n }\n createSpecMetadata(frontmatter, filePath) {\n const normalizedPath = filePath\n ? normalizeSpecPath(filePath, this.options.workspaceRoot)\n : { relative: '<unknown>', absolute: '<unknown>' };\n return {\n title: frontmatter?.title || 'Untitled Specification',\n type: frontmatter?.type || 'specification',\n created: frontmatter?.created,\n version: frontmatter?.version,\n description: frontmatter?.description,\n filePath: normalizedPath\n };\n }\n findParentSection(section, sections) {\n if (section.level <= 1)\n return undefined;\n const sectionIndex = sections.indexOf(section);\n for (let i = sectionIndex - 1; i >= 0; i--) {\n if (sections[i].level === section.level - 1) {\n return sections[i];\n }\n }\n return undefined;\n }\n extractImplementationFiles(content) {\n const implementationFiles = [];\n const lines = content.split('\\n');\n // Look for implementation file references in specs\n lines.forEach(line => {\n const trimmed = line.trim();\n if (trimmed.startsWith('- ') && (trimmed.includes('.ts') || trimmed.includes('.js') || trimmed.includes('.md'))) {\n const file = trimmed.replace(/^-\\s*/, '').replace(/[`*]/g, '').trim();\n if (file && !implementationFiles.includes(file)) {\n implementationFiles.push(file);\n }\n }\n });\n return implementationFiles;\n }\n async doesSpecFileExist(specPath) {\n // Skip file existence check in browser environment\n if (typeof window !== 'undefined') {\n return false;\n }\n try {\n const path = await import('path');\n const fs = await import('fs/promises');\n const fullPath = path.join(this.options.workspaceRoot, this.options.specsDirectory, specPath);\n await fs.access(fullPath);\n return true;\n }\n catch {\n return false;\n }\n }\n generateRequirementSuggestions(reqId) {\n const suggestions = [];\n // Basic format suggestions\n if (!reqId.startsWith('REQ-')) {\n suggestions.push(`REQ-UX-1 (add REQ- prefix)`);\n }\n // Category suggestions\n Object.values(RequirementCategory).forEach(category => {\n suggestions.push(`REQ-${category}-1`);\n });\n return suggestions.slice(0, 5); // Limit suggestions\n }\n generateCacheKey(content, filePath) {\n // Simple fallback for browser environments\n if (typeof window !== 'undefined') {\n return `${filePath || 'inline'}:${content.length}-${content.slice(0, 10)}`;\n }\n // Use crypto in Node.js\n try {\n const crypto = require('crypto');\n const key = `${filePath || 'inline'}:${crypto.createHash('md5').update(content).digest('hex')}`;\n return key;\n }\n catch (error) {\n // Fallback if crypto not available\n return `${filePath || 'inline'}:${content.length}-${content.slice(0, 10)}`;\n }\n }\n async refreshIndex() {\n this.cache.specIndex.clear();\n await this.indexSpecifications();\n }\n async getSpecification(specPath) {\n // Skip file loading in browser environment\n if (typeof window !== 'undefined') {\n return null;\n }\n try {\n const path = await import('path');\n const fs = await import('fs/promises');\n const fullPath = path.join(this.options.workspaceRoot, this.options.specsDirectory, specPath);\n const content = await fs.readFile(fullPath, 'utf-8');\n return await this.parseSpecification(content, fullPath);\n }\n catch (error) {\n return null;\n }\n }\n // Get indexed specifications for quick access\n getSpecificationIndex() {\n return new Map(this.cache.specIndex);\n }\n // Clear cache for memory management\n clearCache() {\n this.cache.specifications.clear();\n this.cache.specIndex.clear();\n this.cache.lastIndexed = 0;\n }\n}\n", "import { stringSimilarity } from \"./search-utils.js\";\n// Helper function to find documents\nexport async function findDocumentByType(repo, type, options = {}) {\n // console.log(`[findDocumentByType] Starting search for document type: ${type}, options:`, options)\n try {\n // TODO: Replace with actual method to get all document IDs from repo\n // This is a placeholder and must be implemented based on your repo/store\n let documentIds = repo.getAllDocumentIds ? await repo.getAllDocumentIds() : [];\n // Fallback: derive candidate ids from workspace fileRefs when available\n if ((!documentIds || documentIds.length === 0) && options.workspaceId) {\n try {\n const { WorkspaceService } = await import('../services/workspace-service.js');\n const wsService = new WorkspaceService(repo);\n const fileRefs = await wsService.getBranchAwareFileRefs(options.workspaceId);\n const idsFromWorkspace = (fileRefs || []).map((fr) => fr.id);\n const extra = [];\n if (options.activeTab && typeof options.activeTab === 'string')\n extra.push(options.activeTab);\n if (options.preferredId)\n extra.push(options.preferredId);\n const set = new Set([...idsFromWorkspace, ...extra].filter(Boolean));\n documentIds = Array.from(set);\n }\n catch (e) {\n // ignore workspace fallback errors\n }\n }\n // console.log(`[findDocumentByType] Found ${documentIds.length} total documents in store`)\n const matches = [];\n // Improved document availability check\n const checkDocumentAvailability = async (docId) => {\n try {\n const handle = await repo.find(docId);\n if (!handle) {\n // console.log(`[findDocumentByType] No handle found for document: ${docId}`)\n return { doc: null, isAvailable: false };\n }\n // Safely check if document is ready\n let isReady = false;\n try {\n if (typeof handle.isReady === 'function') {\n isReady = handle.isReady();\n }\n // If not ready, try a few more times with delay\n if (!isReady) {\n for (let i = 0; i < 3; i++) {\n await new Promise(resolve => setTimeout(resolve, 300));\n if (typeof handle.isReady === 'function' && handle.isReady()) {\n isReady = true;\n break;\n }\n }\n }\n }\n catch (e) {\n // console.log(`[findDocumentByType] Error checking readiness for ${docId}:`, e)\n return { doc: null, isAvailable: false };\n }\n if (!isReady) {\n // console.log(`[findDocumentByType] Document ${docId} not ready after retries`)\n return { doc: null, isAvailable: false };\n }\n // Try to get document content\n try {\n const doc = handle.doc();\n if (!doc) {\n // console.log(`[findDocumentByType] Document ${docId} exists but content is null`)\n return { doc: null, isAvailable: false };\n }\n return { doc, isAvailable: true };\n }\n catch (e) {\n console.error(`[findDocumentByType] Error accessing document content for ${docId}:`, e);\n return { doc: null, isAvailable: false };\n }\n }\n catch (e) {\n console.error(`[findDocumentByType] Error finding document ${docId}:`, e);\n return { doc: null, isAvailable: false };\n }\n };\n // First try to find by active tab with retries\n if (options.activeTab) {\n // console.log(`[findDocumentByType] Trying to find by active tab: ${options.activeTab}`)\n // Special case: if activeTab is a DocumentId, check it directly first\n if (typeof options.activeTab !== 'string' || options.activeTab.includes('-')) {\n try {\n const activeTabId = options.activeTab;\n const { doc, isAvailable } = await checkDocumentAvailability(activeTabId);\n if (isAvailable && doc && doc?.metadata?.type === type) {\n // console.log(`[findDocumentByType] Found document by direct active tab ID: ${activeTabId}`)\n return { doc, documentId: activeTabId };\n }\n }\n catch (e) {\n // console.log(`[findDocumentByType] Error checking direct active tab:`, e)\n }\n }\n // Then search through all documents\n for (const documentId of documentIds) {\n const { doc, isAvailable } = await checkDocumentAvailability(documentId);\n if (isAvailable && doc) {\n const docTyped = doc;\n // Skip if wrong document type\n if (docTyped?.metadata?.type !== type) {\n continue;\n }\n // Check if title matches active tab name \n if (docTyped.title === options.activeTab || documentId === options.activeTab) {\n // console.log(`[findDocumentByType] Found document by active tab: ${documentId}`)\n return { doc, documentId };\n }\n }\n }\n // console.log(`[findDocumentByType] No document found by active tab, trying by title`)\n }\n // Then try to find by title or collect all matches\n // Direct preferredId check (even if documentIds is empty)\n if (options.preferredId) {\n try {\n const direct = await checkDocumentAvailability(options.preferredId);\n if (direct.isAvailable && direct.doc && direct.doc?.metadata?.type === type) {\n return { doc: direct.doc, documentId: options.preferredId };\n }\n }\n catch { }\n }\n for (const documentId of documentIds) {\n const { doc, isAvailable } = await checkDocumentAvailability(documentId);\n if (isAvailable && doc) {\n const docTyped = doc;\n // Skip if wrong document type\n if (docTyped?.metadata?.type !== type) {\n continue;\n }\n // Check for preferred ID match\n if (options.preferredId && documentId === options.preferredId) {\n // console.log(`[findDocumentByType] Found document by preferred ID: ${documentId}`)\n return { doc, documentId };\n }\n // Calculate title similarity if title is provided\n let similarity = 0;\n if (options.title && docTyped.title) {\n try {\n similarity = stringSimilarity(docTyped.title, options.title);\n // console.log(`[findDocumentByType] Title similarity for ${documentId}: ${similarity}, threshold: ${options.similarityThreshold || 0.8}`)\n if (similarity >= (options.similarityThreshold || 0.8)) {\n // console.log(`[findDocumentByType] Found document by title similarity (${similarity}): ${documentId}`)\n return { doc, documentId };\n }\n }\n catch (e) {\n console.error(`[findDocumentByType] Error calculating similarity for ${documentId}:`, e);\n }\n }\n // Add to matches collection for potential fallback\n matches.push({ doc, documentId, similarity });\n }\n }\n // If we have matches, sort by similarity and return the best match\n if (matches.length > 0) {\n matches.sort((a, b) => b.similarity - a.similarity);\n // console.log(`[findDocumentByType] Returning best match with similarity ${matches[0].similarity}: ${matches[0].documentId}`)\n return {\n doc: matches[0].doc,\n documentId: matches[0].documentId,\n };\n }\n // console.log('[findDocumentByType] No matching documents found')\n return null;\n }\n catch (error) {\n console.error('[findDocumentByType] Unexpected error:', error);\n return null;\n }\n}\n/**\n * Utility function to test if a document is accessible\n * Helps diagnose issues with document loading\n */\nexport async function validateDocumentAccess(repo, documentId) {\n // console.log(`[validateDocumentAccess] Testing access to document: ${documentId}`)\n const errors = [];\n let document = null;\n try {\n // Step 1: Check if document handle can be found\n // console.log(`[validateDocumentAccess] Step 1: Finding document handle...`)\n const handle = await repo.find(documentId);\n if (!handle) {\n return {\n success: false,\n message: `Document handle not found for ID: ${documentId}`,\n errors: ['Document handle not found']\n };\n }\n // console.log(`[validateDocumentAccess] Document handle found`)\n // Step 2: Check if document is ready\n // console.log(`[validateDocumentAccess] Step 2: Checking if document is ready...`)\n if (typeof handle.isReady !== 'function') {\n errors.push('Document handle missing isReady method');\n // console.log(`[validateDocumentAccess] Document handle missing isReady method`)\n }\n else {\n const isReady = handle.isReady();\n // console.log(`[validateDocumentAccess] Document ready status: ${isReady}`)\n if (!isReady) {\n errors.push('Document not ready');\n }\n }\n // Step 3: Try to access document content\n // console.log(`[validateDocumentAccess] Step 3: Trying to access document content...`)\n try {\n document = handle.doc();\n if (!document) {\n errors.push('Document content is null or undefined');\n // console.log(`[validateDocumentAccess] Document content is null or undefined`)\n }\n else {\n // console.log(`[validateDocumentAccess] Successfully accessed document content`)\n // Step 4: Check for expected properties\n // console.log(`[validateDocumentAccess] Step 4: Checking document properties...`)\n if (!document.metadata) {\n errors.push('Document missing metadata property');\n // console.log(`[validateDocumentAccess] Document missing metadata property`)\n }\n if (!document.metadata?.type) {\n errors.push('Document missing metadata.type property');\n // console.log(`[validateDocumentAccess] Document missing metadata.type property`)\n }\n }\n }\n catch (e) {\n const docError = e;\n errors.push(`Error accessing document content: ${docError.message}`);\n console.error(`[validateDocumentAccess] Error accessing document content:`, docError);\n }\n // Build return value\n if (errors.length === 0) {\n return {\n success: true,\n message: 'Document is valid and accessible',\n document\n };\n }\n else {\n return {\n success: false,\n message: `Document has access issues: ${errors.join(', ')}`,\n document,\n errors\n };\n }\n }\n catch (e) {\n const error = e;\n console.error(`[validateDocumentAccess] Unexpected error:`, error);\n return {\n success: false,\n message: `Unexpected error accessing document: ${error.message}`,\n errors: [`Unexpected error: ${error.message}`]\n };\n }\n}\n", "import { WorkspaceService } from \"../services/workspace-service.js\";\nimport { BranchService } from \"../services/branch-service.js\";\nlet eventSequence = 0;\nconst sanitizeDetails = (value) => {\n if (!value || typeof value !== \"object\")\n return undefined;\n try {\n const entries = Object.entries(value).filter(([, v]) => v === null ||\n [\"string\", \"number\", \"boolean\"].includes(typeof v) ||\n Array.isArray(v) ||\n (typeof v === \"object\" && v !== null)).map(([key, v]) => {\n if (typeof v === \"object\" && v !== null) {\n try {\n return [key, JSON.parse(JSON.stringify(v))];\n }\n catch {\n return [key, String(v)];\n }\n }\n return [key, v];\n });\n return Object.fromEntries(entries);\n }\n catch {\n return undefined;\n }\n};\nexport const createDebugSyncEvent = (eventType, info = {}) => {\n const timestamp = Date.now();\n const seq = (eventSequence = (eventSequence + 1) % 1000000);\n return {\n id: `${timestamp}-${seq}`,\n eventType,\n timestamp,\n documentId: info.documentId,\n peerId: info.peerId,\n target: info.target,\n details: sanitizeDetails(info.details),\n docType: info.docType,\n };\n};\nexport const identifyDocumentType = async (repo, documentId) => {\n try {\n const handle = await repo.find(documentId);\n if (!handle)\n return 'unknown';\n // Don't wait for ready - just peek at current state\n const doc = handle.doc();\n if (!doc || typeof doc !== 'object')\n return 'unknown';\n const metadata = doc.metadata;\n if (metadata && typeof metadata.type === 'string') {\n return metadata.type;\n }\n // Check for specific document structures\n if (doc.branches)\n return 'branches-doc';\n if (doc.items)\n return 'thread';\n if (doc.entryIds)\n return 'change-log-doc';\n if (doc.entries)\n return 'change-log-doc';\n if (doc.fileRefs)\n return 'workspace';\n if (doc.workspaceId && doc.parentBranchId !== undefined)\n return 'branch';\n if (doc.tasks)\n return 'tasks-doc';\n if (doc.$schema) {\n const schema = doc.$schema;\n if (typeof schema === 'string') {\n return schema.split('/').pop() || 'unknown';\n }\n }\n return 'unknown';\n }\n catch (err) {\n return 'error';\n }\n};\nexport const formatHead = (raw, maxLength = 12) => {\n if (!raw)\n return \"\";\n const normalized = Array.isArray(raw) ? raw[0] : raw;\n if (typeof normalized !== \"string\") {\n try {\n return JSON.stringify(normalized);\n }\n catch {\n return String(normalized);\n }\n }\n if (normalized.length <= maxLength)\n return normalized;\n return `${normalized.slice(0, maxLength)}\u2026`;\n};\nexport const isSyncDebugEnabled = (opts = {}) => {\n const { nodeEnv, flag } = opts;\n if (typeof flag === \"string\") {\n if (flag === \"1\" || flag.toLowerCase() === \"true\")\n return true;\n }\n else if (flag === true) {\n return true;\n }\n return nodeEnv !== \"production\" && nodeEnv !== \"prod\";\n};\nexport const emptyDebugSnapshot = () => ({\n workspaces: [],\n branches: [],\n files: [],\n fileHeads: [],\n});\nlet nodeFsCache;\nlet nodePathCache;\nconst dynamicImport = new Function(\"moduleName\", \"return import(moduleName);\");\nconst ensureNodeModules = async () => {\n if (typeof window !== \"undefined\")\n return null;\n if (nodeFsCache && nodePathCache) {\n return { fs: nodeFsCache, path: nodePathCache };\n }\n try {\n const [fsMod, pathMod] = await Promise.all([\n dynamicImport(\"node:fs/promises\"),\n dynamicImport(\"node:path\"),\n ]);\n nodeFsCache = fsMod;\n nodePathCache = pathMod;\n return { fs: fsMod, path: pathMod };\n }\n catch {\n return null;\n }\n};\nconst listDocumentIdsFromNodeStorage = async () => {\n const modules = await ensureNodeModules();\n if (!modules)\n return [];\n const { fs, path } = modules;\n let levelOne;\n const baseDir = path.resolve(\".automerge-data\");\n try {\n levelOne = await fs.readdir(baseDir, { withFileTypes: true });\n }\n catch {\n return [];\n }\n const results = [];\n for (const entry of levelOne) {\n if (!entry.isDirectory())\n continue;\n const prefix = entry.name;\n let levelTwo;\n try {\n levelTwo = await fs.readdir(path.join(baseDir, prefix), { withFileTypes: true });\n }\n catch {\n continue;\n }\n for (const sub of levelTwo) {\n if (!sub.isDirectory())\n continue;\n results.push(`${prefix}${sub.name}`);\n }\n }\n return results;\n};\nconst readWorkspaceIdsFromModConfig = async () => {\n const modules = await ensureNodeModules();\n if (!modules)\n return [];\n const { fs, path } = modules;\n const seen = new Set();\n const candidates = [\".mod/config.json\", \".mod/workspaces.json\"];\n for (const rel of candidates) {\n try {\n const filePath = path.resolve(rel);\n const data = await fs.readFile(filePath, { encoding: \"utf8\" });\n const json = JSON.parse(data);\n if (json && typeof json.workspaceId === \"string\" && json.workspaceId.trim().length > 0) {\n seen.add(json.workspaceId.trim());\n }\n if (Array.isArray(json?.workspaces)) {\n for (const entry of json.workspaces) {\n const id = typeof entry === \"string\"\n ? entry\n : typeof entry?.id === \"string\"\n ? entry.id\n : typeof entry?.workspaceId === \"string\"\n ? entry.workspaceId\n : undefined;\n if (id && id.trim().length > 0) {\n seen.add(id.trim());\n }\n }\n }\n }\n catch {\n // ignore missing/invalid files\n }\n }\n return Array.from(seen.values());\n};\nconst readWorkspaceRefsFromBrowser = async (repo) => {\n if (typeof window === \"undefined\")\n return [];\n try {\n const rootDocId = window.localStorage?.getItem(\"rootDocId\");\n if (!rootDocId || rootDocId.trim().length === 0)\n return [];\n const appRoot = await loadDocById(repo, rootDocId.trim());\n const workspaces = Array.isArray(appRoot?.workspaces) ? appRoot.workspaces : [];\n const refs = [];\n for (const entry of workspaces) {\n const id = entry?.id ?? entry?.workspaceId ?? entry;\n if (!id)\n continue;\n refs.push({\n id,\n title: entry?.title ?? entry?.name ?? \"\",\n createdAt: entry?.createdAt ?? new Date().toISOString(),\n updatedAt: entry?.updatedAt ?? new Date().toISOString(),\n });\n }\n return refs;\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] failed to read app root\", err);\n return [];\n }\n};\nconst listDocumentIdsFromIndexedDb = async () => {\n if (typeof window === \"undefined\")\n return [];\n try {\n const { IndexedDBStorageAdapter } = await import(\"@automerge/automerge-repo-storage-indexeddb\");\n const adapter = new IndexedDBStorageAdapter();\n const chunks = await adapter.loadRange([]);\n const ids = new Set();\n for (const chunk of chunks) {\n const key = chunk?.key;\n const docId = Array.isArray(key) ? key[0] : undefined;\n if (typeof docId === \"string\" && docId.length > 0) {\n ids.add(docId);\n }\n }\n return Array.from(ids.values());\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] indexeddb scan failed\", err);\n return [];\n }\n};\nconst loadDocFromHandle = async (handle) => {\n if (!handle || typeof handle !== \"object\")\n return null;\n try {\n if (typeof handle.whenReady === \"function\") {\n try {\n await handle.whenReady();\n }\n catch {\n /* ignore */\n }\n }\n if (typeof handle.doc === \"function\") {\n const doc = handle.doc();\n if (!doc || typeof doc !== \"object\")\n return null;\n return doc;\n }\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] handle load failed\", {\n documentId: handle?.documentId,\n err,\n });\n }\n return null;\n};\nconst loadDocById = async (repo, documentId) => {\n try {\n const handle = await repo.find(documentId);\n return await loadDocFromHandle(handle);\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] repo.find failed\", { documentId, err });\n return null;\n }\n};\nconst fallbackWorkspaceRefs = async (repo, workspaceService) => {\n const discovered = new Map();\n const seenDocIds = new Set();\n const addRef = (ref) => {\n if (!ref || !ref.id)\n return;\n const idStr = String(ref.id);\n if (discovered.has(idStr))\n return;\n discovered.set(idStr, {\n id: ref.id,\n title: ref.title ?? \"\",\n createdAt: ref.createdAt ?? new Date().toISOString(),\n updatedAt: ref.updatedAt ?? new Date().toISOString(),\n });\n };\n const addWorkspaceFromDoc = (workspaceDoc, docId) => {\n if (!workspaceDoc)\n return;\n const id = (workspaceDoc.id ?? docId);\n if (!id)\n return;\n const idStr = String(id);\n if (discovered.has(idStr))\n return;\n discovered.set(idStr, {\n id,\n title: workspaceDoc.title ?? workspaceDoc.metadata?.name ?? \"\",\n createdAt: workspaceDoc.metadata?.createdAt ?? new Date().toISOString(),\n updatedAt: workspaceDoc.metadata?.updatedAt ?? new Date().toISOString(),\n });\n };\n const inspectDoc = (doc, docId) => {\n if (!doc || typeof doc !== \"object\")\n return;\n const metadata = doc.metadata;\n const docType = metadata?.type || doc.type;\n if (docType === \"workspace\") {\n const entry = {\n id: (doc.id ?? docId),\n title: doc.title ?? metadata?.name ?? \"\",\n createdAt: metadata?.createdAt ?? new Date().toISOString(),\n updatedAt: metadata?.updatedAt ?? new Date().toISOString(),\n };\n addRef(entry);\n return;\n }\n if (docType === \"appRoot\" && Array.isArray(doc.workspaces)) {\n for (const ref of doc.workspaces) {\n addRef(ref);\n }\n }\n };\n if (typeof window !== \"undefined\") {\n const browserRefs = await readWorkspaceRefsFromBrowser(repo);\n for (const ref of browserRefs) {\n addRef(ref);\n seenDocIds.add(String(ref.id));\n }\n }\n if (typeof window === \"undefined\") {\n const configIds = await readWorkspaceIdsFromModConfig();\n for (const workspaceId of configIds) {\n const idStr = workspaceId.trim();\n if (!idStr || discovered.has(idStr))\n continue;\n try {\n const workspaceDoc = await workspaceService.getWorkspace(idStr);\n addWorkspaceFromDoc(workspaceDoc, idStr);\n seenDocIds.add(idStr);\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] config workspace load failed\", {\n workspaceId: idStr,\n err,\n });\n }\n }\n if (discovered.size > 0) {\n return Array.from(discovered.values());\n }\n }\n const rawHandles = repo?.handles;\n const handleValues = rawHandles\n ? Array.isArray(rawHandles)\n ? rawHandles\n : Object.values(rawHandles)\n : [];\n for (const handle of handleValues) {\n const docId = handle?.documentId ? String(handle.documentId) : undefined;\n if (docId) {\n seenDocIds.add(docId);\n }\n const doc = await loadDocFromHandle(handle);\n if (doc && docId && typeof doc === \"object\" && !(\"id\" in doc)) {\n try {\n doc.id = docId;\n }\n catch { }\n }\n inspectDoc(doc, docId);\n }\n if (discovered.size > 0) {\n return Array.from(discovered.values());\n }\n if (typeof window !== \"undefined\") {\n const docIds = await listDocumentIdsFromIndexedDb();\n for (const docId of docIds) {\n if (seenDocIds.has(docId))\n continue;\n seenDocIds.add(docId);\n const doc = await loadDocById(repo, docId);\n if (doc && docId && typeof doc === \"object\" && !(\"id\" in doc)) {\n try {\n doc.id = docId;\n }\n catch { }\n }\n inspectDoc(doc, docId);\n // DO NOT call getWorkspace() on every document - it triggers ensureBranchingSetup\n // Only inspectDoc() is enough to identify workspaces\n }\n if (discovered.size > 0) {\n return Array.from(discovered.values());\n }\n }\n if (typeof window === \"undefined\") {\n const docIds = await listDocumentIdsFromNodeStorage();\n for (const docId of docIds) {\n if (seenDocIds.has(docId))\n continue;\n seenDocIds.add(docId);\n const doc = await loadDocById(repo, docId);\n if (doc && docId && typeof doc === \"object\" && !(\"id\" in doc)) {\n try {\n doc.id = docId;\n }\n catch { }\n }\n inspectDoc(doc, docId);\n // DO NOT call getWorkspace() on every document - it triggers ensureBranchingSetup\n // Only inspectDoc() is enough to identify workspaces\n if (discovered.size > 0 && doc && doc?.metadata?.type === \"appRoot\") {\n // If app root provided workspace refs, no need to keep scanning endlessly\n if (doc.workspaces?.length) {\n break;\n }\n }\n }\n }\n return Array.from(discovered.values());\n};\nexport const collectDebugSnapshot = async (repo) => {\n const workspaceService = new WorkspaceService(repo);\n const branchService = new BranchService(repo);\n const workspaces = [];\n const branches = [];\n const files = [];\n const fileHeads = [];\n const workspaceRefMap = new Map();\n try {\n const primary = await workspaceService.getAllWorkspaces();\n console.log(\"[collectDebugSnapshot] getAllWorkspaces returned\", primary?.length ?? 0, \"workspaces\");\n for (const entry of primary ?? []) {\n if (!entry?.id)\n continue;\n const idStr = String(entry.id);\n if (!workspaceRefMap.has(idStr)) {\n workspaceRefMap.set(idStr, entry);\n }\n }\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] getAllWorkspaces failed\", err);\n }\n if (workspaceRefMap.size === 0) {\n console.log(\"[collectDebugSnapshot] Using fallback workspace discovery\");\n const fallbackRefs = await fallbackWorkspaceRefs(repo, workspaceService);\n console.log(\"[collectDebugSnapshot] Fallback found\", fallbackRefs.length, \"workspaces\");\n for (const entry of fallbackRefs) {\n if (!entry?.id)\n continue;\n const idStr = String(entry.id);\n if (!workspaceRefMap.has(idStr)) {\n workspaceRefMap.set(idStr, entry);\n }\n }\n }\n console.log(\"[collectDebugSnapshot] Processing\", workspaceRefMap.size, \"workspaces\");\n for (const entry of workspaceRefMap.values()) {\n const workspaceId = entry.id;\n const workspaceIdStr = String(workspaceId);\n workspaces.push({\n id: workspaceIdStr,\n name: entry.title ? String(entry.title) : undefined,\n });\n console.log(\"[collectDebugSnapshot] Added workspace to list:\", workspaceIdStr, entry.title);\n let workspaceDoc = null;\n try {\n workspaceDoc = await workspaceService.getWorkspace(workspaceId);\n console.log(\"[collectDebugSnapshot] Loaded workspace doc:\", workspaceIdStr, \"branchesDocId:\", workspaceDoc?.branchesDocId);\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] failed to get workspace\", workspaceIdStr, err);\n continue;\n }\n const branchesDocId = workspaceDoc?.branchesDocId;\n if (!branchesDocId) {\n console.warn(\"[collectDebugSnapshot] Workspace has no branchesDocId:\", workspaceIdStr);\n continue;\n }\n let branchList = [];\n try {\n branchList = await branchService.getBranchesForWorkspace(branchesDocId);\n console.log(\"[collectDebugSnapshot] Loaded\", branchList.length, \"branches for workspace:\", workspaceIdStr);\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] failed to load branches\", { workspaceId: workspaceIdStr, err });\n branchList = [];\n }\n for (const branch of branchList) {\n const branchId = branch.id;\n const branchIdStr = String(branchId);\n branches.push({\n id: branchIdStr,\n name: branch.name ? String(branch.name) : undefined,\n workspaceId: workspaceIdStr,\n hasThread: Boolean(branch.threadId),\n });\n console.log(\"[collectDebugSnapshot] Processing branch:\", branchIdStr, branch.name);\n let fileRefs = [];\n try {\n fileRefs = await workspaceService.getBranchAwareFileRefs(workspaceId, { branchId });\n console.log(\"[collectDebugSnapshot] Loaded\", fileRefs.length, \"files for branch:\", branchIdStr);\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] failed to load file refs\", {\n workspaceId: workspaceIdStr,\n branchId: branchIdStr,\n err,\n });\n fileRefs = [];\n }\n for (const file of fileRefs) {\n const fileId = file.id;\n const fileIdStr = String(fileId);\n files.push({\n id: fileIdStr,\n name: file.name ? String(file.name) : undefined,\n workspaceId: workspaceIdStr,\n branchId: branchIdStr,\n });\n try {\n const head = await branchService.getFileHead(branchId, fileId, branchesDocId);\n if (typeof head === \"string\" && head.trim().length > 0) {\n fileHeads.push({ branchId: branchIdStr, fileId: fileIdStr, head });\n }\n }\n catch (err) {\n console.warn(\"[collectDebugSnapshot] failed to read file head\", {\n workspaceId: workspaceIdStr,\n branchId: branchIdStr,\n fileId: fileIdStr,\n err,\n });\n }\n }\n }\n }\n console.log(\"[collectDebugSnapshot] Final counts:\", {\n workspaces: workspaces.length,\n branches: branches.length,\n files: files.length,\n fileHeads: fileHeads.length,\n });\n return { workspaces, branches, files, fileHeads };\n};\n", "import { WorkspaceService } from '../services/workspace-service.js';\nconst DEFAULT_CONTENT_LIMIT = 3000;\nconst DEFAULT_SUMMARY_LIMIT = 800;\nconst MISSING_PRIMER_ID = 'missing-mod-md';\nexport async function prepareWorkspaceDefaults(options) {\n const { repo, workspace, activeBranchId, maxContentLength = DEFAULT_CONTENT_LIMIT, maxSummaryLength = DEFAULT_SUMMARY_LIMIT, } = options;\n const workspaceDefaults = {};\n try {\n const wsService = new WorkspaceService(repo);\n let fileRefs = [];\n try {\n fileRefs = await wsService.getBranchAwareFileRefs(workspace.id, { branchId: activeBranchId ?? undefined });\n }\n catch (error) {\n console.warn('[prepareWorkspaceDefaults] Failed to fetch branch-aware file refs, falling back to workspace snapshot:', error);\n fileRefs = workspace.fileRefs || [];\n }\n const candidates = selectModPrimerCandidates(fileRefs, workspace.folders || []);\n if (!candidates.length) {\n workspaceDefaults.modMd = {\n documentId: MISSING_PRIMER_ID,\n title: 'mod.md',\n status: 'missing',\n message: 'Workspace does not contain mod.md. Create `mod.md` inside the `.mod/` folder to share expectations with agents.',\n };\n return workspaceDefaults;\n }\n const preferred = candidates[0];\n const primer = await buildPrimerPayload({\n repo,\n fileRef: preferred,\n maxContentLength,\n maxSummaryLength,\n });\n workspaceDefaults.modMd = primer;\n }\n catch (error) {\n console.error('[prepareWorkspaceDefaults] Failed to prepare workspace defaults:', error);\n workspaceDefaults.modMd = {\n documentId: MISSING_PRIMER_ID,\n title: 'mod.md',\n status: 'placeholder',\n message: 'Unable to load mod.md due to an unexpected error.',\n };\n }\n return workspaceDefaults;\n}\nfunction selectModPrimerCandidates(fileRefs, folders) {\n if (!Array.isArray(fileRefs) || fileRefs.length === 0)\n return [];\n const folderMap = new Map();\n for (const folder of folders) {\n if (folder?.id)\n folderMap.set(String(folder.id), folder);\n }\n const computeFolderPath = (folderId) => {\n if (!folderId)\n return undefined;\n const names = [];\n let current = folderId;\n const guard = new Set();\n while (current) {\n if (guard.has(current))\n break;\n guard.add(current);\n const folder = folderMap.get(String(current));\n if (!folder)\n break;\n names.push(folder.name);\n current = folder.parentId;\n }\n return names.length ? names.reverse().join('/') : undefined;\n };\n const candidates = [];\n for (const ref of fileRefs) {\n const name = (ref?.name || '').trim();\n if (!name)\n continue;\n if (name.toLowerCase() !== 'mod.md')\n continue;\n const folderPath = computeFolderPath(ref.folderId);\n const score = scorePrimerCandidate(name, folderPath);\n const enrichedRef = { ...ref, __primerFolderPath: folderPath ?? null };\n candidates.push({ fileRef: enrichedRef, score, folderPath });\n }\n return candidates\n .sort((a, b) => b.score - a.score)\n .map(candidate => candidate.fileRef);\n}\nfunction scorePrimerCandidate(name, folderPath) {\n let score = 0;\n const lowerName = name.toLowerCase();\n if (lowerName === 'mod.md')\n score += 5;\n if (folderPath) {\n const lowerPath = folderPath.toLowerCase();\n if (lowerPath === '.mod')\n score += 8;\n if (lowerPath.endsWith('/.mod'))\n score += 8;\n if (lowerPath.includes('.mod'))\n score += 4;\n if (lowerPath.includes('mod'))\n score += 2;\n }\n else {\n score += 1; // Root-level mod.md\n }\n return score;\n}\nasync function buildPrimerPayload({ repo, fileRef, maxContentLength, maxSummaryLength, }) {\n const documentId = fileRef.id;\n const handle = await repo.find(documentId);\n if (!handle) {\n return {\n documentId,\n title: fileRef.name || 'mod.md',\n status: 'placeholder',\n message: 'mod.md reference exists but document handle was not found.',\n folderPath: normalizeFolderPath(fileRef.__primerFolderPath),\n };\n }\n try {\n if (typeof handle.whenReady === 'function') {\n await handle.whenReady();\n }\n else if (!handle.isReady()) {\n // Fallback polling similar to other helpers\n for (let i = 0; i < 3 && !handle.isReady(); i++) {\n await new Promise(resolve => setTimeout(resolve, 150));\n }\n }\n }\n catch (error) {\n console.warn('[prepareWorkspaceDefaults] Error awaiting mod.md readiness:', error);\n }\n let doc;\n try {\n doc = handle.doc();\n }\n catch (error) {\n console.warn('[prepareWorkspaceDefaults] Failed to access mod.md doc:', error);\n }\n const rawContent = extractTextContent(doc);\n const trimmedContent = rawContent?.trim();\n if (!trimmedContent) {\n return {\n documentId,\n title: deriveTitle(doc, fileRef.name),\n status: 'placeholder',\n message: 'mod.md document is empty or content could not be extracted.',\n lastUpdated: deriveUpdatedAt(doc, fileRef),\n folderPath: normalizeFolderPath(fileRef.__primerFolderPath),\n };\n }\n const primer = {\n documentId,\n title: deriveTitle(doc, fileRef.name),\n size: trimmedContent.length,\n lastUpdated: deriveUpdatedAt(doc, fileRef),\n version: deriveVersion(doc),\n folderPath: normalizeFolderPath(fileRef.__primerFolderPath),\n status: 'full',\n };\n if (trimmedContent.length <= maxContentLength) {\n primer.content = trimmedContent;\n return primer;\n }\n primer.status = 'summary';\n primer.summary = buildSummary(trimmedContent, maxSummaryLength);\n primer.content = trimmedContent.slice(0, maxContentLength);\n primer.message = `Primer truncated to ${maxContentLength} characters (original ${trimmedContent.length}).`;\n return primer;\n}\nfunction extractTextContent(doc) {\n if (!doc)\n return undefined;\n if (typeof doc === 'string')\n return doc;\n if (typeof doc.text === 'string')\n return doc.text;\n if (doc.text && typeof doc.text === 'object') {\n try {\n if (Array.isArray(doc.text))\n return doc.text.join('\\n');\n if (typeof doc.text.toString === 'function')\n return String(doc.text);\n }\n catch { }\n }\n if (typeof doc.markdown === 'string')\n return doc.markdown;\n if (typeof doc.content === 'string')\n return doc.content;\n if (Array.isArray(doc.content)) {\n return doc.content.map((item) => {\n if (typeof item === 'string')\n return item;\n if (item && typeof item.text === 'string')\n return item.text;\n return '';\n }).filter(Boolean).join('\\n');\n }\n if (Array.isArray(doc.lines)) {\n return doc.lines.filter((line) => typeof line === 'string').join('\\n');\n }\n return undefined;\n}\nfunction normalizeFolderPath(path) {\n if (!path || path.trim().length === 0)\n return '/';\n const trimmed = path.trim().replace(/\\/+$/g, '');\n return trimmed.length === 0 ? '/' : trimmed;\n}\nfunction deriveTitle(doc, fallback) {\n if (doc) {\n if (typeof doc.title === 'string' && doc.title.trim().length > 0)\n return doc.title.trim();\n if (doc.metadata?.name && typeof doc.metadata.name === 'string' && doc.metadata.name.trim().length > 0) {\n return doc.metadata.name.trim();\n }\n }\n return fallback || 'mod.md';\n}\nfunction deriveUpdatedAt(doc, fileRef) {\n if (doc?.metadata?.updatedAt)\n return doc.metadata.updatedAt;\n if (fileRef?.updatedAt)\n return fileRef.updatedAt;\n return undefined;\n}\nfunction deriveVersion(doc) {\n if (!doc)\n return undefined;\n if (typeof doc.version === 'number' || typeof doc.version === 'string')\n return doc.version;\n if (doc.metadata?.version)\n return doc.metadata.version;\n return undefined;\n}\nfunction buildSummary(content, maxLength) {\n const normalized = content.replace(/\\r\\n/g, '\\n').trim();\n if (normalized.length <= maxLength)\n return normalized;\n const paragraphs = normalized.split(/\\n{2,}/);\n const lines = normalized.split('\\n');\n const summaryParts = [];\n const pushWithLimit = (text) => {\n if (!text)\n return false;\n const next = summaryParts.length ? `${summaryParts.join('\\n\\n')}\\n\\n${text}` : text;\n if (next.length > maxLength)\n return false;\n summaryParts.push(text);\n return true;\n };\n // Prioritize headings and first paragraphs\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed)\n continue;\n if (trimmed.startsWith('#')) {\n if (!pushWithLimit(trimmed))\n break;\n }\n if (summaryParts.join('\\n\\n').length >= maxLength * 0.6)\n break;\n }\n if (summaryParts.length === 0) {\n // Fallback to first paragraphs\n for (const paragraph of paragraphs) {\n if (!pushWithLimit(paragraph.trim()))\n break;\n }\n }\n if (summaryParts.length === 0) {\n return normalized.slice(0, maxLength - 1).trimEnd() + '\u2026';\n }\n let summary = summaryParts.join('\\n\\n').trim();\n if (summary.length > maxLength) {\n summary = summary.slice(0, maxLength - 1).trimEnd();\n }\n if (summary.length < normalized.length) {\n summary = summary.replace(/\\.+$/, '');\n summary += '\u2026';\n }\n return summary;\n}\n", "import fs from 'fs';\nimport path from 'path';\nexport class ModIgnoreService {\n constructor(workingDirectory) {\n this.patterns = [];\n this.defaultPatterns = [\n 'node_modules/',\n '*/node_modules/*',\n '.git/',\n '.DS_Store',\n 'Thumbs.db',\n '*.log',\n 'npm-debug.log*',\n 'yarn-debug.log*',\n '.env',\n '.env.*',\n 'dist/',\n 'build/',\n '.next/',\n '.nuxt/',\n 'coverage/',\n '.nyc_output/',\n '*.tmp',\n '*.temp',\n '*.swp',\n '*.swo',\n '.cache/',\n '.vscode/',\n '.idea/',\n '.automerge-data/',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n '.mod/.cache',\n ];\n this.trackableExtensions = [\n '.md', '.txt', '.js', '.ts', '.jsx', '.tsx', '.json', '.yaml', '.yml',\n '.py', '.java', '.cpp', '.c', '.h', '.css', '.scss', '.html', '.xml',\n '.sql', '.go', '.rs', '.php', '.rb', '.swift', '.kt', '.scala'\n ];\n this.loadIgnoreFile(workingDirectory);\n }\n /**\n * Load .modignore file from the working directory\n */\n loadIgnoreFile(workingDirectory) {\n // Start with default patterns\n this.patterns = this.defaultPatterns.map(pattern => this.parsePattern(pattern));\n const ignoreFilePath = path.join(workingDirectory, '.modignore');\n try {\n if (fs.existsSync(ignoreFilePath)) {\n const content = fs.readFileSync(ignoreFilePath, 'utf8');\n const lines = content.split('\\n')\n .map(line => line.trim())\n .filter(line => line && !line.startsWith('#')); // Remove comments and empty lines\n for (const line of lines) {\n this.patterns.push(this.parsePattern(line));\n }\n }\n }\n catch (err) {\n console.warn('Warning: Could not read .modignore file:', err);\n }\n }\n /**\n * Parse a single ignore pattern\n */\n parsePattern(pattern) {\n let cleanPattern = pattern.trim();\n const isNegation = cleanPattern.startsWith('!');\n if (isNegation) {\n cleanPattern = cleanPattern.slice(1);\n }\n const isDirectory = cleanPattern.endsWith('/');\n if (isDirectory) {\n cleanPattern = cleanPattern.slice(0, -1);\n }\n return {\n pattern: cleanPattern,\n isNegation,\n isDirectory,\n };\n }\n /**\n * Check if a file path should be ignored\n */\n shouldIgnore(filePath, workingDirectory) {\n // Always ignore .mod and .modignore files\n const relativePath = path.relative(workingDirectory, filePath);\n const fileName = path.basename(filePath);\n if (fileName === '.mod' || fileName === '.modignore') {\n return true;\n }\n // Check if it's a directory\n const isDirectory = fs.existsSync(filePath) && fs.statSync(filePath).isDirectory();\n let shouldIgnore = false;\n for (const { pattern, isNegation, isDirectory: patternIsDirectory } of this.patterns) {\n const matches = this.matchesPattern(relativePath, pattern, isDirectory, patternIsDirectory);\n if (matches) {\n shouldIgnore = !isNegation;\n }\n }\n return shouldIgnore;\n }\n /**\n * Check if a path matches a pattern\n */\n matchesPattern(relativePath, pattern, isDirectory, patternIsDirectory) {\n // If pattern is for directories only, skip non-directories\n if (patternIsDirectory && !isDirectory) {\n return false;\n }\n // Convert pattern to regex\n const regexPattern = this.patternToRegex(pattern);\n const regex = new RegExp(regexPattern);\n // Check direct match\n if (regex.test(relativePath)) {\n return true;\n }\n // Check if any parent directory matches (for directory patterns)\n const pathParts = relativePath.split(path.sep);\n for (let i = 0; i < pathParts.length; i++) {\n const partialPath = pathParts.slice(0, i + 1).join(path.sep);\n if (regex.test(partialPath)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Convert a glob pattern to a regex pattern\n */\n patternToRegex(pattern) {\n // Escape special regex characters except * and ?\n let regex = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n // Handle ** globstar patterns first (before single *)\n regex = regex.replace(/\\*\\*/g, '(?:.*[\\\\\\\\/])?.*'); // ** matches zero or more directories\n // Convert remaining glob patterns to regex\n regex = regex.replace(/\\*/g, '[^\\\\\\\\/]*'); // * matches any characters except path separators\n regex = regex.replace(/\\?/g, '.'); // ? matches any single character\n // Handle directory separators\n regex = regex.replace(/\\\\\\//g, '[\\\\\\\\/]'); // Handle both / and \\ path separators\n // For patterns ending with /, match anything under that directory\n if (pattern.endsWith('/')) {\n regex = regex.replace(/\\$/, '(?:[\\\\\\\\/].*)?$');\n }\n // Anchor the pattern\n if (!regex.startsWith('(?:.*[\\\\\\\\/])?.*') && !regex.startsWith('^')) {\n regex = '^' + regex;\n }\n if (!regex.endsWith('.*') && !regex.endsWith('$')) {\n regex = regex + '$';\n }\n return regex;\n }\n /**\n * Get all loaded patterns (for debugging)\n */\n getPatterns() {\n return [...this.patterns];\n }\n /**\n * Filter a list of file paths, removing ignored ones\n */\n filterIgnored(filePaths, workingDirectory) {\n return filePaths.filter(filePath => !this.shouldIgnore(filePath, workingDirectory));\n }\n async preFilterDirectory(workingDirectory) {\n const result = {\n totalFiles: 0,\n filteredFiles: [],\n excludedCount: 0,\n trackableFiles: []\n };\n await this.scanDirectoryRecursive(workingDirectory, workingDirectory, result);\n result.trackableFiles = result.filteredFiles.filter(filePath => this.isTrackableFile(filePath));\n return result;\n }\n async scanDirectoryRecursive(dirPath, rootPath, result) {\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n if (entry.isDirectory()) {\n // Check if directory should be ignored before recursing\n if (!this.shouldIgnore(fullPath, rootPath)) {\n await this.scanDirectoryRecursive(fullPath, rootPath, result);\n }\n else {\n try {\n const excludedCount = await this.countFilesInDirectory(fullPath);\n result.excludedCount += excludedCount;\n }\n catch (error) {\n console.warn(`Failed to count files in excluded directory ${fullPath}:`, error);\n }\n }\n }\n else if (entry.isFile()) {\n result.totalFiles++;\n if (!this.shouldIgnore(fullPath, rootPath)) {\n result.filteredFiles.push(fullPath);\n }\n else {\n result.excludedCount++;\n }\n }\n }\n }\n catch (error) {\n console.warn(`Failed to scan directory ${dirPath}:`, error);\n }\n }\n async countFilesInDirectory(dirPath) {\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n let count = 0;\n for (const entry of entries) {\n if (entry.isFile()) {\n count++;\n }\n else if (entry.isDirectory()) {\n count += await this.countFilesInDirectory(path.join(dirPath, entry.name));\n }\n }\n return count;\n }\n catch (error) {\n return 0;\n }\n }\n isTrackableFile(filePath) {\n const ext = path.extname(filePath).toLowerCase();\n return this.trackableExtensions.includes(ext);\n }\n getPatternStats() {\n return {\n totalPatterns: this.patterns.length,\n defaultPatterns: this.defaultPatterns.length,\n customPatterns: Math.max(0, this.patterns.length - this.defaultPatterns.length)\n };\n }\n /**\n * Create a default .modignore file in the specified directory\n */\n static createDefaultIgnoreFile(workingDirectory) {\n const ignoreFilePath = path.join(workingDirectory, '.modignore');\n if (fs.existsSync(ignoreFilePath)) {\n return; // Don't overwrite existing file\n }\n const defaultContent = `# Mod Ignore File\n# Patterns to exclude from mod sync operations\n\n# Dependencies\nnode_modules/\nvendor/\n\n# Build outputs\ndist/\nbuild/\nout/\ntarget/\n\n# Environment files\n.env\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\n# Logs\n*.log\nlogs/\n\n# Runtime data\npids/\n*.pid\n*.seed\n*.pid.lock\n\n# Coverage directory used by tools like istanbul\ncoverage/\n.nyc_output/\n\n# Cache directories\n.cache/\n.npm/\n.yarn/\n\n# OS generated files\n.DS_Store\n.DS_Store?\n._*\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db\n\n# Temporary files\n*.tmp\n*.temp\n*.swp\n*.swo\n*~\n\n# IDE files\n.vscode/\n.idea/\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n\n# Automerge data\n.automerge-data/\n`;\n try {\n fs.writeFileSync(ignoreFilePath, defaultContent, 'utf8');\n console.log('Created default .modignore file');\n }\n catch (err) {\n console.warn('Warning: Could not create .modignore file:', err);\n }\n }\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { spawn } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport { readModConfig } from './mod-config.js';\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nexport class SyncDaemon {\n constructor() {\n this.syncQueue = [];\n this.cacheDir = path.join(process.cwd(), '.mod', '.cache');\n this.stateFilePath = path.join(this.cacheDir, 'sync-daemon.json');\n this.pidFilePath = path.join(this.cacheDir, 'sync-daemon.pid');\n }\n async start(options = {}) {\n try {\n const currentState = await this.getState();\n if (currentState && currentState.status === 'running' && !options.force) {\n if (await this.isProcessRunning(currentState.pid)) {\n throw new Error(`Daemon is already running (PID: ${currentState.pid})`);\n }\n }\n await fs.mkdir(this.cacheDir, { recursive: true });\n const cfg = readModConfig();\n if (!cfg?.workspaceId) {\n throw new Error('No active workspace found in .mod/config.json');\n }\n const daemonProcess = spawn(process.execPath, [\n path.join(__dirname, '../daemon-worker.js'),\n '--workspace-id', cfg.workspaceId,\n '--active-branch', cfg.activeBranchId || 'main',\n '--working-dir', process.cwd()\n ], {\n detached: true,\n stdio: options.verbose ? 'inherit' : 'ignore',\n cwd: process.cwd(),\n env: { ...process.env, MOD_DAEMON_MODE: 'true' }\n });\n daemonProcess.unref();\n const initialState = {\n pid: daemonProcess.pid,\n status: 'starting',\n startedAt: new Date().toISOString(),\n lastActivity: new Date().toISOString(),\n workspaceId: cfg.workspaceId,\n activeBranchId: cfg.activeBranchId,\n watchedFiles: 0,\n crashCount: 0,\n uptime: 0\n };\n await this.saveState(initialState);\n await fs.writeFile(this.pidFilePath, daemonProcess.pid.toString(), 'utf8');\n console.log(`\u2705 Sync daemon started (PID: ${daemonProcess.pid})`);\n console.log(`\uD83D\uDCC1 Working directory: ${process.cwd()}`);\n console.log(`\uD83D\uDD17 Workspace: ${cfg.workspaceId}`);\n await this.waitForDaemonReady(daemonProcess.pid, 5000);\n }\n catch (error) {\n console.error('Failed to start sync daemon:', error);\n throw error;\n }\n }\n async stop(options = {}) {\n try {\n const currentState = await this.getState();\n if (!currentState || currentState.status === 'stopped') {\n console.log('Daemon is not running');\n return;\n }\n if (!(await this.isProcessRunning(currentState.pid))) {\n console.log('Daemon process not found (cleaning up stale state)');\n await this.cleanup();\n return;\n }\n console.log(`\uD83D\uDED1 Stopping daemon (PID: ${currentState.pid})...`);\n await this.updateState({ status: 'stopping' });\n // Send SIGTERM for graceful shutdown\n process.kill(currentState.pid, 'SIGTERM');\n const shutdownTimeout = 10000; // 10 seconds\n let gracefulShutdown = false;\n for (let i = 0; i < shutdownTimeout / 100; i++) {\n if (!(await this.isProcessRunning(currentState.pid))) {\n gracefulShutdown = true;\n break;\n }\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n if (!gracefulShutdown) {\n if (options.force) {\n console.log('\u26A0\uFE0F Forcing daemon shutdown...');\n process.kill(currentState.pid, 'SIGKILL');\n }\n else {\n throw new Error('Daemon did not shut down gracefully. Use --force to kill the process.');\n }\n }\n await this.cleanup();\n console.log('\u2705 Sync daemon stopped');\n }\n catch (error) {\n console.error('Failed to stop sync daemon:', error);\n throw error;\n }\n }\n async restart(options = {}) {\n console.log('\uD83D\uDD04 Restarting sync daemon...');\n await this.stop(options);\n await new Promise(resolve => setTimeout(resolve, 1000)); // Brief pause\n await this.start(options);\n }\n async status() {\n try {\n const state = await this.getState();\n if (!state) {\n return null;\n }\n const isRunning = await this.isProcessRunning(state.pid);\n if (!isRunning && state.status !== 'stopped') {\n // Process died unexpectedly\n await this.updateState({\n status: 'crashed',\n lastError: 'Process terminated unexpectedly'\n });\n state.status = 'crashed';\n }\n // Calculate uptime if running\n if (state.status === 'running') {\n state.uptime = Date.now() - new Date(state.startedAt).getTime();\n }\n return state;\n }\n catch (error) {\n console.error('Failed to get daemon status:', error);\n return null;\n }\n }\n async handleCrash(pid, error) {\n const state = await this.getState();\n if (!state)\n return;\n const crashCount = (state.crashCount || 0) + 1;\n await this.updateState({\n status: 'crashed',\n crashCount,\n lastError: error || 'Process crashed unexpectedly',\n lastActivity: new Date().toISOString()\n });\n const backoffDelay = Math.min(1000 * Math.pow(2, crashCount - 1), 30000); // Max 30 seconds\n console.error(`\uD83D\uDCA5 Daemon crashed (attempt ${crashCount}). Restarting in ${backoffDelay}ms...`);\n if (crashCount <= 5) { // Max 5 restart attempts\n setTimeout(async () => {\n try {\n await this.start({ autoRestart: true });\n }\n catch (restartError) {\n console.error('Failed to restart daemon after crash:', restartError);\n }\n }, backoffDelay);\n }\n else {\n console.error('\u274C Maximum crash restart attempts exceeded. Manual restart required.');\n }\n }\n async addToSyncQueue(item) {\n const queueItem = {\n id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n timestamp: new Date().toISOString(),\n retryCount: 0,\n ...item\n };\n if (item.priority === 'high') {\n this.syncQueue.unshift(queueItem);\n }\n else {\n this.syncQueue.push(queueItem);\n }\n await this.processSyncQueue();\n }\n async processSyncQueue() {\n while (this.syncQueue.length > 0) {\n const item = this.syncQueue.shift();\n try {\n // Process sync operation here\n await this.updateState({ lastActivity: new Date().toISOString() });\n }\n catch (error) {\n console.error(`Failed to process sync queue item ${item.id}:`, error);\n if (item.retryCount < 3) {\n item.retryCount++;\n setTimeout(() => this.syncQueue.push(item), 1000 * item.retryCount);\n }\n }\n }\n }\n async getState() {\n try {\n const data = await fs.readFile(this.stateFilePath, 'utf8');\n return JSON.parse(data);\n }\n catch {\n return null;\n }\n }\n async saveState(state) {\n await fs.writeFile(this.stateFilePath, JSON.stringify(state, null, 2), 'utf8');\n }\n async updateState(updates) {\n const currentState = await this.getState();\n if (currentState) {\n const newState = { ...currentState, ...updates };\n await this.saveState(newState);\n }\n }\n async isProcessRunning(pid) {\n try {\n process.kill(pid, 0); // Signal 0 checks if process exists without killing\n return true;\n }\n catch {\n return false;\n }\n }\n async waitForDaemonReady(pid, timeoutMs) {\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n const state = await this.getState();\n if (state && state.pid === pid && state.status === 'running') {\n return;\n }\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n throw new Error('Daemon failed to start within timeout period');\n }\n async cleanup() {\n try {\n await fs.unlink(this.pidFilePath);\n }\n catch { /* ignore */ }\n try {\n await fs.unlink(this.stateFilePath);\n }\n catch { /* ignore */ }\n }\n}\n", "import { SpecificationParserService, RequirementCategory } from '@mod/mod-core';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { log } from '../services/logger.js';\nimport { readModConfig } from '../services/mod-config.js';\nimport { createModWorkspace } from '@mod/mod-core';\nexport async function specCommand(args, repo) {\n const subcommand = args[0] || 'status';\n const remainingArgs = args.slice(1);\n switch (subcommand) {\n case 'status':\n await specStatusCommand(remainingArgs, repo);\n break;\n case 'list':\n await specListCommand(remainingArgs);\n break;\n default:\n // If no valid subcommand, assume it's a spec file for status\n await specStatusCommand([subcommand, ...remainingArgs], repo);\n }\n}\nasync function specStatusCommand(args, repo) {\n try {\n let specName = args[0];\n if (!specName && repo) {\n const activeBranchSpec = await getActiveBranchSpec(repo);\n if (activeBranchSpec) {\n specName = activeBranchSpec;\n console.log(`Using active branch specification: ${specName}`);\n }\n }\n if (!specName) {\n console.error('Error: Specification file required');\n console.error('Usage: mod spec status [spec-file]');\n console.error(' mod spec status (uses active branch spec if available)');\n process.exit(1);\n }\n if (!specName.endsWith('.spec.md')) {\n specName += '.spec.md';\n }\n const workspaceRoot = process.cwd();\n const analysis = await analyzeSpecification(workspaceRoot, specName);\n printTscStyleOutput(analysis);\n process.exit(0);\n }\n catch (error) {\n handleError(error, args[0]);\n }\n}\nasync function specListCommand(args) {\n try {\n const workspaceRoot = process.cwd();\n const specsDir = path.join(workspaceRoot, '.mod/specs');\n const specs = await findAllSpecifications(specsDir);\n if (specs.length === 0) {\n console.log('No specification files found in .mod/specs');\n return;\n }\n console.log('Available specifications:\\n');\n // Group by directory\n const grouped = new Map();\n for (const spec of specs) {\n const dir = path.dirname(spec);\n if (!grouped.has(dir)) {\n grouped.set(dir, []);\n }\n grouped.get(dir).push(path.basename(spec));\n }\n // Display grouped specs\n for (const [dir, files] of grouped) {\n const relDir = dir === '.' ? '' : `${dir}/`;\n for (const file of files) {\n console.log(` ${relDir}${file}`);\n }\n }\n console.log(`\\nTotal: ${specs.length} specification files`);\n }\n catch (error) {\n console.error('Failed to list specifications:', error);\n process.exit(1);\n }\n}\nasync function getActiveBranchSpec(repo) {\n try {\n const cfg = readModConfig();\n if (!cfg?.workspaceId || !cfg?.activeBranchId) {\n return undefined;\n }\n const modWorkspace = createModWorkspace(repo);\n const workspaceHandles = await modWorkspace.listWorkspaces();\n const workspaceHandle = workspaceHandles.find(wh => wh.id === cfg.workspaceId);\n if (!workspaceHandle)\n return undefined;\n const branches = await workspaceHandle.branch.list();\n const activeBranch = branches.find(b => b.id === cfg.activeBranchId);\n if (!activeBranch?.metadata?.linkedSpec)\n return undefined;\n return activeBranch.metadata.linkedSpec;\n }\n catch (error) {\n log('[Spec] Failed to get active branch spec:', error);\n return undefined;\n }\n}\nasync function analyzeSpecification(workspaceRoot, specName) {\n const parser = new SpecificationParserService({\n workspaceRoot,\n specsDirectory: '.mod/specs',\n cacheEnabled: false\n });\n log('[Spec] Scanning workspace for @spec traces');\n const startTime = Date.now();\n const traceMap = await parser.scanWorkspaceForTraces();\n const scanTime = Date.now() - startTime;\n log(`[Spec] Scan completed in ${scanTime}ms, found ${traceMap.size} requirement IDs`);\n const specFilePath = await findSpecificationFile(workspaceRoot, specName);\n const content = await fs.readFile(specFilePath, 'utf-8');\n const parsed = await parser.parseSpecification(content, specFilePath);\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n/);\n const frontmatterOffset = frontmatterMatch ? frontmatterMatch[0].split('\\n').length - 1 : 0;\n const allRequirements = extractNestedRequirements(content, parsed.requirements, frontmatterOffset);\n const filteredTraces = filterTracesBySpec(traceMap, specName);\n const requirements = allRequirements.map(req => {\n const traces = filteredTraces.get(req.id) || [];\n const status = traces.length === 0 ? 'todo' : 'traced';\n return {\n requirementId: req.id,\n category: req.category,\n title: req.title,\n status: status,\n traceCount: traces.length,\n traces: traces.map(trace => ({\n file: path.relative(workspaceRoot, trace.filePath),\n line: trace.lineRange.start,\n description: trace.description\n })),\n hierarchyLevel: calculateHierarchyLevel(req.id),\n lineRange: req.lineRange\n };\n });\n applyHierarchicalAggregation(requirements);\n const summary = {\n traced: requirements.filter(r => r.status === 'traced').length,\n todo: requirements.filter(r => r.status === 'todo').length,\n totalTraces: requirements.reduce((sum, r) => sum + r.traceCount, 0)\n };\n return {\n specFile: path.relative(workspaceRoot, specFilePath),\n title: parsed.metadata.title,\n requirements,\n summary\n };\n}\nasync function findSpecificationFile(workspaceRoot, specName) {\n const specsDir = path.join(workspaceRoot, '.mod/specs');\n const matches = [];\n async function searchDir(dir, relativePath = '') {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relPath = path.join(relativePath, entry.name);\n if (entry.isDirectory()) {\n await searchDir(fullPath, relPath);\n }\n else if (entry.name.endsWith('.spec.md')) {\n // Check exact match with path or just filename\n if (relPath === specName || entry.name === specName) {\n matches.push(fullPath);\n }\n }\n }\n }\n catch {\n // Directory doesn't exist or can't be read\n }\n }\n await searchDir(specsDir);\n if (matches.length === 0) {\n throw new Error(`Specification file \"${specName}\" not found in ${specsDir}`);\n }\n if (matches.length > 1) {\n const errorMsg = [`Multiple specifications found with name \"${specName}\":`];\n const sortedPaths = matches.map(m => path.relative(specsDir, m)).sort();\n for (const specPath of sortedPaths) {\n errorMsg.push(` - ${specPath}`);\n }\n errorMsg.push('');\n errorMsg.push('Please specify the full path from .mod/specs/');\n errorMsg.push(`Example: mod spec status ${sortedPaths[0]}`);\n throw new Error(errorMsg.join('\\n'));\n }\n return matches[0];\n}\n// Helper function to find all specifications\nasync function findAllSpecifications(specsDir) {\n const specs = [];\n async function searchDir(dir, relativePath = '') {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relPath = path.join(relativePath, entry.name);\n if (entry.isDirectory()) {\n await searchDir(fullPath, relPath);\n }\n else if (entry.name.endsWith('.spec.md')) {\n specs.push(relPath);\n }\n }\n }\n catch {\n // Directory doesn't exist or can't be read\n }\n }\n await searchDir(specsDir);\n return specs.sort();\n}\n// Extract nested requirements (reused from status.ts)\nfunction extractNestedRequirements(content, topLevelRequirements, frontmatterOffset) {\n const adjustedTopLevel = topLevelRequirements.map(req => ({\n ...req,\n lineRange: req.lineRange ? {\n start: req.lineRange.start + frontmatterOffset,\n end: req.lineRange.end + frontmatterOffset\n } : undefined\n }));\n const allRequirements = [...adjustedTopLevel];\n const nestedReqRegex = /^\\s*-\\s*\\*\\*(?<id>REQ-[A-Z]+-\\d+(?:\\.\\d+)*)\\*\\*:\\s*(?<description>.*)/gm;\n let match;\n while ((match = nestedReqRegex.exec(content)) !== null) {\n const groups = match.groups;\n if (!groups)\n continue;\n const { id, description } = groups;\n const categoryMatch = id.match(/REQ-([A-Z]+)/);\n if (!categoryMatch)\n continue;\n const categoryStr = categoryMatch[1];\n const category = Object.values(RequirementCategory).find(cat => cat === categoryStr);\n if (!category)\n continue;\n if (topLevelRequirements.some(req => req.id === id))\n continue;\n const lineNumber = content.substring(0, match.index).split('\\n').length;\n allRequirements.push({\n id,\n category,\n title: description.trim(),\n description: description.trim(),\n children: [],\n lineRange: { start: lineNumber, end: lineNumber },\n parent: determineParentRequirement(id)\n });\n }\n return allRequirements;\n}\nfunction filterTracesBySpec(traceMap, specName) {\n const filtered = new Map();\n const specBaseName = specName.replace('.spec.md', '');\n for (const [requirementId, traces] of traceMap.entries()) {\n const relevantTraces = traces.filter(trace => {\n if (!trace.specPath)\n return true;\n return trace.specPath.includes(specBaseName);\n });\n if (relevantTraces.length > 0) {\n filtered.set(requirementId, relevantTraces);\n }\n }\n return filtered;\n}\n// Helper functions\nfunction determineParentRequirement(requirementId) {\n const parts = requirementId.split('-');\n if (parts.length < 3)\n return undefined;\n const [, category, numberPart] = parts;\n const dotIndex = numberPart.indexOf('.');\n if (dotIndex === -1)\n return undefined;\n const parentNumber = numberPart.substring(0, dotIndex);\n return `REQ-${category}-${parentNumber}`;\n}\nfunction calculateHierarchyLevel(requirementId) {\n const parts = requirementId.split('-');\n if (parts.length < 3)\n return 1;\n const numberPart = parts[2];\n const dotCount = (numberPart.match(/\\./g) || []).length;\n return 2 + dotCount;\n}\nfunction applyHierarchicalAggregation(requirements) {\n const sortedByHierarchy = [...requirements].sort((a, b) => b.hierarchyLevel - a.hierarchyLevel);\n for (const requirement of sortedByHierarchy) {\n const children = requirements.filter(r => r.requirementId.startsWith(requirement.requirementId + '.') &&\n r.hierarchyLevel === requirement.hierarchyLevel + 1);\n if (children.length > 0) {\n if (requirement.traceCount === 0 && children.every(child => child.status === 'traced')) {\n requirement.status = 'traced';\n }\n }\n }\n}\nfunction printTscStyleOutput(analysis) {\n const colors = {\n traced: '\\x1b[32m', // Green\n todo: '\\x1b[31m', // Red\n reset: '\\x1b[0m',\n dim: '\\x1b[90m', // Dim gray\n count: '\\x1b[36m' // Cyan for trace counts\n };\n const totalReqs = analysis.requirements.length;\n console.log(`${analysis.specFile} - ${totalReqs} requirements\\n`);\n const requirementsByCategory = groupRequirementsByCategory(analysis.requirements);\n for (const [category, requirements] of requirementsByCategory.entries()) {\n console.log(`${colors.dim}## ${category} Requirements${colors.reset}\\n`);\n for (const req of requirements) {\n const statusLabel = req.status;\n const color = colors[statusLabel];\n const truncatedTitle = req.title.length > 60 ?\n req.title.substring(0, 57) + '...' : req.title;\n const indent = ' '.repeat(Math.max(0, req.hierarchyLevel - 2));\n if (req.traces.length > 0) {\n const trace = req.traces[0];\n const traceCountDisplay = req.traceCount > 1 ? ` ${colors.count}(${req.traceCount})${colors.reset}` : '';\n console.log(`${indent}${trace.file}:${trace.line}:1 - ${color}${statusLabel}${colors.reset}${traceCountDisplay} ${req.requirementId}: ${truncatedTitle}`);\n }\n else {\n const lineNumber = req.lineRange?.start || 1;\n console.log(`${indent}${analysis.specFile}:${lineNumber}:1 - ${color}${statusLabel}${colors.reset} ${req.requirementId}: ${truncatedTitle}`);\n }\n }\n console.log();\n }\n const tracedText = `${colors.traced}${analysis.summary.traced} traced${colors.reset}`;\n const todoText = `${colors.todo}${analysis.summary.todo} todo${colors.reset}`;\n const totalTracesText = `${colors.count}${analysis.summary.totalTraces} traces${colors.reset}`;\n console.log(`Found ${tracedText}, ${todoText} (${totalTracesText} total).`);\n}\nfunction groupRequirementsByCategory(requirements) {\n const categoryOrder = ['UX', 'BUS', 'DATA', 'INT', 'INFRA', 'QUAL'];\n const grouped = new Map();\n for (const category of categoryOrder) {\n grouped.set(category, []);\n }\n for (const req of requirements) {\n const category = req.category;\n if (!grouped.has(category)) {\n grouped.set(category, []);\n }\n grouped.get(category).push(req);\n }\n for (const [, reqs] of grouped.entries()) {\n reqs.sort((a, b) => a.requirementId.localeCompare(b.requirementId));\n }\n const result = new Map();\n for (const [category, reqs] of grouped.entries()) {\n if (reqs.length > 0) {\n result.set(category, reqs);\n }\n }\n return result;\n}\nfunction handleError(error, specName) {\n if (error instanceof Error) {\n if (error.message.includes('not found')) {\n console.error(`Error: Specification file \"${specName}\" not found`);\n process.exit(1);\n }\n else if (error.message.includes('parse')) {\n console.error(`Error: Failed to parse specification: ${error.message}`);\n process.exit(2);\n }\n else if (error.message.includes('scan')) {\n console.error(`Error: Failed to scan workspace: ${error.message}`);\n process.exit(3);\n }\n else if (error.message.includes('Multiple specifications found')) {\n console.error(error.message);\n process.exit(1);\n }\n }\n console.error(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(3);\n}\n", "import { createModWorkspace } from '@mod/mod-core';\nimport { readModConfig, writeModConfig } from '../services/mod-config.js';\nimport fs from 'fs';\nimport path from 'path';\nexport async function workspaceCommand(args, repo) {\n const [subcommand, ...rest] = args;\n switch (subcommand) {\n case 'create':\n await handleCreateWorkspace(rest, repo);\n break;\n case 'list':\n await handleListWorkspaces(rest, repo);\n break;\n case 'switch':\n await handleSwitchWorkspace(rest, repo);\n break;\n case 'info':\n await handleWorkspaceInfo(rest, repo);\n break;\n case 'delete':\n await handleDeleteWorkspace(rest, repo);\n break;\n case 'rename':\n await handleRenameWorkspace(rest, repo);\n break;\n default:\n if (!subcommand) {\n await handleListWorkspaces([], repo);\n }\n else {\n console.error('Usage: mod workspace <create|list|switch|info|delete|rename> [options]');\n console.error('Available commands:');\n console.error(' create <name> Create new workspace and set as active');\n console.error(' list List all available workspaces');\n console.error(' switch <name-or-id> Switch to a different workspace');\n console.error(' info [name-or-id] Show workspace details');\n console.error(' delete <name-or-id> Delete a workspace');\n console.error(' rename <name-or-id> <new-name> Rename a workspace');\n process.exit(1);\n }\n }\n process.exit(0);\n}\nasync function handleCreateWorkspace(args, repo) {\n const [name, ...flags] = args;\n if (!name) {\n console.error('Usage: mod workspace create <name> [--description <desc>]');\n process.exit(1);\n }\n let description;\n const descIndex = flags.indexOf('--description');\n if (descIndex !== -1 && descIndex + 1 < flags.length) {\n description = flags[descIndex + 1];\n }\n try {\n const modWorkspace = createModWorkspace(repo);\n console.log(`Creating workspace: ${name}...`);\n const workspaceHandle = await modWorkspace.createWorkspace({\n name: name,\n description: description\n });\n // Get the main branch ID for the newly created workspace\n const branches = await workspaceHandle.branch.list();\n const mainBranch = branches.find(b => b.metadata?.type === 'main') || branches[0];\n if (!mainBranch) {\n throw new Error('Failed to find main branch in newly created workspace');\n }\n const config = (readModConfig() || {});\n const updatedConfig = {\n ...config,\n workspaceId: workspaceHandle.id,\n workspaceName: name,\n activeBranchId: mainBranch.id, // Set to main branch ID\n lastWorkspaceSwitch: new Date().toISOString()\n };\n const recentWorkspaces = updatedConfig.recentWorkspaces || [];\n const existingIndex = recentWorkspaces.findIndex(w => w.id === workspaceHandle.id);\n const workspaceRef = {\n id: workspaceHandle.id,\n name: name,\n lastAccessed: new Date().toISOString(),\n accessCount: existingIndex !== -1 ? recentWorkspaces[existingIndex].accessCount + 1 : 1\n };\n if (existingIndex !== -1) {\n recentWorkspaces[existingIndex] = workspaceRef;\n }\n else {\n recentWorkspaces.unshift(workspaceRef);\n // Keep only last 10 workspaces\n updatedConfig.recentWorkspaces = recentWorkspaces.slice(0, 10);\n }\n writeModConfig(updatedConfig);\n await invalidateWorkspaceCache();\n console.log(`\u2713 Created and switched to workspace: ${name} (${workspaceHandle.id})`);\n if (description) {\n console.log(` Description: ${description}`);\n }\n }\n catch (error) {\n console.error('Failed to create workspace:', error);\n console.log('Try running: mod workspace list to check available workspaces');\n process.exit(1);\n }\n}\nasync function handleListWorkspaces(args, repo) {\n try {\n const modWorkspace = createModWorkspace(repo);\n const workspaces = await getWorkspacesWithCache(modWorkspace);\n if (workspaces.length === 0) {\n console.log('No workspaces found.');\n console.log('Create a new workspace with: mod workspace create <name>');\n return;\n }\n const config = readModConfig();\n const activeWorkspaceId = config?.workspaceId;\n console.log('Available workspaces:');\n workspaces.forEach((workspace, index) => {\n const isActive = activeWorkspaceId && workspace.id === activeWorkspaceId;\n const indicator = isActive ? '* ' : ' ';\n const quickNumber = index < 9 ? `[${index + 1}] ` : ' ';\n console.log(`${indicator}${quickNumber}${workspace.name} (${workspace.id})`);\n if (workspace.description) {\n console.log(` ${workspace.description}`);\n }\n const stats = [\n `${workspace.fileCount} files`,\n `${workspace.branchCount} branches`,\n `updated ${formatRelativeTime(workspace.lastModified)}`\n ].join(', ');\n console.log(` ${stats}`);\n });\n if (workspaces.length > 1) {\n console.log('\\nQuick switch: mod workspace switch <number>');\n }\n }\n catch (error) {\n console.error('Failed to list workspaces:', error);\n process.exit(1);\n }\n}\nasync function handleSwitchWorkspace(args, repo) {\n const [nameOrId] = args;\n if (!nameOrId) {\n console.error('Usage: mod workspace switch <name-or-id>');\n process.exit(1);\n }\n try {\n const modWorkspace = createModWorkspace(repo);\n const targetWorkspace = await resolveWorkspace(nameOrId, modWorkspace);\n if (!targetWorkspace) {\n console.error(`Workspace not found: ${nameOrId}`);\n console.log('Available workspaces:');\n const workspaces = await getWorkspacesWithCache(modWorkspace);\n workspaces.forEach((w) => console.log(` ${w.name} (${w.id})`));\n process.exit(1);\n }\n const config = (readModConfig() || {});\n const updatedConfig = {\n ...config,\n workspaceId: targetWorkspace.id,\n workspaceName: targetWorkspace.name,\n activeBranchId: undefined, // Reset to main branch\n lastWorkspaceSwitch: new Date().toISOString()\n };\n const recentWorkspaces = updatedConfig.recentWorkspaces || [];\n const existingIndex = recentWorkspaces.findIndex(w => w.id === targetWorkspace.id);\n const workspaceRef = {\n id: targetWorkspace.id,\n name: targetWorkspace.name,\n lastAccessed: new Date().toISOString(),\n accessCount: existingIndex !== -1 ? recentWorkspaces[existingIndex].accessCount + 1 : 1\n };\n if (existingIndex !== -1) {\n recentWorkspaces[existingIndex] = workspaceRef;\n }\n else {\n recentWorkspaces.unshift(workspaceRef);\n updatedConfig.recentWorkspaces = recentWorkspaces.slice(0, 10);\n }\n writeModConfig(updatedConfig);\n console.log(`\u2713 Switched to workspace: ${targetWorkspace.name} (${targetWorkspace.id})`);\n }\n catch (error) {\n console.error('Failed to switch workspace:', error);\n process.exit(1);\n }\n}\nasync function handleWorkspaceInfo(args, repo) {\n const [nameOrId] = args;\n try {\n const modWorkspace = createModWorkspace(repo);\n let targetWorkspace;\n if (nameOrId) {\n const resolved = await resolveWorkspace(nameOrId, modWorkspace);\n if (!resolved) {\n console.error(`Workspace not found: ${nameOrId}`);\n process.exit(1);\n }\n targetWorkspace = resolved;\n }\n else {\n const config = readModConfig();\n if (!config?.workspaceId) {\n console.error('No active workspace configured');\n console.log('Set a workspace with: mod workspace switch <name>');\n process.exit(1);\n }\n const resolved = await resolveWorkspace(config.workspaceId, modWorkspace);\n if (!resolved) {\n console.error('Current workspace not found');\n process.exit(1);\n }\n targetWorkspace = resolved;\n }\n console.log(`Workspace: ${targetWorkspace.name}`);\n console.log(`ID: ${targetWorkspace.id}`);\n if (targetWorkspace.description) {\n console.log(`Description: ${targetWorkspace.description}`);\n }\n console.log(`Files: ${targetWorkspace.fileCount}`);\n console.log(`Branches: ${targetWorkspace.branchCount}`);\n console.log(`Last Updated: ${formatAbsoluteTime(targetWorkspace.lastModified)}`);\n if (targetWorkspace.permissions.length > 0) {\n console.log(`Permissions: ${targetWorkspace.permissions.join(', ')}`);\n }\n const config = readModConfig();\n if (config?.workspaceId === targetWorkspace.id && config?.activeBranchId) {\n console.log(`Active Branch: ${config.activeBranchId}`);\n }\n else {\n console.log('Active Branch: main');\n }\n }\n catch (error) {\n console.error('Failed to get workspace info:', error);\n process.exit(1);\n }\n}\nasync function handleDeleteWorkspace(args, repo) {\n const [nameOrId] = args;\n if (!nameOrId) {\n console.error('Usage: mod workspace delete <name-or-id>');\n process.exit(1);\n }\n try {\n const modWorkspace = createModWorkspace(repo);\n const targetWorkspace = await resolveWorkspace(nameOrId, modWorkspace);\n if (!targetWorkspace) {\n console.error(`Workspace not found: ${nameOrId}`);\n process.exit(1);\n }\n console.log(`WARNING: This will permanently delete workspace \"${targetWorkspace.name}\"`);\n console.log(`Files: ${targetWorkspace.fileCount}, Branches: ${targetWorkspace.branchCount}`);\n console.log('Type \"yes\" to confirm deletion:');\n // Simple confirmation - in a real implementation you might want to use a proper prompt library\n const confirm = process.env.MOD_AUTO_CONFIRM === 'yes' ? 'yes' : 'no';\n if (confirm !== 'yes') {\n console.log('Deletion cancelled');\n return;\n }\n // Note: Actual deletion would need to be implemented in ModWorkspace interface\n // For now, just remove from config if it's the active workspace\n const config = readModConfig();\n if (config?.workspaceId === targetWorkspace.id) {\n const updatedConfig = { ...config };\n delete updatedConfig.workspaceId;\n delete updatedConfig.workspaceName;\n delete updatedConfig.activeBranchId;\n writeModConfig(updatedConfig);\n }\n await invalidateWorkspaceCache();\n console.log(`\u2713 Workspace \"${targetWorkspace.name}\" scheduled for deletion`);\n console.log('Note: Full deletion implementation pending ModWorkspace.deleteWorkspace() interface');\n }\n catch (error) {\n console.error('Failed to delete workspace:', error);\n process.exit(1);\n }\n}\nasync function handleRenameWorkspace(args, repo) {\n const [nameOrId, newName] = args;\n if (!nameOrId || !newName) {\n console.error('Usage: mod workspace rename <name-or-id> <new-name>');\n process.exit(1);\n }\n try {\n const modWorkspace = createModWorkspace(repo);\n const targetWorkspace = await resolveWorkspace(nameOrId, modWorkspace);\n if (!targetWorkspace) {\n console.error(`Workspace not found: ${nameOrId}`);\n process.exit(1);\n }\n const existingWorkspaces = await getWorkspacesWithCache(modWorkspace);\n const isDuplicate = existingWorkspaces.some((w) => w.name === newName && w.id !== targetWorkspace.id);\n if (isDuplicate) {\n console.error(`Workspace name \"${newName}\" already exists`);\n process.exit(1);\n }\n // Note: Actual rename would need to be implemented in ModWorkspace interface\n // For now, update local config if this is the active workspace\n const config = readModConfig();\n if (config?.workspaceId === targetWorkspace.id) {\n const updatedConfig = { ...config, workspaceName: newName };\n writeModConfig(updatedConfig);\n }\n await invalidateWorkspaceCache();\n console.log(`\u2713 Workspace renamed from \"${targetWorkspace.name}\" to \"${newName}\"`);\n console.log('Note: Full rename implementation pending ModWorkspace.renameWorkspace() interface');\n }\n catch (error) {\n console.error('Failed to rename workspace:', error);\n process.exit(1);\n }\n}\nasync function resolveWorkspace(nameOrId, modWorkspace) {\n const workspaces = await getWorkspacesWithCache(modWorkspace);\n // First try exact ID match\n let match = workspaces.find((w) => w.id === nameOrId);\n if (match)\n return match;\n // Then try exact name match\n match = workspaces.find((w) => w.name === nameOrId);\n if (match)\n return match;\n // Try numbered quick-switch (1-9)\n const num = parseInt(nameOrId);\n if (!isNaN(num) && num >= 1 && num <= workspaces.length) {\n return workspaces[num - 1];\n }\n // Finally try fuzzy name matching\n const fuzzyMatches = workspaces.filter((w) => w.name.toLowerCase().includes(nameOrId.toLowerCase()));\n if (fuzzyMatches.length === 1) {\n return fuzzyMatches[0];\n }\n return null;\n}\nasync function getWorkspacesWithCache(modWorkspace) {\n const cacheDir = '.mod/.cache';\n const cachePath = path.join(cacheDir, 'workspaces.json');\n // Ensure cache directory exists\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n }\n // Check if cache exists and is recent (under 5 minutes old)\n if (fs.existsSync(cachePath)) {\n const stats = fs.statSync(cachePath);\n const ageMinutes = (Date.now() - stats.mtime.getTime()) / (1000 * 60);\n if (ageMinutes < 5) {\n try {\n const cache = JSON.parse(fs.readFileSync(cachePath, 'utf8'));\n return cache.workspaces;\n }\n catch (error) {\n // Cache is corrupted, fall through to refresh\n }\n }\n }\n try {\n const workspaceHandles = await modWorkspace.listWorkspaces();\n // Convert WorkspaceHandle[] to CachedWorkspace format\n const workspaces = [];\n for (const handle of workspaceHandles) {\n // Get additional workspace data if available\n let fileCount = 0;\n let branchCount = 1;\n try {\n const files = await handle.file.list();\n fileCount = files.length;\n const branches = await handle.branch.list();\n branchCount = branches.length || 1;\n }\n catch (error) {\n // Ignore errors when fetching additional data\n }\n workspaces.push({\n id: handle.id,\n name: handle.name,\n description: undefined, // Not available from handle\n fileCount,\n branchCount,\n lastModified: new Date().toISOString(), // Would need to be tracked properly\n permissions: [] // Would need to be populated from permission system\n });\n }\n const cache = {\n lastUpdate: new Date().toISOString(),\n workspaces: workspaces,\n nameIndex: workspaces.reduce((index, w) => {\n index[w.name] = w.id;\n return index;\n }, {})\n };\n fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2));\n return workspaces;\n }\n catch (error) {\n console.warn('Failed to fetch workspaces:', error);\n return [];\n }\n}\nasync function invalidateWorkspaceCache() {\n const cachePath = '.mod/.cache/workspaces.json';\n if (fs.existsSync(cachePath)) {\n fs.unlinkSync(cachePath);\n }\n}\n// Utility functions for time formatting\nfunction formatRelativeTime(isoString) {\n const date = new Date(isoString);\n const now = new Date();\n const diffHours = Math.floor((now.getTime() - date.getTime()) / (1000 * 60 * 60));\n if (diffHours < 1)\n return 'just now';\n if (diffHours < 24)\n return `${diffHours}h ago`;\n if (diffHours < 24 * 7)\n return `${Math.floor(diffHours / 24)}d ago`;\n return `${Math.floor(diffHours / (24 * 7))}w ago`;\n}\nfunction formatAbsoluteTime(isoString) {\n const date = new Date(isoString);\n return date.toLocaleString();\n}\n", "/**\n * Claude Code Event Sync Tool\n * Syncs Claude Code events with Mod system (branches, threads, tasks, history)\n */\nimport { readModConfig } from '../services/mod-config.js';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nfunction isWorkspaceHistoryFile(filePath) {\n if (!filePath)\n return false;\n const normalized = filePath.replace(/\\\\/g, '/');\n if (!normalized)\n return false;\n if (normalized === '.claude' || normalized === '/.claude')\n return false;\n if (normalized.startsWith('.claude/'))\n return false;\n if (normalized.includes('/.claude/'))\n return false;\n if (normalized.endsWith('/.claude'))\n return false;\n return true;\n}\nexport async function claudeSyncCommand(args, repo) {\n // Check for --payload-stdin flag\n if (args.includes('--payload-stdin')) {\n // await processPayloadFromStdin(repo); // Commented out - needs refactoring\n return;\n }\n const subcommand = args[0];\n if (!subcommand) {\n console.log(`\nClaude Code Event Sync Tool\n\nUsage:\n mod claude-sync <command> [options]\n\nCommands:\n sync-events # Sync all tracked events to Mod system\n create-session <id> # Create branch/thread for specific session\n sync-file-updates # Sync file updates to history\n sync-todos # Sync todo tracking to tasks\n sync-conversations # Sync conversation content to threads\n status # Show sync status\n help # Show this help\n\nExamples:\n mod claude-sync sync-events\n mod claude-sync create-session 1faa82b3-6d63-4e39-8784-207d7fbf83c0\n mod claude-sync status\n`);\n return;\n }\n const cfg = readModConfig();\n if (!cfg?.workspaceId) {\n console.error('\u274C No active workspace configured in .mod/config.json');\n process.exit(1);\n }\n // TODO: Replace with ModWorkspace/WorkspaceHandle approach\n console.error('\u274C claude-sync needs refactoring to work with new ModWorkspace approach');\n process.exit(1);\n}\n/* COMMENTED OUT - Needs refactoring for new ModWorkspace approach\n const cache = getCliRepoCache(repo as any);\n const workspaceContext = await cache.ensureBranchContext({\n workspaceId: cfg.workspaceId,\n branchId: '', // Will be resolved by the cache\n waitForHydration: true\n });\n const { workspace, branchesDocId, branch } = workspaceContext;\n \n if (!workspace || !branch) {\n console.error('\u274C Failed to resolve workspace context');\n process.exit(1);\n }\n \n const workspaceId = workspace.id;\n const branchId = branch.id;\n\n const workspaceService = new WorkspaceService(repo);\n const branchService = new BranchService(repo);\n const threadService = new ThreadService(repo);\n const taskService = new TaskService(repo);\n const changeLogService = new ChangeLogService(repo);\n\n const projectDir = process.cwd();\n const stateDir = path.join(projectDir, '.claude', 'state');\n const logDir = path.join(projectDir, '.claude', 'logs');\n const conversationsDir = path.join(projectDir, '.claude', 'conversations');\n\n switch (subcommand) {\n case 'sync-events':\n await syncAllEvents(workspaceService, branchService, threadService, taskService, changeLogService, {\n workspaceId, branchId, branchesDocId, projectDir, stateDir, logDir, conversationsDir\n });\n break;\n \n case 'create-session':\n const sessionId = args[1];\n if (!sessionId) {\n console.error('\u274C Session ID required: mod claude-sync create-session <session-id>');\n process.exit(1);\n }\n await createSessionBranchThread(workspaceService, branchService, threadService, {\n workspaceId, branchId, branchesDocId, sessionId, projectDir, stateDir\n });\n break;\n \n case 'sync-file-updates':\n await syncFileUpdates(taskService, changeLogService, { branchId, branchesDocId, projectDir, logDir });\n break;\n \n case 'sync-todos':\n await syncTodos(taskService, { branchId, branchesDocId, projectDir, logDir });\n break;\n \n case 'sync-conversations':\n await syncConversations(threadService, { branchId, branchesDocId, projectDir, conversationsDir });\n break;\n \n case 'status':\n await showSyncStatus({ projectDir, stateDir, logDir, conversationsDir });\n break;\n \n case 'help':\n console.log(`\nClaude Code Event Sync Tool\n\nThis tool integrates Claude Code activity with your Mod workspace by:\n\n1. Creating new branches/threads for each Claude Code session\n2. Tracking file updates in task history\n3. Syncing todo tracking to Mod tasks\n4. Adding conversation content to threads\n\nCommands:\n sync-events # Full sync of all tracked data\n create-session <id> # Create branch/thread for specific session\n sync-file-updates # Sync file updates to history\n sync-todos # Sync todo tracking to tasks\n sync-conversations # Sync conversation content to threads\n status # Show sync status\n\nThe tool reads from:\n .claude/logs/events-*.jsonl # Event logs\n .claude/conversations/*.json # Conversation data\n .claude/state/sessions.json # Session mappings\n`);\n break;\n \n default:\n console.error(`\u274C Unknown command: ${subcommand}`);\n console.log('Run \"mod claude-sync help\" for usage information');\n process.exit(1);\n }\n}\n\nasync function syncAllEvents(\n workspaceService: WorkspaceService,\n branchService: BranchService,\n threadService: ThreadService,\n taskService: TaskService,\n changeLogService: ChangeLogService,\n context: any\n) {\n console.log('\uD83D\uDD04 Starting full Claude Code event sync...');\n \n // Load session mappings\n const sessionMapping = loadSessionMapping(context.stateDir);\n \n // Process all events\n const events = loadAllEvents(context.logDir);\n console.log(`\uD83D\uDCCA Found ${events.length} events across ${new Set(events.map(e => e.session_id)).size} sessions`);\n \n // Group events by session\n const eventsBySession = groupEventsBySession(events);\n \n for (const [sessionId, sessionEvents] of eventsBySession) {\n console.log(`\\n\uD83D\uDCDD Processing session: ${sessionId}`);\n \n // Create branch/thread if not exists\n if (!sessionMapping[sessionId]?.threadId) {\n await createSessionBranchThread(workspaceService, branchService, threadService, {\n ...context, sessionId\n });\n }\n \n // Sync file updates\n await syncFileUpdatesForSession(taskService, changeLogService, {\n ...context, sessionId, events: sessionEvents\n });\n \n // Sync todos\n await syncTodosForSession(taskService, {\n ...context, sessionId, events: sessionEvents\n });\n \n // Sync conversation\n await syncConversationForSession(threadService, {\n ...context, sessionId\n });\n }\n \n console.log('\\n\u2705 Full sync complete!');\n}\n\nasync function createSessionBranchThread(\n workspaceService: WorkspaceService,\n branchService: BranchService,\n threadService: ThreadService,\n context: any\n) {\n const { workspaceId, branchId, branchesDocId, sessionId, projectDir, stateDir } = context;\n \n console.log(`\uD83C\uDFD7\uFE0F Creating branch/thread for session: ${sessionId}`);\n \n try {\n // Create new branch for this session\n const branchName = `claude-session-${sessionId.substring(0, 8)}`;\n const newBranch = await branchService.createBranch(\n branchId, // parent branch\n branchName,\n workspaceId,\n 'thread',\n 'claude-code',\n branchesDocId\n );\n \n // Create thread for the branch\n const threadName = `Claude Session ${sessionId.substring(0, 8)}`;\n const newThread = await threadService.createThreadWithBranch(\n workspaceId,\n branchesDocId,\n newBranch.id,\n threadName\n );\n \n // Update session mapping\n updateSessionMapping(stateDir, sessionId, {\n threadId: newThread.id,\n branchId: newBranch.id,\n firstSeen: new Date().toISOString(),\n lastActivity: new Date().toISOString()\n });\n \n console.log(`\u2705 Created branch: ${branchName} (${newBranch.id})`);\n console.log(`\u2705 Created thread: ${threadName} (${newThread.id})`);\n \n } catch (error) {\n console.error(`\u274C Failed to create branch/thread for session ${sessionId}:`, error);\n }\n}\n\nasync function syncFileUpdates(\n taskService: TaskService,\n changeLogService: ChangeLogService,\n context: any\n) {\n console.log('\uD83D\uDCC1 Syncing file updates to history...');\n \n const events = loadAllEvents(context.logDir);\n const fileEvents = events.filter(e => e.tool_name === 'Write' || e.tool_name === 'Edit');\n \n console.log(`\uD83D\uDCCA Found ${fileEvents.length} file update events`);\n \n for (const event of fileEvents) {\n if (event.file_path) {\n if (!isWorkspaceHistoryFile(event.file_path)) {\n console.log(`\u23ED\uFE0F Skipping Claude internal file: ${event.file_path}`);\n continue;\n }\n try {\n // Create or get task for this session\n const taskId = await getOrCreateTaskForSession(taskService, context, event.session_id, {\n description: `File update: ${path.basename(event.file_path)}`,\n source: 'claude-code',\n sessionId: event.session_id\n });\n \n // Add file update to task\n const fileId = path.basename(event.file_path); // Simplified file ID\n await taskService.addFileUpdateToTask(\n taskId,\n fileId,\n 'unknown', // before head\n 'current' // after head\n );\n \n console.log(`\u2705 Tracked file update: ${event.file_path}`);\n \n } catch (error) {\n console.error(`\u274C Failed to track file update for ${event.file_path}:`, error);\n }\n }\n }\n}\n\nasync function syncTodos(\n taskService: TaskService,\n context: any\n) {\n console.log('\uD83D\uDCCB Syncing todos to tasks...');\n \n const events = loadAllEvents(context.logDir);\n const todoEvents = events.filter(e => e.tool_name === 'TodoWrite');\n \n console.log(`\uD83D\uDCCA Found ${todoEvents.length} todo events`);\n \n for (const event of todoEvents) {\n try {\n const todos = event.tool_input?.todos || [];\n \n for (const todo of todos) {\n const taskId = await getOrCreateTaskForSession(taskService, context, event.session_id, {\n description: todo.content,\n status: todo.status === 'in_progress' ? 'in-progress' :\n todo.status === 'completed' ? 'complete' : 'pending',\n source: 'claude-code',\n sessionId: event.session_id,\n todoId: todo.id\n });\n \n console.log(`\u2705 Synced todo: ${todo.content} (${todo.status})`);\n }\n \n } catch (error) {\n console.error(`\u274C Failed to sync todos for session ${event.session_id}:`, error);\n }\n }\n}\n\nasync function syncConversations(\n threadService: ThreadService,\n context: any\n) {\n console.log('\uD83D\uDCAC Syncing conversations to threads...');\n \n if (!fs.existsSync(context.conversationsDir)) {\n console.log('\uD83D\uDCC1 No conversations directory found');\n return;\n }\n \n const conversationFiles = fs.readdirSync(context.conversationsDir)\n .filter(f => f.endsWith('.json') && !f.endsWith('-summary.json'));\n \n console.log(`\uD83D\uDCCA Found ${conversationFiles.length} conversations`);\n \n for (const file of conversationFiles) {\n const sessionId = file.replace('.json', '');\n const conversationPath = path.join(context.conversationsDir, file);\n \n try {\n const conversation = JSON.parse(fs.readFileSync(conversationPath, 'utf8'));\n \n // Add conversation as thread items\n for (const message of conversation) {\n if (message.role && message.content) {\n // This would need to be implemented based on your thread item structure\n console.log(`\uD83D\uDCDD Would add message: ${message.role} - ${JSON.stringify(message.content).substring(0, 100)}...`);\n }\n }\n \n console.log(`\u2705 Synced conversation: ${sessionId}`);\n \n } catch (error) {\n console.error(`\u274C Failed to sync conversation ${sessionId}:`, error);\n }\n }\n}\n\nasync function syncFileUpdatesForSession(\n taskService: TaskService,\n changeLogService: ChangeLogService,\n context: any\n) {\n const { sessionId, events } = context;\n const fileEvents = events.filter(e => e.tool_name === 'Write' || e.tool_name === 'Edit');\n \n for (const event of fileEvents) {\n if (event.file_path) {\n if (!isWorkspaceHistoryFile(event.file_path)) {\n console.log(`\u23ED\uFE0F Skipping Claude internal file: ${event.file_path}`);\n continue;\n }\n try {\n const taskId = await getOrCreateTaskForSession(taskService, context, sessionId, {\n description: `File update: ${path.basename(event.file_path)}`,\n source: 'claude-code',\n sessionId: sessionId\n });\n \n const fileId = path.basename(event.file_path);\n await taskService.addFileUpdateToTask(taskId, fileId, 'unknown', 'current');\n \n } catch (error) {\n console.error(`\u274C Failed to track file update:`, error);\n }\n }\n }\n}\n\nasync function syncTodosForSession(\n taskService: TaskService,\n context: any\n) {\n const { sessionId, events } = context;\n const todoEvents = events.filter(e => e.tool_name === 'TodoWrite');\n \n for (const event of todoEvents) {\n const todos = event.tool_input?.todos || [];\n \n for (const todo of todos) {\n try {\n await getOrCreateTaskForSession(taskService, context, sessionId, {\n description: todo.content,\n status: todo.status === 'in_progress' ? 'in-progress' :\n todo.status === 'completed' ? 'complete' : 'pending',\n source: 'claude-code',\n sessionId: sessionId,\n todoId: todo.id\n });\n \n } catch (error) {\n console.error(`\u274C Failed to sync todo:`, error);\n }\n }\n }\n}\n\nasync function syncConversationForSession(\n threadService: ThreadService,\n context: any\n) {\n const { sessionId, conversationsDir } = context;\n const conversationPath = path.join(conversationsDir, `${sessionId}.json`);\n \n if (fs.existsSync(conversationPath)) {\n try {\n const conversation = JSON.parse(fs.readFileSync(conversationPath, 'utf8'));\n console.log(`\uD83D\uDCDD Synced ${conversation.length} messages for session ${sessionId}`);\n \n // TODO: Add conversation messages to thread\n // This would require implementing thread item creation\n \n } catch (error) {\n console.error(`\u274C Failed to sync conversation:`, error);\n }\n }\n}\n\nasync function getOrCreateTaskForSession(\n taskService: TaskService,\n context: any,\n sessionId: string,\n taskData: any\n): Promise<string> {\n // This is a simplified implementation\n // In practice, you'd need to:\n // 1. Get the tasksDocId for the session's branch\n // 2. Check if a task already exists for this session/todo\n // 3. Create or update the task accordingly\n \n const task = {\n branchId: context.branchId, // This should be the session's branch ID\n description: taskData.description,\n metadata: {\n createdBy: 'claude-sync',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: taskData.status || 'pending',\n source: taskData.source,\n claude: {\n sessionId: taskData.sessionId,\n todoId: taskData.todoId\n }\n }\n };\n \n // This would need to be implemented with proper task creation\n return `task-${sessionId}-${Date.now()}`;\n}\n\nasync function showSyncStatus(context: any) {\n console.log('\uD83D\uDCCA Claude Code Sync Status');\n console.log('==========================');\n \n const { projectDir, stateDir, logDir, conversationsDir } = context;\n \n // Check event logs\n if (fs.existsSync(logDir)) {\n const logFiles = fs.readdirSync(logDir).filter(f => f.startsWith('events-'));\n const totalEvents = logFiles.reduce((sum, file) => {\n const content = fs.readFileSync(path.join(logDir, file), 'utf8');\n return sum + content.split('\\n').filter(line => line.trim()).length;\n }, 0);\n \n console.log(`\uD83D\uDCDD Event Logs: ${logFiles.length} files, ${totalEvents} events`);\n } else {\n console.log('\uD83D\uDCDD Event Logs: No logs found');\n }\n \n // Check conversations\n if (fs.existsSync(conversationsDir)) {\n const convFiles = fs.readdirSync(conversationsDir).filter(f => f.endsWith('.json') && !f.endsWith('-summary.json'));\n console.log(`\uD83D\uDCAC Conversations: ${convFiles.length} tracked`);\n } else {\n console.log('\uD83D\uDCAC Conversations: None tracked');\n }\n \n // Check session mappings\n if (fs.existsSync(path.join(stateDir, 'sessions.json'))) {\n const sessions = JSON.parse(fs.readFileSync(path.join(stateDir, 'sessions.json'), 'utf8'));\n console.log(`\uD83D\uDC65 Sessions: ${Object.keys(sessions).length} tracked`);\n } else {\n console.log('\uD83D\uDC65 Sessions: None tracked');\n }\n}\n\nfunction loadSessionMapping(stateDir: string): SessionMapping {\n const mappingPath = path.join(stateDir, 'session-mapping.json');\n if (fs.existsSync(mappingPath)) {\n return JSON.parse(fs.readFileSync(mappingPath, 'utf8'));\n }\n return {};\n}\n\nfunction updateSessionMapping(stateDir: string, sessionId: string, data: any) {\n const mappingPath = path.join(stateDir, 'session-mapping.json');\n const mapping = loadSessionMapping(stateDir);\n \n mapping[sessionId] = {\n ...mapping[sessionId],\n ...data,\n lastActivity: new Date().toISOString()\n };\n \n fs.writeFileSync(mappingPath, JSON.stringify(mapping, null, 2));\n}\n\nfunction loadAllEvents(logDir: string): ClaudeEvent[] {\n if (!fs.existsSync(logDir)) return [];\n \n const events: ClaudeEvent[] = [];\n const logFiles = fs.readdirSync(logDir).filter(f => f.startsWith('events-'));\n \n for (const file of logFiles) {\n const content = fs.readFileSync(path.join(logDir, file), 'utf8');\n const lines = content.split('\\n').filter(line => line.trim());\n \n for (const line of lines) {\n try {\n events.push(JSON.parse(line));\n } catch (error) {\n console.warn(`\u26A0\uFE0F Failed to parse event: ${line.substring(0, 100)}...`);\n }\n }\n }\n \n return events;\n}\n\nfunction groupEventsBySession(events: ClaudeEvent[]): Map<string, ClaudeEvent[]> {\n const grouped = new Map<string, ClaudeEvent[]>();\n \n for (const event of events) {\n if (!grouped.has(event.session_id)) {\n grouped.set(event.session_id, []);\n }\n grouped.get(event.session_id)!.push(event);\n }\n \n return grouped;\n}\n\nasync function processPayloadFromStdin(repo: Repo): Promise<void> {\n try {\n // Read payload from stdin\n let payload = '';\n process.stdin.setEncoding('utf8');\n \n for await (const chunk of process.stdin) {\n payload += chunk;\n }\n \n if (!payload.trim()) {\n console.error('\u274C No payload received from stdin');\n process.exit(1);\n }\n \n const eventData = JSON.parse(payload);\n console.log(`\uD83D\uDD04 Processing Claude Code event: ${eventData.tool_name} (session: ${eventData.session_id?.substring(0, 8) || 'unknown'})`);\n \n // Get workspace context\n const cfg = readModConfig();\n if (!cfg?.workspaceId) {\n console.error('\u274C No active workspace configured in .mod/config.json');\n process.exit(1);\n }\n \n // TODO: Replace with ModWorkspace/WorkspaceHandle approach\n console.error('\u274C claude-sync needs refactoring to work with new ModWorkspace approach');\n process.exit(1);\n \n /*\n const cache = getCliRepoCache(repo as any);\n const workspaceContext = await cache.ensureBranchContext({\n workspaceId: cfg.workspaceId,\n branchId: '', // Will be resolved by the cache\n waitForHydration: true\n });\n const { workspace, branchesDocId, branch } = workspaceContext;\n \n if (!workspace || !branch) {\n console.error('\u274C Failed to resolve workspace context');\n process.exit(1);\n }\n \n const workspaceId = workspace.id;\n const branchId = branch.id;\n \n // Initialize services\n const workspaceService = new WorkspaceService(repo);\n const branchService = new BranchService(repo);\n const threadService = new ThreadService(repo);\n const taskService = new TaskService(repo);\n const changeLogService = new ChangeLogService(repo);\n \n const projectDir = process.cwd();\n const stateDir = path.join(projectDir, '.claude', 'state');\n \n // Process the event based on tool type\n const sessionId = eventData.session_id;\n const toolName = eventData.tool_name;\n const filePath = eventData.tool_input?.file_path;\n \n if (!sessionId) {\n console.error('\u274C No session_id in payload');\n process.exit(1);\n }\n \n // Check if this is a new session and create branch/thread if needed\n const sessionMappingFile = path.join(stateDir, 'session-mapping.json');\n let sessionMapping: SessionMapping = {};\n \n if (fs.existsSync(sessionMappingFile)) {\n try {\n sessionMapping = JSON.parse(fs.readFileSync(sessionMappingFile, 'utf8'));\n } catch (e) {\n console.warn('\u26A0\uFE0F Could not read session mapping file');\n }\n }\n \n const isNewSession = !sessionMapping[sessionId];\n \n if (isNewSession) {\n console.log(`\uD83C\uDD95 New Claude Code session detected: ${sessionId.substring(0, 8)}`);\n \n // Create branch/thread for this session\n await createSessionBranchThread(workspaceService, branchService, threadService, {\n workspaceId, branchId, branchesDocId, sessionId, projectDir, stateDir\n });\n \n // Update session mapping\n sessionMapping[sessionId] = {\n firstSeen: new Date().toISOString(),\n lastActivity: new Date().toISOString()\n };\n } else {\n // Update last activity\n sessionMapping[sessionId].lastActivity = new Date().toISOString();\n }\n \n // Process specific tool events\n switch (toolName) {\n case 'Write':\n case 'Edit':\n if (filePath) {\n if (!isWorkspaceHistoryFile(filePath)) {\n console.log(`\u23ED\uFE0F Skipping Claude internal file: ${filePath}`);\n break;\n }\n console.log(`\uD83D\uDCC1 File update detected: ${path.basename(filePath)}`);\n // Create a task for this file update\n const taskDescription = `File update: ${path.basename(filePath)}`;\n const taskId = await createTaskForSession(taskService, branchId, branchesDocId, taskDescription, sessionId);\n if (taskId) {\n console.log(`\u2705 Created task for file update: ${taskId}`);\n }\n }\n break;\n \n case 'TodoWrite':\n console.log(`\uD83D\uDCCB Todo update detected`);\n const todos = eventData.tool_input?.todos || [];\n for (const todo of todos) {\n if (todo.content) {\n // Map todo status to valid task status\n let taskStatus: 'pending' | 'in-progress' | 'complete' | 'rejected' = 'pending';\n if (todo.status === 'completed') taskStatus = 'complete';\n else if (todo.status === 'in_progress') taskStatus = 'in-progress';\n \n const taskId = await createTaskForSession(taskService, branchId, branchesDocId, todo.content, sessionId, taskStatus);\n if (taskId) {\n console.log(`\u2705 Created task for todo: ${todo.content} (${taskStatus})`);\n }\n }\n }\n break;\n \n default:\n console.log(`\uD83D\uDD27 Tool usage: ${toolName}`);\n }\n \n // Save updated session mapping\n fs.mkdirSync(stateDir, { recursive: true });\n fs.writeFileSync(sessionMappingFile, JSON.stringify(sessionMapping, null, 2));\n \n console.log(`\u2705 Event processed successfully for session: ${sessionId.substring(0, 8)}`);\n \n } catch (error) {\n console.error('\u274C Error processing payload:', error);\n process.exit(1);\n }\n}\n\nasync function createTaskForSession(\n taskService: TaskService,\n branchId: string,\n branchesDocId: string,\n description: string,\n sessionId: string,\n status: 'pending' | 'in-progress' | 'complete' | 'rejected' = 'pending'\n): Promise<string | null> {\n try {\n // Ensure tasks doc exists for the branch\n const tasksDocId = await taskService.getOrCreateTasksDocForBranch(branchId, branchesDocId);\n \n // Create task\n const taskDoc = await taskService.createTask(tasksDocId, {\n description,\n branchId,\n context: {\n files: [],\n links: []\n },\n subtasks: [],\n filesUpdated: [],\n threadItemIds: [],\n metadata: {\n createdBy: 'claude-sync',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status,\n source: 'claude-code',\n claude: {\n sessionId\n }\n }\n });\n \n return taskDoc.id;\n } catch (error) {\n console.error('\u274C Failed to create task:', error);\n return null;\n }\n}\n\n// Close comment blocks\n*/\n", "import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport { createModWorkspace } from '@mod/mod-core/mod-workspace';\nimport { detectMimeType, mimeTypeToCanvasType } from '@mod/mod-core';\nimport { ModIgnoreService } from './modignore-service.js';\nimport { readModConfig } from './mod-config.js';\nexport class FileImportService {\n constructor(repo) {\n this.folderCache = new Map(); // path -> folderId\n this.repo = repo;\n }\n async previewImport(options = {}) {\n console.log('\uD83D\uDD0D Scanning for importable files...');\n const workingDir = options.workingDirectory || process.cwd();\n const preview = await this.scanFiles(workingDir, options);\n console.log('\\n\uD83D\uDCCB Import Preview:');\n console.log(` Total files scanned: ${preview.totalFilesScanned}`);\n console.log(` Files to import: ${preview.filteredFiles.length}`);\n console.log(` Files excluded: ${preview.excludedFiles.length}`);\n console.log(` Estimated size: ${this.formatBytes(preview.estimatedSize)}`);\n console.log(` Estimated time: ${preview.estimatedDuration}ms`);\n if (options.verbose) {\n console.log('\\n\uD83D\uDCC1 Files to import:');\n preview.filteredFiles.slice(0, 20).forEach(file => {\n console.log(` ${file}`);\n });\n if (preview.filteredFiles.length > 20) {\n console.log(` ... and ${preview.filteredFiles.length - 20} more files`);\n }\n }\n return preview;\n }\n async promptImport(options = {}) {\n const preview = await this.previewImport(options);\n if (preview.filteredFiles.length === 0) {\n console.log('\u274C No files found to import');\n return false;\n }\n // Simple confirmation for now - could enhance with readline interface\n console.log('\\n\u2753 Proceed with import? (This will create documents in your workspace)');\n console.log(' Type \"y\" to continue or any other key to cancel...');\n // For CLI implementation, we'll return true for now\n // In a full implementation, this would use readline to get user input\n return true;\n }\n async executeImport(options = {}) {\n const startTime = Date.now();\n const workingDir = options.workingDirectory || process.cwd();\n const batchSize = options.batchSize || 50;\n console.log('\uD83D\uDE80 Starting file import...');\n // Clear folder cache for fresh import\n this.folderCache.clear();\n const config = readModConfig();\n if (!config || !config.workspaceId) {\n throw new Error('No active workspace configured. Run `mod workspace create <name>` first.');\n }\n const modWorkspace = createModWorkspace(this.repo);\n const workspaceHandle = await modWorkspace.openWorkspace(config.workspaceId);\n const preview = await this.scanFiles(workingDir, options);\n const result = {\n importedFiles: [],\n skippedFiles: [],\n errors: [],\n totalDuration: 0\n };\n const batches = this.chunkArray(preview.filteredFiles, batchSize);\n for (let i = 0; i < batches.length; i++) {\n const batch = batches[i];\n console.log(`\uD83D\uDCE6 Processing batch ${i + 1}/${batches.length} (${batch.length} files)...`);\n await Promise.all(batch.map(async (filePath) => {\n try {\n await this.importFile(filePath, workspaceHandle, workingDir);\n result.importedFiles.push(filePath);\n if (options.verbose) {\n console.log(` \u2713 ${filePath}`);\n }\n }\n catch (error) {\n result.errors.push({\n file: filePath,\n error: error instanceof Error ? error.message : String(error)\n });\n if (options.verbose) {\n console.log(` \u274C ${filePath}: ${error}`);\n }\n }\n }));\n // Small delay between batches to prevent overwhelming the system\n if (i < batches.length - 1) {\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n }\n result.totalDuration = Date.now() - startTime;\n console.log('\\n\u2705 Import complete!');\n console.log(` Imported: ${result.importedFiles.length} files`);\n console.log(` Skipped: ${result.skippedFiles.length} files`);\n console.log(` Errors: ${result.errors.length} files`);\n console.log(` Duration: ${result.totalDuration}ms`);\n if (result.errors.length > 0) {\n console.log('\\n\u274C Errors occurred:');\n result.errors.slice(0, 5).forEach(error => {\n console.log(` ${error.file}: ${error.error}`);\n });\n if (result.errors.length > 5) {\n console.log(` ... and ${result.errors.length - 5} more errors`);\n }\n }\n return result;\n }\n async scanFiles(workingDir, options) {\n this.modIgnoreService = new ModIgnoreService(workingDir);\n const scannedFiles = [];\n const filteredFiles = [];\n const excludedFiles = [];\n let totalSize = 0;\n await this.scanDirectory(workingDir, workingDir, scannedFiles, filteredFiles, excludedFiles, options);\n // Calculate size estimates\n for (const file of filteredFiles) {\n try {\n const stats = await fs.promises.stat(file);\n totalSize += stats.size;\n }\n catch (error) {\n // File might have been deleted during scan, skip\n }\n }\n return {\n totalFilesScanned: scannedFiles.length,\n filteredFiles,\n excludedFiles,\n estimatedSize: totalSize,\n estimatedDuration: filteredFiles.length * 10 // Rough estimate: 10ms per file\n };\n }\n async scanDirectory(rootDir, currentDir, scannedFiles, filteredFiles, excludedFiles, options) {\n try {\n const entries = await fs.promises.readdir(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n const relativePath = path.relative(rootDir, fullPath);\n if (entry.isDirectory()) {\n // Check if directory should be excluded\n if (this.modIgnoreService?.shouldIgnore(fullPath, rootDir)) {\n excludedFiles.push(relativePath);\n continue;\n }\n // Recurse into directory\n await this.scanDirectory(rootDir, fullPath, scannedFiles, filteredFiles, excludedFiles, options);\n }\n else if (entry.isFile()) {\n scannedFiles.push(relativePath);\n // Check if file should be excluded\n if (this.modIgnoreService?.shouldIgnore(fullPath, rootDir)) {\n excludedFiles.push(relativePath);\n continue;\n }\n // Check file extension filter\n if (this.isTrackableFile(fullPath)) {\n // Apply pattern filters if specified\n if (options.patterns && options.patterns.length > 0) {\n const matches = options.patterns.some(pattern => relativePath.includes(pattern) || fullPath.includes(pattern));\n if (!matches) {\n excludedFiles.push(relativePath);\n continue;\n }\n }\n filteredFiles.push(fullPath);\n }\n else {\n excludedFiles.push(relativePath);\n }\n }\n }\n }\n catch (error) {\n // Directory might not be accessible, skip\n }\n }\n isTrackableFile(filePath) {\n const ext = path.extname(filePath).toLowerCase();\n const trackableExtensions = [\n '.md', '.txt', '.js', '.ts', '.jsx', '.tsx', '.json', '.yaml', '.yml',\n '.py', '.java', '.cpp', '.c', '.h', '.css', '.scss', '.html', '.xml',\n '.sql', '.go', '.rs', '.php', '.rb', '.swift', '.kt', '.scala', '.sh',\n '.ps1', '.dockerfile', '.tf', '.hcl', '.vue', '.svelte', '.astro'\n ];\n return trackableExtensions.includes(ext);\n }\n async importFile(filePath, workspaceHandle, workingDir) {\n try {\n const content = await fs.promises.readFile(filePath, 'utf-8');\n const relativePath = path.relative(workingDir, filePath);\n const contentHash = crypto.createHash('sha256').update(content).digest('hex');\n // Parse directory structure to create hierarchical folders\n const pathParts = relativePath.split(path.sep);\n const fileName = pathParts.pop();\n const dirPath = pathParts.join('/');\n let folderId = null;\n // Create folder hierarchy if the file is in a subdirectory\n if (dirPath) {\n folderId = await this.ensureFolderHierarchy(dirPath, workspaceHandle);\n }\n // Create document via workspace handle with proper folder association\n const ext = path.extname(fileName).toLowerCase();\n const mimeType = this.getMimeTypeForExtension(ext);\n const canvasType = mimeTypeToCanvasType(mimeType);\n const documentData = {\n text: content,\n metadata: {\n type: canvasType, // Required for workspace container routing\n originalFilename: fileName,\n tags: [`imported:${new Date().toISOString()}`, `hash:${contentHash}`],\n typeData: {\n originalPath: filePath,\n relativePath,\n contentHash\n }\n }\n };\n const fileDoc = await workspaceHandle.file.create(documentData, {\n name: fileName, // Use just the filename, not the full path\n mimeType,\n folderId: folderId, // Associate with the appropriate folder (cast to handle DocumentId type)\n });\n // This should be handled automatically by the workspace handle\n }\n catch (error) {\n throw new Error(`Failed to import ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n async ensureFolderHierarchy(dirPath, workspaceHandle) {\n // Check cache first to avoid creating duplicate folders\n if (this.folderCache.has(dirPath)) {\n return this.folderCache.get(dirPath);\n }\n const pathParts = dirPath.split('/').filter(Boolean);\n let currentPath = '';\n let parentFolderId = null;\n // Create folders hierarchically from root to deepest level\n for (const folderName of pathParts) {\n currentPath = currentPath ? `${currentPath}/${folderName}` : folderName;\n if (this.folderCache.has(currentPath)) {\n parentFolderId = this.folderCache.get(currentPath);\n continue;\n }\n // Create folder using workspace handle - we'll use the folder path approach\n // since the workspace handle doesn't expose the direct service createFolder method\n const folderRef = await workspaceHandle.folder.create(currentPath, {\n name: folderName,\n metadata: {\n type: 'folder',\n path: currentPath,\n createdAt: new Date().toISOString()\n }\n });\n // Cache the folder ID for reuse\n this.folderCache.set(currentPath, folderRef.id);\n parentFolderId = folderRef.id;\n }\n return parentFolderId;\n }\n chunkArray(array, chunkSize) {\n const chunks = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n chunks.push(array.slice(i, i + chunkSize));\n }\n return chunks;\n }\n getMimeTypeForExtension(ext) {\n // Use centralized MIME type detection from mod-core\n const fileName = `file${ext}`;\n return detectMimeType(fileName);\n }\n formatBytes(bytes) {\n if (bytes === 0)\n return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n}\n", "import { SyncDaemon } from '../services/sync-daemon.js';\nimport { FileImportService } from '../services/file-import-service.js';\nexport async function syncCommand(args, repo) {\n const command = args[0] || 'start';\n const daemon = new SyncDaemon();\n try {\n switch (command) {\n case 'start':\n await daemon.start({\n force: args.includes('--force'),\n verbose: args.includes('--verbose')\n });\n break;\n case 'stop':\n await daemon.stop({\n force: args.includes('--force')\n });\n break;\n case 'restart':\n await daemon.restart({\n force: args.includes('--force'),\n verbose: args.includes('--verbose')\n });\n break;\n case 'status':\n const status = await daemon.status();\n if (!status) {\n console.log('\u274C Daemon is not running');\n return;\n }\n console.log('\uD83D\uDCCA Sync Daemon Status:');\n console.log(` Status: ${status.status}`);\n console.log(` PID: ${status.pid}`);\n console.log(` Started: ${new Date(status.startedAt).toLocaleString()}`);\n console.log(` Last Activity: ${new Date(status.lastActivity).toLocaleString()}`);\n console.log(` Workspace: ${status.workspaceId}${status.workspaceName ? ` (${status.workspaceName})` : ''}`);\n if (status.activeBranchId) {\n console.log(` Active Branch: ${status.activeBranchId}`);\n }\n console.log(` Watched Files: ${status.watchedFiles}`);\n if (status.uptime) {\n const uptimeSeconds = Math.floor(status.uptime / 1000);\n const hours = Math.floor(uptimeSeconds / 3600);\n const minutes = Math.floor((uptimeSeconds % 3600) / 60);\n const seconds = uptimeSeconds % 60;\n console.log(` Uptime: ${hours}h ${minutes}m ${seconds}s`);\n }\n if (status.crashCount > 0) {\n console.log(` Crashes: ${status.crashCount}`);\n }\n if (status.lastError) {\n console.log(` Last Error: ${status.lastError}`);\n }\n break;\n case 'import':\n const importService = new FileImportService(repo);\n console.log('DEBUG: sync import args:', args);\n const preview = args.includes('--preview');\n console.log('DEBUG: preview flag:', preview);\n const patterns = args.filter(arg => !arg.startsWith('--'));\n if (preview) {\n console.log('DEBUG: Running preview mode only');\n await importService.previewImport({\n patterns: patterns.length > 1 ? patterns.slice(1) : undefined,\n verbose: args.includes('--verbose')\n });\n return; // Exit after preview\n }\n console.log('DEBUG: Running full import');\n await importService.executeImport({\n patterns: patterns.length > 1 ? patterns.slice(1) : undefined,\n verbose: args.includes('--verbose')\n });\n break;\n default:\n console.log('Usage: mod sync <command>');\n console.log('Commands:');\n console.log(' start Start the sync daemon in the background');\n console.log(' stop Stop the sync daemon gracefully');\n console.log(' restart Restart the sync daemon');\n console.log(' status Show daemon status and health information');\n console.log(' import Import existing project files to workspace');\n console.log('');\n console.log('Options:');\n console.log(' --force Force start/stop operations');\n console.log(' --verbose Enable verbose output');\n console.log(' --preview Preview files without importing (import only)');\n break;\n }\n }\n catch (error) {\n console.error(`\u274C Sync command failed:`, error);\n process.exit(1);\n }\n}\n", "/**\n * Init command for installing Claude commands and workspace initialization\n * Installs versioned command files from CLI package to user's .claude/commands directory\n * Creates a new workspace if none exists in the current directory\n */\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { createModWorkspace } from '@mod/mod-core';\nimport { readModConfig, writeModConfig } from '../services/mod-config.js';\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nexport async function initCommand(args, repo) {\n const subcommand = args[0];\n if (subcommand === 'list' || args.includes('--list')) {\n await listAvailableCommands();\n process.exit(0);\n }\n try {\n const workspaceStatus = await checkWorkspaceStatus(repo);\n await ensureClaudeCommandsDirectory();\n const availableCommands = await discoverAvailableCommands();\n const installedCommands = await getInstalledCommands();\n const commandsToInstall = await determineCommandsToInstall(availableCommands, installedCommands, args.includes('--force'));\n if (commandsToInstall.length > 0) {\n displayInstallationPlan(commandsToInstall);\n const shouldProceed = args.includes('--force') || await confirmInstallation(commandsToInstall);\n if (!shouldProceed) {\n console.log('Installation cancelled');\n process.exit(0);\n }\n await installCommands(commandsToInstall);\n }\n const finalWorkspaceStatus = await handleWorkspaceInitialization(workspaceStatus, repo);\n displayInitializationSuccess(commandsToInstall, finalWorkspaceStatus);\n process.exit(0);\n }\n catch (error) {\n handleInstallationError(error);\n }\n}\nasync function ensureClaudeCommandsDirectory() {\n const claudeDir = path.join(process.cwd(), '.claude');\n const commandsDir = path.join(claudeDir, 'commands');\n try {\n if (!fs.existsSync(claudeDir)) {\n fs.mkdirSync(claudeDir, { recursive: true, mode: 0o755 });\n }\n if (!fs.existsSync(commandsDir)) {\n fs.mkdirSync(commandsDir, { recursive: true, mode: 0o755 });\n }\n }\n catch (error) {\n throw new Error(`Failed to create .claude/commands directory: ${error.message}`);\n }\n}\nasync function discoverAvailableCommands() {\n // Navigate from dist/commands/init.js to package root commands/\n // __dirname is dist/commands, so go up two levels to package root\n const packageRoot = path.resolve(__dirname, '../..');\n const commandsSourceDir = path.join(packageRoot, 'commands');\n if (!fs.existsSync(commandsSourceDir)) {\n console.warn('\u26A0\uFE0F No commands directory found in CLI package');\n return [];\n }\n const commands = [];\n const files = fs.readdirSync(commandsSourceDir).filter(f => f.endsWith('.md'));\n for (const filename of files) {\n const filePath = path.join(commandsSourceDir, filename);\n const content = fs.readFileSync(filePath, 'utf8');\n const metadata = parseFrontmatter(content);\n commands.push({\n filename,\n path: filePath,\n metadata,\n content\n });\n }\n return commands;\n}\nasync function getInstalledCommands() {\n const commandsDir = path.join(process.cwd(), '.claude', 'commands');\n const installed = new Map();\n if (!fs.existsSync(commandsDir)) {\n return installed;\n }\n const files = fs.readdirSync(commandsDir).filter(f => f.endsWith('.md'));\n for (const filename of files) {\n const filePath = path.join(commandsDir, filename);\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n const metadata = parseFrontmatter(content);\n installed.set(filename, metadata);\n }\n catch (error) {\n console.warn(`\u26A0\uFE0F Could not read metadata from ${filename}: ${error.message}`);\n }\n }\n return installed;\n}\nfunction parseFrontmatter(content) {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!frontmatterMatch) {\n // Return default metadata for files without frontmatter - they need to be updated\n return {\n version: '0.0.0', // Old version to trigger update\n updated: '1970-01-01',\n checksum: '',\n description: undefined\n };\n }\n const frontmatterText = frontmatterMatch[1];\n const metadata = {};\n // Simple YAML parsing for required fields\n const lines = frontmatterText.split('\\n');\n for (const line of lines) {\n const match = line.match(/^(\\w+):\\s*(.+)$/);\n if (match) {\n const [, key, value] = match;\n metadata[key] = value.trim().replace(/^[\"']|[\"']$/g, '');\n }\n }\n return {\n version: metadata.version || '1.0.0',\n updated: metadata.updated || new Date().toISOString(),\n checksum: metadata.checksum || '',\n description: metadata.description\n };\n}\nasync function determineCommandsToInstall(available, installed, force) {\n const toInstall = [];\n for (const command of available) {\n const installedMetadata = installed.get(command.filename);\n if (force || !installedMetadata) {\n toInstall.push(command);\n continue;\n }\n // Compare versions\n if (compareVersions(command.metadata.version, installedMetadata.version) > 0) {\n toInstall.push(command);\n }\n }\n return toInstall;\n}\nfunction compareVersions(v1, v2) {\n const parts1 = v1.split('.').map(n => parseInt(n, 10));\n const parts2 = v2.split('.').map(n => parseInt(n, 10));\n for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {\n const part1 = parts1[i] || 0;\n const part2 = parts2[i] || 0;\n if (part1 > part2)\n return 1;\n if (part1 < part2)\n return -1;\n }\n return 0;\n}\nasync function listAvailableCommands() {\n console.log('\uD83D\uDCCB Available Claude Commands:\\n');\n try {\n const commands = await discoverAvailableCommands();\n if (commands.length === 0) {\n console.log(' No commands available');\n return;\n }\n for (const command of commands) {\n console.log(` ${command.filename.replace('.md', '')}`);\n console.log(` \u251C\u2500\u2500 Version: ${command.metadata.version}`);\n if (command.metadata.description) {\n console.log(` \u2514\u2500\u2500 Description: ${command.metadata.description}`);\n }\n else {\n console.log(` \u2514\u2500\u2500 Updated: ${command.metadata.updated}`);\n }\n console.log();\n }\n }\n catch (error) {\n console.error('\u274C Error listing commands:', error.message);\n }\n}\nfunction displayInstallationPlan(commands) {\n console.log('\uD83D\uDCE6 Installing Claude Commands:\\n');\n for (const command of commands) {\n console.log(` ${command.filename.replace('.md', '')} (v${command.metadata.version})`);\n }\n console.log();\n}\nasync function confirmInstallation(commands) {\n // In a real implementation, this would use an interactive prompt library\n // For now, we'll assume confirmation\n return true;\n}\nasync function installCommands(commands) {\n const commandsDir = path.join(process.cwd(), '.claude', 'commands');\n const tempFiles = [];\n try {\n // Install to temporary files first for atomic operation\n for (const command of commands) {\n const tempPath = path.join(commandsDir, `${command.filename}.tmp`);\n const finalPath = path.join(commandsDir, command.filename);\n const contentWithChecksum = await updateChecksumInContent(command.content);\n fs.writeFileSync(tempPath, contentWithChecksum, 'utf8');\n tempFiles.push(tempPath);\n }\n // Move all temp files to final locations atomically\n for (let i = 0; i < commands.length; i++) {\n const tempPath = tempFiles[i];\n const finalPath = path.join(commandsDir, commands[i].filename);\n fs.renameSync(tempPath, finalPath);\n }\n }\n catch (error) {\n cleanup(tempFiles);\n throw error;\n }\n}\nasync function updateChecksumInContent(content) {\n // Use dynamic import for crypto in ESM\n const crypto = await import('crypto');\n const contentHash = crypto\n .createHash('sha256')\n .update(content)\n .digest('hex')\n .substring(0, 16);\n // Update checksum in frontmatter\n // First, remove any existing checksum lines\n const withoutChecksum = content.replace(/^(\\s*)checksum:\\s*\\S*$/gm, '');\n // Then add the new checksum after the frontmatter opening\n return withoutChecksum.replace(/^(---\\n)([\\s\\S]*?)(---)/, `$1$2checksum: ${contentHash}\\n$3`);\n}\nfunction cleanup(tempFiles) {\n for (const file of tempFiles) {\n try {\n if (fs.existsSync(file)) {\n fs.unlinkSync(file);\n }\n }\n catch (error) {\n console.warn(`\u26A0\uFE0F Could not clean up temporary file ${file}: ${error.message}`);\n }\n }\n}\nfunction displayInitializationSuccess(commands, workspaceStatus) {\n console.log('\u2705 Initialization Complete!\\n');\n if (commands.length > 0) {\n console.log(`\uD83D\uDCE6 Installed ${commands.length} Claude command(s):\\n`);\n for (const command of commands) {\n const commandName = command.filename.replace('.md', '');\n console.log(` /${commandName} - ${command.metadata.description || 'Mod workflow command'}`);\n }\n console.log();\n }\n else {\n console.log('\u2705 All Claude commands are up to date\\n');\n }\n if (workspaceStatus.created) {\n console.log(`\uD83D\uDE80 Created new workspace: \"${workspaceStatus.workspaceName}\"`);\n }\n else {\n console.log(`\uD83D\uDCC1 Using existing workspace: \"${workspaceStatus.workspaceName}\"`);\n }\n console.log('\\n\uD83D\uDCA1 Usage:');\n console.log(' Open Claude Code and type \"/\" to see available commands');\n console.log(' Use \"mod workspace list\" to see all workspaces');\n console.log(' Commands are available in your .claude/commands directory\\n');\n}\nasync function checkWorkspaceStatus(repo) {\n try {\n const config = await readModConfig();\n if (config && config.workspaceId) {\n let workspaceName = 'Existing Workspace';\n // Try to get the actual workspace name from the workspace service\n if (repo) {\n try {\n const modWorkspace = createModWorkspace(repo);\n const workspaces = await modWorkspace.listWorkspaces();\n const currentWorkspace = workspaces.find(w => w.id === config.workspaceId);\n if (currentWorkspace) {\n workspaceName = currentWorkspace.name;\n }\n }\n catch (error) {\n // Fallback to generic name if we can't fetch workspace details\n console.warn('\u26A0\uFE0F Could not fetch workspace name, using generic name');\n }\n }\n return {\n exists: true,\n created: false,\n workspaceName,\n workspaceId: config.workspaceId\n };\n }\n // No existing workspace found\n return {\n exists: false,\n created: false,\n workspaceName: 'New Workspace',\n workspaceId: undefined\n };\n }\n catch (error) {\n // No config file exists, so no workspace\n return {\n exists: false,\n created: false,\n workspaceName: 'New Workspace',\n workspaceId: undefined\n };\n }\n}\nasync function handleWorkspaceInitialization(workspaceStatus, repo) {\n if (workspaceStatus.exists) {\n return workspaceStatus;\n }\n try {\n const modWorkspace = createModWorkspace(repo);\n const workspaceName = generateWorkspaceName();\n console.log(`\uD83D\uDE80 Creating new workspace: \"${workspaceName}\"...`);\n const workspace = await modWorkspace.createWorkspace({\n name: workspaceName\n });\n const config = {\n workspaceId: workspace.id,\n activeBranchId: undefined\n };\n await writeModConfig(config);\n return {\n exists: false,\n created: true,\n workspaceName: workspace.name,\n workspaceId: workspace.id\n };\n }\n catch (error) {\n console.warn(`\u26A0\uFE0F Failed to create workspace: ${error.message}`);\n console.log(' Continuing with command installation only.');\n return {\n exists: false,\n created: false,\n workspaceName: 'Failed to create',\n workspaceId: undefined\n };\n }\n}\nfunction generateWorkspaceName() {\n const currentDir = path.basename(process.cwd());\n const timestamp = new Date().toISOString().split('T')[0]; // YYYY-MM-DD\n // Use directory name if it's meaningful, otherwise use timestamp\n if (currentDir && currentDir !== '.' && currentDir !== '/' && currentDir.length > 1) {\n return currentDir.charAt(0).toUpperCase() + currentDir.slice(1);\n }\n return `Workspace-${timestamp}`;\n}\nfunction handleInstallationError(error) {\n console.error('\u274C Initialization failed:');\n if (error.code === 'EACCES' || error.code === 'EPERM') {\n console.error(' Permission denied. Try running with appropriate permissions.');\n console.error(' Make sure you have write access to the .claude/commands directory.');\n }\n else if (error.code === 'ENOSPC') {\n console.error(' Insufficient disk space.');\n }\n else if (error.code === 'ENOTDIR') {\n console.error(' Invalid directory structure. Ensure .claude is a directory, not a file.');\n }\n else {\n console.error(` ${error.message}`);\n }\n console.error('\\n\uD83D\uDD27 Troubleshooting:');\n console.error(' - Ensure you have write permissions in the current directory');\n console.error(' - Try running \"mod init --force\" to overwrite existing files');\n console.error(' - Check that .claude is not a file (should be a directory)');\n console.error(' - For workspace issues, try \"mod workspace create <name>\" separately');\n process.exit(1);\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport { readModConfig, writeModConfig } from '../services/mod-config.js';\nexport async function recoverCommand(args, repo) {\n const [action] = args;\n if (!action || !['automerge', 'workspace', 'branches'].includes(action)) {\n console.error('Usage: mod recover <automerge|workspace|branches>');\n console.error(' automerge - Attempt to recover corrupted Automerge storage');\n console.error(' workspace - Reset workspace configuration');\n console.error(' branches - Recreate corrupted branch documents');\n process.exit(1);\n }\n switch (action) {\n case 'automerge':\n await handleAutomergeRecovery(repo);\n break;\n case 'workspace':\n await handleWorkspaceRecovery();\n break;\n case 'branches':\n await handleBranchRecovery(repo);\n break;\n }\n}\nasync function handleAutomergeRecovery(repo) {\n console.log('\uD83D\uDD27 Attempting Automerge storage recovery...');\n const storageDir = process.env.MOD_AUTOMERGE_STORAGE_DIR\n ? path.resolve(process.env.MOD_AUTOMERGE_STORAGE_DIR)\n : path.resolve('./.automerge-data');\n if (!fs.existsSync(storageDir)) {\n console.log('No Automerge storage directory found. Nothing to recover.');\n return;\n }\n console.log(`Scanning storage directory: ${storageDir}`);\n // Create backup of corrupted storage\n const backupDir = `${storageDir}.backup.${Date.now()}`;\n try {\n console.log(`Creating backup at: ${backupDir}`);\n fs.cpSync(storageDir, backupDir, { recursive: true });\n }\n catch (error) {\n console.warn('Could not create backup:', error);\n }\n // Test document loading to identify corrupted documents\n const corruptedDocs = [];\n const validDocs = [];\n const allDocIds = [];\n const scanDirectory = (dir) => {\n try {\n const items = fs.readdirSync(dir);\n for (const item of items) {\n const itemPath = path.join(dir, item);\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n scanDirectory(itemPath);\n }\n else if (itemPath.includes('/incremental/')) {\n // This is an Automerge incremental storage file\n // Extract document ID from path like: 3K/9QuxnF8NM8g71nvphZYzgxsxxJ/incremental/...\n const pathParts = path.relative(storageDir, itemPath).split(path.sep);\n if (pathParts.length >= 3 && pathParts[2] === 'incremental') {\n const docId = `${pathParts[0]}${pathParts[1]}`;\n if (!allDocIds.includes(docId)) {\n allDocIds.push(docId);\n }\n }\n }\n }\n }\n catch (error) {\n console.warn(`Error scanning directory ${dir}:`, error);\n }\n };\n scanDirectory(storageDir);\n console.log(`Found ${allDocIds.length} document files to test...`);\n // Test each document by actually trying to load it\n for (const docId of allDocIds) {\n try {\n const handle = await repo.find(docId);\n const doc = await handle.doc();\n if (doc) {\n validDocs.push(docId);\n }\n }\n catch (error) {\n const errorMessage = String(error?.message || error || '');\n if (errorMessage.includes('corrupt') || errorMessage.includes('deflate') || errorMessage.includes('unable to parse chunk')) {\n corruptedDocs.push(docId);\n console.log(` \uD83D\uDCA5 Corrupted: ${docId}`);\n }\n else {\n // Other errors might not be corruption\n console.warn(` \u26A0\uFE0F Error loading ${docId}: ${errorMessage.substring(0, 100)}`);\n }\n }\n }\n console.log(`Found ${validDocs.length} valid documents and ${corruptedDocs.length} potentially corrupted documents`);\n if (corruptedDocs.length > 0) {\n console.log('\\nCorrupted documents detected:');\n corruptedDocs.slice(0, 5).forEach(docId => {\n console.log(` ${docId}`);\n });\n if (corruptedDocs.length > 5) {\n console.log(` ... and ${corruptedDocs.length - 5} more`);\n }\n // Offer to remove corrupted documents\n console.log('\\n\u26A0\uFE0F This will remove corrupted documents and may cause data loss.');\n console.log('\uD83D\uDCA1 Backup created at:', backupDir);\n // Auto-proceed with recovery\n console.log('Proceeding with corruption cleanup...');\n let removedCount = 0;\n for (const docId of corruptedDocs) {\n try {\n // Find and remove the corrupted document files\n // DocId format: 3K9QuxnF8NM8g71nvphZYzgxsxxJ -> 3K/9QuxnF8NM8g71nvphZYzgxsxxJ\n const prefix = docId.substring(0, 2);\n const suffix = docId.substring(2);\n const docDir = path.join(storageDir, prefix, suffix);\n if (fs.existsSync(docDir)) {\n // Remove the entire document directory\n fs.rmSync(docDir, { recursive: true, force: true });\n removedCount++;\n console.log(` \uD83D\uDDD1\uFE0F Removed document directory: ${prefix}/${suffix}`);\n }\n // Check if parent directory is empty\n const parentDir = path.join(storageDir, prefix);\n try {\n const remainingFiles = fs.readdirSync(parentDir);\n if (remainingFiles.length === 0) {\n fs.rmdirSync(parentDir);\n console.log(` \uD83D\uDDD1\uFE0F Removed empty prefix directory: ${prefix}`);\n }\n }\n catch { }\n }\n catch (error) {\n console.warn(`Could not remove corrupted document ${docId}:`, error);\n }\n }\n console.log(`\u2705 Removed ${removedCount} corrupted document files`);\n console.log('\uD83D\uDD04 Please restart the application and try your command again');\n }\n else {\n console.log('\u2705 No corrupted documents detected in Automerge storage');\n }\n}\nasync function handleWorkspaceRecovery() {\n console.log('\uD83D\uDD27 Resetting workspace configuration...');\n const configPath = '.mod/config.json';\n if (fs.existsSync(configPath)) {\n console.log(`Backing up current config to ${configPath}.backup`);\n fs.copyFileSync(configPath, `${configPath}.backup`);\n }\n // Reset to minimal config\n const minimalConfig = {};\n writeModConfig(minimalConfig);\n console.log('\u2705 Workspace configuration reset');\n console.log('\uD83D\uDCA1 Run \"mod workspace list\" to see available workspaces');\n console.log('\uD83D\uDCA1 Run \"mod workspace switch <workspace-name>\" to select a workspace');\n}\nasync function handleBranchRecovery(repo) {\n console.log('\uD83D\uDD27 Attempting branch recovery...');\n const cfg = readModConfig();\n if (!cfg?.workspaceId) {\n console.error('No workspace configured. Run \"mod recover workspace\" first.');\n process.exit(1);\n }\n try {\n // Try to access the workspace\n const wsHandle = await repo.find(cfg.workspaceId);\n const workspace = await wsHandle.doc();\n if (!workspace) {\n console.error('Workspace document is corrupted or missing');\n console.log('\uD83D\uDCA1 Run \"mod recover automerge\" to fix storage corruption');\n process.exit(1);\n }\n const workspaceData = workspace;\n console.log(`\u2705 Workspace \"${workspaceData.title || 'Untitled'}\" is accessible`);\n // Try to access branches document\n if (workspaceData.branchesDocId) {\n try {\n const branchesHandle = await repo.find(workspaceData.branchesDocId);\n const branchesDoc = await branchesHandle.doc();\n const branchesData = branchesDoc;\n if (branchesData && branchesData.branches) {\n console.log(`\u2705 Found ${Object.keys(branchesData.branches).length} branches`);\n console.log('Branches appear to be intact');\n }\n else {\n console.log('\u26A0\uFE0F Branches document exists but appears empty');\n }\n }\n catch (error) {\n console.error('Branches document is corrupted:', error);\n console.log('\uD83D\uDCA1 Run \"mod recover automerge\" to fix storage corruption');\n }\n }\n else {\n console.log('\u26A0\uFE0F Workspace has no branches document ID');\n }\n }\n catch (error) {\n console.error('Failed to access workspace:', error);\n console.log('\uD83D\uDCA1 Run \"mod recover automerge\" to fix storage corruption');\n process.exit(1);\n }\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nexport const FEATURES = {\n STATUS: 'status',\n WORKSPACE_MANAGEMENT: 'workspace-management',\n WORKSPACE_BRANCHING: 'workspace-branching',\n TASK_MANAGEMENT: 'task-management',\n FILE_OPERATIONS: 'file-operations',\n AGENT_INTEGRATIONS: 'agent-integrations',\n SYNC_OPERATIONS: 'sync-operations',\n WATCH_OPERATIONS: 'watch-operations',\n CONNECTOR_INTEGRATIONS: 'connector-integrations',\n AUTH: 'auth'\n};\nlet releaseProfile = null;\nexport function isFeatureEnabled(feature) {\n if (process.env.NODE_ENV === 'development') {\n const envVar = `MOD_FEATURE_${feature.toUpperCase().replace('-', '_')}`;\n if (process.env[envVar] === 'true')\n return true;\n if (process.env[envVar] === 'false')\n return false;\n }\n if (!releaseProfile) {\n releaseProfile = loadReleaseProfile();\n }\n return releaseProfile[feature] ?? false;\n}\nfunction loadReleaseProfile() {\n const profileName = process.env.MOD_RELEASE_PROFILE || 'development';\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const profilePath = path.join(__dirname, 'release-profiles', `${profileName}.json`);\n if (fs.existsSync(profilePath)) {\n const profileData = fs.readFileSync(profilePath, 'utf8');\n return JSON.parse(profileData);\n }\n throw new Error(`Profile ${profileName} not found`);\n }\n catch (error) {\n if (profileName === 'development') {\n return {\n [FEATURES.STATUS]: true,\n [FEATURES.WORKSPACE_MANAGEMENT]: true,\n [FEATURES.WORKSPACE_BRANCHING]: true,\n [FEATURES.TASK_MANAGEMENT]: true,\n [FEATURES.FILE_OPERATIONS]: true,\n [FEATURES.AGENT_INTEGRATIONS]: true,\n [FEATURES.SYNC_OPERATIONS]: true,\n [FEATURES.WATCH_OPERATIONS]: true,\n [FEATURES.CONNECTOR_INTEGRATIONS]: true\n };\n }\n // Fallback to minimal profile for unknown profiles\n return {\n [FEATURES.STATUS]: true,\n [FEATURES.WORKSPACE_MANAGEMENT]: false,\n [FEATURES.WORKSPACE_BRANCHING]: false,\n [FEATURES.TASK_MANAGEMENT]: false,\n [FEATURES.FILE_OPERATIONS]: false,\n [FEATURES.AGENT_INTEGRATIONS]: false,\n [FEATURES.SYNC_OPERATIONS]: false,\n [FEATURES.WATCH_OPERATIONS]: false,\n [FEATURES.CONNECTOR_INTEGRATIONS]: false\n };\n }\n}\nexport function resetFeatureCache() {\n releaseProfile = null;\n}\n", "import { agentsRunCommand } from './agents-run.js';\nimport { authCommand } from './auth.js';\nimport { branchCommand } from './branch.js';\nimport { specCommand } from './spec.js';\nimport { workspaceCommand } from './workspace.js';\nimport { claudeSyncCommand } from './claude-sync.js';\nimport { syncCommand } from './sync.js';\nimport { initCommand } from './init.js';\nimport { recoverCommand } from './recover.js';\nimport { FEATURES, isFeatureEnabled } from '../config/features.js';\nconst allCommands = {\n 'auth': authCommand,\n 'spec': specCommand,\n 'sync': syncCommand,\n 'agents-run': agentsRunCommand,\n 'claude-sync': claudeSyncCommand,\n 'branch': branchCommand,\n 'workspace': workspaceCommand,\n 'init': initCommand,\n 'recover': recoverCommand,\n};\nconst commandFeatureMapping = {\n 'auth': FEATURES.AUTH,\n 'spec': FEATURES.TASK_MANAGEMENT, // Spec tracking, not in MVP\n 'sync': FEATURES.WATCH_OPERATIONS,\n 'agents-run': FEATURES.AGENT_INTEGRATIONS,\n 'claude-sync': FEATURES.AGENT_INTEGRATIONS, // Claude projects sync, separate from file sync daemon\n 'branch': FEATURES.WORKSPACE_BRANCHING,\n 'workspace': FEATURES.WORKSPACE_MANAGEMENT,\n 'init': FEATURES.SYNC_OPERATIONS, // Use existing feature flag for command installation\n 'recover': FEATURES.STATUS, // Recovery command always available when status is enabled\n};\nconst registry = {};\nfor (const [commandName, commandHandler] of Object.entries(allCommands)) {\n const requiredFeature = commandFeatureMapping[commandName];\n if (requiredFeature && isFeatureEnabled(requiredFeature)) {\n registry[commandName] = commandHandler;\n }\n}\nexport function buildCommandRegistry() {\n return registry;\n}\nexport default registry;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["util", "objectUtil", "path", "errorUtil", "errorMap", "r", "path", "ctx", "result", "issues", "elements", "processed", "ZodFirstPartyTypeKind", "repo", "repo", "resolve", "doc", "repo", "repo", "isValid", "repo", "resolve", "repo", "findWithTimeout", "repo", "DEFAULT_FIND_TIMEOUT_MS", "resolve", "branchesDocId", "err", "data", "randomFillSync", "http", "URL", "WebSocket", "key", "WebSocket", "err", "protocol", "http", "WebSocket", "WebSocket", "repo", "fs", "path", "findWithTimeout", "repo", "DEFAULT_FIND_TIMEOUT_MS", "resolve", "handle", "repo", "doc", "repo", "repo", "repo", "repo", "path", "repo", "resolve", "path", "s1", "s2", "n", "repo", "path", "_a", "owner", "tool", "repo", "tool", "repo", "tool", "path", "repo", "tool", "repo", "path", "tool", "tool", "tool", "agentRegistry", "agent", "_jsx", "path", "fileURLToPath", "_jsx", "_jsxs", "useEffect", "useRef", "useState", "Box", "Text", "set", "repo", "repo", "_jsx", "useEffect", "_jsx", "_jsxs", "React", "Box", "Text", "_jsx", "_jsxs", "Box", "Text", "React", "_jsxs", "Box", "Text", "_jsx", "repo", "stream", "tool", "exec", "repo", "repo", "useEffect", "_jsx", "_jsx", "_jsxs", "useEffect", "useState", "Box", "Text", "fs", "path", "set", "get", "path", "repo", "wsDoc", "fs", "path", "repo", "useState", "useEffect", "BranchableRepo", "_jsx", "Text", "_jsxs", "Box", "_jsx", "_jsxs", "useEffect", "useState", "Box", "Text", "useInput", "repo", "useState", "useEffect", "useInput", "_jsx", "Text", "_jsxs", "Box", "useInput", "fs", "path", "__filename", "__dirname", "repo", "useState", "useRef", "useInput", "useEffect", "_jsx", "Text", "_jsxs", "Box", "resolve", "handleError", "fs", "path", "storageDir", "resolve", "repo", "fs", "path", "path", "ensureModDir", "fs", "getConfigPath", "fs", "resolve", "URL", "resolve", "port", "repo", "fs", "path", "repo", "result", "repo", "resolve", "activeBranch", "_a", "path", "fs", "path", "tool", "repo", "tool", "repo", "tool", "repo", "RequirementCategory", "RequirementPriority", "RequirementStatus", "MatchType", "path", "relative", "path", "fs", "crypto", "fs", "path", "crypto", "repo", "path", "fs", "fileName", "fs", "path", "resolve", "i", "j", "path", "fs", "repo", "resolve", "path", "fs", "fs", "path", "isValid", "repo", "path", "fs", "fs", "path", "repo", "determineParentRequirement", "fs", "path", "repo", "config", "path", "fileURLToPath", "__filename", "__dirname", "repo", "fs", "path", "crypto", "repo", "resolve", "fs", "path", "crypto", "repo", "fs", "path", "fileURLToPath", "__filename", "fileURLToPath", "__dirname", "path", "repo", "fs", "crypto", "fs", "path", "repo", "storageDir", "fs", "path", "fileURLToPath", "isFeatureEnabled", "__filename", "__dirname", "isFeatureEnabled", "__filename", "fileURLToPath", "__dirname", "path", "repo", "isFeatureEnabled", "_jsx"]
|
|
7
|
+
}
|