@saifymatteo/pi-extensions 0.0.0-stage → 0.1.0
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/LICENSE +661 -0
- package/NOTICE.md +20 -0
- package/README.md +151 -2
- package/inventory.json +73 -0
- package/package.json +74 -4
- package/packages/pi-bg-bash/LICENSE +661 -0
- package/packages/pi-bg-bash/NOTICE.md +3 -0
- package/packages/pi-bg-bash/README.md +41 -0
- package/packages/pi-bg-bash/examples/settings.example.json +6 -0
- package/packages/pi-bg-bash/package.json +38 -0
- package/packages/pi-bg-bash/src/index.ts +969 -0
- package/packages/pi-bg-bash/src/lib/async-work.ts +27 -0
- package/packages/pi-bg-bash/test/bg-bash.test.mjs +34 -0
- package/packages/pi-claude-usage/LICENSE +661 -0
- package/packages/pi-claude-usage/NOTICE.md +3 -0
- package/packages/pi-claude-usage/README.md +27 -0
- package/packages/pi-claude-usage/package.json +35 -0
- package/packages/pi-claude-usage/src/index.ts +130 -0
- package/packages/pi-clipboard-image/LICENSE +661 -0
- package/packages/pi-clipboard-image/NOTICE.md +3 -0
- package/packages/pi-clipboard-image/README.md +27 -0
- package/packages/pi-clipboard-image/package.json +36 -0
- package/packages/pi-clipboard-image/src/index.ts +527 -0
- package/packages/pi-codeblock-borders/LICENSE +661 -0
- package/packages/pi-codeblock-borders/NOTICE.md +3 -0
- package/packages/pi-codeblock-borders/README.md +30 -0
- package/packages/pi-codeblock-borders/package.json +35 -0
- package/packages/pi-codeblock-borders/src/index.ts +302 -0
- package/packages/pi-codegraph/LICENSE +661 -0
- package/packages/pi-codegraph/NOTICE.md +5 -0
- package/packages/pi-codegraph/README.md +35 -0
- package/packages/pi-codegraph/examples/codegraph.example.json +4 -0
- package/packages/pi-codegraph/package.json +37 -0
- package/packages/pi-codegraph/src/index.ts +573 -0
- package/packages/pi-codegraph/test/codegraph.test.mjs +21 -0
- package/packages/pi-compact-tools/LICENSE +661 -0
- package/packages/pi-compact-tools/NOTICE.md +3 -0
- package/packages/pi-compact-tools/README.md +27 -0
- package/packages/pi-compact-tools/package.json +36 -0
- package/packages/pi-compact-tools/src/index.ts +1161 -0
- package/packages/pi-decisions/LICENSE +661 -0
- package/packages/pi-decisions/NOTICE.md +3 -0
- package/packages/pi-decisions/README.md +37 -0
- package/packages/pi-decisions/examples/service-models.example.json +27 -0
- package/packages/pi-decisions/package.json +37 -0
- package/packages/pi-decisions/src/index.ts +364 -0
- package/packages/pi-decisions/src/lib/service-models.ts +95 -0
- package/packages/pi-decisions/test/service-models.test.mjs +71 -0
- package/packages/pi-load-pi-dotenv/LICENSE +661 -0
- package/packages/pi-load-pi-dotenv/NOTICE.md +3 -0
- package/packages/pi-load-pi-dotenv/README.md +27 -0
- package/packages/pi-load-pi-dotenv/package.json +32 -0
- package/packages/pi-load-pi-dotenv/src/index.ts +66 -0
- package/packages/pi-model-go/LICENSE +661 -0
- package/packages/pi-model-go/NOTICE.md +5 -0
- package/packages/pi-model-go/README.md +33 -0
- package/packages/pi-model-go/package.json +36 -0
- package/packages/pi-model-go/src/index.ts +171 -0
- package/packages/pi-model-go/src/lib/dialog.ts +31 -0
- package/packages/pi-model-go/src/lib/model-go.ts +239 -0
- package/packages/pi-model-go/test/behavior.test.mjs +17 -0
- package/packages/pi-prestart-working/LICENSE +661 -0
- package/packages/pi-prestart-working/NOTICE.md +3 -0
- package/packages/pi-prestart-working/README.md +25 -0
- package/packages/pi-prestart-working/package.json +35 -0
- package/packages/pi-prestart-working/src/index.ts +86 -0
- package/packages/pi-prestart-working/test/behavior.test.mjs +56 -0
- package/packages/pi-root-guard/LICENSE +661 -0
- package/packages/pi-root-guard/NOTICE.md +3 -0
- package/packages/pi-root-guard/README.md +27 -0
- package/packages/pi-root-guard/package.json +32 -0
- package/packages/pi-root-guard/src/index.ts +202 -0
- package/packages/pi-session-finder/LICENSE +661 -0
- package/packages/pi-session-finder/NOTICE.md +3 -0
- package/packages/pi-session-finder/README.md +33 -0
- package/packages/pi-session-finder/package.json +36 -0
- package/packages/pi-session-finder/src/index.ts +306 -0
- package/packages/pi-session-finder/src/lib/dialog.ts +31 -0
- package/packages/pi-session-finder/test/behavior.test.mjs +18 -0
- package/packages/pi-session-id/LICENSE +661 -0
- package/packages/pi-session-id/NOTICE.md +3 -0
- package/packages/pi-session-id/README.md +31 -0
- package/packages/pi-session-id/package.json +35 -0
- package/packages/pi-session-id/src/index.ts +20 -0
- package/packages/pi-session-id/test/behavior.test.mjs +25 -0
- package/packages/pi-session-nav/LICENSE +661 -0
- package/packages/pi-session-nav/NOTICE.md +3 -0
- package/packages/pi-session-nav/README.md +32 -0
- package/packages/pi-session-nav/package.json +36 -0
- package/packages/pi-session-nav/src/index.ts +203 -0
- package/packages/pi-session-nav/src/lib/dialog.ts +31 -0
- package/packages/pi-session-nav/test/behavior.test.mjs +36 -0
- package/packages/pi-session-rename/LICENSE +661 -0
- package/packages/pi-session-rename/NOTICE.md +3 -0
- package/packages/pi-session-rename/README.md +31 -0
- package/packages/pi-session-rename/package.json +35 -0
- package/packages/pi-session-rename/src/index.ts +456 -0
- package/packages/pi-session-rename/test/behavior.test.mjs +10 -0
- package/packages/pi-session-retention/LICENSE +661 -0
- package/packages/pi-session-retention/NOTICE.md +3 -0
- package/packages/pi-session-retention/README.md +62 -0
- package/packages/pi-session-retention/package.json +36 -0
- package/packages/pi-session-retention/src/README.md +42 -0
- package/packages/pi-session-retention/src/core.ts +333 -0
- package/packages/pi-session-retention/src/dialog.ts +118 -0
- package/packages/pi-session-retention/src/index.ts +311 -0
- package/packages/pi-session-retention/src/lib/dialog.ts +31 -0
- package/packages/pi-session-retention/src/safety.ts +50 -0
- package/packages/pi-session-retention/test/behavior.test.mjs +42 -0
- package/packages/pi-skill-usage-log/LICENSE +661 -0
- package/packages/pi-skill-usage-log/NOTICE.md +3 -0
- package/packages/pi-skill-usage-log/README.md +32 -0
- package/packages/pi-skill-usage-log/package.json +36 -0
- package/packages/pi-skill-usage-log/src/index.ts +316 -0
- package/packages/pi-skill-usage-log/src/lib/dialog.ts +31 -0
- package/packages/pi-skill-usage-log/src/lib/usage-log.ts +62 -0
- package/packages/pi-skill-usage-log/test/behavior.test.mjs +34 -0
- package/packages/pi-tool-usage-log/LICENSE +661 -0
- package/packages/pi-tool-usage-log/NOTICE.md +5 -0
- package/packages/pi-tool-usage-log/README.md +32 -0
- package/packages/pi-tool-usage-log/package.json +36 -0
- package/packages/pi-tool-usage-log/src/index.ts +233 -0
- package/packages/pi-tool-usage-log/src/lib/dialog.ts +31 -0
- package/packages/pi-tool-usage-log/src/lib/usage-log.ts +62 -0
- package/packages/pi-tool-usage-log/src/skill-usage-log.ts +316 -0
- package/packages/pi-tool-usage-log/test/behavior.test.mjs +23 -0
- package/packages/pi-tts/LICENSE +661 -0
- package/packages/pi-tts/NOTICE.md +3 -0
- package/packages/pi-tts/README.md +37 -0
- package/packages/pi-tts/examples/service-models.example.json +27 -0
- package/packages/pi-tts/package.json +37 -0
- package/packages/pi-tts/src/index.ts +135 -0
- package/packages/pi-tts/src/lib/service-models.ts +95 -0
- package/packages/pi-tts/test/tts-output.test.mjs +47 -0
- package/packages/pi-tts/test/tts.test.mjs +57 -0
- package/packages/pi-user-image-previews/LICENSE +661 -0
- package/packages/pi-user-image-previews/NOTICE.md +3 -0
- package/packages/pi-user-image-previews/README.md +27 -0
- package/packages/pi-user-image-previews/package.json +36 -0
- package/packages/pi-user-image-previews/src/index.ts +168 -0
- package/packages/pi-vision/LICENSE +661 -0
- package/packages/pi-vision/NOTICE.md +5 -0
- package/packages/pi-vision/README.md +43 -0
- package/packages/pi-vision/examples/vision-toolkit.example.json +12 -0
- package/packages/pi-vision/package.json +38 -0
- package/packages/pi-vision/skills/vision-tools/LICENSE +21 -0
- package/packages/pi-vision/skills/vision-tools/SKILL.md +134 -0
- package/packages/pi-vision/skills/vision-tools/agents/openai.yaml +4 -0
- package/packages/pi-vision/skills/vision-tools/bin/crop +94 -0
- package/packages/pi-vision/skills/vision-tools/bin/detect +18 -0
- package/packages/pi-vision/skills/vision-tools/bin/glance +98 -0
- package/packages/pi-vision/skills/vision-tools/bin/ground +18 -0
- package/packages/pi-vision/skills/vision-tools/bin/trace +134 -0
- package/packages/pi-vision/skills/vision-tools/bin/vision-doctor +168 -0
- package/packages/pi-vision/skills/vision-tools/detect.py +56 -0
- package/packages/pi-vision/skills/vision-tools/ground.py +216 -0
- package/packages/pi-vision/skills/vision-tools/references/gui.md +93 -0
- package/packages/pi-vision/skills/vision-tools/references/long-screenshot-ocr.md +103 -0
- package/packages/pi-vision/skills/vision-tools/references/restore-graphic.md +92 -0
- package/packages/pi-vision/skills/vision-tools/references/restore-structure.md +47 -0
- package/packages/pi-vision/skills/vision-tools/references/restore-ui.md +200 -0
- package/packages/pi-vision/skills/vision-tools/scripts/dominant_colors.py +224 -0
- package/packages/pi-vision/skills/vision-tools/scripts/extract_fg.py +278 -0
- package/packages/pi-vision/skills/vision-tools/scripts/html_shot.py +111 -0
- package/packages/pi-vision/skills/vision-tools/scripts/long_screenshot_ocr.py +1245 -0
- package/packages/pi-vision/skills/vision-tools/scripts/pixel_diff.py +88 -0
- package/packages/pi-vision/skills/vision-tools/vision_client.py +581 -0
- package/packages/pi-vision/src/index.ts +728 -0
- package/packages/pi-vision/test/vision.test.mjs +30 -0
- package/packages/pi-wait/LICENSE +661 -0
- package/packages/pi-wait/NOTICE.md +3 -0
- package/packages/pi-wait/README.md +37 -0
- package/packages/pi-wait/package.json +37 -0
- package/packages/pi-wait/src/index.ts +88 -0
- package/packages/pi-wait/src/lib/async-work.ts +27 -0
- package/packages/pi-wait/test/wait.test.mjs +43 -0
- package/packages/pi-zvec/LICENSE +661 -0
- package/packages/pi-zvec/NOTICE.md +3 -0
- package/packages/pi-zvec/README.md +37 -0
- package/packages/pi-zvec/examples/zvec.example.json +5 -0
- package/packages/pi-zvec/package.json +37 -0
- package/packages/pi-zvec/src/index.ts +754 -0
- package/packages/pi-zvec/test/zvec.test.mjs +19 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# @saifymatteo/pi-prestart-working
|
|
2
|
+
|
|
3
|
+
## Purpose and registrations
|
|
4
|
+
|
|
5
|
+
Shows Pi's native "Working" spinner, labelled with the extension currently blocking (e.g. `⠙ Loading hindsight-coding-agents`), while `before_agent_start` hooks run. Pi only raises its working indicator at `turn_start`, so slow handlers otherwise leave the UI silent. No tools, commands, or configuration.
|
|
6
|
+
|
|
7
|
+
## Compatibility and safety
|
|
8
|
+
|
|
9
|
+
Patches `ExtensionRunner.prototype.emitBeforeAgentStart` once per process (guarded by a global symbol, so `/reload` does not double-wrap) and relies on the runner's internal `extensions`, `handlers`, and `uiContext` shapes. These are host internals, not a public API: a host release that renames them breaks the patch. The label is the nearest `package.json` name (scope dropped), else the file name. No-op without UI.
|
|
10
|
+
|
|
11
|
+
Imported host APIs are declared as peer dependencies and supplied by the Pi host. A `*` peer range describes host resolution, not a guarantee of compatibility with every release.
|
|
12
|
+
|
|
13
|
+
## Running locally
|
|
14
|
+
|
|
15
|
+
From the repository root:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
pi -e ./packages/pi-prestart-working
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Follow the [root README](../../README.md#isolated-sessions) to avoid loading an existing copy of the extension.
|
|
22
|
+
|
|
23
|
+
## Status
|
|
24
|
+
|
|
25
|
+
Part of the [pi-extensions](../../README.md) collection. No personal settings or credentials are included; see [NOTICE.md](NOTICE.md) for licensing and provenance.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@saifymatteo/pi-prestart-working",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Show a labelled Working spinner while before_agent_start hooks run.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "AGPL-3.0-only",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"pi-package"
|
|
9
|
+
],
|
|
10
|
+
"files": [
|
|
11
|
+
"src",
|
|
12
|
+
"README.md",
|
|
13
|
+
"NOTICE.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"pi": {
|
|
17
|
+
"extensions": [
|
|
18
|
+
"./src/index.ts"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"@earendil-works/pi-coding-agent": "*"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=24"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/saifymatteo/pi-extensions.git",
|
|
33
|
+
"directory": "packages/pi-prestart-working"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Show Pi's native "Working" spinner, labelled with the extension currently
|
|
3
|
+
* blocking, while before_agent_start hooks run (e.g. "⠙ Loading hindsight-coding-agents").
|
|
4
|
+
*
|
|
5
|
+
* Pi only raises its working indicator at turn_start, after every
|
|
6
|
+
* before_agent_start handler has finished, so slow handlers (Hindsight's memory
|
|
7
|
+
* recall can take ~20 s) leave the UI silent. Handlers run in extension load
|
|
8
|
+
* order and live inside Pi's ExtensionRunner, so no event tells an extension
|
|
9
|
+
* which one is running. This wraps ExtensionRunner.prototype.emitBeforeAgentStart
|
|
10
|
+
* once per process: each handler is wrapped just long enough for Pi to snapshot
|
|
11
|
+
* it, and the wrapper names its extension in the working message before it runs.
|
|
12
|
+
*
|
|
13
|
+
* The run is already active at that point, so setWorkingVisible(true) shows the
|
|
14
|
+
* spinner immediately. The patch reads UI from the runner itself, so it survives
|
|
15
|
+
* /reload without holding a stale extension ctx.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { basename, dirname, extname, join } from "node:path";
|
|
20
|
+
import { ExtensionRunner } from "@earendil-works/pi-coding-agent";
|
|
21
|
+
|
|
22
|
+
const PATCHED = Symbol.for("settings.prestart-working.patched");
|
|
23
|
+
const EVENT = "before_agent_start";
|
|
24
|
+
|
|
25
|
+
type Handler = (...args: unknown[]) => unknown;
|
|
26
|
+
type Ext = { path: string; handlers: Map<string, Handler[]> };
|
|
27
|
+
type Runner = {
|
|
28
|
+
extensions: Ext[];
|
|
29
|
+
hasUI(): boolean;
|
|
30
|
+
uiContext: { setWorkingMessage(m?: string): void; setWorkingVisible(v: boolean): void };
|
|
31
|
+
emitBeforeAgentStart(...args: unknown[]): Promise<unknown>;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const names = new Map<string, string>();
|
|
35
|
+
|
|
36
|
+
/** Nearest package.json name (scope dropped), else the file name: "hindsight-coding-agents", "zvec". */
|
|
37
|
+
export function extensionLabel(path: string): string {
|
|
38
|
+
const cached = names.get(path);
|
|
39
|
+
if (cached) return cached;
|
|
40
|
+
let label = basename(path, extname(path));
|
|
41
|
+
if (label === "index" || label === "pi") {
|
|
42
|
+
for (let dir = dirname(path); dir !== dirname(dir); dir = dirname(dir)) {
|
|
43
|
+
const pkg = join(dir, "package.json");
|
|
44
|
+
if (!existsSync(pkg)) continue;
|
|
45
|
+
try {
|
|
46
|
+
const name = JSON.parse(readFileSync(pkg, "utf8")).name;
|
|
47
|
+
if (typeof name === "string") label = name.replace(/^@[^/]+\//, "");
|
|
48
|
+
} catch {}
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
names.set(path, label);
|
|
53
|
+
return label;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default function () {
|
|
57
|
+
const proto = (ExtensionRunner as unknown as { prototype: Runner & { [PATCHED]?: true } }).prototype;
|
|
58
|
+
if (proto[PATCHED]) return;
|
|
59
|
+
proto[PATCHED] = true;
|
|
60
|
+
const original = proto.emitBeforeAgentStart;
|
|
61
|
+
|
|
62
|
+
proto.emitBeforeAgentStart = function (this: Runner, ...args: unknown[]) {
|
|
63
|
+
if (!this.hasUI()) return original.apply(this, args);
|
|
64
|
+
const ui = this.uiContext;
|
|
65
|
+
const swapped: [Ext, Handler[]][] = [];
|
|
66
|
+
for (const ext of this.extensions) {
|
|
67
|
+
const list = ext.handlers.get(EVENT);
|
|
68
|
+
if (!list?.length) continue;
|
|
69
|
+
const label = extensionLabel(ext.path);
|
|
70
|
+
swapped.push([ext, list]);
|
|
71
|
+
ext.handlers.set(
|
|
72
|
+
EVENT,
|
|
73
|
+
list.map((h) => (...a: unknown[]) => {
|
|
74
|
+
ui.setWorkingMessage(`Loading ${label}`);
|
|
75
|
+
return h(...a);
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
ui.setWorkingVisible(true);
|
|
80
|
+
// Pi snapshots the handler lists synchronously before its first await,
|
|
81
|
+
// so the originals can go back right away (keeps pi.on() unsubscribe intact).
|
|
82
|
+
const result = original.apply(this, args);
|
|
83
|
+
for (const [ext, list] of swapped) ext.handlers.set(EVENT, list);
|
|
84
|
+
return result.finally(() => ui.setWorkingMessage(undefined));
|
|
85
|
+
};
|
|
86
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdirSync, mkdtempSync, writeFileSync, rmSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { loadExtension } from '../../../test/load-extension.mjs';
|
|
7
|
+
|
|
8
|
+
// Mirrors Pi's ExtensionRunner.emitBeforeAgentStart: snapshot handler lists
|
|
9
|
+
// synchronously, then await each handler in extension order.
|
|
10
|
+
class FakeRunner {
|
|
11
|
+
log = [];
|
|
12
|
+
extensions = [];
|
|
13
|
+
uiContext = {
|
|
14
|
+
setWorkingMessage: m => this.log.push(`msg:${m ?? '<default>'}`),
|
|
15
|
+
setWorkingVisible: v => this.log.push(`visible:${v}`),
|
|
16
|
+
};
|
|
17
|
+
hasUI() { return true; }
|
|
18
|
+
async emitBeforeAgentStart() {
|
|
19
|
+
const snapshot = this.extensions.map(e => (e.handlers.get('before_agent_start') ?? []).slice());
|
|
20
|
+
for (const handlers of snapshot) for (const h of handlers) await h();
|
|
21
|
+
return 'result';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
test('labels the spinner with each blocking extension, then restores', async t => {
|
|
26
|
+
const { default: install, extensionLabel } = loadExtension(new URL('../src/index.ts', import.meta.url), {
|
|
27
|
+
'@earendil-works/pi-coding-agent': { ExtensionRunner: FakeRunner },
|
|
28
|
+
});
|
|
29
|
+
install();
|
|
30
|
+
install(); // second load (e.g. /reload) must not double-wrap
|
|
31
|
+
|
|
32
|
+
const pkgDir = mkdtempSync(join(tmpdir(), 'prestart-'));
|
|
33
|
+
t.after(() => rmSync(pkgDir, { recursive: true, force: true }));
|
|
34
|
+
mkdirSync(join(pkgDir, 'dist'));
|
|
35
|
+
writeFileSync(join(pkgDir, 'package.json'), JSON.stringify({ name: '@vectorize-io/hindsight-coding-agents' }));
|
|
36
|
+
|
|
37
|
+
const runner = new FakeRunner();
|
|
38
|
+
const slow = async () => { runner.log.push('run:hindsight'); };
|
|
39
|
+
const fast = () => { runner.log.push('run:zvec'); };
|
|
40
|
+
runner.extensions = [
|
|
41
|
+
{ path: join(pkgDir, 'dist', 'pi.js'), handlers: new Map([['before_agent_start', [slow]]]) },
|
|
42
|
+
{ path: '/x/extensions/zvec.ts', handlers: new Map([['before_agent_start', [fast]]]) },
|
|
43
|
+
{ path: '/x/extensions/other.ts', handlers: new Map() },
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
assert.equal(await runner.emitBeforeAgentStart(), 'result');
|
|
47
|
+
assert.deepEqual(runner.log, [
|
|
48
|
+
'visible:true',
|
|
49
|
+
'msg:Loading hindsight-coding-agents', 'run:hindsight',
|
|
50
|
+
'msg:Loading zvec', 'run:zvec',
|
|
51
|
+
'msg:<default>',
|
|
52
|
+
]);
|
|
53
|
+
// Original handler arrays are back, so pi.on() unsubscribe still finds them.
|
|
54
|
+
assert.equal(runner.extensions[0].handlers.get('before_agent_start')[0], slow);
|
|
55
|
+
assert.equal(extensionLabel('/a/b/session-rename.ts'), 'session-rename');
|
|
56
|
+
});
|