newmark-agent 0.3.5 → 0.3.7
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/Flow/Electron-Debug-Release.Flow.json +43 -43
- package/Flow/Flow.md +8 -8
- package/Flow/UI-Feature-Integration.Flow.json +96 -96
- package/dist/conversation-utility-host.bundle.cjs +154 -11
- package/dist/core/agent.d.ts +2 -0
- package/dist/core/agent.js +126 -2
- package/dist/core/agentKernelRunner.js +4 -0
- package/dist/core/automationWake.js +37 -37
- package/dist/core/subagent.d.ts +1 -0
- package/dist/core/subagent.js +15 -3
- package/dist/core/toolPolicy.js +2 -0
- package/dist/main.js +60 -60
- package/dist/tools/index.js +13 -6
- package/dist/tools/nativeTools.js +2 -0
- package/dist/ui/index.html +1 -1
- package/dist/wsl-agent-host.bundle.cjs +154 -11
- package/package.json +1 -1
- package/dist/windows-process-tree-helper.dll +0 -0
|
@@ -327015,6 +327015,8 @@ var NATIVE_TOOL_CATALOG = [
|
|
|
327015
327015
|
{ name: "subagent_close", label: "Subagent close", description: "Close a same-conversation peer agent.", category: "agent", defaultEnabled: true, protected: true, availability: "mode-scoped" },
|
|
327016
327016
|
{ name: "linked_plan", label: "Linked plan", description: "Read or conservatively update the conversation-linked Markdown plan.", category: "agent", defaultEnabled: true, protected: true, availability: "mode-scoped" },
|
|
327017
327017
|
{ name: "build_history_query", label: "Build history query", description: "Read concrete public work details for one historical Build Block.", category: "agent", defaultEnabled: true, protected: true, availability: "mode-scoped" },
|
|
327018
|
+
{ name: "context_compress", label: "Context compress", description: "Actively compress the LLM context history, leaving the displayed conversation history unchanged.", category: "agent", defaultEnabled: true, protected: true, availability: "mode-scoped" },
|
|
327019
|
+
{ name: "context_history_manage", label: "Context history manage", description: "List, remove, or summarize entries in the LLM context history without touching the displayed conversation history.", category: "agent", defaultEnabled: true, protected: true, availability: "mode-scoped" },
|
|
327018
327020
|
{ name: "question", label: "Ask question", description: "Ask the user for structured option feedback.", category: "agent", defaultEnabled: true, protected: true, availability: "mode-scoped" },
|
|
327019
327021
|
{ name: "skill_download", label: "Skill download", description: "Download and install a skill.", category: "agent", defaultEnabled: true },
|
|
327020
327022
|
{ name: "skill", label: "Skill", description: "Search enabled skill metadata or load one skill body on demand.", category: "agent", defaultEnabled: true, protected: true, availability: "mode-scoped" },
|
|
@@ -334509,6 +334511,8 @@ var MODE_SCOPED_TOOLS = /* @__PURE__ */ new Set([
|
|
|
334509
334511
|
"pdf_read",
|
|
334510
334512
|
"linked_plan",
|
|
334511
334513
|
"build_history_query",
|
|
334514
|
+
"context_compress",
|
|
334515
|
+
"context_history_manage",
|
|
334512
334516
|
"question",
|
|
334513
334517
|
"task",
|
|
334514
334518
|
"subagent_list",
|
|
@@ -335526,14 +335530,21 @@ var ToolExecutor = class {
|
|
|
335526
335530
|
remote_root: { type: "string" },
|
|
335527
335531
|
remote_path: { type: "string" }
|
|
335528
335532
|
}, ["action"]),
|
|
335529
|
-
t3("task", "Create a same-conversation peer agent and return immediately. The peer has a
|
|
335530
|
-
t3("subagent_list", "List flat same-conversation peer agents, optionally filtered by status.", { status: { type: "string", enum: ["idle", "queued", "working", "completed", "error", "closed"] } }, []),
|
|
335531
|
-
t3("subagent_read", "Read one same-conversation peer status, queue/mailbox summary, latest bounded feedback, and result. Available for running, queued, completed, error, and closed peers.", { id: { type: "string" }, name: { type: "string" }, max_chars: { type: "number", description: "Bounded result size from 2000 to 32000 characters." } }, []),
|
|
335532
|
-
t3("subagent_send", "Persist a mailbox message to a same-conversation peer agent.", { id: { type: "string" }, name: { type: "string" }, message: { type: "string" }, prompt: { type: "string", description: "Legacy alias for message." }, kind: { type: "string", enum: ["directive", "question", "result", "handoff"] }, reply_to: { type: "string" }, correlation_id: { type: "string" } }, []),
|
|
335533
|
-
t3("subagent_result", "Return the persisted transcript, mailbox summary, status, and latest result for a peer agent.", { id: { type: "string" }, name: { type: "string" } }, []),
|
|
335534
|
-
t3("subagent_close", "Close a same-conversation peer. Root can close any peer; a peer can close only itself.", { id: { type: "string" }, name: { type: "string" } }, []),
|
|
335533
|
+
t3("task", "Create a same-conversation peer agent and return immediately. The peer has a stable human-readable name, a short id, and a canonical UUID-qualified identity. The peer name is decoupled from its id: pass name for readable references and id for exact targeting. Pass model to select an exact configured model deployment (deployment:providerId:modelId or an unambiguous provider/model name). When model is omitted, the peer inherits the parent Agent's currently resolved model deployment. Plan mode peers are forced to Plan.", { nature: { type: "string" }, name: { type: "string", description: "Legacy alias for nature." }, prompt: { type: "string" }, preset: { type: "string" }, agent: { type: "string" }, model: { type: "string", description: "Optional exact model deployment. Omit to inherit the parent Agent resolved model." }, mode: { type: "string" }, input_mode: { type: "string" }, flow: { type: "string" } }, ["prompt"]),
|
|
335534
|
+
t3("subagent_list", "List flat same-conversation peer agents, optionally filtered by status. Each entry exposes both the stable name and the exact id; use the id for any subsequent targeting.", { status: { type: "string", enum: ["idle", "queued", "working", "completed", "error", "closed"] } }, []),
|
|
335535
|
+
t3("subagent_read", "Read one same-conversation peer status, queue/mailbox summary, latest bounded feedback, and result. Available for running, queued, completed, error, and closed peers. Pass the exact id returned by subagent_list, or a name for convenience lookup.", { id: { type: "string", description: "Exact peer id from subagent_list." }, name: { type: "string", description: "Convenience peer name; ambiguous names resolve to the first match." }, max_chars: { type: "number", description: "Bounded result size from 2000 to 32000 characters." } }, []),
|
|
335536
|
+
t3("subagent_send", "Persist a mailbox message to a same-conversation peer agent. Target by exact id (preferred) or name.", { id: { type: "string", description: "Exact peer id from subagent_list." }, name: { type: "string", description: "Convenience peer name." }, message: { type: "string" }, prompt: { type: "string", description: "Legacy alias for message." }, kind: { type: "string", enum: ["directive", "question", "result", "handoff"] }, reply_to: { type: "string" }, correlation_id: { type: "string" } }, []),
|
|
335537
|
+
t3("subagent_result", "Return the persisted transcript, mailbox summary, status, and latest result for a peer agent. Target by exact id (preferred) or name.", { id: { type: "string", description: "Exact peer id from subagent_list." }, name: { type: "string", description: "Convenience peer name." } }, []),
|
|
335538
|
+
t3("subagent_close", "Close a same-conversation peer. Root can close any peer; a peer can close only itself. Target by exact id (preferred) or name.", { id: { type: "string", description: "Exact peer id from subagent_list." }, name: { type: "string", description: "Convenience peer name." } }, []),
|
|
335535
335539
|
t3("linked_plan", "Read or update the current conversation linked Markdown plan. Update requires the current expected_revision.", { action: { type: "string", enum: ["get", "update"] }, markdown: { type: "string" }, expected_revision: { type: "number" } }, ["action"]),
|
|
335536
335540
|
t3("build_history_query", "Read the concrete public work details of one historical Build Block. The prompt already exposes user input, final summary, and completion status; call this read-only tool only when the user asks what specifically happened. Select by newest-to-oldest history_index, or by run_id returned from an earlier query.", { history_index: { type: "number", minimum: 1, description: "1-based historical Build Block index from the request ledger; 1 is the newest previous task." }, run_id: { type: "string", description: "Exact run id returned by an earlier build_history_query result." }, max_events: { type: "number", minimum: 1, maximum: 200, description: "Maximum trailing public work events; defaults to 80." } }, []),
|
|
335541
|
+
t3("context_compress", "Actively compress the LLM context history for this conversation. This collapses older history entries into a concise summary while preserving the recent tail, which reduces context tokens and cost. IMPORTANT: it affects only the LLM context (what the model sees); the displayed conversation history shown to the user is never altered. Call this when the conversation is long, token pressure is high, or you judge that older turns are no longer needed in full. Idempotent and safe: repeated calls produce incremental summaries.", { keep_recent: { type: "number", minimum: 2, maximum: 60, description: "Recent message count to keep uncompressed at the tail. Defaults to the configured keep_recent_messages." }, force: { type: "boolean", description: "Compress even if the context is not yet over the automatic threshold. Defaults to false." } }, []),
|
|
335542
|
+
t3("context_history_manage", "Manage the LLM context history for this conversation without affecting the displayed conversation history. This is the active context-management surface. Actions: list returns a bounded index of context entries (position, role, name, length, first-line preview); remove deletes the entry at a given position; summarize replaces a contiguous range of context entries with a concise local summary entry. The displayed conversation history (what the user sees) is never modified by any action.", {
|
|
335543
|
+
action: { type: "string", enum: ["list", "remove", "summarize"], description: "list: index context entries. remove: delete the entry at position. summarize: fold entries [from, to] into one summary entry." },
|
|
335544
|
+
position: { type: "number", minimum: 0, description: "0-based context entry index for remove, or the start of the range for summarize." },
|
|
335545
|
+
to: { type: "number", minimum: 0, description: "0-based inclusive end of the range for summarize. Defaults to position." },
|
|
335546
|
+
limit: { type: "number", minimum: 5, maximum: 400, description: "Maximum context entries to list; defaults to 200." }
|
|
335547
|
+
}, ["action"]),
|
|
335537
335548
|
t3("question", "Ask user a multiple-choice question", { questions: { type: "array" } }, ["questions"]),
|
|
335538
335549
|
t3("skill_download", "Download a skill", { name: { type: "string" }, source: { type: "string" } }, ["name", "source"]),
|
|
335539
335550
|
t3("skill", "Search enabled skill metadata or load one exact skill body on demand. Use query when unsure, then name to load the selected skill.", { query: { type: "string", maxLength: 200 }, name: { type: "string", maxLength: 200 } }, []),
|
|
@@ -337619,7 +337630,7 @@ var SubagentManager = class {
|
|
|
337619
337630
|
natureSlug: slug,
|
|
337620
337631
|
displayName,
|
|
337621
337632
|
qualifiedName,
|
|
337622
|
-
name:
|
|
337633
|
+
name: slug,
|
|
337623
337634
|
conversationId: this.conversationId,
|
|
337624
337635
|
createdByAgentId,
|
|
337625
337636
|
prompt,
|
|
@@ -337630,7 +337641,7 @@ var SubagentManager = class {
|
|
|
337630
337641
|
flowName: flowName || void 0,
|
|
337631
337642
|
flowPc: Math.max(0, Math.floor(Number(flowPc) || 0)),
|
|
337632
337643
|
status: "queued",
|
|
337633
|
-
messages: [{ role: "system", content: `Peer agent '${
|
|
337644
|
+
messages: [{ role: "system", content: `Peer agent '${slug}' (${id}): ${prompt}` }, { role: "user", content: prompt, hidden_user_input: true }],
|
|
337634
337645
|
result: null,
|
|
337635
337646
|
createdAt: stamp,
|
|
337636
337647
|
updatedAt: stamp
|
|
@@ -337640,7 +337651,10 @@ var SubagentManager = class {
|
|
|
337640
337651
|
return id;
|
|
337641
337652
|
}
|
|
337642
337653
|
get(id) {
|
|
337643
|
-
|
|
337654
|
+
if (this.subs.has(id)) return this.subs.get(id);
|
|
337655
|
+
const exact = [...this.subs.values()].find((item) => item.id === id || item.qualifiedName === id);
|
|
337656
|
+
if (exact) return exact;
|
|
337657
|
+
return [...this.subs.values()].find((item) => item.name === id || item.displayName === id || item.shortId === id || item.natureSlug === natureSlug(id));
|
|
337644
337658
|
}
|
|
337645
337659
|
send(id, prompt) {
|
|
337646
337660
|
const target = this.get(id);
|
|
@@ -337788,6 +337802,7 @@ var SubagentManager = class {
|
|
|
337788
337802
|
natureSlug: record.natureSlug,
|
|
337789
337803
|
displayName: record.displayName,
|
|
337790
337804
|
qualifiedName: record.qualifiedName,
|
|
337805
|
+
name: record.name,
|
|
337791
337806
|
createdByAgentId: record.createdByAgentId,
|
|
337792
337807
|
status: record.status,
|
|
337793
337808
|
active: record.status !== "closed",
|
|
@@ -340416,6 +340431,8 @@ async function executeNewmarkTool(agent, name50, args, inputSchema, signal) {
|
|
|
340416
340431
|
if (name50 === "subagent_close") return agent.handleSubagentCloseEnvelope(args).output;
|
|
340417
340432
|
if (name50 === "linked_plan") return agent.handleLinkedPlanTool(args);
|
|
340418
340433
|
if (name50 === "build_history_query") return agent.handleBuildHistoryQuery(args);
|
|
340434
|
+
if (name50 === "context_compress") return (await agent.handleContextCompress(args, signal)).output;
|
|
340435
|
+
if (name50 === "context_history_manage") return agent.handleContextHistoryManage(args).output;
|
|
340419
340436
|
if (name50 === "question") {
|
|
340420
340437
|
if (agent.config.getStr("agent", "option_feedback") === "fully_autonomous") return "[question] Disabled by fully_autonomous option feedback.";
|
|
340421
340438
|
if (!agent.handleQuestion(args)) return "[Question rejected: at least one question with two labeled options is required.]";
|
|
@@ -346152,6 +346169,132 @@ Review this persisted peer result and summarize or continue the parent task as n
|
|
|
346152
346169
|
truncatedActivities: Math.max(0, publicEvents.length - activities.length)
|
|
346153
346170
|
});
|
|
346154
346171
|
}
|
|
346172
|
+
async handleContextCompress(args, signal) {
|
|
346173
|
+
let input2 = {};
|
|
346174
|
+
try {
|
|
346175
|
+
input2 = JSON.parse(args || "{}");
|
|
346176
|
+
} catch {
|
|
346177
|
+
}
|
|
346178
|
+
if (this.history.length <= 1) return { ok: false, output: "[context_compress] No context to compress.", error: "No context to compress." };
|
|
346179
|
+
const previousKeepLast = this.config.getNum("context", "keep_recent_messages");
|
|
346180
|
+
const keepRecent = Math.max(2, Math.min(60, Math.floor(Number(input2.keep_recent) || previousKeepLast || 10)));
|
|
346181
|
+
const force = Boolean(input2.force);
|
|
346182
|
+
try {
|
|
346183
|
+
this.config.set("context", "keep_recent_messages", keepRecent);
|
|
346184
|
+
const msgs = this.history.map((message) => ({ ...message }));
|
|
346185
|
+
const provider = this.engineModel();
|
|
346186
|
+
await this.maybeCompress(msgs, provider, signal, this.activeModelName(), force);
|
|
346187
|
+
if (this.history.length <= 1) return { ok: false, output: "[context_compress] Compression skipped: context unchanged.", error: "Compression skipped." };
|
|
346188
|
+
return {
|
|
346189
|
+
ok: true,
|
|
346190
|
+
output: JSON.stringify({
|
|
346191
|
+
ok: true,
|
|
346192
|
+
compressed: true,
|
|
346193
|
+
at: this.lastCompression?.at,
|
|
346194
|
+
originalMessages: this.lastCompression?.originalMessages,
|
|
346195
|
+
compressedMessages: this.lastCompression?.compressedMessages,
|
|
346196
|
+
originalChars: this.lastCompression?.originalChars,
|
|
346197
|
+
compressedChars: this.lastCompression?.compressedChars,
|
|
346198
|
+
estimatedTokens: this.lastCompression?.compressedTokens,
|
|
346199
|
+
summary: this.lastCompression?.summary?.slice(0, 2e3),
|
|
346200
|
+
model: this.lastCompression?.model,
|
|
346201
|
+
fallback: this.lastCompression?.fallback,
|
|
346202
|
+
displayHistory: { untouched: true, messageCount: this.chatMessages.length }
|
|
346203
|
+
}, null, 2),
|
|
346204
|
+
metadata: { kind: "context-compress" }
|
|
346205
|
+
};
|
|
346206
|
+
} finally {
|
|
346207
|
+
this.config.set("context", "keep_recent_messages", previousKeepLast);
|
|
346208
|
+
}
|
|
346209
|
+
}
|
|
346210
|
+
handleContextHistoryManage(args) {
|
|
346211
|
+
let input2 = {};
|
|
346212
|
+
try {
|
|
346213
|
+
input2 = JSON.parse(args || "{}");
|
|
346214
|
+
} catch {
|
|
346215
|
+
}
|
|
346216
|
+
const action = String(input2.action || "").trim();
|
|
346217
|
+
if (!action) return { ok: false, output: "[context_history_manage] action is required (list|remove|summarize).", error: "action is required." };
|
|
346218
|
+
if (action === "list") {
|
|
346219
|
+
const limit = Math.max(5, Math.min(400, Math.floor(Number(input2.limit || 200))));
|
|
346220
|
+
const entries = this.history.slice(0, limit).map((message, index) => ({
|
|
346221
|
+
position: index,
|
|
346222
|
+
role: String(message.role || ""),
|
|
346223
|
+
name: String(message.name || ""),
|
|
346224
|
+
chars: typeof message.content === "string" ? message.content.length : JSON.stringify(message.content || "").length,
|
|
346225
|
+
preview: this.compressionHistoryContent(message.content || "").slice(0, 160)
|
|
346226
|
+
}));
|
|
346227
|
+
return {
|
|
346228
|
+
ok: true,
|
|
346229
|
+
output: JSON.stringify({
|
|
346230
|
+
ok: true,
|
|
346231
|
+
action: "list",
|
|
346232
|
+
entryCount: this.history.length,
|
|
346233
|
+
listed: entries.length,
|
|
346234
|
+
entries,
|
|
346235
|
+
displayHistory: { untouched: true, messageCount: this.chatMessages.length }
|
|
346236
|
+
}, null, 2),
|
|
346237
|
+
metadata: { kind: "context-history-list" }
|
|
346238
|
+
};
|
|
346239
|
+
}
|
|
346240
|
+
if (action === "remove") {
|
|
346241
|
+
const position = Math.floor(Number(input2.position));
|
|
346242
|
+
if (!Number.isFinite(position) || position < 0 || position >= this.history.length) {
|
|
346243
|
+
return { ok: false, output: `[context_history_manage] remove position ${position} out of range (0..${this.history.length - 1}).`, error: "remove position out of range." };
|
|
346244
|
+
}
|
|
346245
|
+
const removed = this.history.splice(position, 1)[0];
|
|
346246
|
+
this.saveWorkspaceConversationState(true);
|
|
346247
|
+
return {
|
|
346248
|
+
ok: true,
|
|
346249
|
+
output: JSON.stringify({
|
|
346250
|
+
ok: true,
|
|
346251
|
+
action: "remove",
|
|
346252
|
+
removedPosition: position,
|
|
346253
|
+
removedRole: String(removed?.role || ""),
|
|
346254
|
+
remaining: this.history.length,
|
|
346255
|
+
displayHistory: { untouched: true, messageCount: this.chatMessages.length }
|
|
346256
|
+
}, null, 2),
|
|
346257
|
+
metadata: { kind: "context-history-remove" }
|
|
346258
|
+
};
|
|
346259
|
+
}
|
|
346260
|
+
if (action === "summarize") {
|
|
346261
|
+
const from = Math.max(0, Math.floor(Number(input2.position || 0)));
|
|
346262
|
+
const toRaw = Math.floor(Number(input2.to ?? input2.position));
|
|
346263
|
+
const to = Number.isFinite(toRaw) ? Math.min(this.history.length - 1, Math.max(from, toRaw)) : from;
|
|
346264
|
+
if (from >= this.history.length) return { ok: false, output: `[context_history_manage] summarize position ${from} out of range (0..${this.history.length - 1}).`, error: "summarize position out of range." };
|
|
346265
|
+
if (to - from < 1) return { ok: false, output: "[context_history_manage] summarize requires at least two entries in range.", error: "summarize requires a range of at least two entries." };
|
|
346266
|
+
const segment = this.history.slice(from, to + 1);
|
|
346267
|
+
const chars = segment.reduce((sum, message) => sum + (typeof message.content === "string" ? message.content.length : JSON.stringify(message.content || "").length), 0);
|
|
346268
|
+
const summary = this.localCompressionSummary(
|
|
346269
|
+
`Workspace: ${this.workspace.current?.path || this.rootPath}
|
|
346270
|
+
Mode: ${this.modeName()}`,
|
|
346271
|
+
segment.map((message, i4) => `#${i4 + 1} [${String(message.role || "unknown")}${message.name ? ` ${String(message.name)}` : ""}]
|
|
346272
|
+
${this.compressionHistoryContent(message.content || "")}`).join("\n\n").slice(0, 2e4),
|
|
346273
|
+
segment.length,
|
|
346274
|
+
chars
|
|
346275
|
+
);
|
|
346276
|
+
const replacement = { role: "system", content: `[Context History Summary]
|
|
346277
|
+
${summary}` };
|
|
346278
|
+
this.history.splice(from, to - from + 1, replacement);
|
|
346279
|
+
this.saveWorkspaceConversationState(true);
|
|
346280
|
+
return {
|
|
346281
|
+
ok: true,
|
|
346282
|
+
output: JSON.stringify({
|
|
346283
|
+
ok: true,
|
|
346284
|
+
action: "summarize",
|
|
346285
|
+
foldedFrom: from,
|
|
346286
|
+
foldedTo: to,
|
|
346287
|
+
foldedEntries: to - from + 1,
|
|
346288
|
+
foldedChars: chars,
|
|
346289
|
+
remaining: this.history.length,
|
|
346290
|
+
summary: summary.slice(0, 2e3),
|
|
346291
|
+
displayHistory: { untouched: true, messageCount: this.chatMessages.length }
|
|
346292
|
+
}, null, 2),
|
|
346293
|
+
metadata: { kind: "context-history-summarize" }
|
|
346294
|
+
};
|
|
346295
|
+
}
|
|
346296
|
+
return { ok: false, output: `[context_history_manage] Unknown action: ${action}`, error: `Unknown action: ${action}` };
|
|
346297
|
+
}
|
|
346155
346298
|
recordContextCompressionStep() {
|
|
346156
346299
|
const runId = this.currentWorkRunId();
|
|
346157
346300
|
if (!runId) return;
|
|
@@ -348019,7 +348162,7 @@ ${settled?.result || settled?.error || ""}`.trim();
|
|
|
348019
348162
|
const transcript = sa.messages.map((m2) => `[${m2.role}] ${m2.content}`).join("\n");
|
|
348020
348163
|
return this.subagents.toToolResult(
|
|
348021
348164
|
sa.id,
|
|
348022
|
-
`get.subagent("${sa.name}")
|
|
348165
|
+
`get.subagent("${sa.name}", id="${sa.id}")
|
|
348023
348166
|
Status: ${sa.status}
|
|
348024
348167
|
Model: ${sa.model}
|
|
348025
348168
|
Mode: ${sa.agentMode}
|
|
@@ -348811,7 +348954,7 @@ Falling back to built-in engine.` }];
|
|
|
348811
348954
|
if (!this.config.getBool("context", "auto_compress")) return;
|
|
348812
348955
|
const total = msgs.reduce((sum, m2) => sum + (typeof m2.content === "string" ? m2.content.length : JSON.stringify(m2.content || "").length), 0);
|
|
348813
348956
|
const budget = this.compressionBudget(msgs);
|
|
348814
|
-
if (budget.estimatedTokens < budget.triggerTokens) return;
|
|
348957
|
+
if (budget.estimatedTokens < budget.triggerTokens && !force) return;
|
|
348815
348958
|
if (!force && this.lastCompression && String(msgs[0]?.content || "").includes(this.lastCompression.summary)) {
|
|
348816
348959
|
const baselineChars = Math.max(0, Number(this.lastCompression.compressedChars || 0));
|
|
348817
348960
|
const baselineTokens = Math.max(0, Number(this.lastCompression.compressedTokens || 0));
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "newmark-agent",
|
|
3
3
|
"productName": "Newmark Agent",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.7",
|
|
5
5
|
"description": "Newmark Agent — Portable AI coding agent with rich GUI and CLI (TypeScript)",
|
|
6
6
|
"homepage": "https://github.com/positer/Newmark-Agent",
|
|
7
7
|
"repository": {
|
|
Binary file
|