open-agents-ai 0.187.10 → 0.187.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +373 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -264641,7 +264641,7 @@ var init_agent_types = __esm({
|
|
|
264641
264641
|
model: "inherit",
|
|
264642
264642
|
isolation: "none",
|
|
264643
264643
|
canSpawnAgents: false,
|
|
264644
|
-
systemPromptAddition:
|
|
264644
|
+
systemPromptAddition: 'You are a planning agent. Analyze the codebase and produce a structured implementation plan. You can ONLY read files \u2014 you CANNOT make changes.\n\nWhen you call task_complete, include a JSON plan in your summary using this structure:\n```json\n{"task":"the task description","approach":"1-2 sentence strategy","estimatedTurns":5,"steps":[{"step":1,"action":"what to do","tool":"which_tool","target":"file_or_resource","expectedOutcome":"what should happen","risk":"low|medium|high"}]}\n```\n\nRules:\n- Be specific about files and tools\n- Include verification steps (tests, validation)\n- Flag high-risk steps (file deletion, config changes)\n- Each step should map to a single tool call'
|
|
264645
264645
|
};
|
|
264646
264646
|
COORDINATOR_AGENT = {
|
|
264647
264647
|
type: "coordinator",
|
|
@@ -264933,9 +264933,189 @@ var init_coordinator = __esm({
|
|
|
264933
264933
|
});
|
|
264934
264934
|
|
|
264935
264935
|
// packages/orchestrator/dist/self-critique.js
|
|
264936
|
+
function buildPlanPrompt(task) {
|
|
264937
|
+
return `## Plan Mode Active
|
|
264938
|
+
|
|
264939
|
+
You are in PLAN MODE. Generate a structured plan for this task WITHOUT executing it.
|
|
264940
|
+
|
|
264941
|
+
**Task**: ${task}
|
|
264942
|
+
|
|
264943
|
+
Output a JSON plan with this structure:
|
|
264944
|
+
{
|
|
264945
|
+
"task": "the task description",
|
|
264946
|
+
"approach": "1-2 sentence high-level strategy",
|
|
264947
|
+
"estimatedTurns": <number>,
|
|
264948
|
+
"steps": [
|
|
264949
|
+
{
|
|
264950
|
+
"step": 1,
|
|
264951
|
+
"action": "What to do",
|
|
264952
|
+
"tool": "which_tool_to_use",
|
|
264953
|
+
"target": "file or resource",
|
|
264954
|
+
"expectedOutcome": "What should happen",
|
|
264955
|
+
"risk": "low|medium|high"
|
|
264956
|
+
}
|
|
264957
|
+
]
|
|
264958
|
+
}
|
|
264959
|
+
|
|
264960
|
+
Rules:
|
|
264961
|
+
- Be specific about files and tools
|
|
264962
|
+
- Include verification steps (tests, validation)
|
|
264963
|
+
- Flag high-risk steps (file deletion, config changes)
|
|
264964
|
+
- Keep the plan actionable \u2014 each step should be a single tool call`;
|
|
264965
|
+
}
|
|
264966
|
+
function buildCritiquePrompt(plan) {
|
|
264967
|
+
const principlesList = Object.values(CRITIQUE_PRINCIPLES).map((p2, i2) => `${i2 + 1}. **${p2.name}**: ${p2.description}`).join("\n");
|
|
264968
|
+
return `## Self-Critique Mode
|
|
264969
|
+
|
|
264970
|
+
Review this plan against these principles:
|
|
264971
|
+
|
|
264972
|
+
${principlesList}
|
|
264973
|
+
|
|
264974
|
+
**Plan to critique**:
|
|
264975
|
+
${JSON.stringify(plan, null, 2)}
|
|
264976
|
+
|
|
264977
|
+
For each principle, rate 1-5 and explain. Output JSON:
|
|
264978
|
+
{
|
|
264979
|
+
"scores": { "safety": <1-5>, "completeness": <1-5>, "efficiency": <1-5>, "correctness": <1-5>, "ordering": <1-5> },
|
|
264980
|
+
"issues": ["issue 1", "issue 2"],
|
|
264981
|
+
"suggestions": ["suggestion 1"]
|
|
264982
|
+
}
|
|
264983
|
+
|
|
264984
|
+
If any score < 3, the plan needs revision.`;
|
|
264985
|
+
}
|
|
264986
|
+
function buildMetaCritiquePrompt(critique) {
|
|
264987
|
+
return `## Meta-Critique Mode
|
|
264988
|
+
|
|
264989
|
+
Was your critique thorough? Review your own evaluation:
|
|
264990
|
+
|
|
264991
|
+
${JSON.stringify(critique, null, 2)}
|
|
264992
|
+
|
|
264993
|
+
Ask yourself:
|
|
264994
|
+
- Did I miss any risks?
|
|
264995
|
+
- Were my scores justified?
|
|
264996
|
+
- Did I consider edge cases?
|
|
264997
|
+
|
|
264998
|
+
Output JSON:
|
|
264999
|
+
{
|
|
265000
|
+
"quality": <1-5>,
|
|
265001
|
+
"thorough": <boolean>,
|
|
265002
|
+
"missed": ["any missed concerns"]
|
|
265003
|
+
}
|
|
265004
|
+
|
|
265005
|
+
If quality < 4, re-critique with more depth.`;
|
|
265006
|
+
}
|
|
265007
|
+
function parsePlan(text) {
|
|
265008
|
+
const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/) || text.match(/(\{[\s\S]*"steps"[\s\S]*\})/);
|
|
265009
|
+
if (!jsonMatch)
|
|
265010
|
+
return null;
|
|
265011
|
+
try {
|
|
265012
|
+
const parsed = JSON.parse(jsonMatch[1].trim());
|
|
265013
|
+
if (!parsed.steps || !Array.isArray(parsed.steps))
|
|
265014
|
+
return null;
|
|
265015
|
+
return {
|
|
265016
|
+
task: parsed.task || "",
|
|
265017
|
+
approach: parsed.approach || "",
|
|
265018
|
+
estimatedTurns: parsed.estimatedTurns || parsed.steps.length,
|
|
265019
|
+
steps: parsed.steps.map((s2, i2) => ({
|
|
265020
|
+
step: s2.step || i2 + 1,
|
|
265021
|
+
action: s2.action || "",
|
|
265022
|
+
tool: s2.tool,
|
|
265023
|
+
target: s2.target,
|
|
265024
|
+
expectedOutcome: s2.expectedOutcome || s2.expected_outcome || "",
|
|
265025
|
+
risk: s2.risk || "low"
|
|
265026
|
+
}))
|
|
265027
|
+
};
|
|
265028
|
+
} catch {
|
|
265029
|
+
return null;
|
|
265030
|
+
}
|
|
265031
|
+
}
|
|
265032
|
+
function parseCritique(text) {
|
|
265033
|
+
const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/) || text.match(/(\{[\s\S]*"scores"[\s\S]*\})/);
|
|
265034
|
+
if (!jsonMatch)
|
|
265035
|
+
return null;
|
|
265036
|
+
try {
|
|
265037
|
+
const parsed = JSON.parse(jsonMatch[1].trim());
|
|
265038
|
+
if (!parsed.scores)
|
|
265039
|
+
return null;
|
|
265040
|
+
const scores = parsed.scores;
|
|
265041
|
+
const values = Object.values(scores);
|
|
265042
|
+
const avg = values.reduce((a2, b) => a2 + b, 0) / values.length;
|
|
265043
|
+
return {
|
|
265044
|
+
scores,
|
|
265045
|
+
issues: parsed.issues || [],
|
|
265046
|
+
suggestions: parsed.suggestions || [],
|
|
265047
|
+
pass: values.every((v) => v >= 3),
|
|
265048
|
+
averageScore: Math.round(avg * 10) / 10
|
|
265049
|
+
};
|
|
265050
|
+
} catch {
|
|
265051
|
+
return null;
|
|
265052
|
+
}
|
|
265053
|
+
}
|
|
265054
|
+
function parseMetaCritique(text) {
|
|
265055
|
+
const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/) || text.match(/(\{[\s\S]*"quality"[\s\S]*\})/);
|
|
265056
|
+
if (!jsonMatch)
|
|
265057
|
+
return null;
|
|
265058
|
+
try {
|
|
265059
|
+
const parsed = JSON.parse(jsonMatch[1].trim());
|
|
265060
|
+
return {
|
|
265061
|
+
quality: parsed.quality || 3,
|
|
265062
|
+
thorough: parsed.thorough ?? true,
|
|
265063
|
+
missed: parsed.missed || []
|
|
265064
|
+
};
|
|
265065
|
+
} catch {
|
|
265066
|
+
return null;
|
|
265067
|
+
}
|
|
265068
|
+
}
|
|
265069
|
+
function getPlanModeConfig(modelTier) {
|
|
265070
|
+
switch (modelTier) {
|
|
265071
|
+
case "large":
|
|
265072
|
+
return { ...DEFAULT_PLAN_MODE_CONFIG, maxRevisions: 3, enableMetaCritique: true };
|
|
265073
|
+
case "medium":
|
|
265074
|
+
return { ...DEFAULT_PLAN_MODE_CONFIG, maxRevisions: 2, enableMetaCritique: true };
|
|
265075
|
+
case "small":
|
|
265076
|
+
return { ...DEFAULT_PLAN_MODE_CONFIG, maxRevisions: 1, enableMetaCritique: false };
|
|
265077
|
+
default:
|
|
265078
|
+
return DEFAULT_PLAN_MODE_CONFIG;
|
|
265079
|
+
}
|
|
265080
|
+
}
|
|
265081
|
+
var CRITIQUE_PRINCIPLES, DEFAULT_PLAN_MODE_CONFIG;
|
|
264936
265082
|
var init_self_critique = __esm({
|
|
264937
265083
|
"packages/orchestrator/dist/self-critique.js"() {
|
|
264938
265084
|
"use strict";
|
|
265085
|
+
CRITIQUE_PRINCIPLES = {
|
|
265086
|
+
safety: {
|
|
265087
|
+
name: "SAFETY",
|
|
265088
|
+
description: "Does any step risk data loss, irreversible changes, or security issues?",
|
|
265089
|
+
weight: 2
|
|
265090
|
+
// Critical — double weight
|
|
265091
|
+
},
|
|
265092
|
+
completeness: {
|
|
265093
|
+
name: "COMPLETENESS",
|
|
265094
|
+
description: "Does the plan address the full task? Are there missing steps?",
|
|
265095
|
+
weight: 1
|
|
265096
|
+
},
|
|
265097
|
+
efficiency: {
|
|
265098
|
+
name: "EFFICIENCY",
|
|
265099
|
+
description: "Are there unnecessary steps? Could steps be combined or parallelized?",
|
|
265100
|
+
weight: 1
|
|
265101
|
+
},
|
|
265102
|
+
correctness: {
|
|
265103
|
+
name: "CORRECTNESS",
|
|
265104
|
+
description: "Will each step produce the expected output? Are there logical errors?",
|
|
265105
|
+
weight: 1.5
|
|
265106
|
+
},
|
|
265107
|
+
ordering: {
|
|
265108
|
+
name: "ORDERING",
|
|
265109
|
+
description: "Are steps in the right dependency order? Would reordering improve the plan?",
|
|
265110
|
+
weight: 1
|
|
265111
|
+
}
|
|
265112
|
+
};
|
|
265113
|
+
DEFAULT_PLAN_MODE_CONFIG = {
|
|
265114
|
+
maxRevisions: 3,
|
|
265115
|
+
minAverageScore: 3,
|
|
265116
|
+
enableMetaCritique: true,
|
|
265117
|
+
metaCritiqueThreshold: 4
|
|
265118
|
+
};
|
|
264939
265119
|
}
|
|
264940
265120
|
});
|
|
264941
265121
|
|
|
@@ -304986,6 +305166,8 @@ function buildTools(repoRoot, config, contextWindowSize, modelTier) {
|
|
|
304986
305166
|
// MCP tools (dynamic — from connected MCP servers, WO-MCP-01)
|
|
304987
305167
|
..._mcpTools.map(adaptTool6),
|
|
304988
305168
|
createSubAgentTool(config, repoRoot, contextWindowSize),
|
|
305169
|
+
// Self-critique plan mode (WO-TP2)
|
|
305170
|
+
createPlanModeTool(config, repoRoot, contextWindowSize),
|
|
304989
305171
|
createTaskCompleteTool(modelTier)
|
|
304990
305172
|
];
|
|
304991
305173
|
}
|
|
@@ -305073,6 +305255,195 @@ Use task_status("${taskId}") or task_output("${taskId}") to check progress.`
|
|
|
305073
305255
|
}
|
|
305074
305256
|
};
|
|
305075
305257
|
}
|
|
305258
|
+
function createPlanModeTool(config, repoRoot, ctxWindowSize) {
|
|
305259
|
+
return {
|
|
305260
|
+
name: "enter_plan_mode",
|
|
305261
|
+
description: "Generate a self-critiqued implementation plan before executing complex tasks. Spawns a read-only plan agent to analyze the codebase, then runs a critique loop against safety/completeness/correctness/efficiency/ordering principles. Returns an approved structured plan with steps, tools, targets, and risk levels. Use this BEFORE making changes to complex multi-file tasks.",
|
|
305262
|
+
parameters: {
|
|
305263
|
+
type: "object",
|
|
305264
|
+
properties: {
|
|
305265
|
+
task: {
|
|
305266
|
+
type: "string",
|
|
305267
|
+
description: "The task to plan (e.g. 'Add authentication middleware to all API routes')"
|
|
305268
|
+
},
|
|
305269
|
+
max_revisions: {
|
|
305270
|
+
type: "number",
|
|
305271
|
+
description: "Maximum critique-revision cycles (default: tier-dependent, 1-3)"
|
|
305272
|
+
}
|
|
305273
|
+
},
|
|
305274
|
+
required: ["task"]
|
|
305275
|
+
},
|
|
305276
|
+
async execute(args) {
|
|
305277
|
+
const task = String(args["task"] ?? "");
|
|
305278
|
+
if (!task) {
|
|
305279
|
+
return { success: false, output: "", error: "task is required" };
|
|
305280
|
+
}
|
|
305281
|
+
const modelTier = getModelTier(config.model);
|
|
305282
|
+
const planConfig = getPlanModeConfig(modelTier);
|
|
305283
|
+
const maxRevisions = typeof args["max_revisions"] === "number" ? args["max_revisions"] : planConfig.maxRevisions;
|
|
305284
|
+
let planAgentOutput = "";
|
|
305285
|
+
try {
|
|
305286
|
+
const backend = new OllamaAgenticBackend(config.backendUrl, config.model, config.apiKey);
|
|
305287
|
+
const planRunner = new AgenticRunner(backend, {
|
|
305288
|
+
maxTurns: 15,
|
|
305289
|
+
maxTokens: 8192,
|
|
305290
|
+
temperature: 0,
|
|
305291
|
+
requestTimeoutMs: config.timeoutMs,
|
|
305292
|
+
taskTimeoutMs: config.timeoutMs * 2,
|
|
305293
|
+
compactionThreshold: 24e3,
|
|
305294
|
+
contextWindowSize: ctxWindowSize ?? 0,
|
|
305295
|
+
modelTier
|
|
305296
|
+
});
|
|
305297
|
+
const planTools = [
|
|
305298
|
+
new FileReadTool(repoRoot),
|
|
305299
|
+
new GrepSearchTool(repoRoot),
|
|
305300
|
+
new GlobFindTool(repoRoot),
|
|
305301
|
+
new ListDirectoryTool(repoRoot)
|
|
305302
|
+
].map(adaptTool6);
|
|
305303
|
+
planTools.push(createTaskCompleteTool(modelTier));
|
|
305304
|
+
for (const t2 of planTools)
|
|
305305
|
+
planRunner.registerTool(t2);
|
|
305306
|
+
const planPrompt = buildPlanPrompt(task);
|
|
305307
|
+
const result = await planRunner.run(planPrompt);
|
|
305308
|
+
planAgentOutput = result.summary || "";
|
|
305309
|
+
} catch (err) {
|
|
305310
|
+
return {
|
|
305311
|
+
success: false,
|
|
305312
|
+
output: "",
|
|
305313
|
+
error: `Plan agent failed: ${err instanceof Error ? err.message : String(err)}`
|
|
305314
|
+
};
|
|
305315
|
+
}
|
|
305316
|
+
if (!planAgentOutput) {
|
|
305317
|
+
return { success: false, output: "", error: "Plan agent returned empty output" };
|
|
305318
|
+
}
|
|
305319
|
+
let plan = parsePlan(planAgentOutput);
|
|
305320
|
+
if (!plan) {
|
|
305321
|
+
return {
|
|
305322
|
+
success: true,
|
|
305323
|
+
output: `[Plan generated but not in JSON format \u2014 returning raw analysis]
|
|
305324
|
+
|
|
305325
|
+
${planAgentOutput}`
|
|
305326
|
+
};
|
|
305327
|
+
}
|
|
305328
|
+
const critiques = [];
|
|
305329
|
+
let approved = false;
|
|
305330
|
+
let reason = "";
|
|
305331
|
+
for (let revision = 0; revision < maxRevisions; revision++) {
|
|
305332
|
+
const critiquePrompt = buildCritiquePrompt(plan);
|
|
305333
|
+
let critiqueText = "";
|
|
305334
|
+
try {
|
|
305335
|
+
const backend = new OllamaAgenticBackend(config.backendUrl, config.model, config.apiKey);
|
|
305336
|
+
const response = await backend.chatCompletion({
|
|
305337
|
+
messages: [
|
|
305338
|
+
{ role: "system", content: "You are a code review expert. Evaluate the plan critically." },
|
|
305339
|
+
{ role: "user", content: critiquePrompt }
|
|
305340
|
+
],
|
|
305341
|
+
tools: [],
|
|
305342
|
+
temperature: 0,
|
|
305343
|
+
maxTokens: 2048,
|
|
305344
|
+
timeoutMs: config.timeoutMs
|
|
305345
|
+
});
|
|
305346
|
+
critiqueText = response.choices?.[0]?.message?.content ?? "";
|
|
305347
|
+
} catch {
|
|
305348
|
+
reason = "Critique call failed \u2014 auto-approved";
|
|
305349
|
+
approved = true;
|
|
305350
|
+
break;
|
|
305351
|
+
}
|
|
305352
|
+
const critique = parseCritique(critiqueText);
|
|
305353
|
+
if (!critique) {
|
|
305354
|
+
reason = "Critique parse failed \u2014 auto-approved";
|
|
305355
|
+
approved = true;
|
|
305356
|
+
break;
|
|
305357
|
+
}
|
|
305358
|
+
critiques.push(critique);
|
|
305359
|
+
if (critique.pass && critique.averageScore >= planConfig.minAverageScore) {
|
|
305360
|
+
approved = true;
|
|
305361
|
+
reason = `Critique passed: avg ${critique.averageScore}/5, all scores \u2265 3`;
|
|
305362
|
+
break;
|
|
305363
|
+
}
|
|
305364
|
+
if (revision < maxRevisions - 1) {
|
|
305365
|
+
try {
|
|
305366
|
+
const backend = new OllamaAgenticBackend(config.backendUrl, config.model, config.apiKey);
|
|
305367
|
+
const revisionResponse = await backend.chatCompletion({
|
|
305368
|
+
messages: [
|
|
305369
|
+
{ role: "system", content: "You are a software architect. Revise this plan based on the critique." },
|
|
305370
|
+
{
|
|
305371
|
+
role: "user",
|
|
305372
|
+
content: `Original plan:
|
|
305373
|
+
${JSON.stringify(plan, null, 2)}
|
|
305374
|
+
|
|
305375
|
+
Critique issues:
|
|
305376
|
+
${critique.issues.map((i2, idx) => `${idx + 1}. ${i2}`).join("\n")}
|
|
305377
|
+
|
|
305378
|
+
Suggestions:
|
|
305379
|
+
${critique.suggestions.map((s2, idx) => `${idx + 1}. ${s2}`).join("\n")}
|
|
305380
|
+
|
|
305381
|
+
Revise the plan to address these issues. Output the revised plan as JSON.`
|
|
305382
|
+
}
|
|
305383
|
+
],
|
|
305384
|
+
tools: [],
|
|
305385
|
+
temperature: 0,
|
|
305386
|
+
maxTokens: 4096,
|
|
305387
|
+
timeoutMs: config.timeoutMs
|
|
305388
|
+
});
|
|
305389
|
+
const revisedText = revisionResponse.choices?.[0]?.message?.content ?? "";
|
|
305390
|
+
const revisedPlan = parsePlan(revisedText);
|
|
305391
|
+
if (revisedPlan)
|
|
305392
|
+
plan = revisedPlan;
|
|
305393
|
+
} catch {
|
|
305394
|
+
}
|
|
305395
|
+
}
|
|
305396
|
+
}
|
|
305397
|
+
if (!approved) {
|
|
305398
|
+
reason = `Max revisions (${maxRevisions}) reached \u2014 best effort plan (avg score: ${critiques[critiques.length - 1]?.averageScore ?? "?"}/5)`;
|
|
305399
|
+
}
|
|
305400
|
+
let metaCritiqueNote = "";
|
|
305401
|
+
if (planConfig.enableMetaCritique && critiques.length > 0 && approved) {
|
|
305402
|
+
try {
|
|
305403
|
+
const lastCritique = critiques[critiques.length - 1];
|
|
305404
|
+
const backend = new OllamaAgenticBackend(config.backendUrl, config.model, config.apiKey);
|
|
305405
|
+
const metaResponse = await backend.chatCompletion({
|
|
305406
|
+
messages: [
|
|
305407
|
+
{ role: "system", content: "You are a meta-evaluator. Assess the quality of the following critique." },
|
|
305408
|
+
{ role: "user", content: buildMetaCritiquePrompt(lastCritique) }
|
|
305409
|
+
],
|
|
305410
|
+
tools: [],
|
|
305411
|
+
temperature: 0,
|
|
305412
|
+
maxTokens: 1024,
|
|
305413
|
+
timeoutMs: config.timeoutMs
|
|
305414
|
+
});
|
|
305415
|
+
const metaText = metaResponse.choices?.[0]?.message?.content ?? "";
|
|
305416
|
+
const meta = parseMetaCritique(metaText);
|
|
305417
|
+
if (meta) {
|
|
305418
|
+
metaCritiqueNote = `
|
|
305419
|
+
Meta-critique: quality ${meta.quality}/5, thorough: ${meta.thorough}`;
|
|
305420
|
+
if (meta.missed.length > 0)
|
|
305421
|
+
metaCritiqueNote += `, missed: ${meta.missed.join("; ")}`;
|
|
305422
|
+
}
|
|
305423
|
+
} catch {
|
|
305424
|
+
}
|
|
305425
|
+
}
|
|
305426
|
+
const output = [
|
|
305427
|
+
`# Plan: ${plan.task || task}`,
|
|
305428
|
+
`**Status**: ${approved ? "APPROVED" : "BEST EFFORT"} \u2014 ${reason}`,
|
|
305429
|
+
`**Approach**: ${plan.approach}`,
|
|
305430
|
+
`**Estimated turns**: ${plan.estimatedTurns}`,
|
|
305431
|
+
`**Critique iterations**: ${critiques.length}`,
|
|
305432
|
+
metaCritiqueNote,
|
|
305433
|
+
"",
|
|
305434
|
+
"## Steps",
|
|
305435
|
+
...plan.steps.map((s2) => `${s2.step}. [${s2.risk.toUpperCase()}] ${s2.action}` + (s2.tool ? ` \u2192 \`${s2.tool}\`` : "") + (s2.target ? ` on \`${s2.target}\`` : "") + `
|
|
305436
|
+
Expected: ${s2.expectedOutcome}`),
|
|
305437
|
+
"",
|
|
305438
|
+
"## Plan JSON",
|
|
305439
|
+
"```json",
|
|
305440
|
+
JSON.stringify(plan, null, 2),
|
|
305441
|
+
"```"
|
|
305442
|
+
].filter(Boolean).join("\n");
|
|
305443
|
+
return { success: true, output };
|
|
305444
|
+
}
|
|
305445
|
+
};
|
|
305446
|
+
}
|
|
305076
305447
|
function gatherMemorySnippets(root) {
|
|
305077
305448
|
const snippets = [];
|
|
305078
305449
|
const dirs = [
|
|
@@ -310052,6 +310423,7 @@ var init_interactive = __esm({
|
|
|
310052
310423
|
"use strict";
|
|
310053
310424
|
init_dist7();
|
|
310054
310425
|
init_dist7();
|
|
310426
|
+
init_dist7();
|
|
310055
310427
|
init_dist4();
|
|
310056
310428
|
init_dist();
|
|
310057
310429
|
init_listen();
|
package/package.json
CHANGED