@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.
Files changed (67) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/src/cli/team.d.ts +4 -1
  3. package/dist/src/cli/team.js +95 -6
  4. package/dist/src/server/agent-startup-instructions.js +1 -1
  5. package/dist/src/server/hive-team-guidance.js +2 -2
  6. package/dist/src/server/routes-team-memory.js +53 -2
  7. package/dist/src/server/routes-workspace-memory.js +31 -2
  8. package/dist/src/server/runtime-store-contract.d.ts +2 -0
  9. package/dist/src/server/runtime-store-dream.d.ts +2 -5
  10. package/dist/src/server/runtime-store-dream.js +2 -12
  11. package/dist/src/server/runtime-store-helpers.d.ts +4 -0
  12. package/dist/src/server/runtime-store-helpers.js +21 -1
  13. package/dist/src/server/runtime-store-memory.d.ts +6 -0
  14. package/dist/src/server/runtime-store-memory.js +1 -0
  15. package/dist/src/server/sqlite-schema-v36.d.ts +3 -0
  16. package/dist/src/server/sqlite-schema-v36.js +21 -0
  17. package/dist/src/server/sqlite-schema.d.ts +1 -1
  18. package/dist/src/server/sqlite-schema.js +6 -1
  19. package/dist/src/server/team-memory-diagnostics.d.ts +86 -0
  20. package/dist/src/server/team-memory-diagnostics.js +87 -0
  21. package/dist/src/server/team-memory-digest.d.ts +7 -0
  22. package/dist/src/server/team-memory-digest.js +22 -5
  23. package/dist/src/server/team-memory-dream-applier.js +20 -3
  24. package/dist/src/server/team-memory-dream-cli.d.ts +13 -0
  25. package/dist/src/server/team-memory-dream-cli.js +115 -0
  26. package/dist/src/server/team-memory-dream-input.d.ts +15 -0
  27. package/dist/src/server/team-memory-dream-input.js +14 -0
  28. package/dist/src/server/team-memory-dream-ops.d.ts +4 -1
  29. package/dist/src/server/team-memory-dream-ops.js +32 -3
  30. package/dist/src/server/team-memory-dream-prompt.js +5 -3
  31. package/dist/src/server/team-memory-dream-reverter.js +13 -3
  32. package/dist/src/server/team-memory-dream-run-store.d.ts +1 -0
  33. package/dist/src/server/team-memory-dream-run-store.js +20 -0
  34. package/dist/src/server/team-memory-dream-runner.d.ts +10 -1
  35. package/dist/src/server/team-memory-dream-runner.js +34 -5
  36. package/dist/src/server/team-memory-dream-scheduler.js +2 -2
  37. package/dist/src/server/team-memory-dream-store.d.ts +2 -1
  38. package/dist/src/server/team-memory-dream-store.js +1 -1
  39. package/dist/src/server/team-memory-dream-types.d.ts +5 -1
  40. package/dist/src/server/team-memory-export.js +7 -0
  41. package/dist/src/server/team-memory-http-serializers.d.ts +15 -0
  42. package/dist/src/server/team-memory-http-serializers.js +7 -0
  43. package/dist/src/server/team-memory-provider.d.ts +33 -0
  44. package/dist/src/server/team-memory-provider.js +54 -0
  45. package/dist/src/server/team-memory-store.d.ts +10 -3
  46. package/dist/src/server/team-memory-store.js +134 -58
  47. package/dist/src/shared/team-memory.d.ts +13 -0
  48. package/dist/src/shared/team-memory.js +12 -0
  49. package/package.json +1 -1
  50. package/web/dist/assets/{AddWorkerDialog-CkCGKa0N.js → AddWorkerDialog-AxzWv2T8.js} +2 -2
  51. package/web/dist/assets/AddWorkspaceFlow-D-Yh_kk_.js +1 -0
  52. package/web/dist/assets/{FirstRunWizard-Db4HWbBQ.js → FirstRunWizard-nAK4Eprj.js} +1 -1
  53. package/web/dist/assets/{MarketplaceDrawer-DHwl1if1.js → MarketplaceDrawer-B8JW-znT.js} +1 -1
  54. package/web/dist/assets/{TaskGraphDrawer-B_OibVQO.js → TaskGraphDrawer-BQ9Wr41D.js} +1 -1
  55. package/web/dist/assets/{WhatsNewDialog-9QXlLVfy.js → WhatsNewDialog-D7DwCnTR.js} +1 -1
  56. package/web/dist/assets/{WorkerModal-BGdtte3-.js → WorkerModal-tU-XkiFG.js} +1 -1
  57. package/web/dist/assets/{WorkflowsDrawer-DRuS0Ao5.js → WorkflowsDrawer-DCa-HN3D.js} +1 -1
  58. package/web/dist/assets/WorkspaceMemoryDrawer-4hLlu8BO.js +1 -0
  59. package/web/dist/assets/WorkspaceTaskDrawer-D3LcLkw_.js +1 -0
  60. package/web/dist/assets/{index-BiGD5NhO.js → index-B8tv0NRK.js} +13 -13
  61. package/web/dist/assets/{search-BHvXxsdK.js → search-CcRvD2Q5.js} +1 -1
  62. package/web/dist/assets/{square-terminal-CzkQzjCU.js → square-terminal-zBgH6nhI.js} +1 -1
  63. package/web/dist/index.html +1 -1
  64. package/web/dist/sw.js +1 -1
  65. package/web/dist/assets/AddWorkspaceFlow-Cd73iChz.js +0 -1
  66. package/web/dist/assets/WorkspaceMemoryDrawer-C8PuHo0x.js +0 -1
  67. 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 { DreamRunRecord, DreamRunTrigger } from './team-memory-dream-store.js';
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 run = async (workspaceId, trigger) => {
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 = deps.dreamStore.createRun({ trigger, workspaceId });
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: (workspaceId) => run(workspaceId, 'manual'),
31
- runScheduled: (workspaceId) => run(workspaceId, 'scheduled'),
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
- scope: 'workspace' | 'user';
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;