@agimon-ai/doompi-file-edit 0.0.1-alpha.32 → 0.0.1-alpha.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../container/index.cjs");let t=require("@agimon-ai/doompi-extension-contracts/child-process"),n=require("@agimon-ai/doompi-extension-contracts/cordis-host"),r=require("@agimon-ai/doompi-extension-contracts/ui-hub"),i=require("@agimon-ai/doompi-telemetry");const a=`file-edits`,o=`@agimon-ai/doompi-file-edit`,s={source:o,bindings:[{id:`editor.files`,path:[{key:`e`,label:`extension`,order:50},{key:`f`,label:`files`,detail:`session edits`}],command:{name:a}}]};function c(n,r){n.effect(function*(){let{paths:n,timeline:s,editTracker:c,workflow:l}=e.createFileEditContainer(),u=(0,i.createDoomTelemetry)({serviceName:`doom-file-edit`,packageName:o,env:process.env,enableLogs:!0,enableTraces:!0}),d=new Map,f=!0,p=0;yield async()=>{f=!1,p+=1,d.clear();try{process.env[t.SUBAGENT_CHILD_ENV]||await s.clear(),await u.recordEvent(`doom_file_edit.timeline_finished`,{outcome:`closed`})}finally{await u.shutdown()}},r.registerCommand(a,{description:`Review files edited in this session`,handler:async(e,t)=>{if(f){if(!t.hasUI){t.ui.notify(`/file-edits requires interactive mode`,`error`);return}await l.open(t)}}}),r.on(`session_start`,(e,t)=>{if(!f)return;p+=1,d.clear();let r=n.sessionKey(t.sessionManager.getSessionId());s.initialize(n.timelinePath(t.cwd,r)),u.recordEvent(`doom_file_edit.timeline_started`,{outcome:`initialized`})}),r.on(`tool_execution_start`,async(e,t)=>{if(!f)return;let n=p;if(d.set(e.toolCallId,Date.now()),await c.start(e.toolCallId,e.toolName,e.args,t.cwd),!f||n!==p){d.delete(e.toolCallId);return}u.recordEvent(`doom_file_edit.edit_started`,{"tool.name":e.toolName})}),r.on(`tool_execution_end`,async e=>{if(!f)return;let t=d.get(e.toolCallId);d.delete(e.toolCallId),await c.end(e.toolCallId,e.isError),f&&u.recordEvent(`doom_file_edit.edit_finished`,{"tool.name":e.toolName,"tool.result.error":e.isError,...t===void 0?{}:{duration_ms:Date.now()-t},outcome:e.isError?`failed`:`completed`})})},`${o}/runtime`)}async function l(e){let t=await(0,n.connectDoomCordisHost)(e,o),r=t.root.plugin(u,{pi:e});try{await r}catch(e){try{await r.dispose()}finally{await t.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await t.dispose()}})())}function u(e,t){c(e,t.pi),e.inject([r.DOOM_UI_HUB_SERVICE],e=>{let t=(0,r.requireDoomUiHub)(e).registerLeader(s);return()=>t.dispose()})}exports.FILE_EDIT_LEADER_CONTRIBUTION=s,exports.fileEditExtension=l,exports.installFileEditRuntime=c;
|
|
1
|
+
const e=require("../../container/index.cjs");let t=require("@agimon-ai/doompi-extension-contracts/child-process"),n=require("@agimon-ai/doompi-extension-contracts/cordis-host"),r=require("@agimon-ai/doompi-extension-contracts/ui-hub"),i=require("@agimon-ai/doompi-telemetry");const a=`file-edits`,o=`@agimon-ai/doompi-file-edit`,s={source:o,bindings:[{id:`editor.files`,path:[{key:`e`,label:`extension`,detail:`tools, skills and config`,order:50},{key:`f`,label:`files`,detail:`session edits`}],command:{name:a}}]};function c(n,r){n.effect(function*(){let{paths:n,timeline:s,editTracker:c,workflow:l}=e.createFileEditContainer(),u=(0,i.createDoomTelemetry)({serviceName:`doom-file-edit`,packageName:o,env:process.env,enableLogs:!0,enableTraces:!0}),d=new Map,f=!0,p=0;yield async()=>{f=!1,p+=1,d.clear();try{process.env[t.SUBAGENT_CHILD_ENV]||await s.clear(),await u.recordEvent(`doom_file_edit.timeline_finished`,{outcome:`closed`})}finally{await u.shutdown()}},r.registerCommand(a,{description:`Review files edited in this session`,handler:async(e,t)=>{if(f){if(!t.hasUI){t.ui.notify(`/file-edits requires interactive mode`,`error`);return}await l.open(t)}}}),r.on(`session_start`,(e,t)=>{if(!f)return;p+=1,d.clear();let r=n.sessionKey(t.sessionManager.getSessionId());s.initialize(n.timelinePath(t.cwd,r)),u.recordEvent(`doom_file_edit.timeline_started`,{outcome:`initialized`})}),r.on(`tool_execution_start`,async(e,t)=>{if(!f)return;let n=p;if(d.set(e.toolCallId,Date.now()),await c.start(e.toolCallId,e.toolName,e.args,t.cwd),!f||n!==p){d.delete(e.toolCallId);return}u.recordEvent(`doom_file_edit.edit_started`,{"tool.name":e.toolName})}),r.on(`tool_execution_end`,async e=>{if(!f)return;let t=d.get(e.toolCallId);d.delete(e.toolCallId),await c.end(e.toolCallId,e.isError),f&&u.recordEvent(`doom_file_edit.edit_finished`,{"tool.name":e.toolName,"tool.result.error":e.isError,...t===void 0?{}:{duration_ms:Date.now()-t},outcome:e.isError?`failed`:`completed`})})},`${o}/runtime`)}async function l(e){let t=await(0,n.connectDoomCordisHost)(e,o),r=t.root.plugin(u,{pi:e});try{await r}catch(e){try{await r.dispose()}finally{await t.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await t.dispose()}})())}function u(e,t){c(e,t.pi),e.inject([r.DOOM_UI_HUB_SERVICE],e=>{let t=(0,r.requireDoomUiHub)(e).registerLeader(s);return()=>t.dispose()})}exports.FILE_EDIT_LEADER_CONTRIBUTION=s,exports.fileEditExtension=l,exports.installFileEditRuntime=c;
|
|
2
2
|
//# sourceMappingURL=extension.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.cjs","names":["createFileEditContainer","createDoomTelemetry","SUBAGENT_CHILD_ENV","connectDoomCordisHost","DOOM_UI_HUB_SERVICE","requireDoomUiHub"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { SUBAGENT_CHILD_ENV } from '@agimon-ai/doompi-extension-contracts/child-process';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport type { LeaderContribution } from '@agimon-ai/doompi-extension-contracts/leader';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createFileEditContainer } from '../../container/index.ts';\n\nconst FILES_COMMAND = 'file-edits';\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-file-edit';\n\nexport const FILE_EDIT_LEADER_CONTRIBUTION = {\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: 'editor.files',\n path: [\n { key: 'e', label: 'extension', order: 50 },\n { key: 'f', label: 'files', detail: 'session edits' },\n ],\n command: { name: FILES_COMMAND },\n },\n ],\n} as const satisfies LeaderContribution;\n\n/** Install File Edit resources into its host-owned Cordis plugin fiber. */\nexport function installFileEditRuntime(cordis: Context, pi: ExtensionAPI): void {\n cordis.effect(function* () {\n const { paths, timeline, editTracker: tracker, workflow } = createFileEditContainer();\n const telemetry: DoomTelemetry = createDoomTelemetry({\n serviceName: 'doom-file-edit',\n packageName: PACKAGE_SOURCE,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const toolStartedAt = new Map<string, number>();\n let active = true;\n let sessionGeneration = 0;\n\n yield async () => {\n active = false;\n sessionGeneration += 1;\n toolStartedAt.clear();\n try {\n if (!process.env[SUBAGENT_CHILD_ENV]) await timeline.clear();\n await telemetry.recordEvent('doom_file_edit.timeline_finished', { outcome: 'closed' });\n } finally {\n await telemetry.shutdown();\n }\n };\n\n pi.registerCommand(FILES_COMMAND, {\n description: 'Review files edited in this session',\n handler: async (_args, ctx) => {\n if (!active) return;\n if (!ctx.hasUI) {\n ctx.ui.notify('/file-edits requires interactive mode', 'error');\n return;\n }\n await workflow.open(ctx);\n },\n });\n\n pi.on('session_start', (_event, ctx) => {\n if (!active) return;\n sessionGeneration += 1;\n toolStartedAt.clear();\n const sessionKey = paths.sessionKey(ctx.sessionManager.getSessionId());\n timeline.initialize(paths.timelinePath(ctx.cwd, sessionKey));\n void telemetry.recordEvent('doom_file_edit.timeline_started', { outcome: 'initialized' });\n });\n pi.on('tool_execution_start', async (event, ctx) => {\n if (!active) return;\n const ownGeneration = sessionGeneration;\n toolStartedAt.set(event.toolCallId, Date.now());\n await tracker.start(event.toolCallId, event.toolName, event.args, ctx.cwd);\n if (!active || ownGeneration !== sessionGeneration) {\n toolStartedAt.delete(event.toolCallId);\n return;\n }\n void telemetry.recordEvent('doom_file_edit.edit_started', { 'tool.name': event.toolName });\n });\n pi.on('tool_execution_end', async (event) => {\n if (!active) return;\n const startedAt = toolStartedAt.get(event.toolCallId);\n toolStartedAt.delete(event.toolCallId);\n await tracker.end(event.toolCallId, event.isError);\n if (!active) return;\n void telemetry.recordEvent('doom_file_edit.edit_finished', {\n 'tool.name': event.toolName,\n 'tool.result.error': event.isError,\n ...(startedAt === undefined ? {} : { duration_ms: Date.now() - startedAt }),\n outcome: event.isError ? 'failed' : 'completed',\n });\n });\n }, `${PACKAGE_SOURCE}/runtime`);\n}\n\n/** The package's single standard Pi factory. */\nexport async function fileEditExtension(pi: ExtensionAPI): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(fileEditPlugin, { pi });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\ninterface FileEditPluginConfig {\n readonly pi: ExtensionAPI;\n}\n\nfunction fileEditPlugin(cordis: Context, config: FileEditPluginConfig): void {\n installFileEditRuntime(cordis, config.pi);\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader(FILE_EDIT_LEADER_CONTRIBUTION);\n return () => contribution.dispose();\n });\n}\n"],"mappings":"oRASA,MAAM,EAAgB,aAChB,EAAiB,8BAEV,EAAgC,CAC3C,OAAQ,EACR,SAAU,CACR,CACE,GAAI,eACJ,KAAM,CACJ,CAAE,IAAK,IAAK,MAAO,YAAa,MAAO,EAAG,
|
|
1
|
+
{"version":3,"file":"extension.cjs","names":["createFileEditContainer","createDoomTelemetry","SUBAGENT_CHILD_ENV","connectDoomCordisHost","DOOM_UI_HUB_SERVICE","requireDoomUiHub"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { SUBAGENT_CHILD_ENV } from '@agimon-ai/doompi-extension-contracts/child-process';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport type { LeaderContribution } from '@agimon-ai/doompi-extension-contracts/leader';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createFileEditContainer } from '../../container/index.ts';\n\nconst FILES_COMMAND = 'file-edits';\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-file-edit';\n\nexport const FILE_EDIT_LEADER_CONTRIBUTION = {\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: 'editor.files',\n path: [\n { key: 'e', label: 'extension', detail: 'tools, skills and config', order: 50 },\n { key: 'f', label: 'files', detail: 'session edits' },\n ],\n command: { name: FILES_COMMAND },\n },\n ],\n} as const satisfies LeaderContribution;\n\n/** Install File Edit resources into its host-owned Cordis plugin fiber. */\nexport function installFileEditRuntime(cordis: Context, pi: ExtensionAPI): void {\n cordis.effect(function* () {\n const { paths, timeline, editTracker: tracker, workflow } = createFileEditContainer();\n const telemetry: DoomTelemetry = createDoomTelemetry({\n serviceName: 'doom-file-edit',\n packageName: PACKAGE_SOURCE,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const toolStartedAt = new Map<string, number>();\n let active = true;\n let sessionGeneration = 0;\n\n yield async () => {\n active = false;\n sessionGeneration += 1;\n toolStartedAt.clear();\n try {\n if (!process.env[SUBAGENT_CHILD_ENV]) await timeline.clear();\n await telemetry.recordEvent('doom_file_edit.timeline_finished', { outcome: 'closed' });\n } finally {\n await telemetry.shutdown();\n }\n };\n\n pi.registerCommand(FILES_COMMAND, {\n description: 'Review files edited in this session',\n handler: async (_args, ctx) => {\n if (!active) return;\n if (!ctx.hasUI) {\n ctx.ui.notify('/file-edits requires interactive mode', 'error');\n return;\n }\n await workflow.open(ctx);\n },\n });\n\n pi.on('session_start', (_event, ctx) => {\n if (!active) return;\n sessionGeneration += 1;\n toolStartedAt.clear();\n const sessionKey = paths.sessionKey(ctx.sessionManager.getSessionId());\n timeline.initialize(paths.timelinePath(ctx.cwd, sessionKey));\n void telemetry.recordEvent('doom_file_edit.timeline_started', { outcome: 'initialized' });\n });\n pi.on('tool_execution_start', async (event, ctx) => {\n if (!active) return;\n const ownGeneration = sessionGeneration;\n toolStartedAt.set(event.toolCallId, Date.now());\n await tracker.start(event.toolCallId, event.toolName, event.args, ctx.cwd);\n if (!active || ownGeneration !== sessionGeneration) {\n toolStartedAt.delete(event.toolCallId);\n return;\n }\n void telemetry.recordEvent('doom_file_edit.edit_started', { 'tool.name': event.toolName });\n });\n pi.on('tool_execution_end', async (event) => {\n if (!active) return;\n const startedAt = toolStartedAt.get(event.toolCallId);\n toolStartedAt.delete(event.toolCallId);\n await tracker.end(event.toolCallId, event.isError);\n if (!active) return;\n void telemetry.recordEvent('doom_file_edit.edit_finished', {\n 'tool.name': event.toolName,\n 'tool.result.error': event.isError,\n ...(startedAt === undefined ? {} : { duration_ms: Date.now() - startedAt }),\n outcome: event.isError ? 'failed' : 'completed',\n });\n });\n }, `${PACKAGE_SOURCE}/runtime`);\n}\n\n/** The package's single standard Pi factory. */\nexport async function fileEditExtension(pi: ExtensionAPI): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(fileEditPlugin, { pi });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\ninterface FileEditPluginConfig {\n readonly pi: ExtensionAPI;\n}\n\nfunction fileEditPlugin(cordis: Context, config: FileEditPluginConfig): void {\n installFileEditRuntime(cordis, config.pi);\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader(FILE_EDIT_LEADER_CONTRIBUTION);\n return () => contribution.dispose();\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createFileEditContainer as e}from"../../container/index.mjs";import{SUBAGENT_CHILD_ENV as t}from"@agimon-ai/doompi-extension-contracts/child-process";import{connectDoomCordisHost as n}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{DOOM_UI_HUB_SERVICE as r,requireDoomUiHub as i}from"@agimon-ai/doompi-extension-contracts/ui-hub";import{createDoomTelemetry as a}from"@agimon-ai/doompi-telemetry";const o=`file-edits`,s=`@agimon-ai/doompi-file-edit`,c={source:s,bindings:[{id:`editor.files`,path:[{key:`e`,label:`extension`,order:50},{key:`f`,label:`files`,detail:`session edits`}],command:{name:o}}]};function l(n,r){n.effect(function*(){let{paths:n,timeline:i,editTracker:c,workflow:l}=e(),u=a({serviceName:`doom-file-edit`,packageName:s,env:process.env,enableLogs:!0,enableTraces:!0}),d=new Map,f=!0,p=0;yield async()=>{f=!1,p+=1,d.clear();try{process.env[t]||await i.clear(),await u.recordEvent(`doom_file_edit.timeline_finished`,{outcome:`closed`})}finally{await u.shutdown()}},r.registerCommand(o,{description:`Review files edited in this session`,handler:async(e,t)=>{if(f){if(!t.hasUI){t.ui.notify(`/file-edits requires interactive mode`,`error`);return}await l.open(t)}}}),r.on(`session_start`,(e,t)=>{if(!f)return;p+=1,d.clear();let r=n.sessionKey(t.sessionManager.getSessionId());i.initialize(n.timelinePath(t.cwd,r)),u.recordEvent(`doom_file_edit.timeline_started`,{outcome:`initialized`})}),r.on(`tool_execution_start`,async(e,t)=>{if(!f)return;let n=p;if(d.set(e.toolCallId,Date.now()),await c.start(e.toolCallId,e.toolName,e.args,t.cwd),!f||n!==p){d.delete(e.toolCallId);return}u.recordEvent(`doom_file_edit.edit_started`,{"tool.name":e.toolName})}),r.on(`tool_execution_end`,async e=>{if(!f)return;let t=d.get(e.toolCallId);d.delete(e.toolCallId),await c.end(e.toolCallId,e.isError),f&&u.recordEvent(`doom_file_edit.edit_finished`,{"tool.name":e.toolName,"tool.result.error":e.isError,...t===void 0?{}:{duration_ms:Date.now()-t},outcome:e.isError?`failed`:`completed`})})},`${s}/runtime`)}async function u(e){let t=await n(e,s),r=t.root.plugin(d,{pi:e});try{await r}catch(e){try{await r.dispose()}finally{await t.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await t.dispose()}})())}function d(e,t){l(e,t.pi),e.inject([r],e=>{let t=i(e).registerLeader(c);return()=>t.dispose()})}export{c as FILE_EDIT_LEADER_CONTRIBUTION,u as fileEditExtension,l as installFileEditRuntime};
|
|
1
|
+
import{createFileEditContainer as e}from"../../container/index.mjs";import{SUBAGENT_CHILD_ENV as t}from"@agimon-ai/doompi-extension-contracts/child-process";import{connectDoomCordisHost as n}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{DOOM_UI_HUB_SERVICE as r,requireDoomUiHub as i}from"@agimon-ai/doompi-extension-contracts/ui-hub";import{createDoomTelemetry as a}from"@agimon-ai/doompi-telemetry";const o=`file-edits`,s=`@agimon-ai/doompi-file-edit`,c={source:s,bindings:[{id:`editor.files`,path:[{key:`e`,label:`extension`,detail:`tools, skills and config`,order:50},{key:`f`,label:`files`,detail:`session edits`}],command:{name:o}}]};function l(n,r){n.effect(function*(){let{paths:n,timeline:i,editTracker:c,workflow:l}=e(),u=a({serviceName:`doom-file-edit`,packageName:s,env:process.env,enableLogs:!0,enableTraces:!0}),d=new Map,f=!0,p=0;yield async()=>{f=!1,p+=1,d.clear();try{process.env[t]||await i.clear(),await u.recordEvent(`doom_file_edit.timeline_finished`,{outcome:`closed`})}finally{await u.shutdown()}},r.registerCommand(o,{description:`Review files edited in this session`,handler:async(e,t)=>{if(f){if(!t.hasUI){t.ui.notify(`/file-edits requires interactive mode`,`error`);return}await l.open(t)}}}),r.on(`session_start`,(e,t)=>{if(!f)return;p+=1,d.clear();let r=n.sessionKey(t.sessionManager.getSessionId());i.initialize(n.timelinePath(t.cwd,r)),u.recordEvent(`doom_file_edit.timeline_started`,{outcome:`initialized`})}),r.on(`tool_execution_start`,async(e,t)=>{if(!f)return;let n=p;if(d.set(e.toolCallId,Date.now()),await c.start(e.toolCallId,e.toolName,e.args,t.cwd),!f||n!==p){d.delete(e.toolCallId);return}u.recordEvent(`doom_file_edit.edit_started`,{"tool.name":e.toolName})}),r.on(`tool_execution_end`,async e=>{if(!f)return;let t=d.get(e.toolCallId);d.delete(e.toolCallId),await c.end(e.toolCallId,e.isError),f&&u.recordEvent(`doom_file_edit.edit_finished`,{"tool.name":e.toolName,"tool.result.error":e.isError,...t===void 0?{}:{duration_ms:Date.now()-t},outcome:e.isError?`failed`:`completed`})})},`${s}/runtime`)}async function u(e){let t=await n(e,s),r=t.root.plugin(d,{pi:e});try{await r}catch(e){try{await r.dispose()}finally{await t.dispose()}throw e}let i;e.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await t.dispose()}})())}function d(e,t){l(e,t.pi),e.inject([r],e=>{let t=i(e).registerLeader(c);return()=>t.dispose()})}export{c as FILE_EDIT_LEADER_CONTRIBUTION,u as fileEditExtension,l as installFileEditRuntime};
|
|
2
2
|
//# sourceMappingURL=extension.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { SUBAGENT_CHILD_ENV } from '@agimon-ai/doompi-extension-contracts/child-process';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport type { LeaderContribution } from '@agimon-ai/doompi-extension-contracts/leader';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createFileEditContainer } from '../../container/index.ts';\n\nconst FILES_COMMAND = 'file-edits';\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-file-edit';\n\nexport const FILE_EDIT_LEADER_CONTRIBUTION = {\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: 'editor.files',\n path: [\n { key: 'e', label: 'extension', order: 50 },\n { key: 'f', label: 'files', detail: 'session edits' },\n ],\n command: { name: FILES_COMMAND },\n },\n ],\n} as const satisfies LeaderContribution;\n\n/** Install File Edit resources into its host-owned Cordis plugin fiber. */\nexport function installFileEditRuntime(cordis: Context, pi: ExtensionAPI): void {\n cordis.effect(function* () {\n const { paths, timeline, editTracker: tracker, workflow } = createFileEditContainer();\n const telemetry: DoomTelemetry = createDoomTelemetry({\n serviceName: 'doom-file-edit',\n packageName: PACKAGE_SOURCE,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const toolStartedAt = new Map<string, number>();\n let active = true;\n let sessionGeneration = 0;\n\n yield async () => {\n active = false;\n sessionGeneration += 1;\n toolStartedAt.clear();\n try {\n if (!process.env[SUBAGENT_CHILD_ENV]) await timeline.clear();\n await telemetry.recordEvent('doom_file_edit.timeline_finished', { outcome: 'closed' });\n } finally {\n await telemetry.shutdown();\n }\n };\n\n pi.registerCommand(FILES_COMMAND, {\n description: 'Review files edited in this session',\n handler: async (_args, ctx) => {\n if (!active) return;\n if (!ctx.hasUI) {\n ctx.ui.notify('/file-edits requires interactive mode', 'error');\n return;\n }\n await workflow.open(ctx);\n },\n });\n\n pi.on('session_start', (_event, ctx) => {\n if (!active) return;\n sessionGeneration += 1;\n toolStartedAt.clear();\n const sessionKey = paths.sessionKey(ctx.sessionManager.getSessionId());\n timeline.initialize(paths.timelinePath(ctx.cwd, sessionKey));\n void telemetry.recordEvent('doom_file_edit.timeline_started', { outcome: 'initialized' });\n });\n pi.on('tool_execution_start', async (event, ctx) => {\n if (!active) return;\n const ownGeneration = sessionGeneration;\n toolStartedAt.set(event.toolCallId, Date.now());\n await tracker.start(event.toolCallId, event.toolName, event.args, ctx.cwd);\n if (!active || ownGeneration !== sessionGeneration) {\n toolStartedAt.delete(event.toolCallId);\n return;\n }\n void telemetry.recordEvent('doom_file_edit.edit_started', { 'tool.name': event.toolName });\n });\n pi.on('tool_execution_end', async (event) => {\n if (!active) return;\n const startedAt = toolStartedAt.get(event.toolCallId);\n toolStartedAt.delete(event.toolCallId);\n await tracker.end(event.toolCallId, event.isError);\n if (!active) return;\n void telemetry.recordEvent('doom_file_edit.edit_finished', {\n 'tool.name': event.toolName,\n 'tool.result.error': event.isError,\n ...(startedAt === undefined ? {} : { duration_ms: Date.now() - startedAt }),\n outcome: event.isError ? 'failed' : 'completed',\n });\n });\n }, `${PACKAGE_SOURCE}/runtime`);\n}\n\n/** The package's single standard Pi factory. */\nexport async function fileEditExtension(pi: ExtensionAPI): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(fileEditPlugin, { pi });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\ninterface FileEditPluginConfig {\n readonly pi: ExtensionAPI;\n}\n\nfunction fileEditPlugin(cordis: Context, config: FileEditPluginConfig): void {\n installFileEditRuntime(cordis, config.pi);\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader(FILE_EDIT_LEADER_CONTRIBUTION);\n return () => contribution.dispose();\n });\n}\n"],"mappings":"kaASA,MAAM,EAAgB,aAChB,EAAiB,8BAEV,EAAgC,CAC3C,OAAQ,EACR,SAAU,CACR,CACE,GAAI,eACJ,KAAM,CACJ,CAAE,IAAK,IAAK,MAAO,YAAa,MAAO,EAAG,
|
|
1
|
+
{"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { SUBAGENT_CHILD_ENV } from '@agimon-ai/doompi-extension-contracts/child-process';\nimport { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport type { LeaderContribution } from '@agimon-ai/doompi-extension-contracts/leader';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createFileEditContainer } from '../../container/index.ts';\n\nconst FILES_COMMAND = 'file-edits';\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-file-edit';\n\nexport const FILE_EDIT_LEADER_CONTRIBUTION = {\n source: PACKAGE_SOURCE,\n bindings: [\n {\n id: 'editor.files',\n path: [\n { key: 'e', label: 'extension', detail: 'tools, skills and config', order: 50 },\n { key: 'f', label: 'files', detail: 'session edits' },\n ],\n command: { name: FILES_COMMAND },\n },\n ],\n} as const satisfies LeaderContribution;\n\n/** Install File Edit resources into its host-owned Cordis plugin fiber. */\nexport function installFileEditRuntime(cordis: Context, pi: ExtensionAPI): void {\n cordis.effect(function* () {\n const { paths, timeline, editTracker: tracker, workflow } = createFileEditContainer();\n const telemetry: DoomTelemetry = createDoomTelemetry({\n serviceName: 'doom-file-edit',\n packageName: PACKAGE_SOURCE,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const toolStartedAt = new Map<string, number>();\n let active = true;\n let sessionGeneration = 0;\n\n yield async () => {\n active = false;\n sessionGeneration += 1;\n toolStartedAt.clear();\n try {\n if (!process.env[SUBAGENT_CHILD_ENV]) await timeline.clear();\n await telemetry.recordEvent('doom_file_edit.timeline_finished', { outcome: 'closed' });\n } finally {\n await telemetry.shutdown();\n }\n };\n\n pi.registerCommand(FILES_COMMAND, {\n description: 'Review files edited in this session',\n handler: async (_args, ctx) => {\n if (!active) return;\n if (!ctx.hasUI) {\n ctx.ui.notify('/file-edits requires interactive mode', 'error');\n return;\n }\n await workflow.open(ctx);\n },\n });\n\n pi.on('session_start', (_event, ctx) => {\n if (!active) return;\n sessionGeneration += 1;\n toolStartedAt.clear();\n const sessionKey = paths.sessionKey(ctx.sessionManager.getSessionId());\n timeline.initialize(paths.timelinePath(ctx.cwd, sessionKey));\n void telemetry.recordEvent('doom_file_edit.timeline_started', { outcome: 'initialized' });\n });\n pi.on('tool_execution_start', async (event, ctx) => {\n if (!active) return;\n const ownGeneration = sessionGeneration;\n toolStartedAt.set(event.toolCallId, Date.now());\n await tracker.start(event.toolCallId, event.toolName, event.args, ctx.cwd);\n if (!active || ownGeneration !== sessionGeneration) {\n toolStartedAt.delete(event.toolCallId);\n return;\n }\n void telemetry.recordEvent('doom_file_edit.edit_started', { 'tool.name': event.toolName });\n });\n pi.on('tool_execution_end', async (event) => {\n if (!active) return;\n const startedAt = toolStartedAt.get(event.toolCallId);\n toolStartedAt.delete(event.toolCallId);\n await tracker.end(event.toolCallId, event.isError);\n if (!active) return;\n void telemetry.recordEvent('doom_file_edit.edit_finished', {\n 'tool.name': event.toolName,\n 'tool.result.error': event.isError,\n ...(startedAt === undefined ? {} : { duration_ms: Date.now() - startedAt }),\n outcome: event.isError ? 'failed' : 'completed',\n });\n });\n }, `${PACKAGE_SOURCE}/runtime`);\n}\n\n/** The package's single standard Pi factory. */\nexport async function fileEditExtension(pi: ExtensionAPI): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n const fiber = connection.root.plugin(fileEditPlugin, { pi });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\ninterface FileEditPluginConfig {\n readonly pi: ExtensionAPI;\n}\n\nfunction fileEditPlugin(cordis: Context, config: FileEditPluginConfig): void {\n installFileEditRuntime(cordis, config.pi);\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader(FILE_EDIT_LEADER_CONTRIBUTION);\n return () => contribution.dispose();\n });\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-file-edit",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.34",
|
|
4
4
|
"description": "Pi extension for session-scoped file-change timelines and external editor workflows.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@deepseek-ai/cordis": "4.0.1",
|
|
46
46
|
"cross-spawn": "7.0.6",
|
|
47
|
-
"@agimon-ai/doompi-
|
|
48
|
-
"@agimon-ai/doompi-
|
|
49
|
-
"@agimon-ai/doompi-
|
|
50
|
-
"@agimon-ai/doompi-
|
|
47
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.34",
|
|
48
|
+
"@agimon-ai/doompi-config": "0.0.1-alpha.34",
|
|
49
|
+
"@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.34",
|
|
50
|
+
"@agimon-ai/doompi-ui": "0.0.1-alpha.34"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@earendil-works/pi-coding-agent": "0.84.2",
|