@agimon-ai/doompi-git 0.0.1-alpha.30 → 0.0.1-alpha.32

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 (41) hide show
  1. package/README.md +10 -0
  2. package/dist/apiContracts.cjs +51 -2
  3. package/dist/apiContracts.cjs.map +1 -1
  4. package/dist/apiContracts.mjs +51 -2
  5. package/dist/apiContracts.mjs.map +1 -1
  6. package/dist/extensions/pi.cjs +4 -8
  7. package/dist/extensions/pi.cjs.map +1 -1
  8. package/dist/extensions/pi.d.mts +1 -1
  9. package/dist/extensions/pi.mjs +2 -6
  10. package/dist/extensions/pi.mjs.map +1 -1
  11. package/dist/extensions/server.cjs +98 -5
  12. package/dist/extensions/server.cjs.map +1 -1
  13. package/dist/extensions/server.mjs +98 -5
  14. package/dist/extensions/server.mjs.map +1 -1
  15. package/dist/extensions/web.mjs +334 -3
  16. package/dist/extensions/web.mjs.map +1 -1
  17. package/dist/{gitDependencies-D-EUEIkE.mjs → gitDependencies-CJFmhrG1.mjs} +2 -2
  18. package/dist/{gitDependencies-D-EUEIkE.mjs.map → gitDependencies-CJFmhrG1.mjs.map} +1 -1
  19. package/dist/{gitDependencies-DKJr5kLQ.cjs → gitDependencies-CWsygnLQ.cjs} +2 -2
  20. package/dist/{gitDependencies-DKJr5kLQ.cjs.map → gitDependencies-CWsygnLQ.cjs.map} +1 -1
  21. package/dist/{index-BQq2vblZ.d.mts → index-D79MSCee.d.mts} +15 -13
  22. package/dist/index-D79MSCee.d.mts.map +1 -0
  23. package/dist/index.cjs +1 -1
  24. package/dist/index.d.mts +1 -1
  25. package/dist/index.mjs +1 -1
  26. package/dist/{runWorktree-BL99h9oH.mjs → runWorktree-BdK3oRtX.mjs} +18 -9
  27. package/dist/runWorktree-BdK3oRtX.mjs.map +1 -0
  28. package/dist/{runWorktree-B6ikYRrG.cjs → runWorktree-D0bsyYc0.cjs} +41 -8
  29. package/dist/runWorktree-D0bsyYc0.cjs.map +1 -0
  30. package/dist/{worktreeOperations-DAbs0ZTX.mjs → worktreeOperations-CijBzYEf.mjs} +130 -21
  31. package/dist/worktreeOperations-CijBzYEf.mjs.map +1 -0
  32. package/dist/{worktreeOperations-DjO_Y5Yv.cjs → worktreeOperations-FJDk44Zt.cjs} +135 -20
  33. package/dist/worktreeOperations-FJDk44Zt.cjs.map +1 -0
  34. package/llms.txt +4 -0
  35. package/package.json +8 -7
  36. package/src/prompts/doompi-use-git/SKILL.md +21 -1
  37. package/dist/index-BQq2vblZ.d.mts.map +0 -1
  38. package/dist/runWorktree-B6ikYRrG.cjs.map +0 -1
  39. package/dist/runWorktree-BL99h9oH.mjs.map +0 -1
  40. package/dist/worktreeOperations-DAbs0ZTX.mjs.map +0 -1
  41. package/dist/worktreeOperations-DjO_Y5Yv.cjs.map +0 -1
package/README.md CHANGED
@@ -27,6 +27,16 @@ Run the registered command in Pi:
27
27
 
28
28
  Show git worktrees owned by this session
29
29
 
30
+ ### New-session dialog
31
+
32
+ In the web cockpit, doompi-git replaces the new-session dialog for a git workspace. It offers three choices:
33
+
34
+ - **Existing branch**: a worktree session on a local branch, or on a remote-only branch (a local tracking branch is created). Branches already checked out elsewhere are disabled.
35
+ - **New branch**: a worktree session on a new branch from a base, preselected to the repository's default branch.
36
+ - **No branch**: a plain session in the workspace folder.
37
+
38
+ Worktree sessions opened here start at the top level of the session rail, with no parent. A workspace that is not a git checkout offers the plain session only. For remote devices, creating a worktree session needs the same passkey step-up as any new session.
39
+
30
40
  ## Package behavior
31
41
 
32
42
  > Before publishing, replace this paragraph with one concrete, copy-pasteable example of the package-specific input, output, configuration, or workflow that is not already demonstrated by the generated command.
@@ -17,7 +17,7 @@ const RecordSchema = typebox.Type.Object({
17
17
  path: S,
18
18
  repositoryRoot: S,
19
19
  sessionId: S,
20
- parentSessionId: S,
20
+ parentSessionId: typebox.Type.Optional(S),
21
21
  status: literals([
22
22
  "spawning",
23
23
  "running",
@@ -120,7 +120,56 @@ const apiContracts = (0, _agimon_ai_doompi_core_apiContracts.defineApiContract)(
120
120
  schema: B
121
121
  }],
122
122
  responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(typebox.Type.Object({ worktree: RecordSchema }))
123
- }
123
+ },
124
+ ...scope === "workspace" ? [{
125
+ id: "git.branches",
126
+ scope,
127
+ basePath: "git",
128
+ path: "/branches",
129
+ method: "GET",
130
+ authentication: "owner",
131
+ description: "List the workspace branches for the new-session dialog.",
132
+ responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(typebox.Type.Object({
133
+ repository: B,
134
+ current: O(S),
135
+ defaultBase: O(S),
136
+ local: typebox.Type.Array(typebox.Type.Object({
137
+ name: S,
138
+ checkedOutAt: O(S)
139
+ })),
140
+ remote: typebox.Type.Array(typebox.Type.Object({
141
+ remote: S,
142
+ name: S
143
+ }))
144
+ }))
145
+ }, {
146
+ id: "git.sessions.create",
147
+ scope,
148
+ basePath: "git",
149
+ path: "/sessions",
150
+ method: "POST",
151
+ authentication: "owner",
152
+ description: "Start a top-level worktree session on an existing or new branch.",
153
+ body: {
154
+ required: true,
155
+ contentType: "application/json",
156
+ schema: typebox.Type.Union([typebox.Type.Object({
157
+ mode: typebox.Type.Literal("existing-branch"),
158
+ branch: S,
159
+ remote: O(S),
160
+ name: O(S)
161
+ }), typebox.Type.Object({
162
+ mode: typebox.Type.Literal("new-branch"),
163
+ branch: S,
164
+ baseRef: O(S),
165
+ name: O(S)
166
+ })])
167
+ },
168
+ responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(typebox.Type.Object({
169
+ sessionId: S,
170
+ worktreeId: S
171
+ }), 201)
172
+ }] : []
124
173
  ]),
125
174
  sockets: ["global", "workspace"].flatMap((scope) => [{
126
175
  id: "git.channel",
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst RecordSchema = Type.Object({\n version: Type.Literal(1),\n id: S,\n branch: S,\n baseRef: S,\n path: S,\n repositoryRoot: S,\n sessionId: S,\n parentSessionId: S,\n status: literals(['spawning', 'running', 'closing', 'orphaned']),\n createdAt: S,\n});\nconst ErrorTargetSchema = Type.Union([\n Type.Object({ action: Type.Literal('create') }),\n Type.Object({ action: Type.Literal('close'), id: S }),\n]);\nexport const WorktreesPayloadSchema = Type.Object({\n worktrees: Type.Array(\n Type.Object({ id: S, branch: S, path: S, sessionId: Type.Union([S, Type.Null()]), orphaned: B, unowned: B }),\n ),\n pending: O(S),\n error: O(S),\n errorTarget: O(ErrorTargetSchema),\n});\nexport const WorktreesCommandSchema = Type.Union([\n Type.Object({\n action: Type.Literal('create'),\n branch: S,\n baseRef: O(S),\n reservationId: O(Type.String({ minLength: 1, pattern: '^[A-Za-z0-9_-]+$' })),\n }),\n Type.Object({ action: Type.Literal('close'), id: S, force: O(B) }),\n]);\nconst query = [\n { name: 'repositoryId', in: 'query' as const, required: true, schema: S },\n { name: 'sessionId', in: 'query' as const, required: true, schema: S },\n];\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'git.list',\n scope,\n basePath: 'git',\n path: '/worktrees',\n method: 'GET',\n authentication: 'owner',\n description: 'List admitted repository worktrees.',\n parameters: query.map((item) => ({ ...item, required: item.name === 'repositoryId' })),\n responses: jsonApiResponses(Type.Object({ worktrees: Type.Array(RecordSchema) })),\n },\n {\n id: 'git.create',\n scope,\n basePath: 'git',\n path: '/worktrees',\n method: 'POST',\n authentication: 'owner',\n description: 'Create a worktree and session.',\n parameters: query,\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ branch: Type.String({ minLength: 1 }), baseRef: O(S), name: O(S) }),\n },\n responses: jsonApiResponses(Type.Object({ worktree: RecordSchema }), 201),\n },\n {\n id: 'git.close',\n scope,\n basePath: 'git',\n path: '/worktrees/{id}',\n method: 'DELETE',\n authentication: 'owner',\n description: 'Close a worktree.',\n parameters: [...query, { name: 'force', in: 'query', required: false, schema: B }],\n responses: jsonApiResponses(Type.Object({ worktree: RecordSchema })),\n },\n ]),\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'git.channel',\n scope,\n service: 'doompi.hub.v1',\n member: 'git_worktrees',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Worktree channel payload.',\n input: WorktreesPayloadSchema,\n },\n {\n id: 'git.command',\n scope,\n service: 'doompi.hub.v1',\n member: 'git_worktrees',\n kind: 'channel',\n direction: 'client-to-server',\n description: 'Worktree channel command payload.',\n input: WorktreesCommandSchema,\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":";;;;;;;AAGA,MAAM,IAAIA,QAAAA,KAAK,OAAO;AACtB,MAAM,IAAIA,QAAAA,KAAK,QAAQ;AACvB,MAAM,IAAIA,QAAAA,KAAK;AACf,MAAM,YAA8B,WAAgBA,QAAAA,KAAK,MAAM,OAAO,KAAK,UAAUA,QAAAA,KAAK,QAAQ,KAAK,CAAC,CAAC;AACzG,MAAM,eAAeA,QAAAA,KAAK,OAAO;CAC/B,SAASA,QAAAA,KAAK,QAAQ,CAAC;CACvB,IAAI;CACJ,QAAQ;CACR,SAAS;CACT,MAAM;CACN,gBAAgB;CAChB,WAAW;CACX,iBAAiB;CACjB,QAAQ,SAAS;EAAC;EAAY;EAAW;EAAW;CAAU,CAAC;CAC/D,WAAW;AACb,CAAC;AACD,MAAM,oBAAoBA,QAAAA,KAAK,MAAM,CACnCA,QAAAA,KAAK,OAAO,EAAE,QAAQA,QAAAA,KAAK,QAAQ,QAAQ,EAAE,CAAC,GAC9CA,QAAAA,KAAK,OAAO;CAAE,QAAQA,QAAAA,KAAK,QAAQ,OAAO;CAAG,IAAI;AAAE,CAAC,CACtD,CAAC;AACD,MAAa,yBAAyBA,QAAAA,KAAK,OAAO;CAChD,WAAWA,QAAAA,KAAK,MACdA,QAAAA,KAAK,OAAO;EAAE,IAAI;EAAG,QAAQ;EAAG,MAAM;EAAG,WAAWA,QAAAA,KAAK,MAAM,CAAC,GAAGA,QAAAA,KAAK,KAAK,CAAC,CAAC;EAAG,UAAU;EAAG,SAAS;CAAE,CAAC,CAC7G;CACA,SAAS,EAAE,CAAC;CACZ,OAAO,EAAE,CAAC;CACV,aAAa,EAAE,iBAAiB;AAClC,CAAC;AACD,MAAa,yBAAyBA,QAAAA,KAAK,MAAM,CAC/CA,QAAAA,KAAK,OAAO;CACV,QAAQA,QAAAA,KAAK,QAAQ,QAAQ;CAC7B,QAAQ;CACR,SAAS,EAAE,CAAC;CACZ,eAAe,EAAEA,QAAAA,KAAK,OAAO;EAAE,WAAW;EAAG,SAAS;CAAmB,CAAC,CAAC;AAC7E,CAAC,GACDA,QAAAA,KAAK,OAAO;CAAE,QAAQA,QAAAA,KAAK,QAAQ,OAAO;CAAG,IAAI;CAAG,OAAO,EAAE,CAAC;AAAE,CAAC,CACnE,CAAC;AACD,MAAM,QAAQ,CACZ;CAAE,MAAM;CAAgB,IAAI;CAAkB,UAAU;CAAM,QAAQ;AAAE,GACxE;CAAE,MAAM;CAAa,IAAI;CAAkB,UAAU;CAAM,QAAQ;AAAE,CACvE;AACA,MAAa,gBAAA,GAAeC,oCAAAA,kBAAAA,CAAkB;CAC5C,SAAS;CACT,SAAS,CAAC;CACV,MAAO,CAAC,UAAU,WAAW,CAAC,CAAW,SAAS,UAAU;EAC1D;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,YAAY,MAAM,KAAK,UAAU;IAAE,GAAG;IAAM,UAAU,KAAK,SAAS;GAAe,EAAE;GACrF,YAAA,GAAWC,oCAAAA,iBAAAA,CAAiBF,QAAAA,KAAK,OAAO,EAAE,WAAWA,QAAAA,KAAK,MAAM,YAAY,EAAE,CAAC,CAAC;EAClF;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,YAAY;GACZ,MAAM;IACJ,UAAU;IACV,aAAa;IACb,QAAQA,QAAAA,KAAK,OAAO;KAAE,QAAQA,QAAAA,KAAK,OAAO,EAAE,WAAW,EAAE,CAAC;KAAG,SAAS,EAAE,CAAC;KAAG,MAAM,EAAE,CAAC;IAAE,CAAC;GAC1F;GACA,YAAA,GAAWE,oCAAAA,iBAAAA,CAAiBF,QAAAA,KAAK,OAAO,EAAE,UAAU,aAAa,CAAC,GAAG,GAAG;EAC1E;EACA;GACE,IAAI;GACJ;GACA,UAAU;GACV,MAAM;GACN,QAAQ;GACR,gBAAgB;GAChB,aAAa;GACb,YAAY,CAAC,GAAG,OAAO;IAAE,MAAM;IAAS,IAAI;IAAS,UAAU;IAAO,QAAQ;GAAE,CAAC;GACjF,YAAA,GAAWE,oCAAAA,iBAAAA,CAAiBF,QAAAA,KAAK,OAAO,EAAE,UAAU,aAAa,CAAC,CAAC;EACrE;CACF,CAAC;CACD,SAAU,CAAC,UAAU,WAAW,CAAC,CAAW,SAAS,UAAU,CAC7D;EACE,IAAI;EACJ;EACA,SAAS;EACT,QAAQ;EACR,MAAM;EACN,WAAW;EACX,aAAa;EACb,OAAO;CACT,GACA;EACE,IAAI;EACJ;EACA,SAAS;EACT,QAAQ;EACR,MAAM;EACN,WAAW;EACX,aAAa;EACb,OAAO;CACT,CACF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst RecordSchema = Type.Object({\n version: Type.Literal(1),\n id: S,\n branch: S,\n baseRef: S,\n path: S,\n repositoryRoot: S,\n sessionId: S,\n parentSessionId: Type.Optional(S),\n status: literals(['spawning', 'running', 'closing', 'orphaned']),\n createdAt: S,\n});\nconst ErrorTargetSchema = Type.Union([\n Type.Object({ action: Type.Literal('create') }),\n Type.Object({ action: Type.Literal('close'), id: S }),\n]);\nexport const WorktreesPayloadSchema = Type.Object({\n worktrees: Type.Array(\n Type.Object({ id: S, branch: S, path: S, sessionId: Type.Union([S, Type.Null()]), orphaned: B, unowned: B }),\n ),\n pending: O(S),\n error: O(S),\n errorTarget: O(ErrorTargetSchema),\n});\nexport const WorktreesCommandSchema = Type.Union([\n Type.Object({\n action: Type.Literal('create'),\n branch: S,\n baseRef: O(S),\n reservationId: O(Type.String({ minLength: 1, pattern: '^[A-Za-z0-9_-]+$' })),\n }),\n Type.Object({ action: Type.Literal('close'), id: S, force: O(B) }),\n]);\nconst query = [\n { name: 'repositoryId', in: 'query' as const, required: true, schema: S },\n { name: 'sessionId', in: 'query' as const, required: true, schema: S },\n];\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'git.list',\n scope,\n basePath: 'git',\n path: '/worktrees',\n method: 'GET',\n authentication: 'owner',\n description: 'List admitted repository worktrees.',\n parameters: query.map((item) => ({ ...item, required: item.name === 'repositoryId' })),\n responses: jsonApiResponses(Type.Object({ worktrees: Type.Array(RecordSchema) })),\n },\n {\n id: 'git.create',\n scope,\n basePath: 'git',\n path: '/worktrees',\n method: 'POST',\n authentication: 'owner',\n description: 'Create a worktree and session.',\n parameters: query,\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ branch: Type.String({ minLength: 1 }), baseRef: O(S), name: O(S) }),\n },\n responses: jsonApiResponses(Type.Object({ worktree: RecordSchema }), 201),\n },\n {\n id: 'git.close',\n scope,\n basePath: 'git',\n path: '/worktrees/{id}',\n method: 'DELETE',\n authentication: 'owner',\n description: 'Close a worktree.',\n parameters: [...query, { name: 'force', in: 'query', required: false, schema: B }],\n responses: jsonApiResponses(Type.Object({ worktree: RecordSchema })),\n },\n // The new-session dialog's routes exist only on a workspace mount.\n ...(scope === 'workspace'\n ? [\n {\n id: 'git.branches',\n scope,\n basePath: 'git',\n path: '/branches',\n method: 'GET' as const,\n authentication: 'owner' as const,\n description: 'List the workspace branches for the new-session dialog.',\n responses: jsonApiResponses(\n Type.Object({\n repository: B,\n current: O(S),\n defaultBase: O(S),\n local: Type.Array(Type.Object({ name: S, checkedOutAt: O(S) })),\n remote: Type.Array(Type.Object({ remote: S, name: S })),\n }),\n ),\n },\n {\n id: 'git.sessions.create',\n scope,\n basePath: 'git',\n path: '/sessions',\n method: 'POST' as const,\n authentication: 'owner' as const,\n description: 'Start a top-level worktree session on an existing or new branch.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Union([\n Type.Object({ mode: Type.Literal('existing-branch'), branch: S, remote: O(S), name: O(S) }),\n Type.Object({ mode: Type.Literal('new-branch'), branch: S, baseRef: O(S), name: O(S) }),\n ]),\n },\n responses: jsonApiResponses(Type.Object({ sessionId: S, worktreeId: S }), 201),\n },\n ]\n : []),\n ]),\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'git.channel',\n scope,\n service: 'doompi.hub.v1',\n member: 'git_worktrees',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Worktree channel payload.',\n input: WorktreesPayloadSchema,\n },\n {\n id: 'git.command',\n scope,\n service: 'doompi.hub.v1',\n member: 'git_worktrees',\n kind: 'channel',\n direction: 'client-to-server',\n description: 'Worktree channel command payload.',\n input: WorktreesCommandSchema,\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":"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"}
@@ -13,7 +13,7 @@ const RecordSchema = Type.Object({
13
13
  path: S,
14
14
  repositoryRoot: S,
15
15
  sessionId: S,
16
- parentSessionId: S,
16
+ parentSessionId: Type.Optional(S),
17
17
  status: literals([
18
18
  "spawning",
19
19
  "running",
@@ -116,7 +116,56 @@ const apiContracts = defineApiContract({
116
116
  schema: B
117
117
  }],
118
118
  responses: jsonApiResponses(Type.Object({ worktree: RecordSchema }))
119
- }
119
+ },
120
+ ...scope === "workspace" ? [{
121
+ id: "git.branches",
122
+ scope,
123
+ basePath: "git",
124
+ path: "/branches",
125
+ method: "GET",
126
+ authentication: "owner",
127
+ description: "List the workspace branches for the new-session dialog.",
128
+ responses: jsonApiResponses(Type.Object({
129
+ repository: B,
130
+ current: O(S),
131
+ defaultBase: O(S),
132
+ local: Type.Array(Type.Object({
133
+ name: S,
134
+ checkedOutAt: O(S)
135
+ })),
136
+ remote: Type.Array(Type.Object({
137
+ remote: S,
138
+ name: S
139
+ }))
140
+ }))
141
+ }, {
142
+ id: "git.sessions.create",
143
+ scope,
144
+ basePath: "git",
145
+ path: "/sessions",
146
+ method: "POST",
147
+ authentication: "owner",
148
+ description: "Start a top-level worktree session on an existing or new branch.",
149
+ body: {
150
+ required: true,
151
+ contentType: "application/json",
152
+ schema: Type.Union([Type.Object({
153
+ mode: Type.Literal("existing-branch"),
154
+ branch: S,
155
+ remote: O(S),
156
+ name: O(S)
157
+ }), Type.Object({
158
+ mode: Type.Literal("new-branch"),
159
+ branch: S,
160
+ baseRef: O(S),
161
+ name: O(S)
162
+ })])
163
+ },
164
+ responses: jsonApiResponses(Type.Object({
165
+ sessionId: S,
166
+ worktreeId: S
167
+ }), 201)
168
+ }] : []
120
169
  ]),
121
170
  sockets: ["global", "workspace"].flatMap((scope) => [{
122
171
  id: "git.channel",
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst RecordSchema = Type.Object({\n version: Type.Literal(1),\n id: S,\n branch: S,\n baseRef: S,\n path: S,\n repositoryRoot: S,\n sessionId: S,\n parentSessionId: S,\n status: literals(['spawning', 'running', 'closing', 'orphaned']),\n createdAt: S,\n});\nconst ErrorTargetSchema = Type.Union([\n Type.Object({ action: Type.Literal('create') }),\n Type.Object({ action: Type.Literal('close'), id: S }),\n]);\nexport const WorktreesPayloadSchema = Type.Object({\n worktrees: Type.Array(\n Type.Object({ id: S, branch: S, path: S, sessionId: Type.Union([S, Type.Null()]), orphaned: B, unowned: B }),\n ),\n pending: O(S),\n error: O(S),\n errorTarget: O(ErrorTargetSchema),\n});\nexport const WorktreesCommandSchema = Type.Union([\n Type.Object({\n action: Type.Literal('create'),\n branch: S,\n baseRef: O(S),\n reservationId: O(Type.String({ minLength: 1, pattern: '^[A-Za-z0-9_-]+$' })),\n }),\n Type.Object({ action: Type.Literal('close'), id: S, force: O(B) }),\n]);\nconst query = [\n { name: 'repositoryId', in: 'query' as const, required: true, schema: S },\n { name: 'sessionId', in: 'query' as const, required: true, schema: S },\n];\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'git.list',\n scope,\n basePath: 'git',\n path: '/worktrees',\n method: 'GET',\n authentication: 'owner',\n description: 'List admitted repository worktrees.',\n parameters: query.map((item) => ({ ...item, required: item.name === 'repositoryId' })),\n responses: jsonApiResponses(Type.Object({ worktrees: Type.Array(RecordSchema) })),\n },\n {\n id: 'git.create',\n scope,\n basePath: 'git',\n path: '/worktrees',\n method: 'POST',\n authentication: 'owner',\n description: 'Create a worktree and session.',\n parameters: query,\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ branch: Type.String({ minLength: 1 }), baseRef: O(S), name: O(S) }),\n },\n responses: jsonApiResponses(Type.Object({ worktree: RecordSchema }), 201),\n },\n {\n id: 'git.close',\n scope,\n basePath: 'git',\n path: '/worktrees/{id}',\n method: 'DELETE',\n authentication: 'owner',\n description: 'Close a worktree.',\n parameters: [...query, { name: 'force', in: 'query', required: false, schema: B }],\n responses: jsonApiResponses(Type.Object({ worktree: RecordSchema })),\n },\n ]),\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'git.channel',\n scope,\n service: 'doompi.hub.v1',\n member: 'git_worktrees',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Worktree channel payload.',\n input: WorktreesPayloadSchema,\n },\n {\n id: 'git.command',\n scope,\n service: 'doompi.hub.v1',\n member: 'git_worktrees',\n kind: 'channel',\n direction: 'client-to-server',\n description: 'Worktree channel command payload.',\n input: WorktreesCommandSchema,\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":"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"}
1
+ {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/doompi-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nconst RecordSchema = Type.Object({\n version: Type.Literal(1),\n id: S,\n branch: S,\n baseRef: S,\n path: S,\n repositoryRoot: S,\n sessionId: S,\n parentSessionId: Type.Optional(S),\n status: literals(['spawning', 'running', 'closing', 'orphaned']),\n createdAt: S,\n});\nconst ErrorTargetSchema = Type.Union([\n Type.Object({ action: Type.Literal('create') }),\n Type.Object({ action: Type.Literal('close'), id: S }),\n]);\nexport const WorktreesPayloadSchema = Type.Object({\n worktrees: Type.Array(\n Type.Object({ id: S, branch: S, path: S, sessionId: Type.Union([S, Type.Null()]), orphaned: B, unowned: B }),\n ),\n pending: O(S),\n error: O(S),\n errorTarget: O(ErrorTargetSchema),\n});\nexport const WorktreesCommandSchema = Type.Union([\n Type.Object({\n action: Type.Literal('create'),\n branch: S,\n baseRef: O(S),\n reservationId: O(Type.String({ minLength: 1, pattern: '^[A-Za-z0-9_-]+$' })),\n }),\n Type.Object({ action: Type.Literal('close'), id: S, force: O(B) }),\n]);\nconst query = [\n { name: 'repositoryId', in: 'query' as const, required: true, schema: S },\n { name: 'sessionId', in: 'query' as const, required: true, schema: S },\n];\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'git.list',\n scope,\n basePath: 'git',\n path: '/worktrees',\n method: 'GET',\n authentication: 'owner',\n description: 'List admitted repository worktrees.',\n parameters: query.map((item) => ({ ...item, required: item.name === 'repositoryId' })),\n responses: jsonApiResponses(Type.Object({ worktrees: Type.Array(RecordSchema) })),\n },\n {\n id: 'git.create',\n scope,\n basePath: 'git',\n path: '/worktrees',\n method: 'POST',\n authentication: 'owner',\n description: 'Create a worktree and session.',\n parameters: query,\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ branch: Type.String({ minLength: 1 }), baseRef: O(S), name: O(S) }),\n },\n responses: jsonApiResponses(Type.Object({ worktree: RecordSchema }), 201),\n },\n {\n id: 'git.close',\n scope,\n basePath: 'git',\n path: '/worktrees/{id}',\n method: 'DELETE',\n authentication: 'owner',\n description: 'Close a worktree.',\n parameters: [...query, { name: 'force', in: 'query', required: false, schema: B }],\n responses: jsonApiResponses(Type.Object({ worktree: RecordSchema })),\n },\n // The new-session dialog's routes exist only on a workspace mount.\n ...(scope === 'workspace'\n ? [\n {\n id: 'git.branches',\n scope,\n basePath: 'git',\n path: '/branches',\n method: 'GET' as const,\n authentication: 'owner' as const,\n description: 'List the workspace branches for the new-session dialog.',\n responses: jsonApiResponses(\n Type.Object({\n repository: B,\n current: O(S),\n defaultBase: O(S),\n local: Type.Array(Type.Object({ name: S, checkedOutAt: O(S) })),\n remote: Type.Array(Type.Object({ remote: S, name: S })),\n }),\n ),\n },\n {\n id: 'git.sessions.create',\n scope,\n basePath: 'git',\n path: '/sessions',\n method: 'POST' as const,\n authentication: 'owner' as const,\n description: 'Start a top-level worktree session on an existing or new branch.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Union([\n Type.Object({ mode: Type.Literal('existing-branch'), branch: S, remote: O(S), name: O(S) }),\n Type.Object({ mode: Type.Literal('new-branch'), branch: S, baseRef: O(S), name: O(S) }),\n ]),\n },\n responses: jsonApiResponses(Type.Object({ sessionId: S, worktreeId: S }), 201),\n },\n ]\n : []),\n ]),\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'git.channel',\n scope,\n service: 'doompi.hub.v1',\n member: 'git_worktrees',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Worktree channel payload.',\n input: WorktreesPayloadSchema,\n },\n {\n id: 'git.command',\n scope,\n service: 'doompi.hub.v1',\n member: 'git_worktrees',\n kind: 'channel',\n direction: 'client-to-server',\n description: 'Worktree channel command payload.',\n input: WorktreesCommandSchema,\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":"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"}
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_gitDependencies = require("../gitDependencies-DKJr5kLQ.cjs");
6
- const require_runWorktree = require("../runWorktree-B6ikYRrG.cjs");
5
+ const require_gitDependencies = require("../gitDependencies-CWsygnLQ.cjs");
6
+ const require_runWorktree = require("../runWorktree-D0bsyYc0.cjs");
7
7
  let _agimon_ai_doompi_core_piExtension = require("@agimon-ai/doompi-core/piExtension");
8
8
  let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
9
9
  //#region src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts
@@ -12,14 +12,10 @@ const root = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)((context) => (
12
12
  //#region src/extensions/workspaces/sessions/(backend)/root.cli.ts
13
13
  var root_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)(root);
14
14
  //#endregion
15
- //#region src/constants/git.ts
16
- const COMMAND_NAME = "doom-git";
17
- const COMMAND_DESCRIPTION = "Show git worktrees owned by this session";
18
- //#endregion
19
15
  //#region src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.ts
20
16
  function createGitCommand(service) {
21
- return [COMMAND_NAME, {
22
- description: COMMAND_DESCRIPTION,
17
+ return [require_runWorktree.COMMAND_NAME, {
18
+ description: require_runWorktree.COMMAND_DESCRIPTION,
23
19
  handler: async (_args, ctx) => {
24
20
  const result = await service.execute();
25
21
  if (ctx.hasUI) ctx.ui.notify(result.message, result.level);
@@ -1 +1 @@
1
- {"version":3,"file":"pi.cjs","names":["defineRoot","createGitDependencies","defineRoot","contribution","defineCliCommand","contribution","defineResource","defineCliTool","definePiTool","RUN_WORKTREE_TOOL_NAME","RUN_WORKTREE_DESCRIPTION","RunWorktreeToolSchema","validateParams","executeRunWorktreeTool","defineCliTool","contribution","definePiExtension","rootSession","composeRootHooks","commandGit","resourceDoompiUseGit","piToolContributions","toolRunWorktree"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/constants/git.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/doompi-use-git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/runWorktree.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli.ts","../../generated/pi.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createGitDependencies } from '../../../../../services/gitDependencies';\nimport type { GitExtensionDependencies } from '../../../../../types/extension';\n\nconst root = defineRoot((context: PiPluginContext<Partial<GitExtensionDependencies>>) => ({\n value: createGitDependencies(context.options),\n}));\n\nexport type GitPiScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.cli';\n\nexport default defineRoot(contribution);\n","export const COMMAND_NAME = 'doom-git';\nexport const COMMAND_DESCRIPTION = 'Show git worktrees owned by this session';\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n// @scaffold-generated\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { COMMAND_NAME, COMMAND_DESCRIPTION } from '../../../../../../constants/git';\nimport type { GitExtensionDependencies, GitExtensionService } from '../../../../../../types/extension';\nimport type { GitPiScope } from '../../_lib/root.cli';\n\nexport function createGitCommand(\n service: GitExtensionService,\n): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]] {\n return [\n COMMAND_NAME,\n {\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}\n\nexport default (context: WithRoot<PiPluginContext<Partial<GitExtensionDependencies>>, GitPiScope>) =>\n createGitCommand(context.root.service);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/git.cli';\n\nexport default defineCliCommand(contribution);\n","export function createDoompiUseGitResource(moduleUrl: string) {\n return {\n source: '@agimon-ai/doompi-git',\n moduleUrl,\n skills: [\n {\n name: 'doompi-use-git',\n description:\n 'Use @agimon-ai/doompi-git: Git worktree sessions for DoomPi: spawn an isolated worktree with its own session and manage it from the parent',\n },\n ],\n };\n}\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createDoompiUseGitResource } from './_lib/doompi-use-git.cli';\n\nexport default defineResource(createDoompiUseGitResource(import.meta.url));\n","import { defineCliTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport { definePiTool, type PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\n\nimport { RunWorktreeToolSchema, type RunWorktreeToolParams } from '../../../../../../schemas/runWorktreeTool';\nimport {\n executeRunWorktreeTool,\n RUN_WORKTREE_DESCRIPTION,\n RUN_WORKTREE_TOOL_NAME,\n validateParams,\n type RunWorktreeToolDetails,\n} from '../../../../../../services/runWorktree';\nimport type { WorktreeOperations } from '../../../../../../services/worktreeOperations';\nimport type { GitExtensionDependencies } from '../../../../../../types/extension';\nimport type { GitPiScope } from '../../_lib/root.cli';\n\nexport default defineCliTool((context: WithRoot<PiPluginContext<Partial<GitExtensionDependencies>>, GitPiScope>) =>\n definePiTool(createRunWorktreeTool(context.root.operations)),\n);\n\nexport { RUN_WORKTREE_TOOL_NAME, validateParams };\nexport type { RunWorktreeToolDetails };\n\n/** Creates the typed Pi worktree tool declaration. */\nexport function createRunWorktreeTool(\n operations: WorktreeOperations,\n): ToolDefinition<typeof RunWorktreeToolSchema, RunWorktreeToolDetails> {\n const tool: ToolDefinition<typeof RunWorktreeToolSchema, RunWorktreeToolDetails> = {\n name: RUN_WORKTREE_TOOL_NAME,\n label: 'Worktree',\n description: RUN_WORKTREE_DESCRIPTION,\n parameters: RunWorktreeToolSchema,\n prepareArguments: validateParams,\n // The signal and the progress callback are the host's two answers to a\n // call that takes minutes. Dropping them is what let an interrupted spawn\n // run on with nobody waiting for it, and left the caller staring at\n // nothing while it did.\n execute: async (_id, rawParams, signal, onUpdate, ctx) => {\n const params = validateParams(rawParams) as RunWorktreeToolParams;\n return (await executeRunWorktreeTool(\n params,\n operations,\n {\n cwd: ctx.cwd,\n sessionId: ctx.sessionManager.getSessionId(),\n },\n {\n ...(signal === undefined ? {} : { signal }),\n onProgress: (label) =>\n onUpdate?.({ content: [{ type: 'text', text: label }], details: { action: params.action } }),\n },\n )) as AgentToolResult<RunWorktreeToolDetails>;\n },\n };\n return tool;\n}\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/runWorktree.cli';\n\nexport default defineCliTool(contribution);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandGit from '../src/extensions/workspaces/sessions/(backend)/command/git.cli';\nimport resourceDoompiUseGit from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli';\nimport toolRunWorktree from '../src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandGit> | OptionsOf<typeof resourceDoompiUseGit> | OptionsOf<typeof toolRunWorktree>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-git', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandGit, contextSession)]; },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseGit, contextSession)]; },\n ...piToolContributions('@agimon-ai/doompi-git', [via({ name: 'run_worktree' }, at(toolRunWorktree, contextSession))]),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":";;;;;;;;;AAMA,MAAM,QAAA,GAAOA,qCAAAA,WAAAA,EAAY,aAAiE,EACxF,OAAOC,wBAAAA,sBAAsB,QAAQ,OAAO,EAC9C,EAAE;;;ACJF,IAAA,oBAAA,GAAeC,qCAAAA,WAAAA,CAAWC,IAAY;;;ACJtC,MAAa,eAAe;AAC5B,MAAa,sBAAsB;;;ACQnC,SAAgB,iBACd,SACmE;CACnE,OAAO,CACL,cACA;EACE,aAAa;EACb,SAAS,OAAO,OAAO,QAAQ;GAC7B,MAAM,SAAS,MAAM,QAAQ,QAAQ;GACrC,IAAI,IAAI,OAAO,IAAI,GAAG,OAAO,OAAO,SAAS,OAAO,KAAK;EAC3D;CACF,CACF;AACF;AAEA,IAAA,qBAAgB,YACd,iBAAiB,QAAQ,KAAK,OAAO;;;ACrBvC,IAAA,mBAAA,GAAeC,qCAAAA,iBAAAA,CAAiBC,iBAAY;;;ACJ5C,SAAgB,2BAA2B,WAAmB;CAC5D,OAAO;EACL,QAAQ;EACR;EACA,QAAQ,CACN;GACE,MAAM;GACN,aACE;EACJ,CACF;CACF;AACF;;;ACRA,IAAA,8BAAA,GAAeC,qCAAAA,eAAAA,CAAe,2BAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,IAA0C,CAAC;;;ACazE,IAAA,6BAAA,GAAeC,qCAAAA,cAAAA,EAAe,aAAA,GAC5BC,mCAAAA,aAAAA,CAAa,sBAAsB,QAAQ,KAAK,UAAU,CAAC,CAC7D;;AAMA,SAAgB,sBACd,YACsE;CA4BtE,OAAO;EA1BL,MAAMC,oBAAAA;EACN,OAAO;EACP,aAAaC,oBAAAA;EACb,YAAYC,oBAAAA;EACZ,kBAAkBC,oBAAAA;EAKlB,SAAS,OAAO,KAAK,WAAW,QAAQ,UAAU,QAAQ;GACxD,MAAM,SAASA,oBAAAA,eAAe,SAAS;GACvC,OAAQ,MAAMC,oBAAAA,uBACZ,QACA,YACA;IACE,KAAK,IAAI;IACT,WAAW,IAAI,eAAe,aAAa;GAC7C,GACA;IACE,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;IACzC,aAAa,UACX,WAAW;KAAE,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM;KAAM,CAAC;KAAG,SAAS,EAAE,QAAQ,OAAO,OAAO;IAAE,CAAC;GAC/F,CACF;EACF;CAEQ;AACZ;;;ACpDA,IAAA,2BAAA,GAAeC,qCAAAA,cAAAA,CAAcC,yBAAY;;;ACYzC,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,aAAA,GAAYC,mCAAAA,kBAAAA,CAAoC,yBAAyB,OAAO,YAAY;CACvG,MAAM,eAAe,MAAMC,iBAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,IAAA,GAAGC,qCAAAA,iBAAAA,CAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,iBAAY,cAAc,CAAC;EAAG;EAC7F,IAAI,YAAgD;GAAE,OAAO,CAAC,GAAGC,4BAAsB,cAAc,CAAC;EAAG;EACzG,IAAA,GAAGC,mCAAAA,oBAAAA,CAAoB,yBAAyB,CAAC,IAAI,EAAE,MAAM,eAAe,GAAG,GAAGC,yBAAiB,cAAc,CAAC,CAAC,CAAC;EACpH,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
1
+ {"version":3,"file":"pi.cjs","names":["defineRoot","createGitDependencies","defineRoot","contribution","COMMAND_NAME","COMMAND_DESCRIPTION","defineCliCommand","contribution","defineResource","defineCliTool","definePiTool","RUN_WORKTREE_TOOL_NAME","RUN_WORKTREE_DESCRIPTION","RunWorktreeToolSchema","validateParams","executeRunWorktreeTool","defineCliTool","contribution","definePiExtension","rootSession","composeRootHooks","commandGit","resourceDoompiUseGit","piToolContributions","toolRunWorktree"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/doompi-use-git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/runWorktree.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli.ts","../../generated/pi.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createGitDependencies } from '../../../../../services/gitDependencies';\nimport type { GitExtensionDependencies } from '../../../../../types/extension';\n\nconst root = defineRoot((context: PiPluginContext<Partial<GitExtensionDependencies>>) => ({\n value: createGitDependencies(context.options),\n}));\n\nexport type GitPiScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.cli';\n\nexport default defineRoot(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n// @scaffold-generated\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { COMMAND_NAME, COMMAND_DESCRIPTION } from '../../../../../../constants/git';\nimport type { GitExtensionDependencies, GitExtensionService } from '../../../../../../types/extension';\nimport type { GitPiScope } from '../../_lib/root.cli';\n\nexport function createGitCommand(\n service: GitExtensionService,\n): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]] {\n return [\n COMMAND_NAME,\n {\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}\n\nexport default (context: WithRoot<PiPluginContext<Partial<GitExtensionDependencies>>, GitPiScope>) =>\n createGitCommand(context.root.service);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/git.cli';\n\nexport default defineCliCommand(contribution);\n","export function createDoompiUseGitResource(moduleUrl: string) {\n return {\n source: '@agimon-ai/doompi-git',\n moduleUrl,\n skills: [\n {\n name: 'doompi-use-git',\n description:\n 'Use @agimon-ai/doompi-git: Git worktree sessions for DoomPi: spawn an isolated worktree with its own session and manage it from the parent',\n },\n ],\n };\n}\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createDoompiUseGitResource } from './_lib/doompi-use-git.cli';\n\nexport default defineResource(createDoompiUseGitResource(import.meta.url));\n","import { defineCliTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport { definePiTool, type PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\n\nimport { RunWorktreeToolSchema, type RunWorktreeToolParams } from '../../../../../../schemas/runWorktreeTool';\nimport {\n executeRunWorktreeTool,\n RUN_WORKTREE_DESCRIPTION,\n RUN_WORKTREE_TOOL_NAME,\n validateParams,\n type RunWorktreeToolDetails,\n} from '../../../../../../services/runWorktree';\nimport type { WorktreeOperations } from '../../../../../../services/worktreeOperations';\nimport type { GitExtensionDependencies } from '../../../../../../types/extension';\nimport type { GitPiScope } from '../../_lib/root.cli';\n\nexport default defineCliTool((context: WithRoot<PiPluginContext<Partial<GitExtensionDependencies>>, GitPiScope>) =>\n definePiTool(createRunWorktreeTool(context.root.operations)),\n);\n\nexport { RUN_WORKTREE_TOOL_NAME, validateParams };\nexport type { RunWorktreeToolDetails };\n\n/** Creates the typed Pi worktree tool declaration. */\nexport function createRunWorktreeTool(\n operations: WorktreeOperations,\n): ToolDefinition<typeof RunWorktreeToolSchema, RunWorktreeToolDetails> {\n const tool: ToolDefinition<typeof RunWorktreeToolSchema, RunWorktreeToolDetails> = {\n name: RUN_WORKTREE_TOOL_NAME,\n label: 'Worktree',\n description: RUN_WORKTREE_DESCRIPTION,\n parameters: RunWorktreeToolSchema,\n prepareArguments: validateParams,\n // The signal and the progress callback are the host's two answers to a\n // call that takes minutes. Dropping them is what let an interrupted spawn\n // run on with nobody waiting for it, and left the caller staring at\n // nothing while it did.\n execute: async (_id, rawParams, signal, onUpdate, ctx) => {\n const params = validateParams(rawParams) as RunWorktreeToolParams;\n return (await executeRunWorktreeTool(\n params,\n operations,\n {\n cwd: ctx.cwd,\n sessionId: ctx.sessionManager.getSessionId(),\n },\n {\n ...(signal === undefined ? {} : { signal }),\n onProgress: (label) =>\n onUpdate?.({ content: [{ type: 'text', text: label }], details: { action: params.action } }),\n },\n )) as AgentToolResult<RunWorktreeToolDetails>;\n },\n };\n return tool;\n}\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/runWorktree.cli';\n\nexport default defineCliTool(contribution);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandGit from '../src/extensions/workspaces/sessions/(backend)/command/git.cli';\nimport resourceDoompiUseGit from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli';\nimport toolRunWorktree from '../src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandGit> | OptionsOf<typeof resourceDoompiUseGit> | OptionsOf<typeof toolRunWorktree>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-git', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandGit, contextSession)]; },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseGit, contextSession)]; },\n ...piToolContributions('@agimon-ai/doompi-git', [via({ name: 'run_worktree' }, at(toolRunWorktree, contextSession))]),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":";;;;;;;;;AAMA,MAAM,QAAA,GAAOA,qCAAAA,WAAAA,EAAY,aAAiE,EACxF,OAAOC,wBAAAA,sBAAsB,QAAQ,OAAO,EAC9C,EAAE;;;ACJF,IAAA,oBAAA,GAAeC,qCAAAA,WAAAA,CAAWC,IAAY;;;ACKtC,SAAgB,iBACd,SACmE;CACnE,OAAO,CACLC,oBAAAA,cACA;EACE,aAAaC,oBAAAA;EACb,SAAS,OAAO,OAAO,QAAQ;GAC7B,MAAM,SAAS,MAAM,QAAQ,QAAQ;GACrC,IAAI,IAAI,OAAO,IAAI,GAAG,OAAO,OAAO,SAAS,OAAO,KAAK;EAC3D;CACF,CACF;AACF;AAEA,IAAA,qBAAgB,YACd,iBAAiB,QAAQ,KAAK,OAAO;;;ACrBvC,IAAA,mBAAA,GAAeC,qCAAAA,iBAAAA,CAAiBC,iBAAY;;;ACJ5C,SAAgB,2BAA2B,WAAmB;CAC5D,OAAO;EACL,QAAQ;EACR;EACA,QAAQ,CACN;GACE,MAAM;GACN,aACE;EACJ,CACF;CACF;AACF;;;ACRA,IAAA,8BAAA,GAAeC,qCAAAA,eAAAA,CAAe,2BAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,IAA0C,CAAC;;;ACazE,IAAA,6BAAA,GAAeC,qCAAAA,cAAAA,EAAe,aAAA,GAC5BC,mCAAAA,aAAAA,CAAa,sBAAsB,QAAQ,KAAK,UAAU,CAAC,CAC7D;;AAMA,SAAgB,sBACd,YACsE;CA4BtE,OAAO;EA1BL,MAAMC,oBAAAA;EACN,OAAO;EACP,aAAaC,oBAAAA;EACb,YAAYC,oBAAAA;EACZ,kBAAkBC,oBAAAA;EAKlB,SAAS,OAAO,KAAK,WAAW,QAAQ,UAAU,QAAQ;GACxD,MAAM,SAASA,oBAAAA,eAAe,SAAS;GACvC,OAAQ,MAAMC,oBAAAA,uBACZ,QACA,YACA;IACE,KAAK,IAAI;IACT,WAAW,IAAI,eAAe,aAAa;GAC7C,GACA;IACE,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;IACzC,aAAa,UACX,WAAW;KAAE,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM;KAAM,CAAC;KAAG,SAAS,EAAE,QAAQ,OAAO,OAAO;IAAE,CAAC;GAC/F,CACF;EACF;CAEQ;AACZ;;;ACpDA,IAAA,2BAAA,GAAeC,qCAAAA,cAAAA,CAAcC,yBAAY;;;ACYzC,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,aAAA,GAAYC,mCAAAA,kBAAAA,CAAoC,yBAAyB,OAAO,YAAY;CACvG,MAAM,eAAe,MAAMC,iBAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,IAAA,GAAGC,qCAAAA,iBAAAA,CAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,iBAAY,cAAc,CAAC;EAAG;EAC7F,IAAI,YAAgD;GAAE,OAAO,CAAC,GAAGC,4BAAsB,cAAc,CAAC;EAAG;EACzG,IAAA,GAAGC,mCAAAA,oBAAAA,CAAoB,yBAAyB,CAAC,IAAI,EAAE,MAAM,eAAe,GAAG,GAAGC,yBAAiB,cAAc,CAAC,CAAC,CAAC;EACpH,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
@@ -1,4 +1,4 @@
1
- import { r as GitExtensionDependencies } from "../index-BQq2vblZ.mjs";
1
+ import { r as GitExtensionDependencies } from "../index-D79MSCee.mjs";
2
2
  //#region generated/pi.d.ts
3
3
  export declare const extension: import("@agimon-ai/doompi-core/runtimePiExtension").DefinedPiExtension<Partial<GitExtensionDependencies>>;
4
4
  //#endregion
@@ -1,5 +1,5 @@
1
- import { t as createGitDependencies } from "../gitDependencies-D-EUEIkE.mjs";
2
- import { a as RunWorktreeToolSchema, i as validateParams, n as RUN_WORKTREE_TOOL_NAME, r as executeRunWorktreeTool, t as RUN_WORKTREE_DESCRIPTION } from "../runWorktree-BL99h9oH.mjs";
1
+ import { t as createGitDependencies } from "../gitDependencies-CJFmhrG1.mjs";
2
+ import { a as RunWorktreeToolSchema, i as validateParams, n as RUN_WORKTREE_TOOL_NAME, o as COMMAND_DESCRIPTION, r as executeRunWorktreeTool, s as COMMAND_NAME, t as RUN_WORKTREE_DESCRIPTION } from "../runWorktree-BdK3oRtX.mjs";
3
3
  import { definePiExtension, definePiTool, piToolContributions } from "@agimon-ai/doompi-core/piExtension";
4
4
  import { composeRootHooks, defineCliCommand, defineCliTool, defineResource, defineRoot } from "@agimon-ai/doompi-core/extensionFile";
5
5
  //#region src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts
@@ -8,10 +8,6 @@ const root = defineRoot((context) => ({ value: createGitDependencies(context.opt
8
8
  //#region src/extensions/workspaces/sessions/(backend)/root.cli.ts
9
9
  var root_cli_default = defineRoot(root);
10
10
  //#endregion
11
- //#region src/constants/git.ts
12
- const COMMAND_NAME = "doom-git";
13
- const COMMAND_DESCRIPTION = "Show git worktrees owned by this session";
14
- //#endregion
15
11
  //#region src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.ts
16
12
  function createGitCommand(service) {
17
13
  return [COMMAND_NAME, {
@@ -1 +1 @@
1
- {"version":3,"file":"pi.mjs","names":["contribution","contribution","contribution","rootSession","commandGit","resourceDoompiUseGit","toolRunWorktree"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/constants/git.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/doompi-use-git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/runWorktree.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli.ts","../../generated/pi.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createGitDependencies } from '../../../../../services/gitDependencies';\nimport type { GitExtensionDependencies } from '../../../../../types/extension';\n\nconst root = defineRoot((context: PiPluginContext<Partial<GitExtensionDependencies>>) => ({\n value: createGitDependencies(context.options),\n}));\n\nexport type GitPiScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.cli';\n\nexport default defineRoot(contribution);\n","export const COMMAND_NAME = 'doom-git';\nexport const COMMAND_DESCRIPTION = 'Show git worktrees owned by this session';\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n// @scaffold-generated\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { COMMAND_NAME, COMMAND_DESCRIPTION } from '../../../../../../constants/git';\nimport type { GitExtensionDependencies, GitExtensionService } from '../../../../../../types/extension';\nimport type { GitPiScope } from '../../_lib/root.cli';\n\nexport function createGitCommand(\n service: GitExtensionService,\n): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]] {\n return [\n COMMAND_NAME,\n {\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}\n\nexport default (context: WithRoot<PiPluginContext<Partial<GitExtensionDependencies>>, GitPiScope>) =>\n createGitCommand(context.root.service);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/git.cli';\n\nexport default defineCliCommand(contribution);\n","export function createDoompiUseGitResource(moduleUrl: string) {\n return {\n source: '@agimon-ai/doompi-git',\n moduleUrl,\n skills: [\n {\n name: 'doompi-use-git',\n description:\n 'Use @agimon-ai/doompi-git: Git worktree sessions for DoomPi: spawn an isolated worktree with its own session and manage it from the parent',\n },\n ],\n };\n}\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createDoompiUseGitResource } from './_lib/doompi-use-git.cli';\n\nexport default defineResource(createDoompiUseGitResource(import.meta.url));\n","import { defineCliTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport { definePiTool, type PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\n\nimport { RunWorktreeToolSchema, type RunWorktreeToolParams } from '../../../../../../schemas/runWorktreeTool';\nimport {\n executeRunWorktreeTool,\n RUN_WORKTREE_DESCRIPTION,\n RUN_WORKTREE_TOOL_NAME,\n validateParams,\n type RunWorktreeToolDetails,\n} from '../../../../../../services/runWorktree';\nimport type { WorktreeOperations } from '../../../../../../services/worktreeOperations';\nimport type { GitExtensionDependencies } from '../../../../../../types/extension';\nimport type { GitPiScope } from '../../_lib/root.cli';\n\nexport default defineCliTool((context: WithRoot<PiPluginContext<Partial<GitExtensionDependencies>>, GitPiScope>) =>\n definePiTool(createRunWorktreeTool(context.root.operations)),\n);\n\nexport { RUN_WORKTREE_TOOL_NAME, validateParams };\nexport type { RunWorktreeToolDetails };\n\n/** Creates the typed Pi worktree tool declaration. */\nexport function createRunWorktreeTool(\n operations: WorktreeOperations,\n): ToolDefinition<typeof RunWorktreeToolSchema, RunWorktreeToolDetails> {\n const tool: ToolDefinition<typeof RunWorktreeToolSchema, RunWorktreeToolDetails> = {\n name: RUN_WORKTREE_TOOL_NAME,\n label: 'Worktree',\n description: RUN_WORKTREE_DESCRIPTION,\n parameters: RunWorktreeToolSchema,\n prepareArguments: validateParams,\n // The signal and the progress callback are the host's two answers to a\n // call that takes minutes. Dropping them is what let an interrupted spawn\n // run on with nobody waiting for it, and left the caller staring at\n // nothing while it did.\n execute: async (_id, rawParams, signal, onUpdate, ctx) => {\n const params = validateParams(rawParams) as RunWorktreeToolParams;\n return (await executeRunWorktreeTool(\n params,\n operations,\n {\n cwd: ctx.cwd,\n sessionId: ctx.sessionManager.getSessionId(),\n },\n {\n ...(signal === undefined ? {} : { signal }),\n onProgress: (label) =>\n onUpdate?.({ content: [{ type: 'text', text: label }], details: { action: params.action } }),\n },\n )) as AgentToolResult<RunWorktreeToolDetails>;\n },\n };\n return tool;\n}\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/runWorktree.cli';\n\nexport default defineCliTool(contribution);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandGit from '../src/extensions/workspaces/sessions/(backend)/command/git.cli';\nimport resourceDoompiUseGit from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli';\nimport toolRunWorktree from '../src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandGit> | OptionsOf<typeof resourceDoompiUseGit> | OptionsOf<typeof toolRunWorktree>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-git', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandGit, contextSession)]; },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseGit, contextSession)]; },\n ...piToolContributions('@agimon-ai/doompi-git', [via({ name: 'run_worktree' }, at(toolRunWorktree, contextSession))]),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":";;;;;AAMA,MAAM,OAAO,YAAY,aAAiE,EACxF,OAAO,sBAAsB,QAAQ,OAAO,EAC9C,EAAE;;;ACJF,IAAA,mBAAe,WAAWA,IAAY;;;ACJtC,MAAa,eAAe;AAC5B,MAAa,sBAAsB;;;ACQnC,SAAgB,iBACd,SACmE;CACnE,OAAO,CACL,cACA;EACE,aAAa;EACb,SAAS,OAAO,OAAO,QAAQ;GAC7B,MAAM,SAAS,MAAM,QAAQ,QAAQ;GACrC,IAAI,IAAI,OAAO,IAAI,GAAG,OAAO,OAAO,SAAS,OAAO,KAAK;EAC3D;CACF,CACF;AACF;AAEA,IAAA,qBAAgB,YACd,iBAAiB,QAAQ,KAAK,OAAO;;;ACrBvC,IAAA,kBAAe,iBAAiBC,iBAAY;;;ACJ5C,SAAgB,2BAA2B,WAAmB;CAC5D,OAAO;EACL,QAAQ;EACR;EACA,QAAQ,CACN;GACE,MAAM;GACN,aACE;EACJ,CACF;CACF;AACF;;;ACRA,IAAA,6BAAe,eAAe,2BAA2B,YAAY,GAAG,CAAC;;;ACazE,IAAA,4BAAe,eAAe,YAC5B,aAAa,sBAAsB,QAAQ,KAAK,UAAU,CAAC,CAC7D;;AAMA,SAAgB,sBACd,YACsE;CA4BtE,OAAO;EA1BL,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY;EACZ,kBAAkB;EAKlB,SAAS,OAAO,KAAK,WAAW,QAAQ,UAAU,QAAQ;GACxD,MAAM,SAAS,eAAe,SAAS;GACvC,OAAQ,MAAM,uBACZ,QACA,YACA;IACE,KAAK,IAAI;IACT,WAAW,IAAI,eAAe,aAAa;GAC7C,GACA;IACE,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;IACzC,aAAa,UACX,WAAW;KAAE,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM;KAAM,CAAC;KAAG,SAAS,EAAE,QAAQ,OAAO,OAAO;IAAE,CAAC;GAC/F,CACF;EACF;CAEQ;AACZ;;;ACpDA,IAAA,0BAAe,cAAcC,yBAAY;;;ACYzC,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,YAAY,kBAAoC,yBAAyB,OAAO,YAAY;CACvG,MAAM,eAAe,MAAMC,iBAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,GAAG,iBAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,iBAAY,cAAc,CAAC;EAAG;EAC7F,IAAI,YAAgD;GAAE,OAAO,CAAC,GAAGC,4BAAsB,cAAc,CAAC;EAAG;EACzG,GAAG,oBAAoB,yBAAyB,CAAC,IAAI,EAAE,MAAM,eAAe,GAAG,GAAGC,yBAAiB,cAAc,CAAC,CAAC,CAAC;EACpH,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
1
+ {"version":3,"file":"pi.mjs","names":["contribution","contribution","contribution","rootSession","commandGit","resourceDoompiUseGit","toolRunWorktree"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/doompi-use-git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/_lib/runWorktree.cli.ts","../../src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli.ts","../../generated/pi.ts"],"sourcesContent":["import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createGitDependencies } from '../../../../../services/gitDependencies';\nimport type { GitExtensionDependencies } from '../../../../../types/extension';\n\nconst root = defineRoot((context: PiPluginContext<Partial<GitExtensionDependencies>>) => ({\n value: createGitDependencies(context.options),\n}));\n\nexport type GitPiScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.cli';\n\nexport default defineRoot(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n// @scaffold-generated\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { COMMAND_NAME, COMMAND_DESCRIPTION } from '../../../../../../constants/git';\nimport type { GitExtensionDependencies, GitExtensionService } from '../../../../../../types/extension';\nimport type { GitPiScope } from '../../_lib/root.cli';\n\nexport function createGitCommand(\n service: GitExtensionService,\n): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]] {\n return [\n COMMAND_NAME,\n {\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}\n\nexport default (context: WithRoot<PiPluginContext<Partial<GitExtensionDependencies>>, GitPiScope>) =>\n createGitCommand(context.root.service);\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/git.cli';\n\nexport default defineCliCommand(contribution);\n","export function createDoompiUseGitResource(moduleUrl: string) {\n return {\n source: '@agimon-ai/doompi-git',\n moduleUrl,\n skills: [\n {\n name: 'doompi-use-git',\n description:\n 'Use @agimon-ai/doompi-git: Git worktree sessions for DoomPi: spawn an isolated worktree with its own session and manage it from the parent',\n },\n ],\n };\n}\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createDoompiUseGitResource } from './_lib/doompi-use-git.cli';\n\nexport default defineResource(createDoompiUseGitResource(import.meta.url));\n","import { defineCliTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport { definePiTool, type PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { ToolDefinition } from '@earendil-works/pi-coding-agent';\n\nimport { RunWorktreeToolSchema, type RunWorktreeToolParams } from '../../../../../../schemas/runWorktreeTool';\nimport {\n executeRunWorktreeTool,\n RUN_WORKTREE_DESCRIPTION,\n RUN_WORKTREE_TOOL_NAME,\n validateParams,\n type RunWorktreeToolDetails,\n} from '../../../../../../services/runWorktree';\nimport type { WorktreeOperations } from '../../../../../../services/worktreeOperations';\nimport type { GitExtensionDependencies } from '../../../../../../types/extension';\nimport type { GitPiScope } from '../../_lib/root.cli';\n\nexport default defineCliTool((context: WithRoot<PiPluginContext<Partial<GitExtensionDependencies>>, GitPiScope>) =>\n definePiTool(createRunWorktreeTool(context.root.operations)),\n);\n\nexport { RUN_WORKTREE_TOOL_NAME, validateParams };\nexport type { RunWorktreeToolDetails };\n\n/** Creates the typed Pi worktree tool declaration. */\nexport function createRunWorktreeTool(\n operations: WorktreeOperations,\n): ToolDefinition<typeof RunWorktreeToolSchema, RunWorktreeToolDetails> {\n const tool: ToolDefinition<typeof RunWorktreeToolSchema, RunWorktreeToolDetails> = {\n name: RUN_WORKTREE_TOOL_NAME,\n label: 'Worktree',\n description: RUN_WORKTREE_DESCRIPTION,\n parameters: RunWorktreeToolSchema,\n prepareArguments: validateParams,\n // The signal and the progress callback are the host's two answers to a\n // call that takes minutes. Dropping them is what let an interrupted spawn\n // run on with nobody waiting for it, and left the caller staring at\n // nothing while it did.\n execute: async (_id, rawParams, signal, onUpdate, ctx) => {\n const params = validateParams(rawParams) as RunWorktreeToolParams;\n return (await executeRunWorktreeTool(\n params,\n operations,\n {\n cwd: ctx.cwd,\n sessionId: ctx.sessionManager.getSessionId(),\n },\n {\n ...(signal === undefined ? {} : { signal }),\n onProgress: (label) =>\n onUpdate?.({ content: [{ type: 'text', text: label }], details: { action: params.action } }),\n },\n )) as AgentToolResult<RunWorktreeToolDetails>;\n },\n };\n return tool;\n}\n","import { defineCliTool } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/runWorktree.cli';\n\nexport default defineCliTool(contribution);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, piToolContributions, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandGit from '../src/extensions/workspaces/sessions/(backend)/command/git.cli';\nimport resourceDoompiUseGit from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli';\nimport toolRunWorktree from '../src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandGit> | OptionsOf<typeof resourceDoompiUseGit> | OptionsOf<typeof toolRunWorktree>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-git', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandGit, contextSession)]; },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseGit, contextSession)]; },\n ...piToolContributions('@agimon-ai/doompi-git', [via({ name: 'run_worktree' }, at(toolRunWorktree, contextSession))]),\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":";;;;;AAMA,MAAM,OAAO,YAAY,aAAiE,EACxF,OAAO,sBAAsB,QAAQ,OAAO,EAC9C,EAAE;;;ACJF,IAAA,mBAAe,WAAWA,IAAY;;;ACKtC,SAAgB,iBACd,SACmE;CACnE,OAAO,CACL,cACA;EACE,aAAa;EACb,SAAS,OAAO,OAAO,QAAQ;GAC7B,MAAM,SAAS,MAAM,QAAQ,QAAQ;GACrC,IAAI,IAAI,OAAO,IAAI,GAAG,OAAO,OAAO,SAAS,OAAO,KAAK;EAC3D;CACF,CACF;AACF;AAEA,IAAA,qBAAgB,YACd,iBAAiB,QAAQ,KAAK,OAAO;;;ACrBvC,IAAA,kBAAe,iBAAiBC,iBAAY;;;ACJ5C,SAAgB,2BAA2B,WAAmB;CAC5D,OAAO;EACL,QAAQ;EACR;EACA,QAAQ,CACN;GACE,MAAM;GACN,aACE;EACJ,CACF;CACF;AACF;;;ACRA,IAAA,6BAAe,eAAe,2BAA2B,YAAY,GAAG,CAAC;;;ACazE,IAAA,4BAAe,eAAe,YAC5B,aAAa,sBAAsB,QAAQ,KAAK,UAAU,CAAC,CAC7D;;AAMA,SAAgB,sBACd,YACsE;CA4BtE,OAAO;EA1BL,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY;EACZ,kBAAkB;EAKlB,SAAS,OAAO,KAAK,WAAW,QAAQ,UAAU,QAAQ;GACxD,MAAM,SAAS,eAAe,SAAS;GACvC,OAAQ,MAAM,uBACZ,QACA,YACA;IACE,KAAK,IAAI;IACT,WAAW,IAAI,eAAe,aAAa;GAC7C,GACA;IACE,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;IACzC,aAAa,UACX,WAAW;KAAE,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM;KAAM,CAAC;KAAG,SAAS,EAAE,QAAQ,OAAO,OAAO;IAAE,CAAC;GAC/F,CACF;EACF;CAEQ;AACZ;;;ACpDA,IAAA,0BAAe,cAAcC,yBAAY;;;ACYzC,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,YAAY,kBAAoC,yBAAyB,OAAO,YAAY;CACvG,MAAM,eAAe,MAAMC,iBAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,GAAG,iBAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,iBAAY,cAAc,CAAC;EAAG;EAC7F,IAAI,YAAgD;GAAE,OAAO,CAAC,GAAGC,4BAAsB,cAAc,CAAC;EAAG;EACzG,GAAG,oBAAoB,yBAAyB,CAAC,IAAI,EAAE,MAAM,eAAe,GAAG,GAAGC,yBAAiB,cAAc,CAAC,CAAC,CAAC;EACpH,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_worktreeOperations = require("../worktreeOperations-DjO_Y5Yv.cjs");
6
- const require_runWorktree = require("../runWorktree-B6ikYRrG.cjs");
5
+ const require_worktreeOperations = require("../worktreeOperations-FJDk44Zt.cjs");
6
+ const require_runWorktree = require("../runWorktree-D0bsyYc0.cjs");
7
7
  let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
8
8
  let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
9
9
  let _agimon_ai_doompi_session = require("@agimon-ai/doompi-session");
@@ -71,6 +71,50 @@ const root = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)(createGitSessi
71
71
  //#region src/extensions/workspaces/sessions/(backend)/root.server.ts
72
72
  var root_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)(root);
73
73
  //#endregion
74
+ //#region src/services/newSessionRequest/index.ts
75
+ const MAX_NAME_LENGTH = 120;
76
+ /** Trimmed text, undefined when absent or blank, false when not text at all. */
77
+ function optionalText(value) {
78
+ if (value === void 0) return void 0;
79
+ if (typeof value !== "string") return false;
80
+ const trimmed = value.trim();
81
+ return trimmed === "" ? void 0 : trimmed;
82
+ }
83
+ /**
84
+ * Validates a new-session dialog request for a worktree session. Every ref is
85
+ * checked here, before it can reach git as a positional argument.
86
+ */
87
+ function newSessionRequest(body) {
88
+ if (typeof body !== "object" || body === null || Array.isArray(body)) return { error: "A request body is required." };
89
+ const record = body;
90
+ const branch = optionalText(record.branch);
91
+ if (branch === void 0 || branch === false || !require_worktreeOperations.validRefName(branch)) return { error: "A valid branch name is required." };
92
+ const name = optionalText(record.name);
93
+ if (name === false || name !== void 0 && name.length > MAX_NAME_LENGTH) return { error: `The session name must be text of up to ${String(MAX_NAME_LENGTH)} characters.` };
94
+ const named = name === void 0 ? {} : { name };
95
+ if (record.mode === "existing-branch") {
96
+ const remote = optionalText(record.remote);
97
+ if (remote === false || remote !== void 0 && !require_worktreeOperations.validRefName(remote)) return { error: "That remote name is not valid." };
98
+ return {
99
+ mode: "existing-branch",
100
+ branch,
101
+ ...remote === void 0 ? {} : { remote },
102
+ ...named
103
+ };
104
+ }
105
+ if (record.mode === "new-branch") {
106
+ const baseRef = optionalText(record.baseRef);
107
+ if (baseRef === false || baseRef !== void 0 && !require_worktreeOperations.validRefName(baseRef)) return { error: "That base branch is not valid." };
108
+ return {
109
+ mode: "new-branch",
110
+ branch,
111
+ ...baseRef === void 0 ? {} : { baseRef },
112
+ ...named
113
+ };
114
+ }
115
+ return { error: "The mode must be existing-branch or new-branch." };
116
+ }
117
+ //#endregion
74
118
  //#region src/extensions/(backend)/api/_lib/route.server.ts
75
119
  /**
76
120
  * The worktree surface the cockpit panel calls.
@@ -106,10 +150,51 @@ var route_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoute)
106
150
  repositoryRoot
107
151
  });
108
152
  };
153
+ const git = require_worktreeOperations.createWorktreeGit();
109
154
  const operations = require_worktreeOperations.createWorktreeOperations({
110
- git: require_worktreeOperations.createWorktreeGit(),
111
- sessionService: context.sessionService
155
+ git,
156
+ sessionService: context.sessionService,
157
+ ...context.homeDirectory === void 0 ? {} : { homeDir: context.homeDirectory }
112
158
  });
159
+ /**
160
+ * The new-session dialog's routes: the workspace's branches, and a top-level
161
+ * worktree session on one. Workspace-mounted only, and always rooted at the
162
+ * mount's own workspace, so a request can never name another directory.
163
+ */
164
+ const newSession = async (request, url) => {
165
+ const isBranches = request.method === "GET" && url.pathname === "/branches";
166
+ const isCreate = request.method === "POST" && url.pathname === "/sessions";
167
+ if (!isBranches && !isCreate) return void 0;
168
+ const workspaceRoot = context.scope === "workspace" ? context.workspaceRoot : void 0;
169
+ if (workspaceRoot === void 0) return Response.json({ error: "This route belongs to a workspace." }, { status: 404 });
170
+ if (isBranches) {
171
+ const repositoryRoot = await git.repositoryRoot(workspaceRoot);
172
+ const branches = repositoryRoot === void 0 ? {
173
+ repository: false,
174
+ local: [],
175
+ remote: []
176
+ } : {
177
+ repository: true,
178
+ ...await git.listBranches(repositoryRoot)
179
+ };
180
+ return Response.json(branches);
181
+ }
182
+ const parsed = newSessionRequest(await request.json().catch(() => void 0));
183
+ if ("error" in parsed) return badRequest(parsed.error);
184
+ const record = await operations.spawn({ cwd: workspaceRoot }, {
185
+ branch: parsed.branch,
186
+ checkout: parsed.mode === "existing-branch" ? "existing" : "new",
187
+ ...parsed.mode === "existing-branch" && parsed.remote !== void 0 ? { remote: parsed.remote } : {},
188
+ ...parsed.mode === "new-branch" && parsed.baseRef !== void 0 ? { baseRef: parsed.baseRef } : {},
189
+ ...parsed.name === void 0 ? {} : { name: parsed.name }
190
+ });
191
+ publishLifecycle(record.sessionId, record.repositoryRoot);
192
+ const created = {
193
+ sessionId: record.sessionId,
194
+ worktreeId: record.id
195
+ };
196
+ return Response.json(created, { status: 201 });
197
+ };
113
198
  /** The admitted root for a request, or a response explaining why not. */
114
199
  const rootOf = (url) => {
115
200
  const repositoryId = url.searchParams.get("repositoryId");
@@ -121,6 +206,13 @@ var route_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoute)
121
206
  return {
122
207
  async fetch(request) {
123
208
  const url = new URL(request.url);
209
+ try {
210
+ const answered = await newSession(request, url);
211
+ if (answered !== void 0) return answered;
212
+ } catch (error) {
213
+ context.onNotice(`new-session request failed: ${error.name}`);
214
+ return failed(error);
215
+ }
124
216
  const root = rootOf(url);
125
217
  if (root instanceof Response) return root;
126
218
  const callerContext = {
@@ -188,7 +280,8 @@ function payloadOf(state) {
188
280
  function viewsFor(scope, deps) {
189
281
  try {
190
282
  return require_worktreeOperations.createWorktreeRegistry(require_worktreeOperations.registryFile(scope.cwd, deps.homeDir)).list().flatMap((record) => {
191
- const owned = record.parentSessionId === scope.sessionId;
283
+ if (record.parentSessionId === void 0 && record.sessionId !== scope.sessionId) return [];
284
+ const owned = record.parentSessionId === void 0 || record.parentSessionId === scope.sessionId;
192
285
  const unowned = !owned && !deps.sessionService.isLive(record.parentSessionId);
193
286
  if (!owned && !unowned) return [];
194
287
  return [{