pi-shadow-mind 0.1.8 → 0.1.10
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/DESIGN.md +1 -1
- package/README.md +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +56 -12
- package/dist/index.js.map +3 -3
- package/dist/runtime.d.ts +1 -0
- package/dist/runtime.js +28 -12
- package/dist/runtime.js.map +1 -1
- package/dist/session-lifetime.d.ts +8 -0
- package/dist/session-lifetime.js +31 -0
- package/dist/session-lifetime.js.map +1 -0
- package/package.json +1 -1
package/DESIGN.md
CHANGED
|
@@ -155,7 +155,7 @@ Pi 的通用 `ToolDefinition` 没有可供插件查询的只读属性,因此
|
|
|
155
155
|
report_to_main({ content: "..." })
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
插件提供默认运行超时,内置默认值为 `300s`。单个 Shadow 可以通过 `timeout_seconds` 覆盖。超时后插件终止该运行实例、释放并发槽位,并丢弃未完成结果,不向 Main 注入消息。
|
|
159
159
|
|
|
160
160
|
第一版不设置单次 model call 数或工具调用次数上限。运行资源只通过 heartbeat 概率、Shadow 激活概率、最大并发数和时间超时控制。
|
|
161
161
|
|
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ npm pack
|
|
|
23
23
|
The generated `pi-shadow-mind-<version>.tgz` contains the compiled `dist/` extension. Publish it to npm for normal Pi installation, or unpack the standalone ZIP release and install that directory:
|
|
24
24
|
|
|
25
25
|
```powershell
|
|
26
|
-
pi install npm:pi-shadow-mind@0.1.
|
|
26
|
+
pi install npm:pi-shadow-mind@0.1.10
|
|
27
27
|
# or, after unpacking the ZIP
|
|
28
28
|
pi install ./pi-shadow-mind-0.1.0
|
|
29
29
|
```
|
package/dist/config.js
CHANGED
|
@@ -4,7 +4,7 @@ import { inRange, isFiniteNumber, isNonEmptyString, isThinkingLevel } from "./va
|
|
|
4
4
|
export const DEFAULT_CONFIG = {
|
|
5
5
|
heartbeatProbability: 1 / 3,
|
|
6
6
|
maxParallelShadows: 2,
|
|
7
|
-
defaultShadowTimeoutSeconds:
|
|
7
|
+
defaultShadowTimeoutSeconds: 300,
|
|
8
8
|
headlessDrainTimeoutSeconds: 120,
|
|
9
9
|
resultBatchWindowMs: 400,
|
|
10
10
|
defaultThinkingLevel: "low",
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7F,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,oBAAoB,EAAE,CAAC,GAAG,CAAC;IAC3B,kBAAkB,EAAE,CAAC;IACrB,2BAA2B,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7391,7 +7391,7 @@ function isThinkingLevel(value) {
|
|
|
7391
7391
|
var DEFAULT_CONFIG = {
|
|
7392
7392
|
heartbeatProbability: 1 / 3,
|
|
7393
7393
|
maxParallelShadows: 2,
|
|
7394
|
-
defaultShadowTimeoutSeconds:
|
|
7394
|
+
defaultShadowTimeoutSeconds: 300,
|
|
7395
7395
|
headlessDrainTimeoutSeconds: 120,
|
|
7396
7396
|
resultBatchWindowMs: 400,
|
|
7397
7397
|
defaultThinkingLevel: "low"
|
|
@@ -7918,6 +7918,35 @@ function sample(values, count, random) {
|
|
|
7918
7918
|
return copy.slice(0, count);
|
|
7919
7919
|
}
|
|
7920
7920
|
|
|
7921
|
+
// src/session-lifetime.ts
|
|
7922
|
+
var STALE_CONTEXT_MARKER = "This extension ctx is stale after session replacement or reload";
|
|
7923
|
+
var SessionLifetime = class {
|
|
7924
|
+
active = false;
|
|
7925
|
+
activate() {
|
|
7926
|
+
this.active = true;
|
|
7927
|
+
}
|
|
7928
|
+
deactivate() {
|
|
7929
|
+
this.active = false;
|
|
7930
|
+
}
|
|
7931
|
+
get isActive() {
|
|
7932
|
+
return this.active;
|
|
7933
|
+
}
|
|
7934
|
+
run(action) {
|
|
7935
|
+
if (!this.active) return false;
|
|
7936
|
+
try {
|
|
7937
|
+
action();
|
|
7938
|
+
return true;
|
|
7939
|
+
} catch (error) {
|
|
7940
|
+
if (!isStaleExtensionContextError(error)) throw error;
|
|
7941
|
+
this.active = false;
|
|
7942
|
+
return false;
|
|
7943
|
+
}
|
|
7944
|
+
}
|
|
7945
|
+
};
|
|
7946
|
+
function isStaleExtensionContextError(error) {
|
|
7947
|
+
return error instanceof Error && error.message.includes(STALE_CONTEXT_MARKER);
|
|
7948
|
+
}
|
|
7949
|
+
|
|
7921
7950
|
// src/shadow-runner.ts
|
|
7922
7951
|
import { mkdir as mkdir3 } from "node:fs/promises";
|
|
7923
7952
|
import { fileURLToPath } from "node:url";
|
|
@@ -8317,6 +8346,7 @@ var ShadowMindRuntime = class {
|
|
|
8317
8346
|
active = /* @__PURE__ */ new Map();
|
|
8318
8347
|
recentEvents = [];
|
|
8319
8348
|
batcher;
|
|
8349
|
+
sessionLifetime = new SessionLifetime();
|
|
8320
8350
|
epoch = 0;
|
|
8321
8351
|
modelCalls = 0;
|
|
8322
8352
|
paused = false;
|
|
@@ -8332,6 +8362,7 @@ var ShadowMindRuntime = class {
|
|
|
8332
8362
|
}
|
|
8333
8363
|
registerEvents() {
|
|
8334
8364
|
this.pi.on("session_start", async (_event, ctx) => {
|
|
8365
|
+
this.sessionLifetime.activate();
|
|
8335
8366
|
this.latestContext = ctx;
|
|
8336
8367
|
this.modelCalls = 0;
|
|
8337
8368
|
await this.configStore.initialize();
|
|
@@ -8364,6 +8395,7 @@ var ShadowMindRuntime = class {
|
|
|
8364
8395
|
this.abortAll("session-shutdown");
|
|
8365
8396
|
ctx.ui.setStatus("shadow-mind", void 0);
|
|
8366
8397
|
ctx.ui.setWidget("shadow-mind-panel", void 0);
|
|
8398
|
+
this.sessionLifetime.deactivate();
|
|
8367
8399
|
});
|
|
8368
8400
|
}
|
|
8369
8401
|
registerUi() {
|
|
@@ -8456,12 +8488,20 @@ var ShadowMindRuntime = class {
|
|
|
8456
8488
|
modelAuthOk: (model) => ctx.modelRegistry.hasConfiguredAuth(model) || ctx.modelRegistry.isUsingOAuth(model),
|
|
8457
8489
|
mainThinkingLevel: ctx.thinkingLevel,
|
|
8458
8490
|
onReport: (report) => this.acceptReport(report)
|
|
8459
|
-
}).then((result) => this.handleRunEnd(runId, shadow, result))
|
|
8491
|
+
}).then((result) => this.handleRunEnd(runId, shadow, result)).catch((error) => {
|
|
8492
|
+
this.active.delete(runId);
|
|
8493
|
+
this.record("run-end", {
|
|
8494
|
+
runId,
|
|
8495
|
+
shadowId: shadow.id,
|
|
8496
|
+
reason: "error",
|
|
8497
|
+
error: error instanceof Error ? error.message : String(error)
|
|
8498
|
+
});
|
|
8499
|
+
});
|
|
8460
8500
|
}
|
|
8461
8501
|
handleRunEnd(runId, shadow, result) {
|
|
8462
8502
|
this.active.delete(runId);
|
|
8463
8503
|
this.record("run-end", { runId, shadowId: shadow.id, ...result });
|
|
8464
|
-
if (this.latestContext) this.updateStatus(this.latestContext);
|
|
8504
|
+
if (this.latestContext && this.sessionLifetime.isActive) this.updateStatus(this.latestContext);
|
|
8465
8505
|
}
|
|
8466
8506
|
acceptReport(report) {
|
|
8467
8507
|
if (report.epoch !== this.epoch) return;
|
|
@@ -8473,12 +8513,14 @@ var ShadowMindRuntime = class {
|
|
|
8473
8513
|
const content = formatReportBatch(current);
|
|
8474
8514
|
this.record("report-delivered", { runIds: current.map((report) => report.runId), count: current.length });
|
|
8475
8515
|
const idle = this.latestContext?.isIdle() ?? true;
|
|
8476
|
-
this.
|
|
8477
|
-
|
|
8478
|
-
|
|
8479
|
-
|
|
8480
|
-
|
|
8481
|
-
|
|
8516
|
+
this.sessionLifetime.run(() => {
|
|
8517
|
+
this.pi.sendMessage({
|
|
8518
|
+
customType: "shadow-report",
|
|
8519
|
+
content,
|
|
8520
|
+
display: true,
|
|
8521
|
+
details: { reports: current.map(({ shadowId, runId }) => ({ shadowId, runId })) }
|
|
8522
|
+
}, { triggerTurn: true, deliverAs: idle ? "followUp" : "steer" });
|
|
8523
|
+
});
|
|
8482
8524
|
}
|
|
8483
8525
|
async refresh(ctx) {
|
|
8484
8526
|
const config = await this.configStore.reload();
|
|
@@ -8514,11 +8556,13 @@ var ShadowMindRuntime = class {
|
|
|
8514
8556
|
const event = { at: (/* @__PURE__ */ new Date()).toISOString(), kind, epoch: this.epoch, data };
|
|
8515
8557
|
this.recentEvents.push(event);
|
|
8516
8558
|
if (this.recentEvents.length > 20) this.recentEvents.shift();
|
|
8517
|
-
this.pi.appendEntry("shadow-mind-event", event);
|
|
8559
|
+
this.sessionLifetime.run(() => this.pi.appendEntry("shadow-mind-event", event));
|
|
8518
8560
|
}
|
|
8519
8561
|
updateStatus(ctx) {
|
|
8520
|
-
|
|
8521
|
-
|
|
8562
|
+
this.sessionLifetime.run(() => {
|
|
8563
|
+
ctx.ui.setStatus("shadow-mind", `\u{1F419} ${this.active.size}${this.paused ? " paused" : ""}${this.diagnostics.length || this.hasRecentRunErrors() ? " !" : ""}`);
|
|
8564
|
+
if (this.panelVisible) ctx.ui.setWidget("shadow-mind-panel", this.statusLines(), { placement: "aboveEditor" });
|
|
8565
|
+
});
|
|
8522
8566
|
}
|
|
8523
8567
|
hasRecentRunErrors() {
|
|
8524
8568
|
return this.recentEvents.slice(-3).some((event) => event.kind === "run-end" && (event.data?.reason === "error" || event.data?.reason === "timeout"));
|