@agimon-ai/doompi-git 0.0.1-alpha.4 → 0.0.1-alpha.6

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.
Files changed (237) hide show
  1. package/README.md +2 -0
  2. package/dist/api-contracts.cjs +1 -0
  3. package/dist/api-contracts.d.cts +2 -0
  4. package/dist/api-contracts.d.mts +2 -0
  5. package/dist/api-contracts.mjs +1 -0
  6. package/dist/constants/git.cjs +2 -0
  7. package/dist/constants/git.cjs.map +1 -0
  8. package/dist/constants/git.mjs +2 -0
  9. package/dist/constants/git.mjs.map +1 -0
  10. package/dist/controllers/gitCommand.cjs +2 -0
  11. package/dist/controllers/gitCommand.cjs.map +1 -0
  12. package/dist/controllers/gitCommand.mjs +2 -0
  13. package/dist/controllers/gitCommand.mjs.map +1 -0
  14. package/dist/controllers/gitSession.cjs +2 -0
  15. package/dist/controllers/gitSession.cjs.map +1 -0
  16. package/dist/controllers/gitSession.mjs +2 -0
  17. package/dist/controllers/gitSession.mjs.map +1 -0
  18. package/dist/controllers/hubApi.cjs +2 -0
  19. package/dist/controllers/hubApi.cjs.map +1 -0
  20. package/dist/controllers/hubApi.mjs +2 -0
  21. package/dist/controllers/hubApi.mjs.map +1 -0
  22. package/dist/controllers/worktreesChannel.cjs +2 -0
  23. package/dist/controllers/worktreesChannel.cjs.map +1 -0
  24. package/dist/controllers/worktreesChannel.mjs +2 -0
  25. package/dist/controllers/worktreesChannel.mjs.map +1 -0
  26. package/dist/extensions/pi.cjs +2 -1
  27. package/dist/extensions/pi.cjs.map +1 -0
  28. package/dist/extensions/pi.d.cts +6 -2
  29. package/dist/extensions/pi.d.cts.map +1 -0
  30. package/dist/extensions/pi.d.mts +6 -2
  31. package/dist/extensions/pi.d.mts.map +1 -0
  32. package/dist/extensions/pi.mjs +2 -1
  33. package/dist/extensions/pi.mjs.map +1 -0
  34. package/dist/extensions/server.cjs +2 -0
  35. package/dist/extensions/server.cjs.map +1 -0
  36. package/dist/extensions/server.d.cts +5 -0
  37. package/dist/extensions/server.d.cts.map +1 -0
  38. package/dist/extensions/server.d.mts +5 -0
  39. package/dist/extensions/server.d.mts.map +1 -0
  40. package/dist/extensions/server.mjs +2 -0
  41. package/dist/extensions/server.mjs.map +1 -0
  42. package/dist/index.cjs +1 -1
  43. package/dist/index.d.cts +3 -4
  44. package/dist/index.d.mts +3 -4
  45. package/dist/index.mjs +1 -1
  46. package/dist/schemas/apiContracts.cjs +2 -0
  47. package/dist/schemas/apiContracts.cjs.map +1 -0
  48. package/dist/schemas/apiContracts.d.cts +53 -0
  49. package/dist/schemas/apiContracts.d.cts.map +1 -0
  50. package/dist/schemas/apiContracts.d.mts +53 -0
  51. package/dist/schemas/apiContracts.d.mts.map +1 -0
  52. package/dist/schemas/apiContracts.mjs +2 -0
  53. package/dist/schemas/apiContracts.mjs.map +1 -0
  54. package/dist/{adapters/filesystem/atomicJson.cjs → services/atomicJson/index.cjs} +1 -1
  55. package/dist/services/atomicJson/index.cjs.map +1 -0
  56. package/dist/{adapters/filesystem/atomicJson.mjs → services/atomicJson/index.mjs} +1 -1
  57. package/dist/services/atomicJson/index.mjs.map +1 -0
  58. package/dist/services/compositionMirror/index.cjs +2 -0
  59. package/dist/services/compositionMirror/index.cjs.map +1 -0
  60. package/dist/services/compositionMirror/index.mjs +2 -0
  61. package/dist/services/compositionMirror/index.mjs.map +1 -0
  62. package/dist/services/errors/index.cjs +2 -0
  63. package/dist/services/errors/index.cjs.map +1 -0
  64. package/dist/services/errors/index.mjs +2 -0
  65. package/dist/services/errors/index.mjs.map +1 -0
  66. package/dist/services/{extensionService.cjs → extensionService/index.cjs} +1 -1
  67. package/dist/services/extensionService/index.cjs.map +1 -0
  68. package/dist/services/extensionService/index.d.cts +8 -0
  69. package/dist/services/extensionService/index.d.cts.map +1 -0
  70. package/dist/services/extensionService/index.d.mts +8 -0
  71. package/dist/services/extensionService/index.d.mts.map +1 -0
  72. package/dist/services/{extensionService.mjs → extensionService/index.mjs} +1 -1
  73. package/dist/services/extensionService/index.mjs.map +1 -0
  74. package/dist/{adapters/worktree/gitCli.cjs → services/gitCli/index.cjs} +2 -2
  75. package/dist/services/gitCli/index.cjs.map +1 -0
  76. package/dist/{adapters/worktree/gitCli.mjs → services/gitCli/index.mjs} +2 -2
  77. package/dist/services/gitCli/index.mjs.map +1 -0
  78. package/dist/services/gitDependencies/index.cjs +2 -0
  79. package/dist/services/gitDependencies/index.cjs.map +1 -0
  80. package/dist/services/gitDependencies/index.d.cts +6 -0
  81. package/dist/services/gitDependencies/index.d.cts.map +1 -0
  82. package/dist/services/gitDependencies/index.d.mts +6 -0
  83. package/dist/services/gitDependencies/index.d.mts.map +1 -0
  84. package/dist/services/gitDependencies/index.mjs +2 -0
  85. package/dist/services/gitDependencies/index.mjs.map +1 -0
  86. package/dist/services/paths/index.cjs +2 -0
  87. package/dist/services/paths/index.cjs.map +1 -0
  88. package/dist/services/paths/index.mjs +2 -0
  89. package/dist/services/paths/index.mjs.map +1 -0
  90. package/dist/{adapters/worktree/repositoryIdentity.cjs → services/repositoryIdentity/index.cjs} +1 -1
  91. package/dist/services/repositoryIdentity/index.cjs.map +1 -0
  92. package/dist/{adapters/worktree/repositoryIdentity.mjs → services/repositoryIdentity/index.mjs} +1 -1
  93. package/dist/services/repositoryIdentity/index.mjs.map +1 -0
  94. package/dist/services/runWorktree/index.cjs +15 -0
  95. package/dist/services/runWorktree/index.cjs.map +1 -0
  96. package/dist/services/runWorktree/index.mjs +15 -0
  97. package/dist/services/runWorktree/index.mjs.map +1 -0
  98. package/dist/services/worktreeEvents/index.cjs +2 -0
  99. package/dist/services/worktreeEvents/index.cjs.map +1 -0
  100. package/dist/services/worktreeEvents/index.d.cts +15 -0
  101. package/dist/services/worktreeEvents/index.d.cts.map +1 -0
  102. package/dist/services/worktreeEvents/index.d.mts +15 -0
  103. package/dist/services/worktreeEvents/index.d.mts.map +1 -0
  104. package/dist/services/worktreeEvents/index.mjs +2 -0
  105. package/dist/services/worktreeEvents/index.mjs.map +1 -0
  106. package/dist/services/{worktreeNaming.cjs → worktreeNaming/index.cjs} +2 -2
  107. package/dist/services/{worktreeNaming.cjs.map → worktreeNaming/index.cjs.map} +1 -1
  108. package/dist/services/{worktreeNaming.d.mts → worktreeNaming/index.d.cts} +10 -3
  109. package/dist/services/worktreeNaming/index.d.cts.map +1 -0
  110. package/dist/services/{worktreeNaming.d.cts → worktreeNaming/index.d.mts} +10 -3
  111. package/dist/services/worktreeNaming/index.d.mts.map +1 -0
  112. package/dist/services/{worktreeNaming.mjs → worktreeNaming/index.mjs} +2 -2
  113. package/dist/services/{worktreeNaming.mjs.map → worktreeNaming/index.mjs.map} +1 -1
  114. package/dist/services/worktreeOperations/index.cjs +2 -0
  115. package/dist/services/worktreeOperations/index.cjs.map +1 -0
  116. package/dist/{adapters/worktree/worktreeOperations.d.cts → services/worktreeOperations/index.d.cts} +14 -8
  117. package/dist/services/worktreeOperations/index.d.cts.map +1 -0
  118. package/dist/{adapters/worktree/worktreeOperations.d.mts → services/worktreeOperations/index.d.mts} +14 -8
  119. package/dist/services/worktreeOperations/index.d.mts.map +1 -0
  120. package/dist/services/worktreeOperations/index.mjs +2 -0
  121. package/dist/services/worktreeOperations/index.mjs.map +1 -0
  122. package/dist/services/worktreeRegistry/index.cjs +2 -0
  123. package/dist/services/worktreeRegistry/index.cjs.map +1 -0
  124. package/dist/services/worktreeRegistry/index.mjs +2 -0
  125. package/dist/services/worktreeRegistry/index.mjs.map +1 -0
  126. package/dist/tools/runWorktree.cjs +2 -0
  127. package/dist/tools/runWorktree.cjs.map +1 -0
  128. package/dist/tools/runWorktree.mjs +2 -0
  129. package/dist/tools/runWorktree.mjs.map +1 -0
  130. package/dist/types/extension.d.cts +1 -1
  131. package/dist/types/extension.d.mts +1 -1
  132. package/package.json +27 -21
  133. package/src/extensions/web.ts +33 -0
  134. package/src/prompts/doompi-use-git/SKILL.md +5 -2
  135. package/src/types/worktreeRegistry.ts +9 -0
  136. package/src/web/components/RunWorktreeToolMessage.tsx +21 -13
  137. package/src/web/components/WorktreesActivitySection.tsx +29 -13
  138. package/src/web/components/WorktreesPanel.tsx +98 -48
  139. package/src/web/components/toolRenderers.ts +3 -2
  140. package/src/web/stores/worktreesActivityStore.ts +3 -2
  141. package/src/web/tsconfig.json +1 -1
  142. package/dist/adapters/channel/worktreeChannel.cjs +0 -2
  143. package/dist/adapters/channel/worktreeChannel.cjs.map +0 -1
  144. package/dist/adapters/channel/worktreeChannel.d.cts +0 -40
  145. package/dist/adapters/channel/worktreeChannel.d.cts.map +0 -1
  146. package/dist/adapters/channel/worktreeChannel.d.mts +0 -40
  147. package/dist/adapters/channel/worktreeChannel.d.mts.map +0 -1
  148. package/dist/adapters/channel/worktreeChannel.mjs +0 -2
  149. package/dist/adapters/channel/worktreeChannel.mjs.map +0 -1
  150. package/dist/adapters/filesystem/atomicJson.cjs.map +0 -1
  151. package/dist/adapters/filesystem/atomicJson.mjs.map +0 -1
  152. package/dist/adapters/filesystem/paths.cjs +0 -2
  153. package/dist/adapters/filesystem/paths.cjs.map +0 -1
  154. package/dist/adapters/filesystem/paths.mjs +0 -2
  155. package/dist/adapters/filesystem/paths.mjs.map +0 -1
  156. package/dist/adapters/hub/hubClient.cjs +0 -2
  157. package/dist/adapters/hub/hubClient.cjs.map +0 -1
  158. package/dist/adapters/hub/hubClient.d.cts +0 -1
  159. package/dist/adapters/hub/hubClient.d.mts +0 -1
  160. package/dist/adapters/hub/hubClient.mjs +0 -2
  161. package/dist/adapters/hub/hubClient.mjs.map +0 -1
  162. package/dist/adapters/pi/extension.cjs +0 -2
  163. package/dist/adapters/pi/extension.cjs.map +0 -1
  164. package/dist/adapters/pi/extension.d.cts +0 -9
  165. package/dist/adapters/pi/extension.d.cts.map +0 -1
  166. package/dist/adapters/pi/extension.d.mts +0 -9
  167. package/dist/adapters/pi/extension.d.mts.map +0 -1
  168. package/dist/adapters/pi/extension.mjs +0 -2
  169. package/dist/adapters/pi/extension.mjs.map +0 -1
  170. package/dist/adapters/pi/extensions/runWorktreeTool.cjs +0 -15
  171. package/dist/adapters/pi/extensions/runWorktreeTool.cjs.map +0 -1
  172. package/dist/adapters/pi/extensions/runWorktreeTool.mjs +0 -15
  173. package/dist/adapters/pi/extensions/runWorktreeTool.mjs.map +0 -1
  174. package/dist/adapters/web/worktreesChannel.cjs +0 -2
  175. package/dist/adapters/web/worktreesChannel.cjs.map +0 -1
  176. package/dist/adapters/web/worktreesChannel.d.cts +0 -21
  177. package/dist/adapters/web/worktreesChannel.d.cts.map +0 -1
  178. package/dist/adapters/web/worktreesChannel.d.mts +0 -21
  179. package/dist/adapters/web/worktreesChannel.d.mts.map +0 -1
  180. package/dist/adapters/web/worktreesChannel.mjs +0 -2
  181. package/dist/adapters/web/worktreesChannel.mjs.map +0 -1
  182. package/dist/adapters/worktree/dependencyInstall.cjs +0 -2
  183. package/dist/adapters/worktree/dependencyInstall.cjs.map +0 -1
  184. package/dist/adapters/worktree/dependencyInstall.mjs +0 -2
  185. package/dist/adapters/worktree/dependencyInstall.mjs.map +0 -1
  186. package/dist/adapters/worktree/gitCli.cjs.map +0 -1
  187. package/dist/adapters/worktree/gitCli.mjs.map +0 -1
  188. package/dist/adapters/worktree/repositoryIdentity.cjs.map +0 -1
  189. package/dist/adapters/worktree/repositoryIdentity.mjs.map +0 -1
  190. package/dist/adapters/worktree/worktreeOperations.cjs +0 -2
  191. package/dist/adapters/worktree/worktreeOperations.cjs.map +0 -1
  192. package/dist/adapters/worktree/worktreeOperations.d.cts.map +0 -1
  193. package/dist/adapters/worktree/worktreeOperations.d.mts.map +0 -1
  194. package/dist/adapters/worktree/worktreeOperations.mjs +0 -2
  195. package/dist/adapters/worktree/worktreeOperations.mjs.map +0 -1
  196. package/dist/adapters/worktree/worktreeRegistry.cjs +0 -2
  197. package/dist/adapters/worktree/worktreeRegistry.cjs.map +0 -1
  198. package/dist/adapters/worktree/worktreeRegistry.mjs +0 -2
  199. package/dist/adapters/worktree/worktreeRegistry.mjs.map +0 -1
  200. package/dist/commands/doomGitCommand.cjs +0 -2
  201. package/dist/commands/doomGitCommand.cjs.map +0 -1
  202. package/dist/commands/doomGitCommand.mjs +0 -2
  203. package/dist/commands/doomGitCommand.mjs.map +0 -1
  204. package/dist/container/index.cjs +0 -2
  205. package/dist/container/index.cjs.map +0 -1
  206. package/dist/container/index.d.cts +0 -6
  207. package/dist/container/index.d.cts.map +0 -1
  208. package/dist/container/index.d.mts +0 -6
  209. package/dist/container/index.d.mts.map +0 -1
  210. package/dist/container/index.mjs +0 -2
  211. package/dist/container/index.mjs.map +0 -1
  212. package/dist/hubApi.cjs +0 -2
  213. package/dist/hubApi.cjs.map +0 -1
  214. package/dist/hubApi.d.cts +0 -6
  215. package/dist/hubApi.d.cts.map +0 -1
  216. package/dist/hubApi.d.mts +0 -6
  217. package/dist/hubApi.d.mts.map +0 -1
  218. package/dist/hubApi.mjs +0 -2
  219. package/dist/hubApi.mjs.map +0 -1
  220. package/dist/services/extensionService.cjs.map +0 -1
  221. package/dist/services/extensionService.d.cts +0 -8
  222. package/dist/services/extensionService.d.cts.map +0 -1
  223. package/dist/services/extensionService.d.mts +0 -8
  224. package/dist/services/extensionService.d.mts.map +0 -1
  225. package/dist/services/extensionService.mjs.map +0 -1
  226. package/dist/services/support/errors.cjs +0 -2
  227. package/dist/services/support/errors.cjs.map +0 -1
  228. package/dist/services/support/errors.mjs +0 -2
  229. package/dist/services/support/errors.mjs.map +0 -1
  230. package/dist/services/worktreeNaming.d.cts.map +0 -1
  231. package/dist/services/worktreeNaming.d.mts.map +0 -1
  232. package/dist/webHub.cjs +0 -1
  233. package/dist/webHub.d.cts +0 -2
  234. package/dist/webHub.d.mts +0 -2
  235. package/dist/webHub.mjs +0 -1
  236. package/src/exports/webClient.ts +0 -1
  237. package/src/web/index.ts +0 -30
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktreeOperations.mjs","names":[],"sources":["../../../src/adapters/worktree/worktreeOperations.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { installDependencies } from './dependencyInstall.ts';\nimport { createWorktreeSession, HubUnavailableError, sessionIsLive, stopWorktreeSession } from '../hub/hubClient.ts';\nimport { channelRoot, hubRegistryDir, registryFile, worktreesRoot } from '../filesystem/paths.ts';\nimport { repositoryId, repositoryLabel, shortId } from './repositoryIdentity.ts';\nimport { createWorktreeChannel } from '../channel/worktreeChannel.ts';\nimport type { ChannelMessage, ChannelParty } from '../channel/worktreeChannel.ts';\nimport { createWorktreeRegistry } from './worktreeRegistry.ts';\nimport { WORKTREE_RECORD_VERSION } from '../../types/worktreeRegistry.ts';\nimport type { WorktreeGit, WorktreeRecord } from '../../types/worktreeRegistry.ts';\nimport { planPrune, reconcile, refuseClose, refuseSpawn, worktreeDirectory } from '../../services/worktreeNaming.ts';\nimport { DoomGitExpectedError } from '../../services/support/errors.ts';\n\nexport interface WorktreeContext {\n /** Where the calling session is working, used to find the repository. */\n cwd: string;\n /** The calling session, recorded as the new session's parent. */\n sessionId: string;\n}\n\nexport interface SpawnWorktreeRequest {\n branch: string;\n baseRef?: string;\n name?: string;\n}\n\nexport interface WorktreeOperations {\n spawn(context: WorktreeContext, request: SpawnWorktreeRequest): Promise<WorktreeRecord>;\n close(context: WorktreeContext, id: string, force: boolean): Promise<WorktreeRecord>;\n list(context: WorktreeContext): Promise<WorktreeRecord[]>;\n status(context: WorktreeContext, id: string): Promise<{ record: WorktreeRecord; dirtyFiles: string[] }>;\n merge(context: WorktreeContext, id: string, message?: string): Promise<WorktreeRecord>;\n prune(context: WorktreeContext, dryRun: boolean): Promise<ReturnType<typeof planPrune>>;\n send(context: WorktreeContext, id: string, message: string): Promise<void>;\n messages(context: WorktreeContext, id: string): Promise<ChannelMessage[]>;\n}\n\nexport interface WorktreeOperationsDeps {\n git: WorktreeGit;\n /** Injected so tests never reach the network. */\n createSession?: typeof createWorktreeSession;\n /** Injected so tests never run a package manager. */\n install?: typeof installDependencies;\n stopSession?: typeof stopWorktreeSession;\n isSessionLive?: typeof sessionIsLive;\n homeDir?: string;\n registryDir?: string;\n /** Injected so a record's createdAt is reproducible in a test. */\n now?: () => Date;\n}\n\nexport function createWorktreeOperations(deps: WorktreeOperationsDeps): WorktreeOperations {\n const { git } = deps;\n const createSession = deps.createSession ?? createWorktreeSession;\n const install = deps.install ?? installDependencies;\n const stopSession = deps.stopSession ?? stopWorktreeSession;\n const isSessionLive = deps.isSessionLive ?? sessionIsLive;\n const registryDir = deps.registryDir ?? hubRegistryDir();\n const now = deps.now ?? (() => new Date());\n const probe = {\n alive: (record: WorktreeRecord) => isSessionLive(registryDir, record.sessionId),\n exists: (path: string) => fs.existsSync(path),\n };\n\n /**\n * Everything an action needs about the repository it is acting on.\n *\n * Resolved per call rather than cached: a session's cwd is stable, but the\n * registry file is shared with the cockpit panel and another process may\n * have written it since the last call.\n */\n const resolve = async (context: WorktreeContext) => {\n const root = await git.repositoryRoot(context.cwd);\n if (root === undefined) {\n throw new DoomGitExpectedError(\n 'not_a_repository',\n `${context.cwd} is not inside a git repository.`,\n false,\n 'Run this from a repository checkout.',\n );\n }\n const store = createWorktreeRegistry(registryFile(root, deps.homeDir));\n return { root, store, records: store.list() };\n };\n\n const require = (records: readonly WorktreeRecord[], id: string): WorktreeRecord => {\n const record = records.find((entry) => entry.id === id);\n if (record === undefined) {\n throw new DoomGitExpectedError(\n 'worktree_not_found',\n `No worktree with id ${id}.`,\n false,\n 'Call list to see the current ids.',\n );\n }\n return record;\n };\n\n /**\n * Refuses to destroy or merge a worktree another live session is using.\n *\n * `parentSessionId` records who asked for the worktree. Two sessions in one\n * checkout share this registry, so without the check either could close the\n * other's work in progress by id.\n *\n * Once that session is gone there is no owner left to protect, and refusing\n * would strand the worktree: nothing else could ever close it.\n */\n const requireOwner = (context: WorktreeContext, record: WorktreeRecord, action: string): void => {\n if (record.parentSessionId === context.sessionId) return;\n if (!isSessionLive(registryDir, record.parentSessionId)) return;\n throw new DoomGitExpectedError(\n 'worktree_not_owned',\n `Worktree ${record.id} belongs to another session.`,\n false,\n `Ask the session that created it to ${action} it, or close that session first.`,\n );\n };\n\n return {\n async spawn(context, request) {\n const { root, store, records } = await resolve(context);\n const refusal = refuseSpawn({ branch: request.branch, existing: records });\n if (refusal !== undefined) {\n throw new DoomGitExpectedError('worktree_exists', refusal, false, 'Pick another branch name, or close it.');\n }\n const baseRef = request.baseRef ?? (await git.currentBranch(root)) ?? 'HEAD';\n const id = shortId(randomUUID());\n const path = worktreeDirectory({\n worktreesRoot: worktreesRoot(deps.homeDir),\n repositoryLabel: repositoryLabel(root),\n repositoryId: repositoryId(root),\n branch: request.branch,\n shortId: id,\n });\n\n await git.addWorktree({ repositoryRoot: root, path, branch: request.branch, baseRef });\n\n // Before the session, not after. The session resolves this repository's\n // composition, and every workspace package path in it points at a\n // directory that exists only once dependencies are linked. Starting the\n // session first makes it fall back to the global bundle and quietly lose\n // the repository's own packages.\n const installed = await install(path);\n if (installed.kind === 'failed') {\n await git.removeWorktree({ repositoryRoot: root, path, force: true }).catch(() => undefined);\n throw new DoomGitExpectedError(\n 'install_failed',\n `${installed.command} install failed in the new worktree (exit ${String(installed.code ?? 'unknown')}).`,\n true,\n 'Run the install by hand in the repository to see what it reports, then try again.',\n );\n }\n\n // The worktree exists from here on, so every later failure has to leave\n // it removed or recorded. An unrecorded directory on disk is the one\n // outcome with no way back: nothing would ever list it again.\n let sessionId: string;\n try {\n sessionId = await createSession({\n cwd: path,\n name: request.name ?? request.branch,\n parentSessionId: context.sessionId,\n registryDir,\n });\n } catch (error) {\n await git.removeWorktree({ repositoryRoot: root, path, force: true }).catch(() => undefined);\n if (error instanceof HubUnavailableError) {\n throw new DoomGitExpectedError('hub_unavailable', error.message, true, 'Start the cockpit and try again.');\n }\n throw error;\n }\n\n const record: WorktreeRecord = {\n version: WORKTREE_RECORD_VERSION,\n id,\n branch: request.branch,\n baseRef,\n path,\n repositoryRoot: root,\n sessionId,\n parentSessionId: context.sessionId,\n status: 'running',\n createdAt: now().toISOString(),\n };\n store.replace([...records, record]);\n return record;\n },\n\n async close(context, id, force) {\n const { root, store, records } = await resolve(context);\n const record = require(records, id);\n requireOwner(context, record, 'close');\n const dirtyFiles = fs.existsSync(record.path) ? await git.dirtyFiles(record.path) : [];\n const refusal = refuseClose({ record, dirtyFiles, force });\n if (refusal !== undefined) {\n throw new DoomGitExpectedError('worktree_dirty', refusal, false, 'Commit the work, or pass force: true.');\n }\n // The session is stopped before the directory goes. Removing a checkout\n // while a process still holds files open in it is how a half-removed\n // worktree and a stale git administrative entry are made.\n await stopSession(registryDir, record.sessionId);\n await git.removeWorktree({ repositoryRoot: root, path: record.path, force });\n store.replace(records.filter((entry) => entry.id !== id));\n return record;\n },\n\n async list(context) {\n const { store, records } = await resolve(context);\n const outcome = reconcile(records, probe);\n if (outcome.changed.length > 0) store.replace(outcome.records);\n return outcome.records;\n },\n\n async status(context, id) {\n const { records } = await resolve(context);\n const record = require(records, id);\n const dirtyFiles = fs.existsSync(record.path) ? await git.dirtyFiles(record.path) : [];\n return { record, dirtyFiles };\n },\n\n async merge(context, id, message) {\n const { root, records } = await resolve(context);\n const record = require(records, id);\n requireOwner(context, record, 'merge');\n // The merge lands in the parent, so the parent is what must be clean. A\n // dirty parent would mix the person's in-flight edits into a merge commit\n // they did not intend to make.\n const parentDirty = await git.dirtyFiles(root);\n if (parentDirty.length > 0) {\n throw new DoomGitExpectedError(\n 'worktree_dirty',\n `The parent checkout has ${String(parentDirty.length)} uncommitted file(s): ${parentDirty.slice(0, 10).join(', ')}.`,\n false,\n 'Commit or stash the parent checkout first.',\n );\n }\n await git.mergeBranch({\n repositoryRoot: root,\n branch: record.branch,\n ...(message === undefined ? {} : { message }),\n });\n return record;\n },\n\n /**\n * Which side of the channel the caller is.\n *\n * A worktree session is the child of the record it belongs to, and the\n * parent for everything else. Deciding from the session id rather than a\n * flag means neither side can address itself by mistake.\n */\n async send(context, id, message) {\n const { records } = await resolve(context);\n const record = require(records, id);\n const party: ChannelParty = context.sessionId === record.sessionId ? 'parent' : 'child';\n createWorktreeChannel(channelRoot(record.id, deps.homeDir)).send(party, message);\n },\n\n async messages(context, id) {\n const { records } = await resolve(context);\n const record = require(records, id);\n const channel = createWorktreeChannel(channelRoot(record.id, deps.homeDir));\n channel.sweep();\n const party: ChannelParty = context.sessionId === record.sessionId ? 'child' : 'parent';\n return channel.receive(party);\n },\n\n async prune(context, dryRun) {\n const { root, store, records } = await resolve(context);\n const reconciled = reconcile(records, probe);\n const gitPaths = await git.listWorktreePaths(root);\n const dirtyByPath = new Map<string, readonly string[]>();\n for (const record of reconciled.records) {\n if (record.status === 'orphaned' && fs.existsSync(record.path)) {\n dirtyByPath.set(record.path, await git.dirtyFiles(record.path));\n }\n }\n const plan = planPrune({\n records: reconciled.records,\n gitPaths,\n worktreesRoot: worktreesRoot(deps.homeDir),\n dirtyByPath,\n });\n if (dryRun) {\n store.replace(reconciled.records);\n return plan;\n }\n for (const record of plan.remove) {\n await git.removeWorktree({ repositoryRoot: root, path: record.path, force: false });\n }\n const dropped = new Set([...plan.remove, ...plan.forget].map((record) => record.id));\n store.replace(reconciled.records.filter((record) => !dropped.has(record.id)));\n return plan;\n },\n };\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- const e=require("../filesystem/atomicJson.cjs");function t(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.version===1&&typeof t.id==`string`&&t.id!==``&&typeof t.path==`string`&&typeof t.branch==`string`&&typeof t.sessionId==`string`}function n(n){return{list(){let r=e.readJson(n);return!r||r.version!==1||!Array.isArray(r.entries)?[]:r.entries.filter(t)},replace(t){e.writeJsonAtomic(n,{version:1,entries:t})}}}exports.createWorktreeRegistry=n;
2
- //# sourceMappingURL=worktreeRegistry.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktreeRegistry.cjs","names":["readJson"],"sources":["../../../src/adapters/worktree/worktreeRegistry.ts"],"sourcesContent":["import { readJson, writeJsonAtomic } from '../filesystem/atomicJson.ts';\nimport {\n WORKTREE_RECORD_VERSION,\n type WorktreeRecord,\n type WorktreeRegistryFile,\n type WorktreeRegistryStore,\n} from '../../types/worktreeRegistry.ts';\n\nfunction isRecord(value: unknown): value is WorktreeRecord {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Partial<WorktreeRecord>;\n return (\n record.version === WORKTREE_RECORD_VERSION &&\n typeof record.id === 'string' &&\n record.id !== '' &&\n typeof record.path === 'string' &&\n typeof record.branch === 'string' &&\n typeof record.sessionId === 'string'\n );\n}\n\n/**\n * The worktree registry for one repository, as a single JSON file.\n *\n * One file rather than a file per worktree, and read-modify-write rather than\n * merging: every write comes from a tool call in one session's turn, so there\n * is no concurrent writer to reconcile with. Choosing the simpler shape now\n * means a reader can see the whole registry in one place; if concurrent writers\n * ever appear, that is the point to revisit, not before.\n *\n * A file that does not parse is treated as empty rather than fatal. Losing\n * track of worktrees is recoverable through prune; refusing to run is not.\n */\nexport function createWorktreeRegistry(file: string): WorktreeRegistryStore {\n return {\n list() {\n const parsed = readJson<WorktreeRegistryFile>(file);\n if (!parsed || parsed.version !== WORKTREE_RECORD_VERSION || !Array.isArray(parsed.entries)) return [];\n return parsed.entries.filter(isRecord);\n },\n replace(entries) {\n writeJsonAtomic(file, { version: WORKTREE_RECORD_VERSION, entries } satisfies WorktreeRegistryFile);\n },\n };\n}\n"],"mappings":"gDAQA,SAAS,EAAS,EAAyC,CACzD,GAAI,OAAO,GAAU,WAAY,EAAgB,MAAO,GACxD,IAAM,EAAS,EACf,OACE,EAAO,UAAA,GACP,OAAO,EAAO,IAAO,UACrB,EAAO,KAAO,IACd,OAAO,EAAO,MAAS,UACvB,OAAO,EAAO,QAAW,UACzB,OAAO,EAAO,WAAc,QAEhC,CAcA,SAAgB,EAAuB,EAAqC,CAC1E,MAAO,CACL,MAAO,CACL,IAAM,EAASA,EAAAA,SAA+B,CAAI,EAElD,MADI,CAAC,GAAU,EAAO,UAAA,GAAuC,CAAC,MAAM,QAAQ,EAAO,OAAO,EAAU,CAAC,EAC9F,EAAO,QAAQ,OAAO,CAAQ,CACvC,EACA,QAAQ,EAAS,CACf,EAAA,gBAAgB,EAAM,CAAE,QAAA,EAAkC,SAAQ,CAAgC,CACpG,CACF,CACF"}
@@ -1,2 +0,0 @@
1
- import{readJson as e,writeJsonAtomic as t}from"../filesystem/atomicJson.mjs";function n(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.version===1&&typeof t.id==`string`&&t.id!==``&&typeof t.path==`string`&&typeof t.branch==`string`&&typeof t.sessionId==`string`}function r(r){return{list(){let t=e(r);return!t||t.version!==1||!Array.isArray(t.entries)?[]:t.entries.filter(n)},replace(e){t(r,{version:1,entries:e})}}}export{r as createWorktreeRegistry};
2
- //# sourceMappingURL=worktreeRegistry.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktreeRegistry.mjs","names":[],"sources":["../../../src/adapters/worktree/worktreeRegistry.ts"],"sourcesContent":["import { readJson, writeJsonAtomic } from '../filesystem/atomicJson.ts';\nimport {\n WORKTREE_RECORD_VERSION,\n type WorktreeRecord,\n type WorktreeRegistryFile,\n type WorktreeRegistryStore,\n} from '../../types/worktreeRegistry.ts';\n\nfunction isRecord(value: unknown): value is WorktreeRecord {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Partial<WorktreeRecord>;\n return (\n record.version === WORKTREE_RECORD_VERSION &&\n typeof record.id === 'string' &&\n record.id !== '' &&\n typeof record.path === 'string' &&\n typeof record.branch === 'string' &&\n typeof record.sessionId === 'string'\n );\n}\n\n/**\n * The worktree registry for one repository, as a single JSON file.\n *\n * One file rather than a file per worktree, and read-modify-write rather than\n * merging: every write comes from a tool call in one session's turn, so there\n * is no concurrent writer to reconcile with. Choosing the simpler shape now\n * means a reader can see the whole registry in one place; if concurrent writers\n * ever appear, that is the point to revisit, not before.\n *\n * A file that does not parse is treated as empty rather than fatal. Losing\n * track of worktrees is recoverable through prune; refusing to run is not.\n */\nexport function createWorktreeRegistry(file: string): WorktreeRegistryStore {\n return {\n list() {\n const parsed = readJson<WorktreeRegistryFile>(file);\n if (!parsed || parsed.version !== WORKTREE_RECORD_VERSION || !Array.isArray(parsed.entries)) return [];\n return parsed.entries.filter(isRecord);\n },\n replace(entries) {\n writeJsonAtomic(file, { version: WORKTREE_RECORD_VERSION, entries } satisfies WorktreeRegistryFile);\n },\n };\n}\n"],"mappings":"6EAQA,SAAS,EAAS,EAAyC,CACzD,GAAI,OAAO,GAAU,WAAY,EAAgB,MAAO,GACxD,IAAM,EAAS,EACf,OACE,EAAO,UAAA,GACP,OAAO,EAAO,IAAO,UACrB,EAAO,KAAO,IACd,OAAO,EAAO,MAAS,UACvB,OAAO,EAAO,QAAW,UACzB,OAAO,EAAO,WAAc,QAEhC,CAcA,SAAgB,EAAuB,EAAqC,CAC1E,MAAO,CACL,MAAO,CACL,IAAM,EAAS,EAA+B,CAAI,EAElD,MADI,CAAC,GAAU,EAAO,UAAA,GAAuC,CAAC,MAAM,QAAQ,EAAO,OAAO,EAAU,CAAC,EAC9F,EAAO,QAAQ,OAAO,CAAQ,CACvC,EACA,QAAQ,EAAS,CACf,EAAgB,EAAM,CAAE,QAAA,EAAkC,SAAQ,CAAgC,CACpG,CACF,CACF"}
@@ -1,2 +0,0 @@
1
- const e=`doom-git`,t=`Show git worktrees owned by this session`;function n(n,r){n.registerCommand(e,{description:t,handler:async(e,t)=>{let n=await r.execute();t.hasUI&&t.ui.notify(n.message,n.level)}})}exports.COMMAND_DESCRIPTION=t,exports.COMMAND_NAME=e,exports.registerGitCommand=n;
2
- //# sourceMappingURL=doomGitCommand.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doomGitCommand.cjs","names":[],"sources":["../../src/commands/doomGitCommand.ts"],"sourcesContent":["// @scaffold-generated\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { GitExtensionService } from '../types/extension.ts';\n\nexport const COMMAND_NAME = 'doom-git';\nexport const COMMAND_DESCRIPTION = 'Show git worktrees owned by this session';\n\nexport function registerGitCommand(pi: Pick<ExtensionAPI, 'registerCommand'>, service: GitExtensionService): void {\n pi.registerCommand(COMMAND_NAME, {\n description: COMMAND_DESCRIPTION,\n handler: async (_args, ctx) => {\n const result = await service.execute();\n if (ctx.hasUI) ctx.ui.notify(result.message, result.level);\n },\n });\n}\n"],"mappings":"AAIA,MAAa,EAAe,WACf,EAAsB,2CAEnC,SAAgB,EAAmB,EAA2C,EAAoC,CAChH,EAAG,gBAAgB,EAAc,CAC/B,YAAa,EACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,IAAM,EAAS,MAAM,EAAQ,QAAQ,EACjC,EAAI,OAAO,EAAI,GAAG,OAAO,EAAO,QAAS,EAAO,KAAK,CAC3D,CACF,CAAC,CACH"}
@@ -1,2 +0,0 @@
1
- const e=`doom-git`,t=`Show git worktrees owned by this session`;function n(n,r){n.registerCommand(e,{description:t,handler:async(e,t)=>{let n=await r.execute();t.hasUI&&t.ui.notify(n.message,n.level)}})}export{t as COMMAND_DESCRIPTION,e as COMMAND_NAME,n as registerGitCommand};
2
- //# sourceMappingURL=doomGitCommand.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doomGitCommand.mjs","names":[],"sources":["../../src/commands/doomGitCommand.ts"],"sourcesContent":["// @scaffold-generated\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { GitExtensionService } from '../types/extension.ts';\n\nexport const COMMAND_NAME = 'doom-git';\nexport const COMMAND_DESCRIPTION = 'Show git worktrees owned by this session';\n\nexport function registerGitCommand(pi: Pick<ExtensionAPI, 'registerCommand'>, service: GitExtensionService): void {\n pi.registerCommand(COMMAND_NAME, {\n description: COMMAND_DESCRIPTION,\n handler: async (_args, ctx) => {\n const result = await service.execute();\n if (ctx.hasUI) ctx.ui.notify(result.message, result.level);\n },\n });\n}\n"],"mappings":"AAIA,MAAa,EAAe,WACf,EAAsB,2CAEnC,SAAgB,EAAmB,EAA2C,EAAoC,CAChH,EAAG,gBAAgB,EAAc,CAC/B,YAAa,EACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,IAAM,EAAS,MAAM,EAAQ,QAAQ,EACjC,EAAI,OAAO,EAAI,GAAG,OAAO,EAAO,QAAS,EAAO,KAAK,CAC3D,CACF,CAAC,CACH"}
@@ -1,2 +0,0 @@
1
- const e=require("../adapters/worktree/gitCli.cjs"),t=require("../adapters/worktree/worktreeOperations.cjs"),n=require("../services/extensionService.cjs");function r(r={}){return{service:r.service??new n.DefaultGitExtensionService,operations:r.operations??t.createWorktreeOperations({git:e.createWorktreeGit()})}}exports.createGitContainer=r;
2
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["DefaultGitExtensionService","createWorktreeOperations","createWorktreeGit"],"sources":["../../src/container/index.ts"],"sourcesContent":["// @scaffold-generated\nimport { createWorktreeGit } from '../adapters/worktree/gitCli.ts';\nimport { DefaultGitExtensionService } from '../services/extensionService.ts';\nimport { createWorktreeOperations } from '../adapters/worktree/worktreeOperations.ts';\nimport type { GitExtensionDependencies } from '../types/extension.ts';\n\nexport function createGitContainer(overrides: Partial<GitExtensionDependencies> = {}): GitExtensionDependencies {\n return {\n service: overrides.service ?? new DefaultGitExtensionService(),\n operations: overrides.operations ?? createWorktreeOperations({ git: createWorktreeGit() }),\n };\n}\n"],"mappings":"0JAMA,SAAgB,EAAmB,EAA+C,CAAC,EAA6B,CAC9G,MAAO,CACL,QAAS,EAAU,SAAW,IAAIA,EAAAA,2BAClC,WAAY,EAAU,YAAcC,EAAAA,yBAAyB,CAAE,IAAKC,EAAAA,kBAAkB,CAAE,CAAC,CAC3F,CACF"}
@@ -1,6 +0,0 @@
1
- import { GitExtensionDependencies } from "../types/extension.cjs";
2
- //#region src/container/index.d.ts
3
- declare function createGitContainer(overrides?: Partial<GitExtensionDependencies>): GitExtensionDependencies;
4
- //#endregion
5
- export { createGitContainer };
6
- //# sourceMappingURL=index.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/container/index.ts"],"mappings":";;iBAMgB,mBAAmB,YAAW,QAAQ,4BAAiC"}
@@ -1,6 +0,0 @@
1
- import { GitExtensionDependencies } from "../types/extension.mjs";
2
- //#region src/container/index.d.ts
3
- declare function createGitContainer(overrides?: Partial<GitExtensionDependencies>): GitExtensionDependencies;
4
- //#endregion
5
- export { createGitContainer };
6
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/container/index.ts"],"mappings":";;iBAMgB,mBAAmB,YAAW,QAAQ,4BAAiC"}
@@ -1,2 +0,0 @@
1
- import{createWorktreeGit as e}from"../adapters/worktree/gitCli.mjs";import{createWorktreeOperations as t}from"../adapters/worktree/worktreeOperations.mjs";import{DefaultGitExtensionService as n}from"../services/extensionService.mjs";function r(r={}){return{service:r.service??new n,operations:r.operations??t({git:e()})}}export{r as createGitContainer};
2
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/container/index.ts"],"sourcesContent":["// @scaffold-generated\nimport { createWorktreeGit } from '../adapters/worktree/gitCli.ts';\nimport { DefaultGitExtensionService } from '../services/extensionService.ts';\nimport { createWorktreeOperations } from '../adapters/worktree/worktreeOperations.ts';\nimport type { GitExtensionDependencies } from '../types/extension.ts';\n\nexport function createGitContainer(overrides: Partial<GitExtensionDependencies> = {}): GitExtensionDependencies {\n return {\n service: overrides.service ?? new DefaultGitExtensionService(),\n operations: overrides.operations ?? createWorktreeOperations({ git: createWorktreeGit() }),\n };\n}\n"],"mappings":"yOAMA,SAAgB,EAAmB,EAA+C,CAAC,EAA6B,CAC9G,MAAO,CACL,QAAS,EAAU,SAAW,IAAI,EAClC,WAAY,EAAU,YAAc,EAAyB,CAAE,IAAK,EAAkB,CAAE,CAAC,CAC3F,CACF"}
package/dist/hubApi.cjs DELETED
@@ -1,2 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/worktree/gitCli.cjs"),t=require("./services/support/errors.cjs"),n=require("./adapters/worktree/worktreeOperations.cjs");function r(e){return Response.json({error:e},{status:400})}function i(e){return e instanceof t.DoomGitExpectedError?Response.json({error:e.message,code:e.code},{status:e.retryable?503:409}):Response.json({error:`The worktree operation failed.`},{status:500})}const a={basePath:`git`,start(t){let a=n.createWorktreeOperations({git:e.createWorktreeGit()}),o=e=>{let n=e.searchParams.get(`repositoryId`);if(n===null||n===``)return r(`A repositoryId is required.`);let i=t.resolveRepository?.(n);return i===void 0?r(`That repository is not admitted to this cockpit.`):i};return{async fetch(e){let n=new URL(e.url),s=o(n);if(s instanceof Response)return s;let c={cwd:s,sessionId:n.searchParams.get(`sessionId`)??``};try{if(e.method===`GET`&&n.pathname===`/worktrees`)return Response.json({worktrees:await a.list(c)});if(e.method===`POST`&&n.pathname===`/worktrees`){let t=await e.json();if(typeof t.branch!=`string`||t.branch.trim()===``)return r(`A branch is required.`);let n=await a.spawn(c,{branch:t.branch,...t.baseRef===void 0?{}:{baseRef:t.baseRef},...t.name===void 0?{}:{name:t.name}});return Response.json({worktree:n},{status:201})}let t=/^\/worktrees\/([^/]+)$/u.exec(n.pathname);if(e.method===`DELETE`&&t){let e=await a.close(c,decodeURIComponent(String(t[1])),n.searchParams.get(`force`)===`true`);return Response.json({worktree:e})}return Response.json({error:`No such worktree route.`},{status:404})}catch(e){return t.onNotice(`worktree request failed: ${e.name}`),i(e)}},close(){}}}};exports.api=a;
2
- //# sourceMappingURL=hubApi.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hubApi.cjs","names":["DoomGitExpectedError","createWorktreeOperations","createWorktreeGit"],"sources":["../src/exports/hubApi.ts"],"sourcesContent":["import type { DoomApi, DoomApiContext, DoomApiHandler } from '@agimon-ai/doompi-extension-contracts/package-api';\nimport { createWorktreeGit } from '../adapters/worktree/gitCli.ts';\nimport { createWorktreeOperations } from '../adapters/worktree/worktreeOperations.ts';\nimport { DoomGitExpectedError } from '../services/support/errors.ts';\n\n/**\n * The worktree surface the cockpit panel calls.\n *\n * Hub-scoped because worktrees are a property of a repository, not of one\n * session: the panel lists and creates them whether or not the session that\n * made them is focused, and a session-scoped API would disappear with it.\n *\n * The panel names a repository by the hub's opaque id and never by path.\n * `resolveRepository` turns that into an admitted root, so a browser cannot\n * point this at a directory the cockpit was never given.\n */\nfunction badRequest(message: string): Response {\n return Response.json({ error: message }, { status: 400 });\n}\n\nfunction failed(error: unknown): Response {\n if (error instanceof DoomGitExpectedError) {\n return Response.json({ error: error.message, code: error.code }, { status: error.retryable ? 503 : 409 });\n }\n // Never the raw message: a git failure can carry a remote URL with a token.\n return Response.json({ error: 'The worktree operation failed.' }, { status: 500 });\n}\n\nexport const api: DoomApi = {\n basePath: 'git',\n start(context: DoomApiContext): DoomApiHandler {\n const operations = createWorktreeOperations({ git: createWorktreeGit() });\n\n /** The admitted root for a request, or a response explaining why not. */\n const rootOf = (url: URL): string | Response => {\n const repositoryId = url.searchParams.get('repositoryId');\n if (repositoryId === null || repositoryId === '') return badRequest('A repositoryId is required.');\n const root = context.resolveRepository?.(repositoryId);\n if (root === undefined) return badRequest('That repository is not admitted to this cockpit.');\n return root;\n };\n\n return {\n async fetch(request) {\n const url = new URL(request.url);\n const root = rootOf(url);\n if (root instanceof Response) return root;\n // The operations layer works from a cwd, and an admitted repository\n // root is one.\n const callerContext = { cwd: root, sessionId: url.searchParams.get('sessionId') ?? '' };\n\n try {\n if (request.method === 'GET' && url.pathname === '/worktrees') {\n return Response.json({ worktrees: await operations.list(callerContext) });\n }\n if (request.method === 'POST' && url.pathname === '/worktrees') {\n const body = (await request.json()) as { branch?: string; baseRef?: string; name?: string };\n if (typeof body.branch !== 'string' || body.branch.trim() === '') {\n return badRequest('A branch is required.');\n }\n const record = await operations.spawn(callerContext, {\n branch: body.branch,\n ...(body.baseRef === undefined ? {} : { baseRef: body.baseRef }),\n ...(body.name === undefined ? {} : { name: body.name }),\n });\n return Response.json({ worktree: record }, { status: 201 });\n }\n const closing = /^\\/worktrees\\/([^/]+)$/u.exec(url.pathname);\n if (request.method === 'DELETE' && closing) {\n const record = await operations.close(\n callerContext,\n decodeURIComponent(String(closing[1])),\n url.searchParams.get('force') === 'true',\n );\n return Response.json({ worktree: record });\n }\n return Response.json({ error: 'No such worktree route.' }, { status: 404 });\n } catch (error) {\n context.onNotice(`worktree request failed: ${(error as Error).name}`);\n return failed(error);\n }\n },\n close() {},\n };\n },\n};\n"],"mappings":"wNAgBA,SAAS,EAAW,EAA2B,CAC7C,OAAO,SAAS,KAAK,CAAE,MAAO,CAAQ,EAAG,CAAE,OAAQ,GAAI,CAAC,CAC1D,CAEA,SAAS,EAAO,EAA0B,CAKxC,OAJI,aAAiBA,EAAAA,qBACZ,SAAS,KAAK,CAAE,MAAO,EAAM,QAAS,KAAM,EAAM,IAAK,EAAG,CAAE,OAAQ,EAAM,UAAY,IAAM,GAAI,CAAC,EAGnG,SAAS,KAAK,CAAE,MAAO,gCAAiC,EAAG,CAAE,OAAQ,GAAI,CAAC,CACnF,CAEA,MAAa,EAAe,CAC1B,SAAU,MACV,MAAM,EAAyC,CAC7C,IAAM,EAAaC,EAAAA,yBAAyB,CAAE,IAAKC,EAAAA,kBAAkB,CAAE,CAAC,EAGlE,EAAU,GAAgC,CAC9C,IAAM,EAAe,EAAI,aAAa,IAAI,cAAc,EACxD,GAAI,IAAiB,MAAQ,IAAiB,GAAI,OAAO,EAAW,6BAA6B,EACjG,IAAM,EAAO,EAAQ,oBAAoB,CAAY,EAErD,OADI,IAAS,IAAA,GAAkB,EAAW,kDAAkD,EACrF,CACT,EAEA,MAAO,CACL,MAAM,MAAM,EAAS,CACnB,IAAM,EAAM,IAAI,IAAI,EAAQ,GAAG,EACzB,EAAO,EAAO,CAAG,EACvB,GAAI,aAAgB,SAAU,OAAO,EAGrC,IAAM,EAAgB,CAAE,IAAK,EAAM,UAAW,EAAI,aAAa,IAAI,WAAW,GAAK,EAAG,EAEtF,GAAI,CACF,GAAI,EAAQ,SAAW,OAAS,EAAI,WAAa,aAC/C,OAAO,SAAS,KAAK,CAAE,UAAW,MAAM,EAAW,KAAK,CAAa,CAAE,CAAC,EAE1E,GAAI,EAAQ,SAAW,QAAU,EAAI,WAAa,aAAc,CAC9D,IAAM,EAAQ,MAAM,EAAQ,KAAK,EACjC,GAAI,OAAO,EAAK,QAAW,UAAY,EAAK,OAAO,KAAK,IAAM,GAC5D,OAAO,EAAW,uBAAuB,EAE3C,IAAM,EAAS,MAAM,EAAW,MAAM,EAAe,CACnD,OAAQ,EAAK,OACb,GAAI,EAAK,UAAY,IAAA,GAAY,CAAC,EAAI,CAAE,QAAS,EAAK,OAAQ,EAC9D,GAAI,EAAK,OAAS,IAAA,GAAY,CAAC,EAAI,CAAE,KAAM,EAAK,IAAK,CACvD,CAAC,EACD,OAAO,SAAS,KAAK,CAAE,SAAU,CAAO,EAAG,CAAE,OAAQ,GAAI,CAAC,CAC5D,CACA,IAAM,EAAU,0BAA0B,KAAK,EAAI,QAAQ,EAC3D,GAAI,EAAQ,SAAW,UAAY,EAAS,CAC1C,IAAM,EAAS,MAAM,EAAW,MAC9B,EACA,mBAAmB,OAAO,EAAQ,EAAE,CAAC,EACrC,EAAI,aAAa,IAAI,OAAO,IAAM,MACpC,EACA,OAAO,SAAS,KAAK,CAAE,SAAU,CAAO,CAAC,CAC3C,CACA,OAAO,SAAS,KAAK,CAAE,MAAO,yBAA0B,EAAG,CAAE,OAAQ,GAAI,CAAC,CAC5E,OAAS,EAAO,CAEd,OADA,EAAQ,SAAS,4BAA6B,EAAgB,MAAM,EAC7D,EAAO,CAAK,CACrB,CACF,EACA,OAAQ,CAAC,CACX,CACF,CACF"}
package/dist/hubApi.d.cts DELETED
@@ -1,6 +0,0 @@
1
- import { DoomApi } from "@agimon-ai/doompi-extension-contracts/package-api";
2
- //#region src/exports/hubApi.d.ts
3
- declare const api: DoomApi;
4
- //#endregion
5
- export { api };
6
- //# sourceMappingURL=hubApi.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hubApi.d.cts","names":[],"sources":["../src/exports/hubApi.ts"],"mappings":";;cA4Ba,KAAK"}
package/dist/hubApi.d.mts DELETED
@@ -1,6 +0,0 @@
1
- import { DoomApi } from "@agimon-ai/doompi-extension-contracts/package-api";
2
- //#region src/exports/hubApi.d.ts
3
- declare const api: DoomApi;
4
- //#endregion
5
- export { api };
6
- //# sourceMappingURL=hubApi.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hubApi.d.mts","names":[],"sources":["../src/exports/hubApi.ts"],"mappings":";;cA4Ba,KAAK"}
package/dist/hubApi.mjs DELETED
@@ -1,2 +0,0 @@
1
- import{createWorktreeGit as e}from"./adapters/worktree/gitCli.mjs";import{DoomGitExpectedError as t}from"./services/support/errors.mjs";import{createWorktreeOperations as n}from"./adapters/worktree/worktreeOperations.mjs";function r(e){return Response.json({error:e},{status:400})}function i(e){return e instanceof t?Response.json({error:e.message,code:e.code},{status:e.retryable?503:409}):Response.json({error:`The worktree operation failed.`},{status:500})}const a={basePath:`git`,start(t){let a=n({git:e()}),o=e=>{let n=e.searchParams.get(`repositoryId`);if(n===null||n===``)return r(`A repositoryId is required.`);let i=t.resolveRepository?.(n);return i===void 0?r(`That repository is not admitted to this cockpit.`):i};return{async fetch(e){let n=new URL(e.url),s=o(n);if(s instanceof Response)return s;let c={cwd:s,sessionId:n.searchParams.get(`sessionId`)??``};try{if(e.method===`GET`&&n.pathname===`/worktrees`)return Response.json({worktrees:await a.list(c)});if(e.method===`POST`&&n.pathname===`/worktrees`){let t=await e.json();if(typeof t.branch!=`string`||t.branch.trim()===``)return r(`A branch is required.`);let n=await a.spawn(c,{branch:t.branch,...t.baseRef===void 0?{}:{baseRef:t.baseRef},...t.name===void 0?{}:{name:t.name}});return Response.json({worktree:n},{status:201})}let t=/^\/worktrees\/([^/]+)$/u.exec(n.pathname);if(e.method===`DELETE`&&t){let e=await a.close(c,decodeURIComponent(String(t[1])),n.searchParams.get(`force`)===`true`);return Response.json({worktree:e})}return Response.json({error:`No such worktree route.`},{status:404})}catch(e){return t.onNotice(`worktree request failed: ${e.name}`),i(e)}},close(){}}}};export{a as api};
2
- //# sourceMappingURL=hubApi.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hubApi.mjs","names":[],"sources":["../src/exports/hubApi.ts"],"sourcesContent":["import type { DoomApi, DoomApiContext, DoomApiHandler } from '@agimon-ai/doompi-extension-contracts/package-api';\nimport { createWorktreeGit } from '../adapters/worktree/gitCli.ts';\nimport { createWorktreeOperations } from '../adapters/worktree/worktreeOperations.ts';\nimport { DoomGitExpectedError } from '../services/support/errors.ts';\n\n/**\n * The worktree surface the cockpit panel calls.\n *\n * Hub-scoped because worktrees are a property of a repository, not of one\n * session: the panel lists and creates them whether or not the session that\n * made them is focused, and a session-scoped API would disappear with it.\n *\n * The panel names a repository by the hub's opaque id and never by path.\n * `resolveRepository` turns that into an admitted root, so a browser cannot\n * point this at a directory the cockpit was never given.\n */\nfunction badRequest(message: string): Response {\n return Response.json({ error: message }, { status: 400 });\n}\n\nfunction failed(error: unknown): Response {\n if (error instanceof DoomGitExpectedError) {\n return Response.json({ error: error.message, code: error.code }, { status: error.retryable ? 503 : 409 });\n }\n // Never the raw message: a git failure can carry a remote URL with a token.\n return Response.json({ error: 'The worktree operation failed.' }, { status: 500 });\n}\n\nexport const api: DoomApi = {\n basePath: 'git',\n start(context: DoomApiContext): DoomApiHandler {\n const operations = createWorktreeOperations({ git: createWorktreeGit() });\n\n /** The admitted root for a request, or a response explaining why not. */\n const rootOf = (url: URL): string | Response => {\n const repositoryId = url.searchParams.get('repositoryId');\n if (repositoryId === null || repositoryId === '') return badRequest('A repositoryId is required.');\n const root = context.resolveRepository?.(repositoryId);\n if (root === undefined) return badRequest('That repository is not admitted to this cockpit.');\n return root;\n };\n\n return {\n async fetch(request) {\n const url = new URL(request.url);\n const root = rootOf(url);\n if (root instanceof Response) return root;\n // The operations layer works from a cwd, and an admitted repository\n // root is one.\n const callerContext = { cwd: root, sessionId: url.searchParams.get('sessionId') ?? '' };\n\n try {\n if (request.method === 'GET' && url.pathname === '/worktrees') {\n return Response.json({ worktrees: await operations.list(callerContext) });\n }\n if (request.method === 'POST' && url.pathname === '/worktrees') {\n const body = (await request.json()) as { branch?: string; baseRef?: string; name?: string };\n if (typeof body.branch !== 'string' || body.branch.trim() === '') {\n return badRequest('A branch is required.');\n }\n const record = await operations.spawn(callerContext, {\n branch: body.branch,\n ...(body.baseRef === undefined ? {} : { baseRef: body.baseRef }),\n ...(body.name === undefined ? {} : { name: body.name }),\n });\n return Response.json({ worktree: record }, { status: 201 });\n }\n const closing = /^\\/worktrees\\/([^/]+)$/u.exec(url.pathname);\n if (request.method === 'DELETE' && closing) {\n const record = await operations.close(\n callerContext,\n decodeURIComponent(String(closing[1])),\n url.searchParams.get('force') === 'true',\n );\n return Response.json({ worktree: record });\n }\n return Response.json({ error: 'No such worktree route.' }, { status: 404 });\n } catch (error) {\n context.onNotice(`worktree request failed: ${(error as Error).name}`);\n return failed(error);\n }\n },\n close() {},\n };\n },\n};\n"],"mappings":"8NAgBA,SAAS,EAAW,EAA2B,CAC7C,OAAO,SAAS,KAAK,CAAE,MAAO,CAAQ,EAAG,CAAE,OAAQ,GAAI,CAAC,CAC1D,CAEA,SAAS,EAAO,EAA0B,CAKxC,OAJI,aAAiB,EACZ,SAAS,KAAK,CAAE,MAAO,EAAM,QAAS,KAAM,EAAM,IAAK,EAAG,CAAE,OAAQ,EAAM,UAAY,IAAM,GAAI,CAAC,EAGnG,SAAS,KAAK,CAAE,MAAO,gCAAiC,EAAG,CAAE,OAAQ,GAAI,CAAC,CACnF,CAEA,MAAa,EAAe,CAC1B,SAAU,MACV,MAAM,EAAyC,CAC7C,IAAM,EAAa,EAAyB,CAAE,IAAK,EAAkB,CAAE,CAAC,EAGlE,EAAU,GAAgC,CAC9C,IAAM,EAAe,EAAI,aAAa,IAAI,cAAc,EACxD,GAAI,IAAiB,MAAQ,IAAiB,GAAI,OAAO,EAAW,6BAA6B,EACjG,IAAM,EAAO,EAAQ,oBAAoB,CAAY,EAErD,OADI,IAAS,IAAA,GAAkB,EAAW,kDAAkD,EACrF,CACT,EAEA,MAAO,CACL,MAAM,MAAM,EAAS,CACnB,IAAM,EAAM,IAAI,IAAI,EAAQ,GAAG,EACzB,EAAO,EAAO,CAAG,EACvB,GAAI,aAAgB,SAAU,OAAO,EAGrC,IAAM,EAAgB,CAAE,IAAK,EAAM,UAAW,EAAI,aAAa,IAAI,WAAW,GAAK,EAAG,EAEtF,GAAI,CACF,GAAI,EAAQ,SAAW,OAAS,EAAI,WAAa,aAC/C,OAAO,SAAS,KAAK,CAAE,UAAW,MAAM,EAAW,KAAK,CAAa,CAAE,CAAC,EAE1E,GAAI,EAAQ,SAAW,QAAU,EAAI,WAAa,aAAc,CAC9D,IAAM,EAAQ,MAAM,EAAQ,KAAK,EACjC,GAAI,OAAO,EAAK,QAAW,UAAY,EAAK,OAAO,KAAK,IAAM,GAC5D,OAAO,EAAW,uBAAuB,EAE3C,IAAM,EAAS,MAAM,EAAW,MAAM,EAAe,CACnD,OAAQ,EAAK,OACb,GAAI,EAAK,UAAY,IAAA,GAAY,CAAC,EAAI,CAAE,QAAS,EAAK,OAAQ,EAC9D,GAAI,EAAK,OAAS,IAAA,GAAY,CAAC,EAAI,CAAE,KAAM,EAAK,IAAK,CACvD,CAAC,EACD,OAAO,SAAS,KAAK,CAAE,SAAU,CAAO,EAAG,CAAE,OAAQ,GAAI,CAAC,CAC5D,CACA,IAAM,EAAU,0BAA0B,KAAK,EAAI,QAAQ,EAC3D,GAAI,EAAQ,SAAW,UAAY,EAAS,CAC1C,IAAM,EAAS,MAAM,EAAW,MAC9B,EACA,mBAAmB,OAAO,EAAQ,EAAE,CAAC,EACrC,EAAI,aAAa,IAAI,OAAO,IAAM,MACpC,EACA,OAAO,SAAS,KAAK,CAAE,SAAU,CAAO,CAAC,CAC3C,CACA,OAAO,SAAS,KAAK,CAAE,MAAO,yBAA0B,EAAG,CAAE,OAAQ,GAAI,CAAC,CAC5E,OAAS,EAAO,CAEd,OADA,EAAQ,SAAS,4BAA6B,EAAgB,MAAM,EAC7D,EAAO,CAAK,CACrB,CACF,EACA,OAAQ,CAAC,CACX,CACF,CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensionService.cjs","names":[],"sources":["../../src/services/extensionService.ts"],"sourcesContent":["// @scaffold-generated\nimport type { GitExtensionResult, GitExtensionService } from '../types/extension.ts';\n\nexport class DefaultGitExtensionService implements GitExtensionService {\n async execute(): Promise<GitExtensionResult> {\n return { message: 'Show git worktrees owned by this session', level: 'info' };\n }\n}\n"],"mappings":"AAGA,IAAa,EAAb,KAAuE,CACrE,MAAM,SAAuC,CAC3C,MAAO,CAAE,QAAS,2CAA4C,MAAO,MAAO,CAC9E,CACF"}
@@ -1,8 +0,0 @@
1
- import { GitExtensionResult, GitExtensionService } from "../types/extension.cjs";
2
- //#region src/services/extensionService.d.ts
3
- declare class DefaultGitExtensionService implements GitExtensionService {
4
- execute(): Promise<GitExtensionResult>;
5
- }
6
- //#endregion
7
- export { DefaultGitExtensionService };
8
- //# sourceMappingURL=extensionService.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensionService.d.cts","names":[],"sources":["../../src/services/extensionService.ts"],"mappings":";;cAGa,sCAAsC;EAC3C,WAAW,QAAQ"}
@@ -1,8 +0,0 @@
1
- import { GitExtensionResult, GitExtensionService } from "../types/extension.mjs";
2
- //#region src/services/extensionService.d.ts
3
- declare class DefaultGitExtensionService implements GitExtensionService {
4
- execute(): Promise<GitExtensionResult>;
5
- }
6
- //#endregion
7
- export { DefaultGitExtensionService };
8
- //# sourceMappingURL=extensionService.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensionService.d.mts","names":[],"sources":["../../src/services/extensionService.ts"],"mappings":";;cAGa,sCAAsC;EAC3C,WAAW,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensionService.mjs","names":[],"sources":["../../src/services/extensionService.ts"],"sourcesContent":["// @scaffold-generated\nimport type { GitExtensionResult, GitExtensionService } from '../types/extension.ts';\n\nexport class DefaultGitExtensionService implements GitExtensionService {\n async execute(): Promise<GitExtensionResult> {\n return { message: 'Show git worktrees owned by this session', level: 'info' };\n }\n}\n"],"mappings":"AAGA,IAAa,EAAb,KAAuE,CACrE,MAAM,SAAuC,CAC3C,MAAO,CAAE,QAAS,2CAA4C,MAAO,MAAO,CAC9E,CACF"}
@@ -1,2 +0,0 @@
1
- var e=class extends Error{code;retryable;recovery;constructor(e,t,n,r){super(`[${e}] ${t}\nRecovery: ${r}`),this.code=e,this.retryable=n,this.recovery=r,this.name=`DoomGitExpectedError`}};function t(t,n){return new e(`invalid_request`,t,!1,n)}exports.DoomGitExpectedError=e,exports.invalidRequest=t;
2
- //# sourceMappingURL=errors.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../../../src/services/support/errors.ts"],"sourcesContent":["/**\n * Expected failures, kept private to this package.\n *\n * `@agimon-ai/doompi-extension-contracts` does not export `invalidRequest` or\n * an expected-error base, so this mirrors doompi-team's shape rather than\n * reaching across a layer boundary for it. The duplication is deliberate and\n * small; a shared helper would be the better answer only once a third package\n * needs one.\n */\n\nexport type DoomGitErrorCode =\n | 'invalid_request'\n | 'not_a_repository'\n | 'worktree_exists'\n | 'worktree_not_found'\n | 'worktree_not_owned'\n | 'worktree_dirty'\n | 'hub_unavailable'\n | 'install_failed'\n | 'git_failed';\n\nexport class DoomGitExpectedError extends Error {\n constructor(\n readonly code: DoomGitErrorCode,\n message: string,\n readonly retryable: boolean,\n readonly recovery: string,\n ) {\n // The recovery line rides in the message because a tool result is read as\n // text: an error the model cannot act on costs a turn to rediscover.\n super(`[${code}] ${message}\\nRecovery: ${recovery}`);\n this.name = 'DoomGitExpectedError';\n }\n}\n\nexport function invalidRequest(message: string, recovery: string): DoomGitExpectedError {\n return new DoomGitExpectedError('invalid_request', message, false, recovery);\n}\n"],"mappings":"AAqBA,IAAa,EAAb,cAA0C,KAAM,CAEnC,KAEA,UACA,SAJX,YACE,EACA,EACA,EACA,EACA,CAGA,MAAM,IAAI,EAAK,IAAI,EAAQ,cAAc,GAAU,EAP1C,KAAA,KAAA,EAEA,KAAA,UAAA,EACA,KAAA,SAAA,EAKT,KAAK,KAAO,sBACd,CACF,EAEA,SAAgB,EAAe,EAAiB,EAAwC,CACtF,OAAO,IAAI,EAAqB,kBAAmB,EAAS,GAAO,CAAQ,CAC7E"}
@@ -1,2 +0,0 @@
1
- var e=class extends Error{code;retryable;recovery;constructor(e,t,n,r){super(`[${e}] ${t}\nRecovery: ${r}`),this.code=e,this.retryable=n,this.recovery=r,this.name=`DoomGitExpectedError`}};function t(t,n){return new e(`invalid_request`,t,!1,n)}export{e as DoomGitExpectedError,t as invalidRequest};
2
- //# sourceMappingURL=errors.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.mjs","names":[],"sources":["../../../src/services/support/errors.ts"],"sourcesContent":["/**\n * Expected failures, kept private to this package.\n *\n * `@agimon-ai/doompi-extension-contracts` does not export `invalidRequest` or\n * an expected-error base, so this mirrors doompi-team's shape rather than\n * reaching across a layer boundary for it. The duplication is deliberate and\n * small; a shared helper would be the better answer only once a third package\n * needs one.\n */\n\nexport type DoomGitErrorCode =\n | 'invalid_request'\n | 'not_a_repository'\n | 'worktree_exists'\n | 'worktree_not_found'\n | 'worktree_not_owned'\n | 'worktree_dirty'\n | 'hub_unavailable'\n | 'install_failed'\n | 'git_failed';\n\nexport class DoomGitExpectedError extends Error {\n constructor(\n readonly code: DoomGitErrorCode,\n message: string,\n readonly retryable: boolean,\n readonly recovery: string,\n ) {\n // The recovery line rides in the message because a tool result is read as\n // text: an error the model cannot act on costs a turn to rediscover.\n super(`[${code}] ${message}\\nRecovery: ${recovery}`);\n this.name = 'DoomGitExpectedError';\n }\n}\n\nexport function invalidRequest(message: string, recovery: string): DoomGitExpectedError {\n return new DoomGitExpectedError('invalid_request', message, false, recovery);\n}\n"],"mappings":"AAqBA,IAAa,EAAb,cAA0C,KAAM,CAEnC,KAEA,UACA,SAJX,YACE,EACA,EACA,EACA,EACA,CAGA,MAAM,IAAI,EAAK,IAAI,EAAQ,cAAc,GAAU,EAP1C,KAAA,KAAA,EAEA,KAAA,UAAA,EACA,KAAA,SAAA,EAKT,KAAK,KAAO,sBACd,CACF,EAEA,SAAgB,EAAe,EAAiB,EAAwC,CACtF,OAAO,IAAI,EAAqB,kBAAmB,EAAS,GAAO,CAAQ,CAC7E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktreeNaming.d.cts","names":[],"sources":["../../src/services/worktreeNaming.ts"],"mappings":";;UAoGiB;;EAEf,QAAQ;;EAER,QAAQ;;EAER;;EAEA,WAAW;;;;;;;;iBASG,UAAU;EACxB,kBAAkB;EAClB;EACA;EACA,aAAa;IACX"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktreeNaming.d.mts","names":[],"sources":["../../src/services/worktreeNaming.ts"],"mappings":";;UAoGiB;;EAEf,QAAQ;;EAER,QAAQ;;EAER;;EAEA,WAAW;;;;;;;;iBASG,UAAU;EACxB,kBAAkB;EAClB;EACA;EACA,aAAa;IACX"}
package/dist/webHub.cjs DELETED
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/web/worktreesChannel.cjs");exports.createWorktreesChannel=e.createWorktreesChannel,exports.webHubChannels=e.webHubChannels;
package/dist/webHub.d.cts DELETED
@@ -1,2 +0,0 @@
1
- import { createWorktreesChannel, webHubChannels } from "./adapters/web/worktreesChannel.cjs";
2
- export { createWorktreesChannel, webHubChannels };
package/dist/webHub.d.mts DELETED
@@ -1,2 +0,0 @@
1
- import { createWorktreesChannel, webHubChannels } from "./adapters/web/worktreesChannel.mjs";
2
- export { createWorktreesChannel, webHubChannels };
package/dist/webHub.mjs DELETED
@@ -1 +0,0 @@
1
- import{createWorktreesChannel as e,webHubChannels as t}from"./adapters/web/worktreesChannel.mjs";export{e as createWorktreesChannel,t as webHubChannels};
@@ -1 +0,0 @@
1
- export { webPlugin } from '../web/index.ts';
package/src/web/index.ts DELETED
@@ -1,30 +0,0 @@
1
- import { defineWebPlugin } from '@agimon-ai/doompi-web-contracts';
2
- import { gitToolRenderers } from './components/toolRenderers.ts';
3
- import { WorktreesActivitySection } from './components/WorktreesActivitySection.tsx';
4
- import { worktreesTab } from './components/WorktreesPanel.tsx';
5
- import { startWorktreeRuntime, worktreeActivitySource, worktreesChannel } from './stores/worktreesActivityStore.ts';
6
-
7
- /** The named export the generated plugin registry imports. */
8
- export const webPlugin = defineWebPlugin({
9
- id: 'git',
10
- channels: [worktreesChannel],
11
- // The panel commands the hub over its own channel, which needs the page's
12
- // hub socket rather than the per-session frame sender the slots carry.
13
- start: startWorktreeRuntime,
14
- activityGroups: [
15
- {
16
- name: 'git',
17
- keys: 'g w',
18
- // The source keeps the group present while idle, which is exactly when
19
- // its launcher matters: a repository with no worktrees is where someone
20
- // wants to make the first one.
21
- activeSource: worktreeActivitySource,
22
- // A standing worktree is not background work in progress; it is state.
23
- marksBackgroundWork: false,
24
- transientTab: worktreesTab,
25
- order: 30,
26
- },
27
- ],
28
- activitySections: [{ id: 'git', component: WorktreesActivitySection }],
29
- toolRenderers: gitToolRenderers,
30
- });