@wix/ditto-codegen-public 1.0.267 → 1.0.269

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 (2) hide show
  1. package/dist/out.js +377 -189
  2. package/package.json +2 -2
package/dist/out.js CHANGED
@@ -47,6 +47,7 @@ var require_types_impl = __commonJS({
47
47
  TaskKind2["ITERATE_CODEGEN"] = "ITERATE_CODEGEN";
48
48
  TaskKind2["RUN_AGENT"] = "RUN_AGENT";
49
49
  TaskKind2["FIX_CODE"] = "FIX_CODE";
50
+ TaskKind2["ASK_CODEGEN"] = "ASK_CODEGEN";
50
51
  })(TaskKind || (exports2.TaskKind = TaskKind = {}));
51
52
  var Status;
52
53
  (function(Status2) {
@@ -48473,24 +48474,6 @@ var require_DittoEventEmitter = __commonJS({
48473
48474
  }
48474
48475
  });
48475
48476
 
48476
- // dist/opencode-integration/types.js
48477
- var require_types5 = __commonJS({
48478
- "dist/opencode-integration/types.js"(exports2) {
48479
- "use strict";
48480
- Object.defineProperty(exports2, "__esModule", { value: true });
48481
- exports2.ASK_MODE = void 0;
48482
- exports2.tryParseJson = tryParseJson;
48483
- exports2.ASK_MODE = "ask";
48484
- function tryParseJson(text) {
48485
- try {
48486
- return JSON.parse(text);
48487
- } catch {
48488
- return null;
48489
- }
48490
- }
48491
- }
48492
- });
48493
-
48494
48477
  // dist/opencode-integration/prompts/prompt-utils.js
48495
48478
  var require_prompt_utils = __commonJS({
48496
48479
  "dist/opencode-integration/prompts/prompt-utils.js"(exports2) {
@@ -48711,6 +48694,94 @@ var require_prompts = __commonJS({
48711
48694
  }
48712
48695
  });
48713
48696
 
48697
+ // dist/opencode-integration/task-tracker/constants.js
48698
+ var require_constants6 = __commonJS({
48699
+ "dist/opencode-integration/task-tracker/constants.js"(exports2) {
48700
+ "use strict";
48701
+ Object.defineProperty(exports2, "__esModule", { value: true });
48702
+ exports2.BUILDER_TO_EXTENSION_LABEL = exports2.WRITE_TOOLS = exports2.CODE_SEARCH_TOOLS = exports2.WIX_MCP_SERVER_NAME = exports2.CONTAINER_ROOT_PREFIX = void 0;
48703
+ exports2.resolveFileOperation = resolveFileOperation;
48704
+ exports2.isMcpTool = isMcpTool;
48705
+ exports2.normalizeFilePath = normalizeFilePath;
48706
+ exports2.isExtensionsFile = isExtensionsFile;
48707
+ exports2.detectExtensionType = detectExtensionType;
48708
+ exports2.toTitleCase = toTitleCase;
48709
+ exports2.extractExtensionName = extractExtensionName;
48710
+ exports2.getWrittenContent = getWrittenContent;
48711
+ var ditto_codegen_types_12 = require_dist4();
48712
+ exports2.CONTAINER_ROOT_PREFIX = /^\/user-code\//;
48713
+ exports2.WIX_MCP_SERVER_NAME = "wix-mcp";
48714
+ var EXTENSION_FILE_PATTERN = /\/extensions\.ts$|\.extension\.ts$/;
48715
+ function resolveFileOperation(tool2, metadata) {
48716
+ if (tool2 === "write") {
48717
+ return metadata?.exists ? ditto_codegen_types_12.ExtensionGenerationOperation.EDIT : ditto_codegen_types_12.ExtensionGenerationOperation.INSERT;
48718
+ }
48719
+ if (tool2 === "edit") {
48720
+ return ditto_codegen_types_12.ExtensionGenerationOperation.EDIT;
48721
+ }
48722
+ return null;
48723
+ }
48724
+ exports2.CODE_SEARCH_TOOLS = /* @__PURE__ */ new Set(["read", "grep", "glob", "list"]);
48725
+ exports2.WRITE_TOOLS = /* @__PURE__ */ new Set(["write", "edit"]);
48726
+ exports2.BUILDER_TO_EXTENSION_LABEL = {
48727
+ dashboardPage: "dashboard page",
48728
+ dashboardModal: "dashboard modal",
48729
+ dashboardPlugin: "dashboard plugin",
48730
+ dashboardMenuPlugin: "dashboard menu plugin",
48731
+ embeddedScript: "embedded script",
48732
+ event: "backend event",
48733
+ genericExtension: "extension",
48734
+ customElement: "custom element",
48735
+ siteComponent: "site component",
48736
+ sitePlugin: "site plugin",
48737
+ ecomShippingRates: "service plugin",
48738
+ ecomAdditionalFees: "service plugin",
48739
+ ecomValidations: "service plugin",
48740
+ ecomDiscountTriggers: "service plugin",
48741
+ ecomGiftCards: "service plugin",
48742
+ ecomPaymentSettings: "service plugin",
48743
+ bookingsStaffSortingProvider: "service plugin"
48744
+ };
48745
+ function isMcpTool(tool2) {
48746
+ return tool2.startsWith(exports2.WIX_MCP_SERVER_NAME);
48747
+ }
48748
+ function normalizeFilePath(filePath) {
48749
+ return filePath.replace(exports2.CONTAINER_ROOT_PREFIX, "");
48750
+ }
48751
+ function isExtensionsFile(filePath) {
48752
+ return EXTENSION_FILE_PATTERN.test(filePath);
48753
+ }
48754
+ function detectExtensionType(content) {
48755
+ if (content.includes("genericExtension(") && content.includes("compType: 'DATA_COMPONENT'")) {
48756
+ return "collection";
48757
+ }
48758
+ for (const [builder, label] of Object.entries(exports2.BUILDER_TO_EXTENSION_LABEL)) {
48759
+ if (content.includes(`extensions.${builder}(`)) {
48760
+ return label;
48761
+ }
48762
+ }
48763
+ return null;
48764
+ }
48765
+ function toTitleCase(str) {
48766
+ return str.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
48767
+ }
48768
+ function extractExtensionName(filePath) {
48769
+ const parts = normalizeFilePath(filePath).split("/");
48770
+ const folderName = parts[parts.length - 2] || "";
48771
+ return toTitleCase(folderName);
48772
+ }
48773
+ function getWrittenContent(tool2, state) {
48774
+ if (!state.input)
48775
+ return null;
48776
+ if (tool2 === "write" && state.input.content)
48777
+ return state.input.content;
48778
+ if (tool2 === "edit" && state.input.new_string)
48779
+ return state.input.new_string;
48780
+ return null;
48781
+ }
48782
+ }
48783
+ });
48784
+
48714
48785
  // dist/opencode-integration/config.js
48715
48786
  var require_config = __commonJS({
48716
48787
  "dist/opencode-integration/config.js"(exports2) {
@@ -48722,6 +48793,7 @@ var require_config = __commonJS({
48722
48793
  exports2.getOpenCodeAskEnv = getOpenCodeAskEnv;
48723
48794
  var os_1 = require("os");
48724
48795
  var codeGenerationService_12 = require_codeGenerationService();
48796
+ var constants_1 = require_constants6();
48725
48797
  exports2.DEFAULT_TIMEOUT_MS = 20 * 60 * 1e3;
48726
48798
  exports2.DEFAULT_MODEL = "anthropic/claude-sonnet-4-6";
48727
48799
  function getAnthropicBaseUrl(projectId) {
@@ -48741,12 +48813,12 @@ var require_config = __commonJS({
48741
48813
  };
48742
48814
  }
48743
48815
  var WIX_MCP_CONFIG = {
48744
- "wix-mcp": {
48816
+ [constants_1.WIX_MCP_SERVER_NAME]: {
48745
48817
  type: "local",
48746
48818
  command: [
48747
48819
  "npx",
48748
48820
  "-y",
48749
- "@wix/mcp@1.0.22",
48821
+ "@wix/mcp",
48750
48822
  "--experimental",
48751
48823
  "GET_TO_KNOW_WIX,WIX_API_THROUGH_FS"
48752
48824
  ],
@@ -48830,6 +48902,22 @@ var require_config = __commonJS({
48830
48902
  }
48831
48903
  });
48832
48904
 
48905
+ // dist/opencode-integration/types.js
48906
+ var require_types5 = __commonJS({
48907
+ "dist/opencode-integration/types.js"(exports2) {
48908
+ "use strict";
48909
+ Object.defineProperty(exports2, "__esModule", { value: true });
48910
+ exports2.tryParseJson = tryParseJson;
48911
+ function tryParseJson(text) {
48912
+ try {
48913
+ return JSON.parse(text);
48914
+ } catch {
48915
+ return null;
48916
+ }
48917
+ }
48918
+ }
48919
+ });
48920
+
48833
48921
  // dist/opencode-integration/parser.js
48834
48922
  var require_parser = __commonJS({
48835
48923
  "dist/opencode-integration/parser.js"(exports2) {
@@ -48844,10 +48932,7 @@ var require_parser = __commonJS({
48844
48932
  exports2.formatUsageStats = formatUsageStats;
48845
48933
  var ditto_codegen_types_12 = require_dist4();
48846
48934
  var types_1 = require_types5();
48847
- var OPENCODE_TOOL_TO_OPERATION = {
48848
- write: ditto_codegen_types_12.ExtensionGenerationOperation.INSERT,
48849
- edit: ditto_codegen_types_12.ExtensionGenerationOperation.EDIT
48850
- };
48935
+ var constants_1 = require_constants6();
48851
48936
  function parseEvents(output, type) {
48852
48937
  return output.split("\n").filter((line) => line.trim()).map((line) => (0, types_1.tryParseJson)(line)).filter((event) => event !== null && event.type === type);
48853
48938
  }
@@ -48873,14 +48958,11 @@ var require_parser = __commonJS({
48873
48958
  }
48874
48959
  return [];
48875
48960
  }
48876
- function normalizeFilePath(filePath) {
48877
- return filePath.replace(/^\/user-code\//, "");
48878
- }
48879
48961
  function parseFilesChanged(output) {
48880
48962
  const filesChanged = [];
48881
48963
  const seenPaths = /* @__PURE__ */ new Set();
48882
48964
  const addFileChange = (filePath, operation) => {
48883
- const normalizedPath = normalizeFilePath(filePath);
48965
+ const normalizedPath = (0, constants_1.normalizeFilePath)(filePath);
48884
48966
  if (normalizedPath && !seenPaths.has(normalizedPath)) {
48885
48967
  seenPaths.add(normalizedPath);
48886
48968
  filesChanged.push({ path: normalizedPath, operation });
@@ -48895,13 +48977,13 @@ var require_parser = __commonJS({
48895
48977
  continue;
48896
48978
  }
48897
48979
  const tool2 = event.part.tool;
48898
- const operation = OPENCODE_TOOL_TO_OPERATION[tool2];
48980
+ const metadata = event.part.state.metadata;
48981
+ const operation = (0, constants_1.resolveFileOperation)(tool2, metadata);
48899
48982
  if (operation) {
48900
48983
  const filePath = event.part.state.input?.filePath;
48901
48984
  if (filePath) {
48902
48985
  addFileChange(filePath, operation);
48903
48986
  }
48904
- const metadata = event.part.state.metadata;
48905
48987
  if (metadata?.diagnostics) {
48906
48988
  for (const diagPath of Object.keys(metadata.diagnostics)) {
48907
48989
  if (diagPath && !diagPath.includes("node_modules")) {
@@ -48912,7 +48994,7 @@ var require_parser = __commonJS({
48912
48994
  }
48913
48995
  if (tool2 === "task" && event.part.state.metadata?.summary) {
48914
48996
  for (const item of event.part.state.metadata.summary) {
48915
- const summaryOperation = OPENCODE_TOOL_TO_OPERATION[item.tool];
48997
+ const summaryOperation = (0, constants_1.resolveFileOperation)(item.tool);
48916
48998
  if (summaryOperation && item.state?.status === "completed" && item.state?.title) {
48917
48999
  addFileChange(item.state.title, summaryOperation);
48918
49000
  }
@@ -48993,143 +49075,128 @@ var require_parser = __commonJS({
48993
49075
  }
48994
49076
  });
48995
49077
 
48996
- // dist/opencode-integration/task-tracker.js
48997
- var require_task_tracker = __commonJS({
48998
- "dist/opencode-integration/task-tracker.js"(exports2) {
49078
+ // dist/opencode-integration/task-tracker/extension-handler.js
49079
+ var require_extension_handler = __commonJS({
49080
+ "dist/opencode-integration/task-tracker/extension-handler.js"(exports2) {
48999
49081
  "use strict";
49000
49082
  Object.defineProperty(exports2, "__esModule", { value: true });
49001
- exports2.OpenCodeTaskTracker = void 0;
49002
- var codeGenerationService_12 = require_codeGenerationService();
49003
- var job_context_storage_12 = require_job_context_storage();
49083
+ exports2.ExtensionTaskHandler = void 0;
49004
49084
  var ditto_codegen_types_12 = require_dist4();
49005
- var types_1 = require_types5();
49085
+ var codeGenerationService_12 = require_codeGenerationService();
49006
49086
  var logger_12 = require_logger();
49007
- var CODE_SEARCH_TOOLS = /* @__PURE__ */ new Set(["read", "grep", "glob", "list"]);
49008
- function isMcpTool(tool2) {
49009
- return tool2.startsWith("wix-mcp_");
49010
- }
49011
- var OpenCodeTaskTracker = class {
49012
- constructor(options) {
49013
- this.trackedTasks = /* @__PURE__ */ new Map();
49014
- this.taskCounter = 0;
49015
- this.codeSearchTaskCreated = false;
49016
- this.docSearchTaskCreated = false;
49017
- this.skillsUsed = /* @__PURE__ */ new Set();
49018
- this.trackToolCategories = options?.trackToolCategories ?? false;
49019
- }
49020
- getJobContext() {
49021
- const store = job_context_storage_12.jobContextStorage.getStore();
49022
- if (!store?.jobId || !store?.taskId) {
49023
- return null;
49024
- }
49025
- return { jobId: store.jobId, taskId: store.taskId };
49087
+ var constants_1 = require_constants6();
49088
+ var ExtensionTaskHandler = class {
49089
+ constructor() {
49090
+ this.extensionTasksCreated = /* @__PURE__ */ new Set();
49026
49091
  }
49027
- async processLine(line) {
49028
- if (!line.trim())
49092
+ /** Inspects a write/edit event; if it targets an extension file, creates a tracked sub-task. */
49093
+ async handle(tool2, state, ctx) {
49094
+ const filePath = state.input?.filePath || state.title || "";
49095
+ if (!(0, constants_1.isExtensionsFile)(filePath))
49029
49096
  return;
49030
- const event = (0, types_1.tryParseJson)(line);
49031
- if (event) {
49032
- await this.handleEvent(event);
49033
- }
49097
+ const content = (0, constants_1.getWrittenContent)(tool2, state);
49098
+ if (!content)
49099
+ return;
49100
+ const extensionType = (0, constants_1.detectExtensionType)(content);
49101
+ if (!extensionType)
49102
+ return;
49103
+ const normalizedPath = (0, constants_1.normalizeFilePath)(filePath);
49104
+ if (this.extensionTasksCreated.has(normalizedPath))
49105
+ return;
49106
+ await this.completeInitTask(ctx);
49107
+ await this.createExtensionTask(normalizedPath, extensionType, filePath, ctx);
49034
49108
  }
49035
- async handleEvent(event) {
49036
- if (event.type !== "tool_use")
49109
+ /** Completes the INIT_CODEGEN task once the extension tasks are created. */
49110
+ async completeInitTask(ctx) {
49111
+ const { store } = ctx;
49112
+ if (store?.isCompleted || store?.kind !== ditto_codegen_types_12.TaskKind.INIT_CODEGEN)
49037
49113
  return;
49038
- const { tool: tool2, callID, state } = event.part || {};
49039
- if (!tool2 || !callID || !state)
49114
+ if (!store.jobId || !store.taskId)
49040
49115
  return;
49041
- if (tool2 === "task") {
49042
- await this.handleTaskEvent(callID, state);
49043
- }
49044
- if (tool2 === "skill" && state.status === "completed") {
49045
- await this.handleSkillEvent(state);
49046
- }
49047
- if (this.trackToolCategories) {
49048
- await this.handleToolCategoryEvent(tool2);
49116
+ store.isCompleted = true;
49117
+ try {
49118
+ await codeGenerationService_12.codeGenerationService.updateTask(store.jobId, store.taskId, ditto_codegen_types_12.Status.COMPLETED, {});
49119
+ logger_12.logger.info("[OpenCode] Completed init task before extension tasks");
49120
+ } catch (error48) {
49121
+ logger_12.logger.error("[OpenCode] Failed to complete init task", {
49122
+ error: error48 instanceof Error ? error48.message : String(error48)
49123
+ });
49049
49124
  }
49050
49125
  }
49051
- async handleTaskEvent(callID, state) {
49052
- const jobContext = this.getJobContext();
49126
+ /** Registers a new RUNNING sub-task in the job service for a detected extension. */
49127
+ async createExtensionTask(normalizedPath, extensionType, originalPath, ctx) {
49128
+ const jobContext = ctx.getJobContext();
49053
49129
  if (!jobContext)
49054
49130
  return;
49055
- const description = state.input?.description || state.title || "Running sub-agent";
49056
- if (!this.trackedTasks.has(callID)) {
49057
- this.taskCounter++;
49058
- const taskId = `${jobContext.taskId}-opencode-task-${this.taskCounter}`;
49059
- const initialStatus = state.status === "completed" ? ditto_codegen_types_12.Status.COMPLETED : state.status === "error" ? ditto_codegen_types_12.Status.FAILED : ditto_codegen_types_12.Status.RUNNING;
49060
- this.trackedTasks.set(callID, {
49061
- taskId,
49131
+ const extensionName = (0, constants_1.extractExtensionName)(originalPath);
49132
+ const description = `Creating ${extensionName} ${extensionType}`;
49133
+ const extensionKey = `ext-${normalizedPath}`;
49134
+ this.extensionTasksCreated.add(normalizedPath);
49135
+ ctx.taskCounter++;
49136
+ const taskId = `${jobContext.taskId}-ext-${ctx.taskCounter}`;
49137
+ const extensionFolder = normalizedPath.substring(0, normalizedPath.lastIndexOf("/") + 1);
49138
+ ctx.trackedTasks.set(extensionKey, {
49139
+ taskId,
49140
+ description,
49141
+ status: ditto_codegen_types_12.Status.RUNNING,
49142
+ extensionFolder
49143
+ });
49144
+ try {
49145
+ await codeGenerationService_12.codeGenerationService.addTask(jobContext.jobId, {
49146
+ id: taskId,
49147
+ kind: ditto_codegen_types_12.TaskKind.RUN_AGENT,
49148
+ status: ditto_codegen_types_12.Status.RUNNING,
49149
+ name: "create_extension",
49062
49150
  description,
49063
- status: initialStatus
49151
+ agentName: ""
49152
+ });
49153
+ logger_12.logger.info("[OpenCode] Created extension task", { description });
49154
+ } catch (error48) {
49155
+ logger_12.logger.error("[OpenCode] Failed to create extension task", {
49156
+ error: error48 instanceof Error ? error48.message : String(error48)
49064
49157
  });
49065
- try {
49066
- await codeGenerationService_12.codeGenerationService.addTask(jobContext.jobId, {
49067
- id: taskId,
49068
- kind: ditto_codegen_types_12.TaskKind.RUN_AGENT,
49069
- status: initialStatus,
49070
- name: "run_agent",
49071
- description: `Run agent for ${description}`,
49072
- agentName: "OpenCodeSubAgent"
49073
- });
49074
- logger_12.logger.info("[OpenCode] Created sub-task", {
49075
- description,
49076
- status: state.status
49077
- });
49078
- } catch (error48) {
49079
- logger_12.logger.error("[OpenCode] Failed to create sub-task", {
49080
- error: error48 instanceof Error ? error48.message : String(error48)
49081
- });
49082
- }
49083
- return;
49084
- }
49085
- const tracked = this.trackedTasks.get(callID);
49086
- if (state.status === "completed" && tracked.status !== ditto_codegen_types_12.Status.COMPLETED) {
49087
- tracked.status = ditto_codegen_types_12.Status.COMPLETED;
49088
- try {
49089
- await codeGenerationService_12.codeGenerationService.updateTask(jobContext.jobId, tracked.taskId, ditto_codegen_types_12.Status.COMPLETED, {});
49090
- logger_12.logger.info("[OpenCode] Completed sub-task", {
49091
- description: tracked.description
49092
- });
49093
- } catch (error48) {
49094
- logger_12.logger.error("[OpenCode] Failed to update sub-task", {
49095
- error: error48 instanceof Error ? error48.message : String(error48)
49096
- });
49097
- }
49098
- } else if (state.status === "error" && tracked.status !== ditto_codegen_types_12.Status.FAILED) {
49099
- tracked.status = ditto_codegen_types_12.Status.FAILED;
49100
- try {
49101
- await codeGenerationService_12.codeGenerationService.updateTask(jobContext.jobId, tracked.taskId, ditto_codegen_types_12.Status.FAILED, { error: state.output || "Sub-agent failed" });
49102
- logger_12.logger.error("[OpenCode] Failed sub-task", {
49103
- description: tracked.description
49104
- });
49105
- } catch (error48) {
49106
- logger_12.logger.error("[OpenCode] Failed to update sub-task", {
49107
- error: error48 instanceof Error ? error48.message : String(error48)
49108
- });
49109
- }
49110
49158
  }
49111
49159
  }
49112
- async handleSkillEvent(state) {
49113
- const skillName = state.title?.replace("Loaded skill: ", "") || "unknown";
49114
- this.skillsUsed.add(skillName);
49115
- logger_12.logger.info("[OpenCode] Loaded skill", { skillName });
49160
+ };
49161
+ exports2.ExtensionTaskHandler = ExtensionTaskHandler;
49162
+ }
49163
+ });
49164
+
49165
+ // dist/opencode-integration/task-tracker/category-handler.js
49166
+ var require_category_handler = __commonJS({
49167
+ "dist/opencode-integration/task-tracker/category-handler.js"(exports2) {
49168
+ "use strict";
49169
+ Object.defineProperty(exports2, "__esModule", { value: true });
49170
+ exports2.CategoryTaskHandler = void 0;
49171
+ var ditto_codegen_types_12 = require_dist4();
49172
+ var codeGenerationService_12 = require_codeGenerationService();
49173
+ var logger_12 = require_logger();
49174
+ var constants_1 = require_constants6();
49175
+ var CategoryTaskHandler = class {
49176
+ constructor() {
49177
+ this.codeSearchCreated = false;
49178
+ this.docSearchCreated = false;
49116
49179
  }
49117
- async handleToolCategoryEvent(tool2) {
49118
- const jobContext = this.getJobContext();
49180
+ /** Creates a search sub-task on the first use of code-search or MCP tools. */
49181
+ async handle(tool2, ctx) {
49182
+ const jobContext = ctx.getJobContext();
49119
49183
  if (!jobContext)
49120
49184
  return;
49121
- if (CODE_SEARCH_TOOLS.has(tool2) && !this.codeSearchTaskCreated) {
49122
- this.codeSearchTaskCreated = true;
49123
- await this.createCategoryTask(jobContext, "code-search", "Searching in code");
49185
+ if (constants_1.CODE_SEARCH_TOOLS.has(tool2) && !this.codeSearchCreated) {
49186
+ this.codeSearchCreated = true;
49187
+ await this.createTask("code-search", "Searching in code", ctx);
49124
49188
  }
49125
- if (isMcpTool(tool2) && !this.docSearchTaskCreated) {
49126
- this.docSearchTaskCreated = true;
49127
- await this.createCategoryTask(jobContext, "doc-search", "Searching in docs");
49189
+ if ((0, constants_1.isMcpTool)(tool2) && !this.docSearchCreated) {
49190
+ this.docSearchCreated = true;
49191
+ await this.createTask("doc-search", "Searching in docs", ctx);
49128
49192
  }
49129
49193
  }
49130
- async createCategoryTask(jobContext, suffix, description) {
49194
+ async createTask(suffix, description, ctx) {
49195
+ const jobContext = ctx.getJobContext();
49196
+ if (!jobContext)
49197
+ return;
49131
49198
  const taskId = `${jobContext.taskId}-${suffix}`;
49132
- this.trackedTasks.set(suffix, {
49199
+ ctx.trackedTasks.set(suffix, {
49133
49200
  taskId,
49134
49201
  description,
49135
49202
  status: ditto_codegen_types_12.Status.RUNNING
@@ -49150,29 +49217,137 @@ var require_task_tracker = __commonJS({
49150
49217
  });
49151
49218
  }
49152
49219
  }
49220
+ };
49221
+ exports2.CategoryTaskHandler = CategoryTaskHandler;
49222
+ }
49223
+ });
49224
+
49225
+ // dist/opencode-integration/task-tracker/task-tracker.js
49226
+ var require_task_tracker = __commonJS({
49227
+ "dist/opencode-integration/task-tracker/task-tracker.js"(exports2) {
49228
+ "use strict";
49229
+ Object.defineProperty(exports2, "__esModule", { value: true });
49230
+ exports2.OpenCodeTaskTracker = void 0;
49231
+ var ditto_codegen_types_12 = require_dist4();
49232
+ var codeGenerationService_12 = require_codeGenerationService();
49233
+ var job_context_storage_12 = require_job_context_storage();
49234
+ var types_1 = require_types5();
49235
+ var logger_12 = require_logger();
49236
+ var constants_1 = require_constants6();
49237
+ var extension_handler_1 = require_extension_handler();
49238
+ var category_handler_1 = require_category_handler();
49239
+ var OpenCodeTaskTracker = class {
49240
+ constructor() {
49241
+ this.trackedTasks = /* @__PURE__ */ new Map();
49242
+ this.taskCounter = 0;
49243
+ this.collectedFiles = [];
49244
+ this.skillsUsed = /* @__PURE__ */ new Set();
49245
+ this.extensionHandler = new extension_handler_1.ExtensionTaskHandler();
49246
+ this.categoryHandler = new category_handler_1.CategoryTaskHandler();
49247
+ this.store = job_context_storage_12.jobContextStorage.getStore();
49248
+ }
49153
49249
  getSkillsUsed() {
49154
49250
  return Array.from(this.skillsUsed);
49155
49251
  }
49252
+ getJobContext() {
49253
+ if (!this.store?.jobId || !this.store?.taskId) {
49254
+ return null;
49255
+ }
49256
+ return { jobId: this.store.jobId, taskId: this.store.taskId };
49257
+ }
49258
+ get handlerContext() {
49259
+ return {
49260
+ getJobContext: () => this.getJobContext(),
49261
+ store: this.store,
49262
+ trackedTasks: this.trackedTasks,
49263
+ collectedFiles: this.collectedFiles,
49264
+ taskCounter: this.taskCounter
49265
+ };
49266
+ }
49267
+ async processLine(line) {
49268
+ if (!line.trim())
49269
+ return;
49270
+ const event = (0, types_1.tryParseJson)(line);
49271
+ if (event) {
49272
+ await this.handleEvent(event);
49273
+ }
49274
+ }
49275
+ async handleEvent(event) {
49276
+ if (event.type !== "tool_use")
49277
+ return;
49278
+ const { tool: tool2, callID, state } = event.part || {};
49279
+ if (!tool2 || !callID || !state)
49280
+ return;
49281
+ if (constants_1.WRITE_TOOLS.has(tool2)) {
49282
+ this.collectFileChange(tool2, state);
49283
+ const ctx = this.handlerContext;
49284
+ await this.extensionHandler.handle(tool2, state, ctx);
49285
+ this.taskCounter = ctx.taskCounter;
49286
+ }
49287
+ if (tool2 === "skill" && state.status === "completed") {
49288
+ this.handleSkillEvent(state);
49289
+ }
49290
+ if (this.store?.kind === ditto_codegen_types_12.TaskKind.ASK_CODEGEN) {
49291
+ const ctx = this.handlerContext;
49292
+ await this.categoryHandler.handle(tool2, ctx);
49293
+ this.taskCounter = ctx.taskCounter;
49294
+ }
49295
+ }
49296
+ /** Records a unique file change (INSERT/EDIT) from a completed write/edit tool call. */
49297
+ collectFileChange(tool2, state) {
49298
+ if (state.status !== "completed")
49299
+ return;
49300
+ const filePath = state.input?.filePath || state.title;
49301
+ const operation = (0, constants_1.resolveFileOperation)(tool2, state.metadata);
49302
+ if (!filePath || !operation)
49303
+ return;
49304
+ const normalized = (0, constants_1.normalizeFilePath)(filePath);
49305
+ if (!this.collectedFiles.some((f) => f.path === normalized)) {
49306
+ this.collectedFiles.push({ path: normalized, operation });
49307
+ }
49308
+ }
49309
+ async handleSkillEvent(state) {
49310
+ const skillName = state.title?.replace("Loaded skill: ", "") || "unknown";
49311
+ this.skillsUsed.add(skillName);
49312
+ logger_12.logger.info("[OpenCode] Loaded skill", { skillName });
49313
+ }
49314
+ /** Builds the task completion payload — includes file list for extension tasks. */
49315
+ buildTaskPayload(tracked) {
49316
+ if (tracked.extensionFolder) {
49317
+ const extensionFiles = this.collectedFiles.filter((f) => f.path.startsWith(tracked.extensionFolder));
49318
+ return {
49319
+ taskOutput: {
49320
+ files: extensionFiles.map((f) => ({
49321
+ path: f.path,
49322
+ operation: f.operation
49323
+ }))
49324
+ }
49325
+ };
49326
+ }
49327
+ return {};
49328
+ }
49329
+ /** Marks all still-running tracked tasks as COMPLETED (called on successful process exit). */
49156
49330
  async completeRemainingTasks() {
49157
49331
  const jobContext = this.getJobContext();
49158
49332
  if (!jobContext)
49159
49333
  return;
49160
49334
  for (const [, tracked] of this.trackedTasks) {
49161
49335
  if (tracked.status === ditto_codegen_types_12.Status.RUNNING) {
49336
+ const payload = this.buildTaskPayload(tracked);
49162
49337
  try {
49163
- await codeGenerationService_12.codeGenerationService.updateTask(jobContext.jobId, tracked.taskId, ditto_codegen_types_12.Status.COMPLETED, {});
49164
- tracked.status = ditto_codegen_types_12.Status.COMPLETED;
49165
- logger_12.logger.info("[OpenCode] Auto-completed sub-task", {
49338
+ await codeGenerationService_12.codeGenerationService.updateTask(jobContext.jobId, tracked.taskId, ditto_codegen_types_12.Status.COMPLETED, payload);
49339
+ logger_12.logger.info("[OpenCode] Completed task", {
49166
49340
  description: tracked.description
49167
49341
  });
49168
49342
  } catch (err) {
49169
- logger_12.logger.error("[OpenCode] Failed to auto-complete sub-task", {
49343
+ logger_12.logger.error("[OpenCode] Failed to complete task", {
49170
49344
  error: err instanceof Error ? err.message : String(err)
49171
49345
  });
49172
49346
  }
49173
49347
  }
49174
49348
  }
49175
49349
  }
49350
+ /** Marks all still-running tracked tasks as FAILED (called on process error/timeout). */
49176
49351
  async failRemainingTasks(errorMessage) {
49177
49352
  const jobContext = this.getJobContext();
49178
49353
  if (!jobContext)
@@ -49181,12 +49356,11 @@ var require_task_tracker = __commonJS({
49181
49356
  if (tracked.status === ditto_codegen_types_12.Status.RUNNING) {
49182
49357
  try {
49183
49358
  await codeGenerationService_12.codeGenerationService.updateTask(jobContext.jobId, tracked.taskId, ditto_codegen_types_12.Status.FAILED, { error: errorMessage });
49184
- tracked.status = ditto_codegen_types_12.Status.FAILED;
49185
49359
  logger_12.logger.info("[OpenCode] Failed sub-task", {
49186
49360
  description: tracked.description
49187
49361
  });
49188
49362
  } catch (err) {
49189
- logger_12.logger.error("[OpenCode] Failed to fail sub-task", {
49363
+ logger_12.logger.error("[OpenCode] Failed to mark sub-task as failed", {
49190
49364
  error: err instanceof Error ? err.message : String(err)
49191
49365
  });
49192
49366
  }
@@ -49198,6 +49372,19 @@ var require_task_tracker = __commonJS({
49198
49372
  }
49199
49373
  });
49200
49374
 
49375
+ // dist/opencode-integration/task-tracker/index.js
49376
+ var require_task_tracker2 = __commonJS({
49377
+ "dist/opencode-integration/task-tracker/index.js"(exports2) {
49378
+ "use strict";
49379
+ Object.defineProperty(exports2, "__esModule", { value: true });
49380
+ exports2.OpenCodeTaskTracker = void 0;
49381
+ var task_tracker_1 = require_task_tracker();
49382
+ Object.defineProperty(exports2, "OpenCodeTaskTracker", { enumerable: true, get: function() {
49383
+ return task_tracker_1.OpenCodeTaskTracker;
49384
+ } });
49385
+ }
49386
+ });
49387
+
49201
49388
  // dist/opencode-integration/process-manager.js
49202
49389
  var require_process_manager = __commonJS({
49203
49390
  "dist/opencode-integration/process-manager.js"(exports2) {
@@ -49406,11 +49593,11 @@ var require_executor = __commonJS({
49406
49593
  exports2.executeOpenCode = executeOpenCode;
49407
49594
  var child_process_1 = require("child_process");
49408
49595
  var ditto_codegen_types_12 = require_dist4();
49409
- var types_1 = require_types5();
49410
49596
  var config_1 = require_config();
49597
+ var job_context_storage_12 = require_job_context_storage();
49411
49598
  var parser_1 = require_parser();
49412
49599
  var prompts_1 = require_prompts();
49413
- var task_tracker_1 = require_task_tracker();
49600
+ var task_tracker_1 = require_task_tracker2();
49414
49601
  var process_manager_1 = require_process_manager();
49415
49602
  var process_handlers_1 = require_process_handlers();
49416
49603
  var logger_12 = require_logger();
@@ -49465,11 +49652,9 @@ var require_executor = __commonJS({
49465
49652
  return ["run", "--format", "json", prompt];
49466
49653
  }
49467
49654
  async function executeOpenCodeOnce(options, attempt) {
49468
- const { prompt, outputPath, projectId, mode, onStdout, onStderr } = options;
49655
+ const { prompt, outputPath, projectId, onStdout, onStderr } = options;
49469
49656
  const startTime = Date.now();
49470
- const taskTracker = new task_tracker_1.OpenCodeTaskTracker({
49471
- trackToolCategories: mode === types_1.ASK_MODE
49472
- });
49657
+ const taskTracker = new task_tracker_1.OpenCodeTaskTracker();
49473
49658
  return new Promise((resolve3) => {
49474
49659
  const state = {
49475
49660
  stdout: "",
@@ -49510,7 +49695,8 @@ var require_executor = __commonJS({
49510
49695
  maxRetries: MAX_RETRIES,
49511
49696
  workingDirectory: outputPath
49512
49697
  });
49513
- const env = mode === types_1.ASK_MODE ? (0, config_1.getOpenCodeAskEnv)(projectId) : (0, config_1.getOpenCodeEnv)(projectId);
49698
+ const isAsk = job_context_storage_12.jobContextStorage.getStore()?.kind === ditto_codegen_types_12.TaskKind.ASK_CODEGEN;
49699
+ const env = isAsk ? (0, config_1.getOpenCodeAskEnv)(projectId) : (0, config_1.getOpenCodeEnv)(projectId);
49514
49700
  ctx.child = (0, child_process_1.spawn)("opencode", args, {
49515
49701
  cwd: outputPath,
49516
49702
  env,
@@ -49553,7 +49739,6 @@ var require_opencode_runner = __commonJS({
49553
49739
  exports2.runOpenCodeInit = runOpenCodeInit;
49554
49740
  exports2.runOpenCodeIteration = runOpenCodeIteration;
49555
49741
  exports2.runOpenCodeAsk = runOpenCodeAsk;
49556
- var types_1 = require_types5();
49557
49742
  var prompts_1 = require_prompts();
49558
49743
  var executor_1 = require_executor();
49559
49744
  var parser_1 = require_parser();
@@ -49565,7 +49750,13 @@ var require_opencode_runner = __commonJS({
49565
49750
  async function runOpenCodeIteration(options) {
49566
49751
  const { outputPath, projectId, chatHistory, onStdout, onStderr } = options;
49567
49752
  const prompt = (0, prompts_1.buildIterationPrompt)(chatHistory);
49568
- return (0, executor_1.executeOpenCode)({ prompt, outputPath, projectId, onStdout, onStderr });
49753
+ return (0, executor_1.executeOpenCode)({
49754
+ prompt,
49755
+ outputPath,
49756
+ projectId,
49757
+ onStdout,
49758
+ onStderr
49759
+ });
49569
49760
  }
49570
49761
  async function runOpenCodeAsk(options) {
49571
49762
  const { outputPath, projectId, chatHistory, onStdout, onStderr } = options;
@@ -49574,7 +49765,6 @@ var require_opencode_runner = __commonJS({
49574
49765
  prompt,
49575
49766
  outputPath,
49576
49767
  projectId,
49577
- mode: types_1.ASK_MODE,
49578
49768
  onStdout,
49579
49769
  onStderr
49580
49770
  });
@@ -49604,7 +49794,7 @@ var require_opencode_integration = __commonJS({
49604
49794
  Object.defineProperty(exports2, "runOpenCodeAsk", { enumerable: true, get: function() {
49605
49795
  return opencode_runner_1.runOpenCodeAsk;
49606
49796
  } });
49607
- var task_tracker_1 = require_task_tracker();
49797
+ var task_tracker_1 = require_task_tracker2();
49608
49798
  Object.defineProperty(exports2, "OpenCodeTaskTracker", { enumerable: true, get: function() {
49609
49799
  return task_tracker_1.OpenCodeTaskTracker;
49610
49800
  } });
@@ -53274,7 +53464,7 @@ var require_expand = __commonJS({
53274
53464
  });
53275
53465
 
53276
53466
  // ../../node_modules/braces/lib/constants.js
53277
- var require_constants6 = __commonJS({
53467
+ var require_constants7 = __commonJS({
53278
53468
  "../../node_modules/braces/lib/constants.js"(exports2, module2) {
53279
53469
  "use strict";
53280
53470
  module2.exports = {
@@ -53407,7 +53597,7 @@ var require_parse3 = __commonJS({
53407
53597
  /* ' */
53408
53598
  CHAR_NO_BREAK_SPACE,
53409
53599
  CHAR_ZERO_WIDTH_NOBREAK_SPACE
53410
- } = require_constants6();
53600
+ } = require_constants7();
53411
53601
  var parse4 = (input, options = {}) => {
53412
53602
  if (typeof input !== "string") {
53413
53603
  throw new TypeError("Expected a string");
@@ -53676,7 +53866,7 @@ var require_braces = __commonJS({
53676
53866
  });
53677
53867
 
53678
53868
  // ../../node_modules/micromatch/node_modules/picomatch/lib/constants.js
53679
- var require_constants7 = __commonJS({
53869
+ var require_constants8 = __commonJS({
53680
53870
  "../../node_modules/micromatch/node_modules/picomatch/lib/constants.js"(exports2, module2) {
53681
53871
  "use strict";
53682
53872
  var path4 = require("path");
@@ -53883,7 +54073,7 @@ var require_utils13 = __commonJS({
53883
54073
  REGEX_REMOVE_BACKSLASH,
53884
54074
  REGEX_SPECIAL_CHARS,
53885
54075
  REGEX_SPECIAL_CHARS_GLOBAL
53886
- } = require_constants7();
54076
+ } = require_constants8();
53887
54077
  exports2.isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val);
53888
54078
  exports2.hasRegexChars = (str) => REGEX_SPECIAL_CHARS.test(str);
53889
54079
  exports2.isRegexChar = (str) => str.length === 1 && exports2.hasRegexChars(str);
@@ -53969,7 +54159,7 @@ var require_scan = __commonJS({
53969
54159
  /* ) */
53970
54160
  CHAR_RIGHT_SQUARE_BRACKET
53971
54161
  /* ] */
53972
- } = require_constants7();
54162
+ } = require_constants8();
53973
54163
  var isPathSeparator = (code) => {
53974
54164
  return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
53975
54165
  };
@@ -54267,7 +54457,7 @@ var require_scan = __commonJS({
54267
54457
  var require_parse4 = __commonJS({
54268
54458
  "../../node_modules/micromatch/node_modules/picomatch/lib/parse.js"(exports2, module2) {
54269
54459
  "use strict";
54270
- var constants = require_constants7();
54460
+ var constants = require_constants8();
54271
54461
  var utils = require_utils13();
54272
54462
  var {
54273
54463
  MAX_LENGTH,
@@ -55044,7 +55234,7 @@ var require_picomatch = __commonJS({
55044
55234
  var scan = require_scan();
55045
55235
  var parse4 = require_parse4();
55046
55236
  var utils = require_utils13();
55047
- var constants = require_constants7();
55237
+ var constants = require_constants8();
55048
55238
  var isObject2 = (val) => val && typeof val === "object" && !Array.isArray(val);
55049
55239
  var picomatch = (glob, options, returnState = false) => {
55050
55240
  if (Array.isArray(glob)) {
@@ -55997,7 +56187,7 @@ var require_run_parallel = __commonJS({
55997
56187
  });
55998
56188
 
55999
56189
  // ../../node_modules/@nodelib/fs.scandir/out/constants.js
56000
- var require_constants8 = __commonJS({
56190
+ var require_constants9 = __commonJS({
56001
56191
  "../../node_modules/@nodelib/fs.scandir/out/constants.js"(exports2) {
56002
56192
  "use strict";
56003
56193
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -56076,7 +56266,7 @@ var require_async3 = __commonJS({
56076
56266
  exports2.readdir = exports2.readdirWithFileTypes = exports2.read = void 0;
56077
56267
  var fsStat = require_out();
56078
56268
  var rpl = require_run_parallel();
56079
- var constants_1 = require_constants8();
56269
+ var constants_1 = require_constants9();
56080
56270
  var utils = require_utils15();
56081
56271
  var common = require_common2();
56082
56272
  function read(directory, settings, callback) {
@@ -56185,7 +56375,7 @@ var require_sync2 = __commonJS({
56185
56375
  Object.defineProperty(exports2, "__esModule", { value: true });
56186
56376
  exports2.readdir = exports2.readdirWithFileTypes = exports2.read = void 0;
56187
56377
  var fsStat = require_out();
56188
- var constants_1 = require_constants8();
56378
+ var constants_1 = require_constants9();
56189
56379
  var utils = require_utils15();
56190
56380
  var common = require_common2();
56191
56381
  function read(directory, settings) {
@@ -77432,7 +77622,7 @@ var require_tools2 = __commonJS({
77432
77622
  });
77433
77623
 
77434
77624
  // ../scaffolding/dist/constants.js
77435
- var require_constants9 = __commonJS({
77625
+ var require_constants10 = __commonJS({
77436
77626
  "../scaffolding/dist/constants.js"(exports2) {
77437
77627
  "use strict";
77438
77628
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -77462,7 +77652,7 @@ var require_scaffolding = __commonJS({
77462
77652
  exports2.copyScaffoldingTemplate = copyScaffoldingTemplate;
77463
77653
  exports2.toKebabCase = toKebabCase;
77464
77654
  var tools_1 = require_tools2();
77465
- var constants_1 = require_constants9();
77655
+ var constants_1 = require_constants10();
77466
77656
  var types_1 = require_types_impl2();
77467
77657
  var fs_1 = __importDefault2(require("fs"));
77468
77658
  var path_1 = __importDefault2(require("path"));
@@ -77584,7 +77774,7 @@ var require_dist13 = __commonJS({
77584
77774
  Object.defineProperty(exports2, "copyRecursive", { enumerable: true, get: function() {
77585
77775
  return tools_1.copyRecursive;
77586
77776
  } });
77587
- var constants_1 = require_constants9();
77777
+ var constants_1 = require_constants10();
77588
77778
  Object.defineProperty(exports2, "spiToSubPath", { enumerable: true, get: function() {
77589
77779
  return constants_1.spiToSubPath;
77590
77780
  } });
@@ -91908,7 +92098,7 @@ var require_WixMCPClient = __commonJS({
91908
92098
  command: "npx",
91909
92099
  args: [
91910
92100
  "-y",
91911
- "@wix/mcp@1.0.22",
92101
+ "@wix/mcp",
91912
92102
  "--experimental",
91913
92103
  "GET_TO_KNOW_WIX,WIX_API_THROUGH_FS"
91914
92104
  ]
@@ -96872,22 +97062,21 @@ var require_opencode_init = __commonJS({
96872
97062
  requiredPermissions: result.requiredPermissions,
96873
97063
  history
96874
97064
  });
96875
- const taskOutput = {
96876
- files: result.filesChanged.map((file2) => ({
96877
- path: file2.path,
96878
- operation: file2.operation
96879
- }))
96880
- };
96881
- await codeGenerationService_12.codeGenerationService.updateTask(jobId, taskId, ditto_codegen_types_12.Status.COMPLETED, {
96882
- taskOutput
96883
- });
97065
+ if (!store.isCompleted) {
97066
+ await codeGenerationService_12.codeGenerationService.updateTask(jobId, taskId, ditto_codegen_types_12.Status.COMPLETED, {});
97067
+ }
96884
97068
  (0, biEvents_1.reportSessionEnd)({
96885
97069
  ...biBaseParams,
96886
97070
  Task_model: config_1.DEFAULT_MODEL,
96887
97071
  Task_type: kind,
96888
97072
  Task_cost: Math.round(result.usage.cost * 1e6),
96889
97073
  Task_status: ditto_codegen_types_12.Status.COMPLETED,
96890
- Agent_output: JSON.stringify(taskOutput),
97074
+ Agent_output: JSON.stringify({
97075
+ files: result.filesChanged.map((file2) => ({
97076
+ path: file2.path,
97077
+ operation: file2.operation
97078
+ }))
97079
+ }),
96891
97080
  Job_skills_used: result.skillsUsed.join(",")
96892
97081
  });
96893
97082
  jobLog.info(`[OpenCode Init] Completed opencode init task: jobId=${jobId}, taskId=${taskId}`);
@@ -345041,12 +345230,11 @@ async function processJob(job) {
345041
345230
  const payload = task.payload ?? {};
345042
345231
  const history = payload.history ?? [];
345043
345232
  const blueprint = payload.blueprint;
345044
- const taskKind = task.kind;
345045
- if (taskKind === "ASK_CODEGEN") {
345233
+ if (task.kind === CodeGenService_1.TaskKind.ASK_CODEGEN) {
345046
345234
  await (0, opencode_ask_1.runOpencodeAskFlow)(history);
345047
- } else if (task.kind === "ITERATE_CODEGEN") {
345235
+ } else if (task.kind === CodeGenService_1.TaskKind.ITERATE_CODEGEN) {
345048
345236
  await handleIteration(history);
345049
- } else if (task.kind === "INIT_CODEGEN" && blueprint) {
345237
+ } else if (task.kind === CodeGenService_1.TaskKind.INIT_CODEGEN && blueprint) {
345050
345238
  await handleInit(blueprint, history);
345051
345239
  }
345052
345240
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/ditto-codegen-public",
3
- "version": "1.0.267",
3
+ "version": "1.0.269",
4
4
  "description": "AI-powered Wix CLI app generator - standalone executable",
5
5
  "scripts": {
6
6
  "build": "node build.mjs",
@@ -28,5 +28,5 @@
28
28
  "@wix/ditto-codegen": "1.0.0",
29
29
  "esbuild": "^0.27.2"
30
30
  },
31
- "falconPackageHash": "b000bcde46855c5aba4f16f23ef55c340f744b534a5f75a38303ae1b"
31
+ "falconPackageHash": "ad1e291122bd10f8eddcaef9d712accb3c602ed227afff92970f532e"
32
32
  }