@tt-a1i/hive 2.1.4 → 2.1.5
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/CHANGELOG.md +16 -0
- package/dist/src/cli/team.d.ts +4 -1
- package/dist/src/cli/team.js +95 -6
- package/dist/src/server/agent-startup-instructions.js +1 -1
- package/dist/src/server/hive-team-guidance.js +2 -2
- package/dist/src/server/routes-team-memory.js +53 -2
- package/dist/src/server/routes-workspace-memory.js +31 -2
- package/dist/src/server/runtime-store-contract.d.ts +2 -0
- package/dist/src/server/runtime-store-dream.d.ts +2 -5
- package/dist/src/server/runtime-store-dream.js +2 -12
- package/dist/src/server/runtime-store-helpers.d.ts +4 -0
- package/dist/src/server/runtime-store-helpers.js +21 -1
- package/dist/src/server/runtime-store-memory.d.ts +6 -0
- package/dist/src/server/runtime-store-memory.js +1 -0
- package/dist/src/server/sqlite-schema-v36.d.ts +3 -0
- package/dist/src/server/sqlite-schema-v36.js +21 -0
- package/dist/src/server/sqlite-schema.d.ts +1 -1
- package/dist/src/server/sqlite-schema.js +6 -1
- package/dist/src/server/team-memory-diagnostics.d.ts +86 -0
- package/dist/src/server/team-memory-diagnostics.js +87 -0
- package/dist/src/server/team-memory-digest.d.ts +7 -0
- package/dist/src/server/team-memory-digest.js +22 -5
- package/dist/src/server/team-memory-dream-applier.js +20 -3
- package/dist/src/server/team-memory-dream-cli.d.ts +13 -0
- package/dist/src/server/team-memory-dream-cli.js +115 -0
- package/dist/src/server/team-memory-dream-input.d.ts +15 -0
- package/dist/src/server/team-memory-dream-input.js +14 -0
- package/dist/src/server/team-memory-dream-ops.d.ts +4 -1
- package/dist/src/server/team-memory-dream-ops.js +32 -3
- package/dist/src/server/team-memory-dream-prompt.js +5 -3
- package/dist/src/server/team-memory-dream-reverter.js +13 -3
- package/dist/src/server/team-memory-dream-run-store.d.ts +1 -0
- package/dist/src/server/team-memory-dream-run-store.js +20 -0
- package/dist/src/server/team-memory-dream-runner.d.ts +10 -1
- package/dist/src/server/team-memory-dream-runner.js +34 -5
- package/dist/src/server/team-memory-dream-scheduler.js +2 -2
- package/dist/src/server/team-memory-dream-store.d.ts +2 -1
- package/dist/src/server/team-memory-dream-store.js +1 -1
- package/dist/src/server/team-memory-dream-types.d.ts +5 -1
- package/dist/src/server/team-memory-export.js +7 -0
- package/dist/src/server/team-memory-http-serializers.d.ts +15 -0
- package/dist/src/server/team-memory-http-serializers.js +7 -0
- package/dist/src/server/team-memory-provider.d.ts +33 -0
- package/dist/src/server/team-memory-provider.js +54 -0
- package/dist/src/server/team-memory-store.d.ts +10 -3
- package/dist/src/server/team-memory-store.js +134 -58
- package/dist/src/shared/team-memory.d.ts +13 -0
- package/dist/src/shared/team-memory.js +12 -0
- package/package.json +1 -1
- package/web/dist/assets/{AddWorkerDialog-CkCGKa0N.js → AddWorkerDialog-AxzWv2T8.js} +2 -2
- package/web/dist/assets/AddWorkspaceFlow-D-Yh_kk_.js +1 -0
- package/web/dist/assets/{FirstRunWizard-Db4HWbBQ.js → FirstRunWizard-nAK4Eprj.js} +1 -1
- package/web/dist/assets/{MarketplaceDrawer-DHwl1if1.js → MarketplaceDrawer-B8JW-znT.js} +1 -1
- package/web/dist/assets/{TaskGraphDrawer-B_OibVQO.js → TaskGraphDrawer-BQ9Wr41D.js} +1 -1
- package/web/dist/assets/{WhatsNewDialog-9QXlLVfy.js → WhatsNewDialog-D7DwCnTR.js} +1 -1
- package/web/dist/assets/{WorkerModal-BGdtte3-.js → WorkerModal-tU-XkiFG.js} +1 -1
- package/web/dist/assets/{WorkflowsDrawer-DRuS0Ao5.js → WorkflowsDrawer-DCa-HN3D.js} +1 -1
- package/web/dist/assets/WorkspaceMemoryDrawer-4hLlu8BO.js +1 -0
- package/web/dist/assets/WorkspaceTaskDrawer-D3LcLkw_.js +1 -0
- package/web/dist/assets/{index-BiGD5NhO.js → index-B8tv0NRK.js} +13 -13
- package/web/dist/assets/{search-BHvXxsdK.js → search-CcRvD2Q5.js} +1 -1
- package/web/dist/assets/{square-terminal-CzkQzjCU.js → square-terminal-zBgH6nhI.js} +1 -1
- package/web/dist/index.html +1 -1
- package/web/dist/sw.js +1 -1
- package/web/dist/assets/AddWorkspaceFlow-Cd73iChz.js +0 -1
- package/web/dist/assets/WorkspaceMemoryDrawer-C8PuHo0x.js +0 -1
- package/web/dist/assets/WorkspaceTaskDrawer-6mbgRoOq.js +0 -1
|
@@ -42,6 +42,19 @@ export const createDreamRunStore = (db) => {
|
|
|
42
42
|
WHERE workspace_id = ?
|
|
43
43
|
AND status = 'running'`)
|
|
44
44
|
.get(workspaceId).count > 0;
|
|
45
|
+
const getRunningScheduledRun = (workspaceId) => {
|
|
46
|
+
markStaleRunningRuns(workspaceId);
|
|
47
|
+
const row = db
|
|
48
|
+
.prepare(`SELECT *
|
|
49
|
+
FROM dream_runs
|
|
50
|
+
WHERE workspace_id = ?
|
|
51
|
+
AND trigger = 'scheduled'
|
|
52
|
+
AND status = 'running'
|
|
53
|
+
ORDER BY started_at ASC, id ASC
|
|
54
|
+
LIMIT 1`)
|
|
55
|
+
.get(workspaceId);
|
|
56
|
+
return row ? toDreamRunRecord(row) : undefined;
|
|
57
|
+
};
|
|
45
58
|
const getRun = (runId) => {
|
|
46
59
|
const row = db.prepare('SELECT * FROM dream_runs WHERE id = ? LIMIT 1').get(runId);
|
|
47
60
|
if (row?.status === 'running') {
|
|
@@ -130,6 +143,11 @@ export const createDreamRunStore = (db) => {
|
|
|
130
143
|
WHEN trigger = 'scheduled' THEN started_at ELSE NULL
|
|
131
144
|
END
|
|
132
145
|
) AS last_scheduled_at,
|
|
146
|
+
MIN(
|
|
147
|
+
CASE
|
|
148
|
+
WHEN trigger = 'scheduled' AND status = 'running' THEN id ELSE NULL
|
|
149
|
+
END
|
|
150
|
+
) AS running_scheduled_run_id,
|
|
133
151
|
(
|
|
134
152
|
SELECT COUNT(*)
|
|
135
153
|
FROM messages
|
|
@@ -145,6 +163,7 @@ export const createDreamRunStore = (db) => {
|
|
|
145
163
|
hasRunningRun: row.running_count > 0,
|
|
146
164
|
lastScheduledAt: row.last_scheduled_at,
|
|
147
165
|
pendingMessageCount: row.pending_message_count,
|
|
166
|
+
runningScheduledRunId: row.running_scheduled_run_id,
|
|
148
167
|
};
|
|
149
168
|
};
|
|
150
169
|
const createRun = (input) => {
|
|
@@ -213,6 +232,7 @@ export const createDreamRunStore = (db) => {
|
|
|
213
232
|
createRun,
|
|
214
233
|
deleteWorkspaceDreamRuns,
|
|
215
234
|
getScheduleState,
|
|
235
|
+
getRunningScheduledRun,
|
|
216
236
|
getRun,
|
|
217
237
|
listInputMessages,
|
|
218
238
|
listRuns,
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type DreamRunRecord, type DreamRunTrigger } from './team-memory-dream-store.js';
|
|
2
2
|
interface DreamStorePort {
|
|
3
3
|
createRun: (input: {
|
|
4
4
|
trigger: DreamRunTrigger;
|
|
5
5
|
workspaceId: string;
|
|
6
6
|
}) => DreamRunRecord;
|
|
7
|
+
getRunningScheduledRun: (workspaceId: string) => DreamRunRecord | undefined;
|
|
7
8
|
markFailed: (runId: string, error: string, fallback?: DreamRunRecord | undefined) => DreamRunRecord;
|
|
8
9
|
}
|
|
9
10
|
export interface TeamMemoryDreamRunner {
|
|
@@ -11,8 +12,16 @@ export interface TeamMemoryDreamRunner {
|
|
|
11
12
|
runScheduled: (workspaceId: string) => Promise<DreamRunRecord>;
|
|
12
13
|
}
|
|
13
14
|
export declare const createTeamMemoryDreamRunner: (deps: {
|
|
15
|
+
applyScheduledRun: (workspaceId: string, runId: string, rawOps: unknown) => DreamRunRecord;
|
|
16
|
+
buildScheduledInput: (workspaceId: string, run: DreamRunRecord) => {
|
|
17
|
+
prompt: string;
|
|
18
|
+
};
|
|
14
19
|
dreamStore: DreamStorePort;
|
|
15
20
|
deliverToOrchestrator: (workspaceId: string, text: string) => Promise<void>;
|
|
21
|
+
executeScheduledDream: (input: {
|
|
22
|
+
prompt: string;
|
|
23
|
+
workspaceId: string;
|
|
24
|
+
}) => Promise<unknown>;
|
|
16
25
|
scheduleExport: (workspaceId: string) => void;
|
|
17
26
|
}) => TeamMemoryDreamRunner;
|
|
18
27
|
export {};
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { buildDreamMaintenancePayload } from './team-memory-dream-prompt.js';
|
|
2
|
-
import { DreamRunAlreadyRunningError } from './team-memory-dream-store.js';
|
|
2
|
+
import { DreamRunAlreadyRunningError, } from './team-memory-dream-store.js';
|
|
3
3
|
const truncateError = (value) => [...value].slice(0, 1000).join('');
|
|
4
4
|
export const createTeamMemoryDreamRunner = (deps) => {
|
|
5
5
|
const runningWorkspaceIds = new Set();
|
|
6
|
-
const
|
|
6
|
+
const createOrReuseRun = (workspaceId, trigger) => trigger === 'scheduled'
|
|
7
|
+
? (deps.dreamStore.getRunningScheduledRun(workspaceId) ??
|
|
8
|
+
deps.dreamStore.createRun({ trigger, workspaceId }))
|
|
9
|
+
: deps.dreamStore.createRun({ trigger, workspaceId });
|
|
10
|
+
const runManual = async (workspaceId) => {
|
|
7
11
|
if (runningWorkspaceIds.has(workspaceId))
|
|
8
12
|
throw new DreamRunAlreadyRunningError(workspaceId);
|
|
9
13
|
runningWorkspaceIds.add(workspaceId);
|
|
10
14
|
let runRecord;
|
|
11
15
|
try {
|
|
12
|
-
runRecord =
|
|
16
|
+
runRecord = createOrReuseRun(workspaceId, 'manual');
|
|
13
17
|
await deps.deliverToOrchestrator(workspaceId, buildDreamMaintenancePayload(runRecord));
|
|
14
18
|
deps.scheduleExport(workspaceId);
|
|
15
19
|
return runRecord;
|
|
@@ -26,8 +30,33 @@ export const createTeamMemoryDreamRunner = (deps) => {
|
|
|
26
30
|
runningWorkspaceIds.delete(workspaceId);
|
|
27
31
|
}
|
|
28
32
|
};
|
|
33
|
+
const runScheduled = async (workspaceId) => {
|
|
34
|
+
if (runningWorkspaceIds.has(workspaceId))
|
|
35
|
+
throw new DreamRunAlreadyRunningError(workspaceId);
|
|
36
|
+
runningWorkspaceIds.add(workspaceId);
|
|
37
|
+
let runRecord;
|
|
38
|
+
try {
|
|
39
|
+
runRecord = createOrReuseRun(workspaceId, 'scheduled');
|
|
40
|
+
const input = deps.buildScheduledInput(workspaceId, runRecord);
|
|
41
|
+
const raw = await deps.executeScheduledDream({ prompt: input.prompt, workspaceId });
|
|
42
|
+
const completed = deps.applyScheduledRun(workspaceId, runRecord.id, raw);
|
|
43
|
+
deps.scheduleExport(workspaceId);
|
|
44
|
+
return completed;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (!runRecord)
|
|
48
|
+
throw error;
|
|
49
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
+
const failed = deps.dreamStore.markFailed(runRecord.id, truncateError(message), runRecord);
|
|
51
|
+
deps.scheduleExport(workspaceId);
|
|
52
|
+
return failed;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
runningWorkspaceIds.delete(workspaceId);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
29
58
|
return {
|
|
30
|
-
runManual
|
|
31
|
-
runScheduled
|
|
59
|
+
runManual,
|
|
60
|
+
runScheduled,
|
|
32
61
|
};
|
|
33
62
|
};
|
|
@@ -77,9 +77,9 @@ export const createTeamMemoryDreamScheduler = (deps) => {
|
|
|
77
77
|
if (tickNow - idleSince < idleDebounceMs)
|
|
78
78
|
continue;
|
|
79
79
|
const state = deps.getScheduleState(workspace.id);
|
|
80
|
-
if (state.hasRunningRun)
|
|
80
|
+
if (state.hasRunningRun && !state.runningScheduledRunId)
|
|
81
81
|
continue;
|
|
82
|
-
if (state.pendingMessageCount < minMessages)
|
|
82
|
+
if (!state.runningScheduledRunId && state.pendingMessageCount < minMessages)
|
|
83
83
|
continue;
|
|
84
84
|
const effectiveFloorMs = floorMs *
|
|
85
85
|
2 **
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Database } from 'better-sqlite3';
|
|
2
2
|
export { DreamRunValidationError } from './team-memory-dream-ops.js';
|
|
3
3
|
export { DreamRunNotFoundError, DreamRunRevertDataError, DreamRunRevertStatusError, } from './team-memory-dream-reverter.js';
|
|
4
|
-
export { DREAM_RUNNING_STALE_MS, DREAM_STALE_ERROR, DreamRunAlreadyRunningError, DreamWorkspaceMissingError, } from './team-memory-dream-run-store.js';
|
|
4
|
+
export { DREAM_NO_ACTIVE_ORCHESTRATOR_ERROR_PREFIX, DREAM_RUNNING_STALE_MS, DREAM_STALE_ERROR, DreamRunAlreadyRunningError, DreamWorkspaceMissingError, } from './team-memory-dream-run-store.js';
|
|
5
5
|
export type { DreamMessageInput, DreamRunRecord, DreamRunReport, DreamRunRevertBlob, DreamRunStatus, DreamRunTrigger, DreamScheduleState, } from './team-memory-dream-types.js';
|
|
6
6
|
export declare const createTeamMemoryDreamStore: (db: Database) => {
|
|
7
7
|
revertRun: (workspaceId: string, runId: string) => import("./team-memory-dream-types.js").DreamRunRecord;
|
|
@@ -12,6 +12,7 @@ export declare const createTeamMemoryDreamStore: (db: Database) => {
|
|
|
12
12
|
}) => import("./team-memory-dream-types.js").DreamRunRecord;
|
|
13
13
|
deleteWorkspaceDreamRuns: (workspaceId: string) => void;
|
|
14
14
|
getScheduleState: (workspaceId: string) => import("./team-memory-dream-types.js").DreamScheduleState;
|
|
15
|
+
getRunningScheduledRun: (workspaceId: string) => import("./team-memory-dream-types.js").DreamRunRecord | undefined;
|
|
15
16
|
getRun: (runId: string) => import("./team-memory-dream-types.js").DreamRunRecord | undefined;
|
|
16
17
|
listInputMessages: (workspaceId: string, from: number | null, to: number | null) => import("./team-memory-dream-types.js").DreamMessageInput[];
|
|
17
18
|
listRuns: (workspaceId: string, limit?: number) => import("./team-memory-dream-types.js").DreamRunRecord[];
|
|
@@ -3,7 +3,7 @@ import { createDreamRunReverter } from './team-memory-dream-reverter.js';
|
|
|
3
3
|
import { createDreamRunStore } from './team-memory-dream-run-store.js';
|
|
4
4
|
export { DreamRunValidationError } from './team-memory-dream-ops.js';
|
|
5
5
|
export { DreamRunNotFoundError, DreamRunRevertDataError, DreamRunRevertStatusError, } from './team-memory-dream-reverter.js';
|
|
6
|
-
export { DREAM_RUNNING_STALE_MS, DREAM_STALE_ERROR, DreamRunAlreadyRunningError, DreamWorkspaceMissingError, } from './team-memory-dream-run-store.js';
|
|
6
|
+
export { DREAM_NO_ACTIVE_ORCHESTRATOR_ERROR_PREFIX, DREAM_RUNNING_STALE_MS, DREAM_STALE_ERROR, DreamRunAlreadyRunningError, DreamWorkspaceMissingError, } from './team-memory-dream-run-store.js';
|
|
7
7
|
export const createTeamMemoryDreamStore = (db) => {
|
|
8
8
|
const runStore = createDreamRunStore(db);
|
|
9
9
|
const applier = createDreamOperationApplier(db);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MemoryKind } from '../shared/team-memory.js';
|
|
1
|
+
import type { MemoryKind, MemoryProcedureRef } from '../shared/team-memory.js';
|
|
2
2
|
import type { MemorySource, MemorySourceType, MemoryStatus } from './team-memory-store.js';
|
|
3
3
|
export type DreamRunTrigger = 'manual' | 'scheduled';
|
|
4
4
|
export type DreamRunStatus = 'running' | 'completed' | 'failed' | 'reverted';
|
|
@@ -31,6 +31,9 @@ export interface MemoryEntryRow {
|
|
|
31
31
|
kind: MemoryKind;
|
|
32
32
|
last_injected_at: number | null;
|
|
33
33
|
pinned: number;
|
|
34
|
+
ref_id: string | null;
|
|
35
|
+
ref_title: string | null;
|
|
36
|
+
ref_type: MemoryProcedureRef['type'] | null;
|
|
34
37
|
scope: 'workspace' | 'user';
|
|
35
38
|
source: MemorySource;
|
|
36
39
|
status: MemoryStatus;
|
|
@@ -76,6 +79,7 @@ export interface DreamScheduleState {
|
|
|
76
79
|
hasRunningRun: boolean;
|
|
77
80
|
lastScheduledAt: number | null;
|
|
78
81
|
pendingMessageCount: number;
|
|
82
|
+
runningScheduledRunId: string | null;
|
|
79
83
|
}
|
|
80
84
|
export interface DreamMessageInput {
|
|
81
85
|
artifacts: string | null;
|
|
@@ -55,6 +55,13 @@ const formatEntryLine = (entry) => {
|
|
|
55
55
|
labels.push('pinned');
|
|
56
56
|
if (entry.disabled)
|
|
57
57
|
labels.push('disabled');
|
|
58
|
+
if (entry.scope === 'user')
|
|
59
|
+
labels.push('scope: user');
|
|
60
|
+
if (entry.procedureRef) {
|
|
61
|
+
labels.push(`ref: ${entry.procedureRef.type}:${entry.procedureRef.id}`);
|
|
62
|
+
if (entry.procedureRef.title)
|
|
63
|
+
labels.push(`ref_title: ${entry.procedureRef.title}`);
|
|
64
|
+
}
|
|
58
65
|
labels.push(`source: ${entry.source}`);
|
|
59
66
|
const source = entry.sources[0];
|
|
60
67
|
if (source?.actorNameSnapshot)
|
|
@@ -9,6 +9,11 @@ export declare const serializeMemoryEntry: (entry: MemoryEntryWithSources) => {
|
|
|
9
9
|
kind: "fact" | "preference" | "decision" | "pitfall" | "procedure_ref";
|
|
10
10
|
last_injected_at: number | null;
|
|
11
11
|
pinned: boolean;
|
|
12
|
+
procedure_ref: {
|
|
13
|
+
id: string;
|
|
14
|
+
title: string | null;
|
|
15
|
+
type: "workflow" | "skill" | "procedure" | "template" | "doc";
|
|
16
|
+
} | null;
|
|
12
17
|
scope: "workspace" | "user";
|
|
13
18
|
source: import("./team-memory-store.js").MemorySource;
|
|
14
19
|
sources: {
|
|
@@ -41,6 +46,11 @@ export declare const serializeMemorySearchResult: (entry: MemorySearchResult) =>
|
|
|
41
46
|
kind: "fact" | "preference" | "decision" | "pitfall" | "procedure_ref";
|
|
42
47
|
last_injected_at: number | null;
|
|
43
48
|
pinned: boolean;
|
|
49
|
+
procedure_ref: {
|
|
50
|
+
id: string;
|
|
51
|
+
title: string | null;
|
|
52
|
+
type: "workflow" | "skill" | "procedure" | "template" | "doc";
|
|
53
|
+
} | null;
|
|
44
54
|
scope: "workspace" | "user";
|
|
45
55
|
source: import("./team-memory-store.js").MemorySource;
|
|
46
56
|
sources: {
|
|
@@ -76,6 +86,11 @@ export declare const serializeMemoryInjection: (injection: MemoryInjectionWithMe
|
|
|
76
86
|
kind: "fact" | "preference" | "decision" | "pitfall" | "procedure_ref";
|
|
77
87
|
last_injected_at: number | null;
|
|
78
88
|
pinned: boolean;
|
|
89
|
+
procedure_ref: {
|
|
90
|
+
id: string;
|
|
91
|
+
title: string | null;
|
|
92
|
+
type: "workflow" | "skill" | "procedure" | "template" | "doc";
|
|
93
|
+
} | null;
|
|
79
94
|
scope: "workspace" | "user";
|
|
80
95
|
source: import("./team-memory-store.js").MemorySource;
|
|
81
96
|
sources: {
|
|
@@ -21,6 +21,13 @@ export const serializeMemoryEntry = (entry) => ({
|
|
|
21
21
|
kind: entry.kind,
|
|
22
22
|
last_injected_at: entry.lastInjectedAt,
|
|
23
23
|
pinned: entry.pinned,
|
|
24
|
+
procedure_ref: entry.procedureRef
|
|
25
|
+
? {
|
|
26
|
+
id: entry.procedureRef.id,
|
|
27
|
+
title: entry.procedureRef.title,
|
|
28
|
+
type: entry.procedureRef.type,
|
|
29
|
+
}
|
|
30
|
+
: null,
|
|
24
31
|
scope: entry.scope,
|
|
25
32
|
source: entry.source,
|
|
26
33
|
sources: entry.sources.map(serializeMemorySource),
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { MemoryEntryWithSources, MemorySearchOptions, MemorySearchResult } from './team-memory-store.js';
|
|
2
|
+
export interface DispatchMemoryRetrievalInput {
|
|
3
|
+
taskText: string;
|
|
4
|
+
workerDescription: string;
|
|
5
|
+
workspaceId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MemoryProviderDiagnostics {
|
|
8
|
+
provider: 'local_sqlite';
|
|
9
|
+
retrieval: {
|
|
10
|
+
backend: Array<'fts_unicode' | 'fts_trigram' | 'like'>;
|
|
11
|
+
fallback: 'sqlite_only';
|
|
12
|
+
semantic_provider: 'not_configured';
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface TeamMemoryProvider {
|
|
16
|
+
diagnostics: () => MemoryProviderDiagnostics;
|
|
17
|
+
listDigestEntries: (workspaceId: string, options?: {
|
|
18
|
+
limit?: number;
|
|
19
|
+
}) => MemoryEntryWithSources[];
|
|
20
|
+
retrieveDispatchEntries: (input: DispatchMemoryRetrievalInput) => MemorySearchResult[];
|
|
21
|
+
searchEntries: (workspaceId: string, query: string, options?: MemorySearchOptions) => MemorySearchResult[];
|
|
22
|
+
}
|
|
23
|
+
interface LocalMemoryProviderStore {
|
|
24
|
+
listDigestEntries: (workspaceId: string, options?: {
|
|
25
|
+
limit?: number;
|
|
26
|
+
scopes?: Array<'workspace' | 'user'>;
|
|
27
|
+
}) => MemoryEntryWithSources[];
|
|
28
|
+
searchEntries: (workspaceId: string, query: string, options?: MemorySearchOptions) => MemorySearchResult[];
|
|
29
|
+
}
|
|
30
|
+
export declare const createLocalTeamMemoryProvider: ({ memoryStore, }: {
|
|
31
|
+
memoryStore: LocalMemoryProviderStore;
|
|
32
|
+
}) => TeamMemoryProvider;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { buildDispatchQueries, DISPATCH_MEMORY_CANDIDATE_LIMIT, mergeSearchResults, } from './team-memory-digest.js';
|
|
2
|
+
export const createLocalTeamMemoryProvider = ({ memoryStore, }) => {
|
|
3
|
+
const searchRelevantEntries = (workspaceId, queries) => mergeSearchResults(queries.flatMap((query) => memoryStore.searchEntries(workspaceId, query, {
|
|
4
|
+
limit: DISPATCH_MEMORY_CANDIDATE_LIMIT,
|
|
5
|
+
scopes: ['workspace', 'user'],
|
|
6
|
+
statuses: ['active'],
|
|
7
|
+
})));
|
|
8
|
+
return {
|
|
9
|
+
diagnostics: () => ({
|
|
10
|
+
provider: 'local_sqlite',
|
|
11
|
+
retrieval: {
|
|
12
|
+
backend: ['fts_unicode', 'fts_trigram', 'like'],
|
|
13
|
+
fallback: 'sqlite_only',
|
|
14
|
+
semantic_provider: 'not_configured',
|
|
15
|
+
},
|
|
16
|
+
}),
|
|
17
|
+
listDigestEntries: (workspaceId, options) => {
|
|
18
|
+
const limit = Math.max(0, Math.trunc(options?.limit ?? 20));
|
|
19
|
+
const userLimit = limit <= 1 ? 0 : Math.min(4, Math.max(1, Math.floor(limit / 5)));
|
|
20
|
+
const workspaceLimit = Math.max(0, limit - userLimit);
|
|
21
|
+
return [
|
|
22
|
+
...(workspaceLimit > 0
|
|
23
|
+
? memoryStore.listDigestEntries(workspaceId, {
|
|
24
|
+
limit: workspaceLimit,
|
|
25
|
+
scopes: ['workspace'],
|
|
26
|
+
})
|
|
27
|
+
: []),
|
|
28
|
+
...(userLimit > 0
|
|
29
|
+
? memoryStore.listDigestEntries(workspaceId, {
|
|
30
|
+
limit: userLimit,
|
|
31
|
+
scopes: ['user'],
|
|
32
|
+
})
|
|
33
|
+
: []),
|
|
34
|
+
];
|
|
35
|
+
},
|
|
36
|
+
retrieveDispatchEntries({ taskText, workerDescription, workspaceId }) {
|
|
37
|
+
const taskEntries = searchRelevantEntries(workspaceId, buildDispatchQueries(taskText, 8));
|
|
38
|
+
const roleEntries = searchRelevantEntries(workspaceId, buildDispatchQueries(workerDescription, 6));
|
|
39
|
+
const roleMatches = new Map(roleEntries.map((entry) => [entry.id, entry]));
|
|
40
|
+
if (taskEntries.length === 0)
|
|
41
|
+
return [];
|
|
42
|
+
return taskEntries.map((entry) => {
|
|
43
|
+
const roleMatch = roleMatches.get(entry.id);
|
|
44
|
+
if (!roleMatch)
|
|
45
|
+
return entry;
|
|
46
|
+
return {
|
|
47
|
+
...entry,
|
|
48
|
+
score: Math.min(entry.score, roleMatch.score),
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
searchEntries: (workspaceId, query, options) => memoryStore.searchEntries(workspaceId, query, options),
|
|
53
|
+
};
|
|
54
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Database } from 'better-sqlite3';
|
|
2
|
-
import { type MemoryKind } from '../shared/team-memory.js';
|
|
2
|
+
import { type MemoryKind, type MemoryProcedureRef, type MemoryScope } from '../shared/team-memory.js';
|
|
3
3
|
import type { AgentSummary } from '../shared/types.js';
|
|
4
4
|
export type MemoryStatus = 'active' | 'candidate' | 'archived' | 'rejected';
|
|
5
5
|
export type MemorySource = 'manual' | 'dream';
|
|
@@ -20,7 +20,8 @@ export interface MemoryEntryRecord {
|
|
|
20
20
|
kind: MemoryKind;
|
|
21
21
|
lastInjectedAt: number | null;
|
|
22
22
|
pinned: boolean;
|
|
23
|
-
|
|
23
|
+
procedureRef: MemoryProcedureRef | null;
|
|
24
|
+
scope: MemoryScope;
|
|
24
25
|
source: MemorySource;
|
|
25
26
|
status: MemoryStatus;
|
|
26
27
|
tags: string[];
|
|
@@ -52,7 +53,9 @@ export interface AddMemoryEntryInput {
|
|
|
52
53
|
body: string;
|
|
53
54
|
confidence?: number | null;
|
|
54
55
|
kind: MemoryKind;
|
|
56
|
+
procedureRef?: MemoryProcedureRef | null;
|
|
55
57
|
source?: MemorySource;
|
|
58
|
+
scope?: MemoryScope;
|
|
56
59
|
tags?: string[];
|
|
57
60
|
workspaceId: string;
|
|
58
61
|
}
|
|
@@ -66,14 +69,17 @@ export interface LogMemoryInjectionsInput {
|
|
|
66
69
|
export interface MemorySearchOptions {
|
|
67
70
|
includeDisabled?: boolean;
|
|
68
71
|
limit?: number;
|
|
72
|
+
scopes?: MemoryScope[];
|
|
69
73
|
statuses?: MemoryStatus[];
|
|
70
74
|
}
|
|
71
75
|
export interface MemoryListOptions {
|
|
72
76
|
limit?: number;
|
|
77
|
+
scopes?: MemoryScope[];
|
|
73
78
|
statuses?: MemoryStatus[];
|
|
74
79
|
}
|
|
75
80
|
export interface MemoryDigestOptions {
|
|
76
81
|
limit?: number;
|
|
82
|
+
scopes?: MemoryScope[];
|
|
77
83
|
}
|
|
78
84
|
export interface MemoryInjectionWithMemory {
|
|
79
85
|
contextType: MemoryInjectionContext;
|
|
@@ -105,8 +111,9 @@ export declare const createTeamMemoryStore: (db: Database) => {
|
|
|
105
111
|
getEntryWithSources: (workspaceId: string, memoryId: string) => MemoryEntryWithSources | undefined;
|
|
106
112
|
listDigestEntries: (workspaceId: string, options?: MemoryDigestOptions) => MemoryEntryWithSources[];
|
|
107
113
|
listExportEntries: (workspaceId: string) => MemoryEntryWithSources[];
|
|
108
|
-
listAllEntries: (workspaceId: string) => MemoryEntryWithSources[];
|
|
114
|
+
listAllEntries: (workspaceId: string, options?: Pick<MemoryListOptions, "scopes">) => MemoryEntryWithSources[];
|
|
109
115
|
listEntries: (workspaceId: string, options?: MemoryListOptions) => MemoryEntryWithSources[];
|
|
116
|
+
listInjections: (workspaceId: string, limit?: number) => MemoryInjectionWithMemory[];
|
|
110
117
|
listInjectionsForDispatch: (workspaceId: string, dispatchId: string) => MemoryInjectionWithMemory[];
|
|
111
118
|
logInjections: (input: LogMemoryInjectionsInput) => `${string}-${string}-${string}-${string}-${string}`[];
|
|
112
119
|
rejectCandidate: (workspaceId: string, memoryId: string) => MemoryEntryWithSources;
|