@asermax/tachikoma 2.0.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/README.md +64 -0
- package/dist/agent/adapter.d.ts +8 -0
- package/dist/agent/adapter.js +86 -0
- package/dist/agent/adapter.js.map +1 -0
- package/dist/agent/manager.d.ts +35 -0
- package/dist/agent/manager.js +76 -0
- package/dist/agent/manager.js.map +1 -0
- package/dist/agent/models.d.ts +46 -0
- package/dist/agent/models.js +96 -0
- package/dist/agent/models.js.map +1 -0
- package/dist/agent/side-run.d.ts +42 -0
- package/dist/agent/side-run.js +83 -0
- package/dist/agent/side-run.js.map +1 -0
- package/dist/app.d.ts +5 -0
- package/dist/app.js +79 -0
- package/dist/app.js.map +1 -0
- package/dist/channels/types.d.ts +37 -0
- package/dist/channels/types.js +5 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/config/default-template.d.ts +1 -0
- package/dist/config/default-template.js +49 -0
- package/dist/config/default-template.js.map +1 -0
- package/dist/config/load.d.ts +8 -0
- package/dist/config/load.js +28 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/parse.d.ts +5 -0
- package/dist/config/parse.js +18 -0
- package/dist/config/parse.js.map +1 -0
- package/dist/config/schema.d.ts +29 -0
- package/dist/config/schema.js +35 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/coordinator.d.ts +54 -0
- package/dist/coordinator.js +344 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/db/core-schema.d.ts +250 -0
- package/dist/db/core-schema.js +19 -0
- package/dist/db/core-schema.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.js +16 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +4 -0
- package/dist/db/schema.js +7 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/state.d.ts +10 -0
- package/dist/db/state.js +36 -0
- package/dist/db/state.js.map +1 -0
- package/dist/domain/agent-events.d.ts +26 -0
- package/dist/domain/agent-events.js +2 -0
- package/dist/domain/agent-events.js.map +1 -0
- package/dist/domain/message.d.ts +25 -0
- package/dist/domain/message.js +17 -0
- package/dist/domain/message.js.map +1 -0
- package/dist/events.d.ts +9 -0
- package/dist/events.js +27 -0
- package/dist/events.js.map +1 -0
- package/dist/extensions/api.d.ts +118 -0
- package/dist/extensions/api.js +7 -0
- package/dist/extensions/api.js.map +1 -0
- package/dist/extensions/boundary/detector.d.ts +20 -0
- package/dist/extensions/boundary/detector.js +57 -0
- package/dist/extensions/boundary/detector.js.map +1 -0
- package/dist/extensions/boundary/idle.d.ts +10 -0
- package/dist/extensions/boundary/idle.js +28 -0
- package/dist/extensions/boundary/idle.js.map +1 -0
- package/dist/extensions/boundary/index.d.ts +12 -0
- package/dist/extensions/boundary/index.js +65 -0
- package/dist/extensions/boundary/index.js.map +1 -0
- package/dist/extensions/boundary/summary.d.ts +5 -0
- package/dist/extensions/boundary/summary.js +33 -0
- package/dist/extensions/boundary/summary.js.map +1 -0
- package/dist/extensions/commands/index.d.ts +7 -0
- package/dist/extensions/commands/index.js +21 -0
- package/dist/extensions/commands/index.js.map +1 -0
- package/dist/extensions/context/index.d.ts +7 -0
- package/dist/extensions/context/index.js +65 -0
- package/dist/extensions/context/index.js.map +1 -0
- package/dist/extensions/context/processor.d.ts +27 -0
- package/dist/extensions/context/processor.js +228 -0
- package/dist/extensions/context/processor.js.map +1 -0
- package/dist/extensions/detached-processes/index.d.ts +12 -0
- package/dist/extensions/detached-processes/index.js +51 -0
- package/dist/extensions/detached-processes/index.js.map +1 -0
- package/dist/extensions/detached-processes/limits.d.ts +27 -0
- package/dist/extensions/detached-processes/limits.js +55 -0
- package/dist/extensions/detached-processes/limits.js.map +1 -0
- package/dist/extensions/detached-processes/output.d.ts +2 -0
- package/dist/extensions/detached-processes/output.js +26 -0
- package/dist/extensions/detached-processes/output.js.map +1 -0
- package/dist/extensions/detached-processes/reconcile.d.ts +31 -0
- package/dist/extensions/detached-processes/reconcile.js +71 -0
- package/dist/extensions/detached-processes/reconcile.js.map +1 -0
- package/dist/extensions/detached-processes/repository.d.ts +33 -0
- package/dist/extensions/detached-processes/repository.js +62 -0
- package/dist/extensions/detached-processes/repository.js.map +1 -0
- package/dist/extensions/detached-processes/schema.d.ts +252 -0
- package/dist/extensions/detached-processes/schema.js +23 -0
- package/dist/extensions/detached-processes/schema.js.map +1 -0
- package/dist/extensions/detached-processes/spawn.d.ts +40 -0
- package/dist/extensions/detached-processes/spawn.js +137 -0
- package/dist/extensions/detached-processes/spawn.js.map +1 -0
- package/dist/extensions/detached-processes/tools.d.ts +41 -0
- package/dist/extensions/detached-processes/tools.js +243 -0
- package/dist/extensions/detached-processes/tools.js.map +1 -0
- package/dist/extensions/detached-processes/watcher.d.ts +7 -0
- package/dist/extensions/detached-processes/watcher.js +19 -0
- package/dist/extensions/detached-processes/watcher.js.map +1 -0
- package/dist/extensions/external/index.d.ts +11 -0
- package/dist/extensions/external/index.js +40 -0
- package/dist/extensions/external/index.js.map +1 -0
- package/dist/extensions/external/installs.d.ts +39 -0
- package/dist/extensions/external/installs.js +98 -0
- package/dist/extensions/external/installs.js.map +1 -0
- package/dist/extensions/external/loader.d.ts +19 -0
- package/dist/extensions/external/loader.js +70 -0
- package/dist/extensions/external/loader.js.map +1 -0
- package/dist/extensions/external/tools.d.ts +17 -0
- package/dist/extensions/external/tools.js +112 -0
- package/dist/extensions/external/tools.js.map +1 -0
- package/dist/extensions/git/commit.d.ts +19 -0
- package/dist/extensions/git/commit.js +44 -0
- package/dist/extensions/git/commit.js.map +1 -0
- package/dist/extensions/git/git.d.ts +11 -0
- package/dist/extensions/git/git.js +29 -0
- package/dist/extensions/git/git.js.map +1 -0
- package/dist/extensions/git/hooks.d.ts +10 -0
- package/dist/extensions/git/hooks.js +88 -0
- package/dist/extensions/git/hooks.js.map +1 -0
- package/dist/extensions/git/index.d.ts +11 -0
- package/dist/extensions/git/index.js +28 -0
- package/dist/extensions/git/index.js.map +1 -0
- package/dist/extensions/git/processor.d.ts +13 -0
- package/dist/extensions/git/processor.js +52 -0
- package/dist/extensions/git/processor.js.map +1 -0
- package/dist/extensions/git/sync.d.ts +44 -0
- package/dist/extensions/git/sync.js +189 -0
- package/dist/extensions/git/sync.js.map +1 -0
- package/dist/extensions/git/tools.d.ts +21 -0
- package/dist/extensions/git/tools.js +101 -0
- package/dist/extensions/git/tools.js.map +1 -0
- package/dist/extensions/host.d.ts +31 -0
- package/dist/extensions/host.js +75 -0
- package/dist/extensions/host.js.map +1 -0
- package/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/index.js +32 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/memory/archive.d.ts +8 -0
- package/dist/extensions/memory/archive.js +46 -0
- package/dist/extensions/memory/archive.js.map +1 -0
- package/dist/extensions/memory/dates.d.ts +2 -0
- package/dist/extensions/memory/dates.js +7 -0
- package/dist/extensions/memory/dates.js.map +1 -0
- package/dist/extensions/memory/extraction.d.ts +17 -0
- package/dist/extensions/memory/extraction.js +218 -0
- package/dist/extensions/memory/extraction.js.map +1 -0
- package/dist/extensions/memory/index.d.ts +20 -0
- package/dist/extensions/memory/index.js +67 -0
- package/dist/extensions/memory/index.js.map +1 -0
- package/dist/extensions/memory/indexes.d.ts +14 -0
- package/dist/extensions/memory/indexes.js +64 -0
- package/dist/extensions/memory/indexes.js.map +1 -0
- package/dist/extensions/memory/layout.d.ts +20 -0
- package/dist/extensions/memory/layout.js +79 -0
- package/dist/extensions/memory/layout.js.map +1 -0
- package/dist/extensions/memory/maintenance.d.ts +21 -0
- package/dist/extensions/memory/maintenance.js +357 -0
- package/dist/extensions/memory/maintenance.js.map +1 -0
- package/dist/extensions/memory/prompts.d.ts +8 -0
- package/dist/extensions/memory/prompts.js +125 -0
- package/dist/extensions/memory/prompts.js.map +1 -0
- package/dist/extensions/memory/transcript.d.ts +18 -0
- package/dist/extensions/memory/transcript.js +79 -0
- package/dist/extensions/memory/transcript.js.map +1 -0
- package/dist/extensions/notifications/format.d.ts +5 -0
- package/dist/extensions/notifications/format.js +17 -0
- package/dist/extensions/notifications/format.js.map +1 -0
- package/dist/extensions/notifications/index.d.ts +13 -0
- package/dist/extensions/notifications/index.js +29 -0
- package/dist/extensions/notifications/index.js.map +1 -0
- package/dist/extensions/notifications/payload.d.ts +22 -0
- package/dist/extensions/notifications/payload.js +29 -0
- package/dist/extensions/notifications/payload.js.map +1 -0
- package/dist/extensions/notifications/router.d.ts +29 -0
- package/dist/extensions/notifications/router.js +55 -0
- package/dist/extensions/notifications/router.js.map +1 -0
- package/dist/extensions/notifications/tools.d.ts +12 -0
- package/dist/extensions/notifications/tools.js +41 -0
- package/dist/extensions/notifications/tools.js.map +1 -0
- package/dist/extensions/projects/context-provider.d.ts +9 -0
- package/dist/extensions/projects/context-provider.js +37 -0
- package/dist/extensions/projects/context-provider.js.map +1 -0
- package/dist/extensions/projects/git.d.ts +28 -0
- package/dist/extensions/projects/git.js +91 -0
- package/dist/extensions/projects/git.js.map +1 -0
- package/dist/extensions/projects/hooks.d.ts +7 -0
- package/dist/extensions/projects/hooks.js +42 -0
- package/dist/extensions/projects/hooks.js.map +1 -0
- package/dist/extensions/projects/index.d.ts +11 -0
- package/dist/extensions/projects/index.js +30 -0
- package/dist/extensions/projects/index.js.map +1 -0
- package/dist/extensions/projects/processor.d.ts +13 -0
- package/dist/extensions/projects/processor.js +63 -0
- package/dist/extensions/projects/processor.js.map +1 -0
- package/dist/extensions/projects/tools.d.ts +21 -0
- package/dist/extensions/projects/tools.js +118 -0
- package/dist/extensions/projects/tools.js.map +1 -0
- package/dist/extensions/registrations.d.ts +21 -0
- package/dist/extensions/registrations.js +12 -0
- package/dist/extensions/registrations.js.map +1 -0
- package/dist/extensions/repl/index.d.ts +2 -0
- package/dist/extensions/repl/index.js +85 -0
- package/dist/extensions/repl/index.js.map +1 -0
- package/dist/extensions/skills/agents.d.ts +17 -0
- package/dist/extensions/skills/agents.js +77 -0
- package/dist/extensions/skills/agents.js.map +1 -0
- package/dist/extensions/skills/delegate.d.ts +22 -0
- package/dist/extensions/skills/delegate.js +54 -0
- package/dist/extensions/skills/delegate.js.map +1 -0
- package/dist/extensions/skills/index.d.ts +11 -0
- package/dist/extensions/skills/index.js +43 -0
- package/dist/extensions/skills/index.js.map +1 -0
- package/dist/extensions/skills/reload.d.ts +8 -0
- package/dist/extensions/skills/reload.js +38 -0
- package/dist/extensions/skills/reload.js.map +1 -0
- package/dist/extensions/tasks/executor.d.ts +43 -0
- package/dist/extensions/tasks/executor.js +179 -0
- package/dist/extensions/tasks/executor.js.map +1 -0
- package/dist/extensions/tasks/expiration.d.ts +12 -0
- package/dist/extensions/tasks/expiration.js +17 -0
- package/dist/extensions/tasks/expiration.js.map +1 -0
- package/dist/extensions/tasks/generation.d.ts +14 -0
- package/dist/extensions/tasks/generation.js +70 -0
- package/dist/extensions/tasks/generation.js.map +1 -0
- package/dist/extensions/tasks/index.d.ts +14 -0
- package/dist/extensions/tasks/index.js +75 -0
- package/dist/extensions/tasks/index.js.map +1 -0
- package/dist/extensions/tasks/repository.d.ts +53 -0
- package/dist/extensions/tasks/repository.js +147 -0
- package/dist/extensions/tasks/repository.js.map +1 -0
- package/dist/extensions/tasks/schedule.d.ts +13 -0
- package/dist/extensions/tasks/schedule.js +32 -0
- package/dist/extensions/tasks/schedule.js.map +1 -0
- package/dist/extensions/tasks/schema.d.ts +423 -0
- package/dist/extensions/tasks/schema.js +45 -0
- package/dist/extensions/tasks/schema.js.map +1 -0
- package/dist/extensions/tasks/session-delivery.d.ts +18 -0
- package/dist/extensions/tasks/session-delivery.js +39 -0
- package/dist/extensions/tasks/session-delivery.js.map +1 -0
- package/dist/extensions/tasks/tools.d.ts +38 -0
- package/dist/extensions/tasks/tools.js +181 -0
- package/dist/extensions/tasks/tools.js.map +1 -0
- package/dist/extensions/telegram/buttons.d.ts +14 -0
- package/dist/extensions/telegram/buttons.js +49 -0
- package/dist/extensions/telegram/buttons.js.map +1 -0
- package/dist/extensions/telegram/channel.d.ts +39 -0
- package/dist/extensions/telegram/channel.js +201 -0
- package/dist/extensions/telegram/channel.js.map +1 -0
- package/dist/extensions/telegram/chunking.d.ts +7 -0
- package/dist/extensions/telegram/chunking.js +67 -0
- package/dist/extensions/telegram/chunking.js.map +1 -0
- package/dist/extensions/telegram/inbound.d.ts +7 -0
- package/dist/extensions/telegram/inbound.js +29 -0
- package/dist/extensions/telegram/inbound.js.map +1 -0
- package/dist/extensions/telegram/index.d.ts +13 -0
- package/dist/extensions/telegram/index.js +67 -0
- package/dist/extensions/telegram/index.js.map +1 -0
- package/dist/extensions/telegram/media.d.ts +39 -0
- package/dist/extensions/telegram/media.js +223 -0
- package/dist/extensions/telegram/media.js.map +1 -0
- package/dist/extensions/telegram/mutex.d.ts +9 -0
- package/dist/extensions/telegram/mutex.js +14 -0
- package/dist/extensions/telegram/mutex.js.map +1 -0
- package/dist/extensions/telegram/sending.d.ts +48 -0
- package/dist/extensions/telegram/sending.js +119 -0
- package/dist/extensions/telegram/sending.js.map +1 -0
- package/dist/extensions/telegram/streaming.d.ts +46 -0
- package/dist/extensions/telegram/streaming.js +140 -0
- package/dist/extensions/telegram/streaming.js.map +1 -0
- package/dist/extensions/telegram/tools.d.ts +80 -0
- package/dist/extensions/telegram/tools.js +232 -0
- package/dist/extensions/telegram/tools.js.map +1 -0
- package/dist/extensions/workflows/cleanup.d.ts +10 -0
- package/dist/extensions/workflows/cleanup.js +38 -0
- package/dist/extensions/workflows/cleanup.js.map +1 -0
- package/dist/extensions/workflows/index.d.ts +11 -0
- package/dist/extensions/workflows/index.js +42 -0
- package/dist/extensions/workflows/index.js.map +1 -0
- package/dist/extensions/workflows/loader.d.ts +27 -0
- package/dist/extensions/workflows/loader.js +90 -0
- package/dist/extensions/workflows/loader.js.map +1 -0
- package/dist/extensions/workflows/model.d.ts +19 -0
- package/dist/extensions/workflows/model.js +7 -0
- package/dist/extensions/workflows/model.js.map +1 -0
- package/dist/extensions/workflows/repository.d.ts +24 -0
- package/dist/extensions/workflows/repository.js +61 -0
- package/dist/extensions/workflows/repository.js.map +1 -0
- package/dist/extensions/workflows/schema.d.ts +193 -0
- package/dist/extensions/workflows/schema.js +20 -0
- package/dist/extensions/workflows/schema.js.map +1 -0
- package/dist/extensions/workflows/tools.d.ts +27 -0
- package/dist/extensions/workflows/tools.js +285 -0
- package/dist/extensions/workflows/tools.js.map +1 -0
- package/dist/log.d.ts +8 -0
- package/dist/log.js +15 -0
- package/dist/log.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +27 -0
- package/dist/main.js.map +1 -0
- package/dist/migration/ask.d.ts +8 -0
- package/dist/migration/ask.js +24 -0
- package/dist/migration/ask.js.map +1 -0
- package/dist/migration/config.d.ts +10 -0
- package/dist/migration/config.js +122 -0
- package/dist/migration/config.js.map +1 -0
- package/dist/migration/context.d.ts +3 -0
- package/dist/migration/context.js +24 -0
- package/dist/migration/context.js.map +1 -0
- package/dist/migration/database.d.ts +8 -0
- package/dist/migration/database.js +51 -0
- package/dist/migration/database.js.map +1 -0
- package/dist/migration/fs.d.ts +1 -0
- package/dist/migration/fs.js +11 -0
- package/dist/migration/fs.js.map +1 -0
- package/dist/migration/index.d.ts +11 -0
- package/dist/migration/index.js +28 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/skills.d.ts +19 -0
- package/dist/migration/skills.js +77 -0
- package/dist/migration/skills.js.map +1 -0
- package/dist/scheduler.d.ts +17 -0
- package/dist/scheduler.js +53 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/sessions/registry.d.ts +15 -0
- package/dist/sessions/registry.js +42 -0
- package/dist/sessions/registry.js.map +1 -0
- package/dist/workspace.d.ts +13 -0
- package/dist/workspace.js +32 -0
- package/dist/workspace.js.map +1 -0
- package/drizzle/0000_init.sql +19 -0
- package/drizzle/0001_extensions.sql +63 -0
- package/drizzle/meta/0000_snapshot.json +134 -0
- package/drizzle/meta/0001_snapshot.json +526 -0
- package/drizzle/meta/_journal.json +20 -0
- package/package.json +63 -0
- package/skills/skill-authoring/SKILL.md +168 -0
- package/skills/workflow-authoring/SKILL.md +251 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Aggregate drizzle schema: core tables plus every first-party extension's tables.
|
|
2
|
+
// drizzle-kit reads this module to generate migrations for the whole app.
|
|
3
|
+
export * from "../extensions/detached-processes/schema.js";
|
|
4
|
+
export * from "../extensions/tasks/schema.js";
|
|
5
|
+
export * from "../extensions/workflows/schema.js";
|
|
6
|
+
export * from "./core-schema.js";
|
|
7
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,0EAA0E;AAE1E,cAAc,4CAA4C,CAAC;AAC3D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AppDatabase } from "./index.ts";
|
|
2
|
+
/** Namespaced key-value persistence for state that does not warrant its own tables. */
|
|
3
|
+
export declare class KeyValueState {
|
|
4
|
+
private readonly db;
|
|
5
|
+
private readonly namespace;
|
|
6
|
+
constructor(db: AppDatabase, namespace: string);
|
|
7
|
+
get<T>(key: string): T | null;
|
|
8
|
+
set<T>(key: string, value: T): void;
|
|
9
|
+
delete(key: string): void;
|
|
10
|
+
}
|
package/dist/db/state.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { and, eq } from "drizzle-orm";
|
|
2
|
+
import { appState } from "./core-schema.js";
|
|
3
|
+
/** Namespaced key-value persistence for state that does not warrant its own tables. */
|
|
4
|
+
export class KeyValueState {
|
|
5
|
+
db;
|
|
6
|
+
namespace;
|
|
7
|
+
constructor(db, namespace) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
this.namespace = namespace;
|
|
10
|
+
}
|
|
11
|
+
get(key) {
|
|
12
|
+
const row = this.db
|
|
13
|
+
.select()
|
|
14
|
+
.from(appState)
|
|
15
|
+
.where(and(eq(appState.namespace, this.namespace), eq(appState.key, key)))
|
|
16
|
+
.get();
|
|
17
|
+
return row == null ? null : row.value;
|
|
18
|
+
}
|
|
19
|
+
set(key, value) {
|
|
20
|
+
this.db
|
|
21
|
+
.insert(appState)
|
|
22
|
+
.values({ namespace: this.namespace, key, value, updatedAt: new Date() })
|
|
23
|
+
.onConflictDoUpdate({
|
|
24
|
+
target: [appState.namespace, appState.key],
|
|
25
|
+
set: { value, updatedAt: new Date() },
|
|
26
|
+
})
|
|
27
|
+
.run();
|
|
28
|
+
}
|
|
29
|
+
delete(key) {
|
|
30
|
+
this.db
|
|
31
|
+
.delete(appState)
|
|
32
|
+
.where(and(eq(appState.namespace, this.namespace), eq(appState.key, key)))
|
|
33
|
+
.run();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/db/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,uFAAuF;AACvF,MAAM,OAAO,aAAa;IACP,EAAE,CAAc;IAChB,SAAS,CAAS;IAEnC,YAAY,EAAe,EAAE,SAAiB;QAC5C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,GAAG,CAAI,GAAW;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,MAAM,EAAE;aACR,IAAI,CAAC,QAAQ,CAAC;aACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;aACzE,GAAG,EAAE,CAAC;QAET,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,KAAW,CAAC;IAC/C,CAAC;IAED,GAAG,CAAI,GAAW,EAAE,KAAQ;QAC1B,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,QAAQ,CAAC;aAChB,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;aACxE,kBAAkB,CAAC;YAClB,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC;YAC1C,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;SACtC,CAAC;aACD,GAAG,EAAE,CAAC;IACX,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,QAAQ,CAAC;aAChB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;aACzE,GAAG,EAAE,CAAC;IACX,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type AgentEvent = {
|
|
2
|
+
kind: "text";
|
|
3
|
+
text: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: "thinking";
|
|
6
|
+
text: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "tool-start";
|
|
9
|
+
toolCallId: string;
|
|
10
|
+
toolName: string;
|
|
11
|
+
args: Record<string, unknown>;
|
|
12
|
+
} | {
|
|
13
|
+
kind: "tool-end";
|
|
14
|
+
toolCallId: string;
|
|
15
|
+
toolName: string;
|
|
16
|
+
isError: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
kind: "status";
|
|
19
|
+
text: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: "result";
|
|
22
|
+
stopReason: "done" | "aborted" | "error";
|
|
23
|
+
} | {
|
|
24
|
+
kind: "error";
|
|
25
|
+
message: string;
|
|
26
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-events.js","sourceRoot":"","sources":["../../src/domain/agent-events.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const MEDIA_KINDS: {
|
|
2
|
+
readonly photo: "photo";
|
|
3
|
+
readonly audio: "audio";
|
|
4
|
+
readonly voice: "voice";
|
|
5
|
+
readonly document: "document";
|
|
6
|
+
readonly video: "video";
|
|
7
|
+
readonly animation: "animation";
|
|
8
|
+
readonly sticker: "sticker";
|
|
9
|
+
};
|
|
10
|
+
export type MediaKind = keyof typeof MEDIA_KINDS;
|
|
11
|
+
export interface MediaAttachment {
|
|
12
|
+
kind: MediaKind;
|
|
13
|
+
path: string;
|
|
14
|
+
mimeType?: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
metadata?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface InboundMessage {
|
|
19
|
+
text: string;
|
|
20
|
+
channel: string;
|
|
21
|
+
receivedAt: Date;
|
|
22
|
+
media: MediaAttachment[];
|
|
23
|
+
metadata: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export declare const textMessage: (channel: string, text: string) => InboundMessage;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const MEDIA_KINDS = {
|
|
2
|
+
photo: "photo",
|
|
3
|
+
audio: "audio",
|
|
4
|
+
voice: "voice",
|
|
5
|
+
document: "document",
|
|
6
|
+
video: "video",
|
|
7
|
+
animation: "animation",
|
|
8
|
+
sticker: "sticker",
|
|
9
|
+
};
|
|
10
|
+
export const textMessage = (channel, text) => ({
|
|
11
|
+
text,
|
|
12
|
+
channel,
|
|
13
|
+
receivedAt: new Date(),
|
|
14
|
+
media: [],
|
|
15
|
+
metadata: {},
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/domain/message.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;CACV,CAAC;AAoBX,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,IAAY,EAAkB,EAAE,CAAC,CAAC;IAC7E,IAAI;IACJ,OAAO;IACP,UAAU,EAAE,IAAI,IAAI,EAAE;IACtB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,EAAE;CACb,CAAC,CAAC"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Logger } from "./log.ts";
|
|
2
|
+
export type EventHandler<T> = (payload: T) => void | Promise<void>;
|
|
3
|
+
export declare class EventBus {
|
|
4
|
+
private readonly handlers;
|
|
5
|
+
private readonly log;
|
|
6
|
+
constructor(log: Logger);
|
|
7
|
+
on<T = unknown>(event: string, handler: EventHandler<T>): () => void;
|
|
8
|
+
emit<T = unknown>(event: string, payload: T): void;
|
|
9
|
+
}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class EventBus {
|
|
2
|
+
handlers = new Map();
|
|
3
|
+
log;
|
|
4
|
+
constructor(log) {
|
|
5
|
+
this.log = log;
|
|
6
|
+
}
|
|
7
|
+
on(event, handler) {
|
|
8
|
+
const set = this.handlers.get(event) ?? new Set();
|
|
9
|
+
set.add(handler);
|
|
10
|
+
this.handlers.set(event, set);
|
|
11
|
+
return () => {
|
|
12
|
+
set.delete(handler);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
emit(event, payload) {
|
|
16
|
+
const set = this.handlers.get(event);
|
|
17
|
+
if (set == null)
|
|
18
|
+
return;
|
|
19
|
+
for (const handler of set) {
|
|
20
|
+
// Handlers are isolated: one failing subscriber never affects the others.
|
|
21
|
+
void Promise.resolve()
|
|
22
|
+
.then(() => handler(payload))
|
|
23
|
+
.catch((error) => this.log.error({ event, err: error }, "event handler failed"));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,QAAQ;IACF,QAAQ,GAAG,IAAI,GAAG,EAAoC,CAAC;IACvD,GAAG,CAAS;IAE7B,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,EAAE,CAAc,KAAa,EAAE,OAAwB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,OAA8B,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE9B,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,MAAM,CAAC,OAA8B,CAAC,CAAC;QAC7C,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAc,KAAa,EAAE,OAAU;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO;QAExB,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;YAC1B,0EAA0E;YAC1E,KAAK,OAAO,CAAC,OAAO,EAAE;iBACnB,IAAI,CAAC,GAAG,EAAE,CAAE,OAA2B,CAAC,OAAO,CAAC,CAAC;iBACjD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { TSchema } from "typebox";
|
|
3
|
+
import type { ModelTiers } from "../agent/models.ts";
|
|
4
|
+
import type { SideRunner } from "../agent/side-run.ts";
|
|
5
|
+
import type { Channel, Delivery } from "../channels/types.ts";
|
|
6
|
+
import type { Config } from "../config/schema.ts";
|
|
7
|
+
import type { SessionRecord } from "../db/core-schema.ts";
|
|
8
|
+
import type { AppDatabase } from "../db/index.ts";
|
|
9
|
+
import type { KeyValueState } from "../db/state.ts";
|
|
10
|
+
import type { InboundMessage } from "../domain/message.ts";
|
|
11
|
+
import type { EventBus } from "../events.ts";
|
|
12
|
+
import type { Logger } from "../log.ts";
|
|
13
|
+
import type { Scheduler } from "../scheduler.ts";
|
|
14
|
+
import type { Workspace } from "../workspace.ts";
|
|
15
|
+
export interface ContextBlock {
|
|
16
|
+
/** Tag identifying the owner section, e.g. "memories", "projects". */
|
|
17
|
+
tag: string;
|
|
18
|
+
content: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ContextProviderInput {
|
|
21
|
+
message: InboundMessage;
|
|
22
|
+
session: SessionRecord;
|
|
23
|
+
}
|
|
24
|
+
export interface ContextProvider {
|
|
25
|
+
name: string;
|
|
26
|
+
provide(input: ContextProviderInput): Promise<ContextBlock | null>;
|
|
27
|
+
}
|
|
28
|
+
export interface ExchangeContext {
|
|
29
|
+
session: SessionRecord;
|
|
30
|
+
userText: string;
|
|
31
|
+
assistantText: string;
|
|
32
|
+
}
|
|
33
|
+
export type ExchangeProcessor = {
|
|
34
|
+
name: string;
|
|
35
|
+
process(context: ExchangeContext): Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
export declare const POST_PROCESSING_PHASES: {
|
|
38
|
+
readonly main: "main";
|
|
39
|
+
readonly preFinalize: "preFinalize";
|
|
40
|
+
readonly finalize: "finalize";
|
|
41
|
+
};
|
|
42
|
+
export type PostProcessingPhase = keyof typeof POST_PROCESSING_PHASES;
|
|
43
|
+
export interface PostProcessorContext {
|
|
44
|
+
session: SessionRecord;
|
|
45
|
+
/** Path to the pi session JSONL transcript, when the session persisted one. */
|
|
46
|
+
transcriptPath: string | null;
|
|
47
|
+
log: Logger;
|
|
48
|
+
}
|
|
49
|
+
export interface PostProcessor {
|
|
50
|
+
name: string;
|
|
51
|
+
phase?: PostProcessingPhase;
|
|
52
|
+
process(context: PostProcessorContext): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
export interface InboundContext {
|
|
55
|
+
session: SessionRecord | null;
|
|
56
|
+
/** Close the active session (post-processing runs) before the message is handled. */
|
|
57
|
+
closeSession(): Promise<void>;
|
|
58
|
+
/** Resume a previously closed session and make it active. */
|
|
59
|
+
resumeSession(session: SessionRecord): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
export type InboundMiddleware = (message: InboundMessage, context: InboundContext, next: () => Promise<void>) => Promise<void>;
|
|
62
|
+
export interface SessionsApi {
|
|
63
|
+
current(): SessionRecord | null;
|
|
64
|
+
get(id: number): SessionRecord | null;
|
|
65
|
+
update(id: number, patch: Partial<Pick<SessionRecord, "summary" | "lastExchange">>): SessionRecord;
|
|
66
|
+
listResumable(): SessionRecord[];
|
|
67
|
+
/** Close the active session immediately — callers must know no exchange is streaming. */
|
|
68
|
+
close(): Promise<void>;
|
|
69
|
+
/** Close the active session only when no exchange is in flight; returns whether it closed. */
|
|
70
|
+
closeIfIdle(): Promise<boolean>;
|
|
71
|
+
/** Abort the in-flight agent run, if any (user-initiated stop). */
|
|
72
|
+
abortExchange(): Promise<void>;
|
|
73
|
+
onOpen(hook: (session: SessionRecord) => void | Promise<void>): void;
|
|
74
|
+
onExchange(processor: ExchangeProcessor): void;
|
|
75
|
+
registerProcessor(processor: PostProcessor): void;
|
|
76
|
+
}
|
|
77
|
+
export interface ChannelsApi {
|
|
78
|
+
register(channel: Channel): void;
|
|
79
|
+
deliver(delivery: Delivery): void;
|
|
80
|
+
}
|
|
81
|
+
export interface AgentApi {
|
|
82
|
+
/** Contribute a pi extension factory to every agent session the host creates. */
|
|
83
|
+
use(factory: ExtensionFactory): void;
|
|
84
|
+
/** Contribute a section to the agent's system prompt (replaces pi's coding prompt). */
|
|
85
|
+
systemPrompt(builder: () => string): void;
|
|
86
|
+
provideContext(provider: ContextProvider): void;
|
|
87
|
+
readonly models: ModelTiers;
|
|
88
|
+
/** Side-channel LLM work: headless runs and structured classification. */
|
|
89
|
+
readonly side: SideRunner;
|
|
90
|
+
}
|
|
91
|
+
export interface InboundApi {
|
|
92
|
+
use(middleware: InboundMiddleware): void;
|
|
93
|
+
}
|
|
94
|
+
export interface AppContext<C = unknown> {
|
|
95
|
+
readonly config: Config;
|
|
96
|
+
readonly extensionConfig: C;
|
|
97
|
+
readonly workspace: Workspace;
|
|
98
|
+
readonly log: Logger;
|
|
99
|
+
readonly db: AppDatabase;
|
|
100
|
+
readonly state: KeyValueState;
|
|
101
|
+
readonly events: EventBus;
|
|
102
|
+
readonly scheduler: Scheduler;
|
|
103
|
+
readonly sessions: SessionsApi;
|
|
104
|
+
readonly channels: ChannelsApi;
|
|
105
|
+
readonly agent: AgentApi;
|
|
106
|
+
readonly inbound: InboundApi;
|
|
107
|
+
bootstrap(name: string, hook: () => void | Promise<void>): void;
|
|
108
|
+
/** Surface a progress line through the active channel while processing. */
|
|
109
|
+
status(text: string): void;
|
|
110
|
+
/** Enqueue another extension for loading (external extension support). */
|
|
111
|
+
registerExtension(extension: TachikomaExtension<never>): void;
|
|
112
|
+
}
|
|
113
|
+
export interface TachikomaExtension<C = unknown> {
|
|
114
|
+
name: string;
|
|
115
|
+
configSchema?: TSchema;
|
|
116
|
+
setup(app: AppContext<C>): void | Promise<void>;
|
|
117
|
+
}
|
|
118
|
+
export declare const defineExtension: <C = unknown>(extension: TachikomaExtension<C>) => TachikomaExtension<C>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/extensions/api.ts"],"names":[],"mappings":"AA4CA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,UAAU;CACZ,CAAC;AAqGX,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,SAAgC,EACT,EAAE,CAAC,SAAS,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Static, Type } from "typebox";
|
|
2
|
+
import type { SideRunner } from "../../agent/side-run.ts";
|
|
3
|
+
import type { Logger } from "../../log.ts";
|
|
4
|
+
export declare const BoundaryDecisionSchema: Type.TObject<{
|
|
5
|
+
decision: Type.TUnsafe<"continue" | "new" | "resume">;
|
|
6
|
+
resumeSessionId: Type.TOptional<Type.TNumber>;
|
|
7
|
+
}>;
|
|
8
|
+
export type BoundaryDecision = Static<typeof BoundaryDecisionSchema>;
|
|
9
|
+
export type Classifier = Pick<SideRunner, "classify">;
|
|
10
|
+
export interface SessionCandidate {
|
|
11
|
+
id: number;
|
|
12
|
+
summary: string;
|
|
13
|
+
}
|
|
14
|
+
export interface BoundaryInput {
|
|
15
|
+
message: string;
|
|
16
|
+
activeSummary: string | null;
|
|
17
|
+
lastExchange: string | null;
|
|
18
|
+
candidates: SessionCandidate[];
|
|
19
|
+
}
|
|
20
|
+
export declare const detectBoundary: (classifier: Classifier, input: BoundaryInput, log: Logger) => Promise<BoundaryDecision>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { StringEnum } from "@earendil-works/pi-ai";
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
export const BoundaryDecisionSchema = Type.Object({
|
|
4
|
+
decision: StringEnum(["continue", "new", "resume"]),
|
|
5
|
+
resumeSessionId: Type.Optional(Type.Number()),
|
|
6
|
+
});
|
|
7
|
+
const SYSTEM = `You segment an ongoing conversation with a personal assistant into topical sessions.
|
|
8
|
+
|
|
9
|
+
Given the active session's rolling summary, the last exchange, a list of recently closed
|
|
10
|
+
sessions, and a new incoming message, decide:
|
|
11
|
+
|
|
12
|
+
- "continue": the message belongs to the active session's topic (default when in doubt,
|
|
13
|
+
and always when the message is a short reaction, follow-up, or answer to the assistant).
|
|
14
|
+
- "new": the message clearly starts an unrelated topic.
|
|
15
|
+
- "resume": the message clearly picks up the topic of one of the closed sessions listed
|
|
16
|
+
as candidates; set resumeSessionId to that candidate's id.
|
|
17
|
+
|
|
18
|
+
Only choose "resume" when the match is unambiguous. Never invent ids.`;
|
|
19
|
+
const renderInput = ({ message, activeSummary, lastExchange, candidates, }) => {
|
|
20
|
+
const sections = [
|
|
21
|
+
activeSummary != null
|
|
22
|
+
? `<active-session-summary>\n${activeSummary}\n</active-session-summary>`
|
|
23
|
+
: "<active-session-summary>none — no session is active</active-session-summary>",
|
|
24
|
+
lastExchange != null ? `<last-exchange>\n${lastExchange}\n</last-exchange>` : null,
|
|
25
|
+
candidates.length > 0
|
|
26
|
+
? `<closed-sessions>\n${candidates
|
|
27
|
+
.map((candidate) => `- id ${candidate.id}: ${candidate.summary}`)
|
|
28
|
+
.join("\n")}\n</closed-sessions>`
|
|
29
|
+
: null,
|
|
30
|
+
`<incoming-message>\n${message}\n</incoming-message>`,
|
|
31
|
+
];
|
|
32
|
+
return sections.filter((section) => section != null).join("\n\n");
|
|
33
|
+
};
|
|
34
|
+
export const detectBoundary = async (classifier, input, log) => {
|
|
35
|
+
try {
|
|
36
|
+
const decision = await classifier.classify({
|
|
37
|
+
system: SYSTEM,
|
|
38
|
+
user: renderInput(input),
|
|
39
|
+
schema: BoundaryDecisionSchema,
|
|
40
|
+
tier: "classifier",
|
|
41
|
+
});
|
|
42
|
+
if (decision.decision === "resume") {
|
|
43
|
+
const valid = input.candidates.some((candidate) => candidate.id === decision.resumeSessionId);
|
|
44
|
+
if (!valid) {
|
|
45
|
+
log.warn({ decision }, "boundary picked an unknown session id — continuing instead");
|
|
46
|
+
return { decision: "continue" };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return decision;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
// Boundary detection is best-effort: a failure must never block the message.
|
|
53
|
+
log.error({ err: error }, "boundary detection failed — continuing active session");
|
|
54
|
+
return { decision: "continue" };
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/extensions/boundary/detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAK5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;IAChD,QAAQ,EAAE,UAAU,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAC;IAC5D,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;CAC9C,CAAC,CAAC;AAkBH,MAAM,MAAM,GAAG;;;;;;;;;;;sEAWuD,CAAC;AAEvE,MAAM,WAAW,GAAG,CAAC,EACnB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,UAAU,GACI,EAAU,EAAE;IAC1B,MAAM,QAAQ,GAAG;QACf,aAAa,IAAI,IAAI;YACnB,CAAC,CAAC,6BAA6B,aAAa,6BAA6B;YACzE,CAAC,CAAC,8EAA8E;QAClF,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,oBAAoB,YAAY,oBAAoB,CAAC,CAAC,CAAC,IAAI;QAClF,UAAU,CAAC,MAAM,GAAG,CAAC;YACnB,CAAC,CAAC,sBAAsB,UAAU;iBAC7B,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;iBAChE,IAAI,CAAC,IAAI,CAAC,sBAAsB;YACrC,CAAC,CAAC,IAAI;QACR,uBAAuB,OAAO,uBAAuB;KACtD,CAAC;IAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,UAAsB,EACtB,KAAoB,EACpB,GAAW,EACgB,EAAE;IAC7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC;YACzC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;YACxB,MAAM,EAAE,sBAAsB;YAC9B,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,eAAe,CAAC,CAAC;YAE9F,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,4DAA4D,CAAC,CAAC;gBACrF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6EAA6E;QAC7E,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,uDAAuD,CAAC,CAAC;QACnF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAClC,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Logger } from "../../log.ts";
|
|
2
|
+
import type { SessionsApi } from "../api.ts";
|
|
3
|
+
export type IdleSessions = Pick<SessionsApi, "onExchange" | "closeIfIdle">;
|
|
4
|
+
/**
|
|
5
|
+
* Temporal session boundary: after each exchange, (re)arm a timer that closes
|
|
6
|
+
* the session once the conversation has been silent for idleCloseSeconds.
|
|
7
|
+
* closeIfIdle() no-ops when an exchange is in flight, and the timer is re-armed
|
|
8
|
+
* by the next exchange — so a firing during activity loses nothing.
|
|
9
|
+
*/
|
|
10
|
+
export declare const registerIdleClose: (sessions: IdleSessions, idleCloseSeconds: number, log: Logger) => void;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal session boundary: after each exchange, (re)arm a timer that closes
|
|
3
|
+
* the session once the conversation has been silent for idleCloseSeconds.
|
|
4
|
+
* closeIfIdle() no-ops when an exchange is in flight, and the timer is re-armed
|
|
5
|
+
* by the next exchange — so a firing during activity loses nothing.
|
|
6
|
+
*/
|
|
7
|
+
export const registerIdleClose = (sessions, idleCloseSeconds, log) => {
|
|
8
|
+
let timer = null;
|
|
9
|
+
sessions.onExchange({
|
|
10
|
+
name: "idle-close-timer",
|
|
11
|
+
async process() {
|
|
12
|
+
if (timer != null)
|
|
13
|
+
clearTimeout(timer);
|
|
14
|
+
timer = setTimeout(() => {
|
|
15
|
+
timer = null;
|
|
16
|
+
void sessions
|
|
17
|
+
.closeIfIdle()
|
|
18
|
+
.then((closed) => {
|
|
19
|
+
if (closed)
|
|
20
|
+
log.info({ idleCloseSeconds }, "idle timeout reached — session closed");
|
|
21
|
+
})
|
|
22
|
+
.catch((error) => log.error({ err: error }, "idle close failed"));
|
|
23
|
+
}, idleCloseSeconds * 1000);
|
|
24
|
+
timer.unref();
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=idle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle.js","sourceRoot":"","sources":["../../../src/extensions/boundary/idle.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,QAAsB,EACtB,gBAAwB,EACxB,GAAW,EACL,EAAE;IACR,IAAI,KAAK,GAA0B,IAAI,CAAC;IAExC,QAAQ,CAAC,UAAU,CAAC;QAClB,IAAI,EAAE,kBAAkB;QAExB,KAAK,CAAC,OAAO;YACX,IAAI,KAAK,IAAI,IAAI;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAEvC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,KAAK,GAAG,IAAI,CAAC;gBAEb,KAAK,QAAQ;qBACV,WAAW,EAAE;qBACb,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;oBACf,IAAI,MAAM;wBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,EAAE,uCAAuC,CAAC,CAAC;gBACtF,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;YACtE,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAAC;YAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface BoundaryConfig {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
idleCloseSeconds: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Conversation boundaries, temporal and topical: closes sessions after a silence
|
|
7
|
+
* window, keeps a rolling per-session summary after every exchange, and classifies
|
|
8
|
+
* each incoming message as continuing the active session, starting a fresh one,
|
|
9
|
+
* or resuming a recently closed one.
|
|
10
|
+
*/
|
|
11
|
+
declare const _default: import("../api.ts").TachikomaExtension<BoundaryConfig>;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { defineExtension } from "../api.js";
|
|
3
|
+
import { detectBoundary } from "./detector.js";
|
|
4
|
+
import { registerIdleClose } from "./idle.js";
|
|
5
|
+
import { createSummaryProcessor } from "./summary.js";
|
|
6
|
+
/**
|
|
7
|
+
* Conversation boundaries, temporal and topical: closes sessions after a silence
|
|
8
|
+
* window, keeps a rolling per-session summary after every exchange, and classifies
|
|
9
|
+
* each incoming message as continuing the active session, starting a fresh one,
|
|
10
|
+
* or resuming a recently closed one.
|
|
11
|
+
*/
|
|
12
|
+
export default defineExtension({
|
|
13
|
+
name: "boundary",
|
|
14
|
+
configSchema: Type.Object({
|
|
15
|
+
// Gates topic-shift detection; the idle boundary is governed only by idleCloseSeconds.
|
|
16
|
+
enabled: Type.Boolean({ default: true }),
|
|
17
|
+
// Seconds of conversation silence before the active session closes (0 disables).
|
|
18
|
+
idleCloseSeconds: Type.Number({ default: 900 }),
|
|
19
|
+
}),
|
|
20
|
+
setup(app) {
|
|
21
|
+
if (app.extensionConfig.idleCloseSeconds > 0) {
|
|
22
|
+
registerIdleClose(app.sessions, app.extensionConfig.idleCloseSeconds, app.log);
|
|
23
|
+
}
|
|
24
|
+
if (!app.extensionConfig.enabled) {
|
|
25
|
+
app.log.info("boundary detection disabled by configuration");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
app.sessions.onExchange(createSummaryProcessor(app.agent.side, app.sessions, app.log));
|
|
29
|
+
app.inbound.use(async (message, context, next) => {
|
|
30
|
+
// System-originated injections (session tasks, notices) never shift topics.
|
|
31
|
+
if (message.metadata.boundary === "skip")
|
|
32
|
+
return next();
|
|
33
|
+
const active = context.session;
|
|
34
|
+
const candidates = app.sessions
|
|
35
|
+
.listResumable()
|
|
36
|
+
.filter((session) => session.summary != null && session.id !== active?.id)
|
|
37
|
+
.map((session) => ({ id: session.id, summary: session.summary }));
|
|
38
|
+
// Nothing to compare against: first-ever message, or an active session that
|
|
39
|
+
// has not produced a summary yet and no resumable history.
|
|
40
|
+
if ((active == null || active.summary == null) && candidates.length === 0) {
|
|
41
|
+
return next();
|
|
42
|
+
}
|
|
43
|
+
app.status("Checking conversation topic…");
|
|
44
|
+
const decision = await detectBoundary(app.agent.side, {
|
|
45
|
+
message: message.text,
|
|
46
|
+
activeSummary: active?.summary ?? null,
|
|
47
|
+
lastExchange: active?.lastExchange ?? null,
|
|
48
|
+
candidates,
|
|
49
|
+
}, app.log);
|
|
50
|
+
if (decision.decision === "new" && active != null) {
|
|
51
|
+
app.status("Topic shift — closing the previous session");
|
|
52
|
+
await context.closeSession();
|
|
53
|
+
}
|
|
54
|
+
else if (decision.decision === "resume" && decision.resumeSessionId != null) {
|
|
55
|
+
const target = app.sessions.get(decision.resumeSessionId);
|
|
56
|
+
if (target != null) {
|
|
57
|
+
app.status("Resuming a previous conversation");
|
|
58
|
+
await context.resumeSession(target);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return next();
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/boundary/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SideRunner } from "../../agent/side-run.ts";
|
|
2
|
+
import type { Logger } from "../../log.ts";
|
|
3
|
+
import type { ExchangeProcessor, SessionsApi } from "../api.ts";
|
|
4
|
+
export type Completer = Pick<SideRunner, "complete">;
|
|
5
|
+
export declare const createSummaryProcessor: (side: Completer, sessions: SessionsApi, log: Logger) => ExchangeProcessor;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const SUMMARY_SYSTEM = `You maintain a rolling one-paragraph summary of a conversation session.
|
|
2
|
+
|
|
3
|
+
Given the previous summary (possibly empty) and the latest exchange, produce an updated
|
|
4
|
+
summary capturing the session's topic and current state. Keep it under 80 words, factual,
|
|
5
|
+
no preamble.`;
|
|
6
|
+
const MAX_EXCHANGE_CHARS = 2000;
|
|
7
|
+
const clip = (text, max) => text.length <= max ? text : `${text.slice(0, max)}…`;
|
|
8
|
+
export const createSummaryProcessor = (side, sessions, log) => ({
|
|
9
|
+
name: "rolling-summary",
|
|
10
|
+
async process({ session, userText, assistantText }) {
|
|
11
|
+
const lastExchange = clip(`user: ${userText}\nassistant: ${assistantText}`, MAX_EXCHANGE_CHARS);
|
|
12
|
+
try {
|
|
13
|
+
const summary = await side.complete({
|
|
14
|
+
tier: "processor",
|
|
15
|
+
system: SUMMARY_SYSTEM,
|
|
16
|
+
user: [
|
|
17
|
+
session.summary != null
|
|
18
|
+
? `Previous summary:\n${session.summary}`
|
|
19
|
+
: "Previous summary: (none)",
|
|
20
|
+
`Latest exchange:\n${lastExchange}`,
|
|
21
|
+
].join("\n\n"),
|
|
22
|
+
});
|
|
23
|
+
sessions.update(session.id, { summary: clip(summary.trim(), 600), lastExchange });
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
// Keep the verbatim exchange even when summarization fails — the boundary
|
|
27
|
+
// detector can still work with it on the next message.
|
|
28
|
+
log.error({ err: error }, "rolling summary failed");
|
|
29
|
+
sessions.update(session.id, { lastExchange });
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../../src/extensions/boundary/summary.ts"],"names":[],"mappings":"AAIA,MAAM,cAAc,GAAG;;;;aAIV,CAAC;AAEd,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,GAAW,EAAU,EAAE,CACjD,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAIvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,IAAe,EACf,QAAqB,EACrB,GAAW,EACQ,EAAE,CAAC,CAAC;IACvB,IAAI,EAAE,iBAAiB;IAEvB,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,QAAQ,gBAAgB,aAAa,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAEhG,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;gBAClC,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE;oBACJ,OAAO,CAAC,OAAO,IAAI,IAAI;wBACrB,CAAC,CAAC,sBAAsB,OAAO,CAAC,OAAO,EAAE;wBACzC,CAAC,CAAC,0BAA0B;oBAC9B,qBAAqB,YAAY,EAAE;iBACpC,CAAC,IAAI,CAAC,MAAM,CAAC;aACf,CAAC,CAAC;YAEH,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,uDAAuD;YACvD,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,wBAAwB,CAAC,CAAC;YACpD,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel-agnostic conversation commands handled before the agent sees them.
|
|
3
|
+
* (/queue is handled at submit time by the coordinator, since steering happens
|
|
4
|
+
* before middleware runs; /stop is channel-level because it must act mid-stream.)
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: import("../api.ts").TachikomaExtension<unknown>;
|
|
7
|
+
export default _default;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defineExtension } from "../api.js";
|
|
2
|
+
/**
|
|
3
|
+
* Channel-agnostic conversation commands handled before the agent sees them.
|
|
4
|
+
* (/queue is handled at submit time by the coordinator, since steering happens
|
|
5
|
+
* before middleware runs; /stop is channel-level because it must act mid-stream.)
|
|
6
|
+
*/
|
|
7
|
+
export default defineExtension({
|
|
8
|
+
name: "commands",
|
|
9
|
+
setup(app) {
|
|
10
|
+
app.inbound.use(async (message, context, next) => {
|
|
11
|
+
if (message.text.trim() === "/new") {
|
|
12
|
+
message.metadata.handled = true;
|
|
13
|
+
await context.closeSession();
|
|
14
|
+
app.channels.deliver({ text: "🆕 Started a fresh session.", gate: "immediate" });
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
return next();
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;GAIG;AACH,eAAe,eAAe,CAAC;IAC7B,IAAI,EAAE,UAAU;IAEhB,KAAK,CAAC,GAAG;QACP,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;gBACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;gBAEhC,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC7B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YAED,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Foundational context: SOUL.md (personality) and USER.md (durable user knowledge)
|
|
3
|
+
* compose the system prompt. AGENTS.md is discovered natively by pi from the
|
|
4
|
+
* workspace root, so it needs no handling here.
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: import("../api.ts").TachikomaExtension<unknown>;
|
|
7
|
+
export default _default;
|