qlogicagent 2.10.33 → 2.10.34

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 (132) hide show
  1. package/dist/agent.js +6 -21
  2. package/dist/cli.js +386 -387
  3. package/dist/index.js +388 -389
  4. package/dist/orchestration.js +8 -8
  5. package/dist/permissions.js +1 -1
  6. package/dist/protocol.js +1 -1
  7. package/dist/types/agent/agent.d.ts +4 -2
  8. package/dist/types/agent/tool-loop/artifact-events.d.ts +17 -0
  9. package/dist/types/agent/tool-loop/loop-helpers.d.ts +15 -0
  10. package/dist/types/agent/tool-loop/recovery-helpers.d.ts +18 -0
  11. package/dist/types/agent/tool-loop/single-round.d.ts +2 -0
  12. package/dist/types/agent/tool-loop/tool-result-events.d.ts +7 -0
  13. package/dist/types/agent/tool-loop.d.ts +12 -11
  14. package/dist/types/agent/types.d.ts +3 -1
  15. package/dist/types/cli/acp-session-handlers.d.ts +2 -0
  16. package/dist/types/cli/agent-runtime-bootstrap.d.ts +2 -1
  17. package/dist/types/cli/agent-runtime-ports-adapter.d.ts +2 -0
  18. package/dist/types/cli/agent-runtime-session-state.d.ts +24 -0
  19. package/dist/types/cli/base-tool-bootstrap.d.ts +2 -0
  20. package/dist/types/cli/core-tool-coordinator.d.ts +3 -0
  21. package/dist/types/cli/core-tools/agent-tool-bootstrap.d.ts +3 -1
  22. package/dist/types/cli/core-tools/agent-tool-service.d.ts +3 -1
  23. package/dist/types/cli/core-tools/checkpoint-tool-bootstrap.d.ts +3 -1
  24. package/dist/types/cli/core-tools/config-tool-bootstrap.d.ts +3 -1
  25. package/dist/types/cli/core-tools/cron-tool-bootstrap.d.ts +3 -1
  26. package/dist/types/cli/core-tools/monitor-tool-bootstrap.d.ts +3 -1
  27. package/dist/types/cli/core-tools/team-tool-bootstrap.d.ts +3 -1
  28. package/dist/types/cli/core-tools/utility-tool-bootstrap.d.ts +3 -1
  29. package/dist/types/cli/dev-tool-bootstrap.d.ts +4 -0
  30. package/dist/types/cli/dev-tools/dev-tool-bootstrap-service.d.ts +6 -0
  31. package/dist/types/cli/dev-tools/dev-tool-registry.d.ts +7 -0
  32. package/dist/types/cli/dream-host-adapter.d.ts +1 -0
  33. package/dist/types/cli/handlers/community-handler.d.ts +2 -1
  34. package/dist/types/cli/handlers/config-handler.d.ts +2 -0
  35. package/dist/types/cli/handlers/dream-handler.d.ts +2 -0
  36. package/dist/types/cli/handlers/pet-handler.d.ts +1 -0
  37. package/dist/types/cli/handlers/product-handler.d.ts +18 -40
  38. package/dist/types/cli/handlers/project-handler.d.ts +1 -1
  39. package/dist/types/cli/handlers/turn-handler.d.ts +3 -1
  40. package/dist/types/cli/handlers/workflow-handler.d.ts +2 -0
  41. package/dist/types/cli/mcp-bootstrap.d.ts +20 -0
  42. package/dist/types/cli/mcp-plugin-bootstrap.d.ts +2 -27
  43. package/dist/types/cli/media-runtime-facade.d.ts +20 -0
  44. package/dist/types/cli/memory-candidate-service.d.ts +74 -0
  45. package/dist/types/cli/memory-coordinator.d.ts +3 -3
  46. package/dist/types/cli/permission-approval-bridge.d.ts +15 -0
  47. package/dist/types/cli/permission-bootstrap.d.ts +6 -6
  48. package/dist/types/cli/permission-runtime-service.d.ts +9 -0
  49. package/dist/types/cli/pet-confirm-coordinator.d.ts +2 -2
  50. package/dist/types/cli/plugin-bootstrap.d.ts +14 -0
  51. package/dist/types/cli/product-coordinator.d.ts +25 -0
  52. package/dist/types/cli/project-command-service.d.ts +26 -0
  53. package/dist/types/cli/provider-core-facade.d.ts +1 -0
  54. package/dist/types/cli/runtime-hook-bootstrap.d.ts +2 -1
  55. package/dist/types/cli/runtime-watcher-bootstrap.d.ts +2 -2
  56. package/dist/types/cli/session-coordinator.d.ts +5 -3
  57. package/dist/types/cli/session-query-service.d.ts +23 -0
  58. package/dist/types/cli/skill-meta-subturn-service.d.ts +22 -0
  59. package/dist/types/cli/skill-meta-tool-bootstrap.d.ts +9 -7
  60. package/dist/types/cli/skills-query-service.d.ts +26 -0
  61. package/dist/types/cli/stdio-agent-session-bootstrap.d.ts +78 -0
  62. package/dist/types/cli/stdio-runtime-bootstrap.d.ts +16 -0
  63. package/dist/types/cli/stdio-runtime-services.d.ts +36 -0
  64. package/dist/types/cli/stdio-server.d.ts +19 -18
  65. package/dist/types/cli/test-support/tool-catalog-fixture.d.ts +3 -0
  66. package/dist/types/cli/tool-bootstrap-providers.d.ts +3 -0
  67. package/dist/types/cli/tool-bootstrap.d.ts +7 -20
  68. package/dist/types/cli/tool-catalog.d.ts +4 -2
  69. package/dist/types/cli/tool-invoker-factory.d.ts +2 -0
  70. package/dist/types/cli/tool-registration-modules.contract.test.d.ts +1 -0
  71. package/dist/types/cli/tool-registry-adapter.d.ts +5 -0
  72. package/dist/types/contracts/hooks.d.ts +1 -1
  73. package/dist/types/index.d.ts +1 -2
  74. package/dist/types/orchestration/product-persistence.d.ts +7 -3
  75. package/dist/types/orchestration/solo-persistence.d.ts +8 -4
  76. package/dist/types/orchestration/subagent/agent-registry.d.ts +3 -3
  77. package/dist/types/orchestration/tool-cascade.d.ts +12 -3
  78. package/dist/types/orchestration/tool-loop/tool-schema.d.ts +4 -1
  79. package/dist/types/orchestration/workflow/qla-executor-host.d.ts +3 -3
  80. package/dist/types/protocol/methods.d.ts +27 -1
  81. package/dist/types/protocol/wire/acp-protocol.d.ts +0 -2
  82. package/dist/types/protocol/wire/agent-rpc.d.ts +4 -4
  83. package/dist/types/protocol/wire/capability-manifest.d.ts +2 -1
  84. package/dist/types/protocol/wire/capability-transport.d.ts +2 -2
  85. package/dist/types/protocol/wire/chat-types.d.ts +4 -0
  86. package/dist/types/protocol/wire/index.d.ts +1 -1
  87. package/dist/types/protocol/wire/notification-payloads.d.ts +2 -1
  88. package/dist/types/protocol/wire/web-capability.d.ts +3 -0
  89. package/dist/types/runtime/community/community-consent-client.d.ts +21 -1
  90. package/dist/types/runtime/execution/dream-agent.d.ts +1 -1
  91. package/dist/types/runtime/execution/forked-agent.d.ts +1 -1
  92. package/dist/types/runtime/execution/tool-eligibility.d.ts +14 -37
  93. package/dist/types/runtime/execution/tool-eligibility.test.d.ts +1 -0
  94. package/dist/types/runtime/hooks/context-compression.d.ts +1 -1
  95. package/dist/types/runtime/infra/agent-paths.d.ts +0 -4
  96. package/dist/types/runtime/infra/default-path-service.d.ts +32 -0
  97. package/dist/types/runtime/infra/llmrouter-catalog.d.ts +6 -5
  98. package/dist/types/runtime/infra/model-registry.d.ts +1 -2
  99. package/dist/types/runtime/infra/process-config-port.d.ts +2 -0
  100. package/dist/types/runtime/infra/provider-catalog-adapter.d.ts +48 -0
  101. package/dist/types/runtime/infra/token-budget.d.ts +1 -1
  102. package/dist/types/runtime/ports/agent-runtime-ports.d.ts +76 -0
  103. package/dist/types/runtime/ports/config-port.d.ts +4 -0
  104. package/dist/types/runtime/ports/index.d.ts +8 -2
  105. package/dist/types/runtime/ports/model-transport-contracts.d.ts +125 -0
  106. package/dist/types/runtime/ports/path-service.d.ts +18 -0
  107. package/dist/types/runtime/ports/permission-contracts.d.ts +8 -3
  108. package/dist/types/runtime/ports/tool-contracts.d.ts +63 -2
  109. package/dist/types/runtime/session/session-persistence.d.ts +1 -1
  110. package/dist/types/runtime/tasks/task-types.d.ts +2 -1
  111. package/dist/types/skills/index.d.ts +1 -109
  112. package/dist/types/skills/mcp/mcp-manager.d.ts +13 -0
  113. package/dist/types/skills/memory/local-memory-provider.d.ts +0 -4
  114. package/dist/types/skills/memory/local-store-records.d.ts +184 -0
  115. package/dist/types/skills/memory/local-store.d.ts +9 -14
  116. package/dist/types/skills/memory/memory-db-path.d.ts +7 -0
  117. package/dist/types/skills/memory/memory-embedding-config.d.ts +31 -0
  118. package/dist/types/skills/memory/memory-provider-factory.d.ts +3 -14
  119. package/dist/types/skills/memory/memory-vector-utils.d.ts +2 -0
  120. package/dist/types/skills/memory/sqlite-memory-mappers.d.ts +6 -0
  121. package/dist/types/skills/memory/sqlite-memory-schema.d.ts +3 -0
  122. package/dist/types/skills/permissions/hook-runner.d.ts +1 -1
  123. package/dist/types/skills/permissions/rule-engine.d.ts +2 -5
  124. package/dist/types/skills/permissions/settings-watcher.d.ts +6 -35
  125. package/dist/types/skills/permissions/types.d.ts +1 -1
  126. package/dist/types/skills/plugins/plugin-loader.d.ts +10 -0
  127. package/dist/types/skills/portable-tool.d.ts +10 -0
  128. package/dist/types/skills/tools/cron-tool.d.ts +0 -20
  129. package/dist/types/skills/tools.d.ts +24 -59
  130. package/dist/types/transport/acp-server.d.ts +7 -7
  131. package/package.json +2 -1
  132. /package/dist/types/{cli/rpc-registry.community.test.d.ts → agent/tool-loop.contract.test.d.ts} +0 -0
@@ -0,0 +1,184 @@
1
+ export interface MemoryRecord {
2
+ id: string;
3
+ text: string;
4
+ userId: string;
5
+ category: string;
6
+ importance: number;
7
+ confidence: number;
8
+ source: string;
9
+ sessionId: string;
10
+ eventDate: string;
11
+ tags: string[];
12
+ embedding: Float32Array | null;
13
+ createdAt: number;
14
+ updatedAt: number;
15
+ accessCount: number;
16
+ lastAccessedAt: number;
17
+ isArchived: boolean;
18
+ }
19
+ export interface MemoryInsertInput {
20
+ text: string;
21
+ userId: string;
22
+ category?: string;
23
+ importance?: number;
24
+ confidence?: number;
25
+ source?: string;
26
+ sessionId?: string;
27
+ eventDate?: string;
28
+ tags?: string[];
29
+ embedding?: Float32Array;
30
+ }
31
+ export interface MemoryUpdateInput {
32
+ text?: string;
33
+ category?: string;
34
+ importance?: number;
35
+ source?: string;
36
+ eventDate?: string;
37
+ tags?: string[];
38
+ embedding?: Float32Array | null;
39
+ }
40
+ export interface MemorySearchHit {
41
+ id: string;
42
+ text: string;
43
+ score: number;
44
+ category: string;
45
+ importance: number;
46
+ metadata: Record<string, unknown>;
47
+ }
48
+ export interface MemoryAtlasBucket {
49
+ id: string;
50
+ startAt: number;
51
+ endAt: number;
52
+ count: number;
53
+ avgImportance: number;
54
+ avgConfidence: number;
55
+ topCategory: string;
56
+ }
57
+ export interface MemoryAtlasCluster {
58
+ id: string;
59
+ label: string;
60
+ kind: "source" | "category" | "tag";
61
+ count: number;
62
+ startAt: number;
63
+ endAt: number;
64
+ avgImportance: number;
65
+ avgConfidence: number;
66
+ topCategory: string;
67
+ }
68
+ export interface MemoryAtlasWindowCursor {
69
+ startAt: number;
70
+ endAt: number;
71
+ centerAt: number;
72
+ pageSize: number;
73
+ hasBefore: boolean;
74
+ hasAfter: boolean;
75
+ }
76
+ export interface MemoryAtlasResult {
77
+ totalCount: number;
78
+ records: MemoryRecord[];
79
+ buckets: MemoryAtlasBucket[];
80
+ clusters: MemoryAtlasCluster[];
81
+ windowCursor: MemoryAtlasWindowCursor | null;
82
+ timeRange: {
83
+ startAt: number;
84
+ endAt: number;
85
+ } | null;
86
+ }
87
+ export type MemorySourceKind = "manual" | "explicit" | "document" | "image" | "video" | "auto" | "turn" | "dream" | "agent";
88
+ export type MemoryClaimStatus = "active" | "superseded" | "conflicted" | "archived" | "pending_confirmation";
89
+ export type MemoryProposalStatus = "pending" | "accepted" | "merged" | "conflicted" | "rejected";
90
+ export interface MemoryObservationInput {
91
+ userId: string;
92
+ text: string;
93
+ source: string;
94
+ sourcePriority: number;
95
+ sessionId?: string;
96
+ evidenceType?: string;
97
+ payload?: Record<string, unknown>;
98
+ }
99
+ export interface MemoryObservationRecord extends Required<Omit<MemoryObservationInput, "payload" | "sessionId" | "evidenceType">> {
100
+ id: string;
101
+ sessionId: string;
102
+ evidenceType: string;
103
+ payload: Record<string, unknown>;
104
+ createdAt: number;
105
+ }
106
+ export interface MemoryProposalInput {
107
+ userId: string;
108
+ observationIds: string[];
109
+ text: string;
110
+ category: string;
111
+ importance: number;
112
+ confidence: number;
113
+ source: string;
114
+ sourcePriority: number;
115
+ entity: string;
116
+ predicate: string;
117
+ value: Record<string, unknown>;
118
+ validTime?: string;
119
+ tags?: string[];
120
+ status?: MemoryProposalStatus;
121
+ relatedClaimIds?: string[];
122
+ }
123
+ export interface MemoryProposalRecord extends Omit<MemoryProposalInput, "value" | "validTime" | "tags" | "status" | "relatedClaimIds"> {
124
+ id: string;
125
+ value: Record<string, unknown>;
126
+ validTime: string;
127
+ tags: string[];
128
+ status: MemoryProposalStatus;
129
+ relatedClaimIds: string[];
130
+ createdAt: number;
131
+ updatedAt: number;
132
+ }
133
+ export interface MemoryClaimInput {
134
+ userId: string;
135
+ memoryId?: string;
136
+ entity: string;
137
+ predicate: string;
138
+ value: Record<string, unknown>;
139
+ text: string;
140
+ category: string;
141
+ importance: number;
142
+ confidence: number;
143
+ source: string;
144
+ sourcePriority: number;
145
+ status: MemoryClaimStatus;
146
+ validTime?: string;
147
+ evidenceIds: string[];
148
+ supersedesClaimId?: string;
149
+ conflictGroupId?: string;
150
+ }
151
+ export interface MemoryClaimRecord extends Omit<MemoryClaimInput, "memoryId" | "value" | "validTime" | "supersedesClaimId" | "conflictGroupId"> {
152
+ id: string;
153
+ memoryId: string;
154
+ value: Record<string, unknown>;
155
+ validTime: string;
156
+ supersedesClaimId: string;
157
+ conflictGroupId: string;
158
+ createdAt: number;
159
+ updatedAt: number;
160
+ }
161
+ export interface MemoryConflictRecord {
162
+ id: string;
163
+ userId: string;
164
+ claimAId: string;
165
+ claimBId: string;
166
+ reason: string;
167
+ status: "open" | "resolved" | "dismissed";
168
+ createdAt: number;
169
+ updatedAt: number;
170
+ }
171
+ export interface SqliteDatabase {
172
+ exec(sql: string): void;
173
+ prepare(sql: string): SqliteStatement;
174
+ pragma(pragma: string): unknown;
175
+ close(): void;
176
+ }
177
+ export interface SqliteStatement {
178
+ run(...params: unknown[]): {
179
+ changes: number;
180
+ lastInsertRowid: number | bigint;
181
+ };
182
+ get(...params: unknown[]): unknown;
183
+ all(...params: unknown[]): unknown[];
184
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Local Memory Store SQLite-backed persistence for qmemory.
2
+ * Local Memory Store - SQLite-backed persistence for qmemory.
3
3
  *
4
4
  * Ported from Python qmemory's memory_store.py + db.py.
5
5
  * Uses better-sqlite3 for synchronous, fast, single-file persistence.
@@ -12,6 +12,7 @@
12
12
  * - memories_fts: FTS5 full-text index for keyword search
13
13
  * - profiles: user profile KV (future)
14
14
  */
15
+ export { resolveMemoryDbPath } from "./memory-db-path.js";
15
16
  export interface MemoryRecord {
16
17
  id: string;
17
18
  text: string;
@@ -294,10 +295,10 @@ export declare class LocalMemoryStore {
294
295
  * Apply feedback signal to a memory, adjusting importance accordingly.
295
296
  *
296
297
  * Signals:
297
- * - "useful" boost importance by +0.15 (capped at 1.0)
298
- * - "irrelevant" reduce importance by -0.2
299
- * - "outdated" archive immediately
300
- * - "wrong" delete immediately
298
+ * - "useful" boosts importance by +0.15 (capped at 1.0)
299
+ * - "irrelevant" reduces importance by -0.2
300
+ * - "outdated" archives immediately
301
+ * - "wrong" deletes immediately
301
302
  */
302
303
  applyFeedback(memoryId: string, signal: "useful" | "irrelevant" | "outdated" | "wrong"): boolean;
303
304
  /**
@@ -336,7 +337,7 @@ export declare class LocalMemoryStore {
336
337
  }>;
337
338
  /**
338
339
  * Get memory activity summary over recent N days.
339
- * Returns daily counts and high-importance entries used by temporal synthesis.
340
+ * Returns daily counts and high-importance entries used by temporal synthesis.
340
341
  */
341
342
  getActivitySummary(userId: string, days?: number): {
342
343
  dailyCounts: Array<{
@@ -352,8 +353,8 @@ export declare class LocalMemoryStore {
352
353
  }>;
353
354
  };
354
355
  /**
355
- * Find memories related to a specific event date (±tolerance).
356
- * Used for temporal context retrieval: "关于上周二的会议" find memories around that date.
356
+ * Find memories related to a specific event date (tolerance).
357
+ * Used for temporal context retrieval, such as finding memories around a requested date.
357
358
  */
358
359
  findByEventDate(userId: string, targetDate: string, toleranceDays?: number): MemorySearchHit[];
359
360
  /**
@@ -417,9 +418,3 @@ export declare class LocalMemoryStore {
417
418
  listConflicts(userId: string): MemoryConflictRecord[];
418
419
  close(): void;
419
420
  }
420
- /**
421
- * Resolve the database file path for L2 vector memory storage.
422
- * L2 vector memory is cross-project for one owner, but physically isolated by
423
- * profile at ~/.qlogicagent/profiles/<owner_user_id>/memory/.
424
- */
425
- export declare function resolveMemoryDbPath(ownerUserId?: string): string;
@@ -0,0 +1,7 @@
1
+ import type { PathService } from "../../runtime/ports/index.js";
2
+ /**
3
+ * Resolve the database file path for L2 vector memory storage.
4
+ * L2 vector memory is cross-project for one owner, but physically isolated by
5
+ * profile at ~/.qlogicagent/profiles/<owner_user_id>/memory/.
6
+ */
7
+ export declare function resolveMemoryDbPath(ownerUserId?: string, pathService?: PathService): string;
@@ -0,0 +1,31 @@
1
+ import type { ConfigPort, PathService } from "../../runtime/ports/index.js";
2
+ import type { LocalEmbeddingConfig } from "./local-embedding.js";
3
+ export interface MemoryProviderFactoryConfig {
4
+ /** Active owner profile. All local memory files are physically scoped here. */
5
+ ownerUserId: string;
6
+ /** User ID prefix. */
7
+ userIdPrefix?: string;
8
+ /** Embedding config for local provider. */
9
+ embedding?: LocalEmbeddingConfig;
10
+ }
11
+ export interface MemoryEmbeddingModelBinding {
12
+ provider: string;
13
+ apiKey: string;
14
+ model: string;
15
+ baseUrl?: string;
16
+ keyHandle: {
17
+ release(result: {
18
+ success: boolean;
19
+ }): void;
20
+ };
21
+ }
22
+ export interface MemoryEmbeddingModelRegistry {
23
+ getActiveModel(purpose: "embedding"): MemoryEmbeddingModelBinding | null;
24
+ }
25
+ export interface MemoryConfigResolutionDeps {
26
+ config: ConfigPort;
27
+ pathService: PathService;
28
+ modelRegistry: MemoryEmbeddingModelRegistry;
29
+ }
30
+ export declare function resolveMemoryProviderConfig(deps: MemoryConfigResolutionDeps): MemoryProviderFactoryConfig;
31
+ export type { LocalEmbeddingConfig };
@@ -4,18 +4,9 @@
4
4
  * No remote/cloud memory service exists. Memory is always local.
5
5
  * This factory is the single integration point for stdio-server.ts.
6
6
  */
7
- import type { LocalEmbeddingConfig } from "./local-embedding.js";
8
7
  import type { LocalMemoryProvider } from "./local-memory-provider.js";
9
- export interface MemoryProviderFactoryConfig {
10
- /** Not used for L2 vector DB (always global). Kept for config compat. */
11
- projectRoot?: string;
12
- /** Active owner profile. All local memory files are physically scoped here. */
13
- ownerUserId: string;
14
- /** User ID prefix. */
15
- userIdPrefix?: string;
16
- /** Embedding config for local provider. */
17
- embedding?: LocalEmbeddingConfig;
18
- }
8
+ import { type MemoryProviderFactoryConfig } from "./memory-embedding-config.js";
9
+ export type { MemoryProviderFactoryConfig } from "./memory-embedding-config.js";
19
10
  export interface MemoryProviderFactoryResult {
20
11
  provider: LocalMemoryProvider | null;
21
12
  mode: "local" | "none";
@@ -38,7 +29,5 @@ export declare function createMemoryProvider(config: MemoryProviderFactoryConfig
38
29
  * Layer 0: Explicit ModelRegistry "embedding" binding
39
30
  * Layer 1: LLM Router default embedding endpoint (BAAI/bge-m3)
40
31
  * Layer 2: FTS5 pure text (NullEmbeddingProvider)
41
- *
42
- * @param projectRoot — Project root for local storage path
43
32
  */
44
- export declare function resolveMemoryConfigFromEnv(projectRoot?: string): MemoryProviderFactoryConfig;
33
+ export declare function resolveMemoryConfigFromEnv(): MemoryProviderFactoryConfig;
@@ -0,0 +1,2 @@
1
+ export declare function normalizeVector(vec: Float32Array): Float32Array;
2
+ export declare function dotProduct(a: Float32Array, b: Float32Array): number;
@@ -0,0 +1,6 @@
1
+ import type { MemoryClaimRecord, MemoryConflictRecord, MemoryRecord } from "./local-store-records.js";
2
+ export declare function rowToRecord(row: unknown): MemoryRecord;
3
+ export declare function rowToClaimRecord(row: unknown): MemoryClaimRecord;
4
+ export declare function rowToConflictRecord(row: unknown): MemoryConflictRecord;
5
+ export declare function parseJsonObject(raw: unknown): Record<string, unknown>;
6
+ export declare function parseJsonArray(raw: unknown): string[];
@@ -0,0 +1,3 @@
1
+ import type { SqliteDatabase } from "./local-store-records.js";
2
+ export declare const MEMORY_SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY,\n text TEXT NOT NULL,\n user_id TEXT NOT NULL,\n category TEXT NOT NULL DEFAULT 'general',\n importance REAL NOT NULL DEFAULT 0.5,\n confidence REAL NOT NULL DEFAULT 1.0,\n source TEXT NOT NULL DEFAULT 'agent',\n session_id TEXT NOT NULL DEFAULT '',\n event_date TEXT NOT NULL DEFAULT '',\n tags TEXT NOT NULL DEFAULT '[]',\n embedding BLOB,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n access_count INTEGER NOT NULL DEFAULT 0,\n last_accessed_at INTEGER NOT NULL DEFAULT 0,\n is_archived INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE INDEX IF NOT EXISTS idx_memories_user ON memories(user_id);\nCREATE INDEX IF NOT EXISTS idx_memories_user_category ON memories(user_id, category);\nCREATE INDEX IF NOT EXISTS idx_memories_user_importance ON memories(user_id, importance DESC);\nCREATE INDEX IF NOT EXISTS idx_memories_created ON memories(created_at DESC);\n\nCREATE TABLE IF NOT EXISTS memory_observations (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n text TEXT NOT NULL,\n source TEXT NOT NULL,\n source_priority INTEGER NOT NULL DEFAULT 0,\n session_id TEXT NOT NULL DEFAULT '',\n evidence_type TEXT NOT NULL DEFAULT 'text',\n payload TEXT NOT NULL DEFAULT '{}',\n created_at INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_memory_observations_user_created ON memory_observations(user_id, created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_memory_observations_source ON memory_observations(user_id, source);\n\nCREATE TABLE IF NOT EXISTS memory_proposals (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n observation_ids TEXT NOT NULL DEFAULT '[]',\n text TEXT NOT NULL,\n category TEXT NOT NULL DEFAULT 'general',\n importance REAL NOT NULL DEFAULT 0.5,\n confidence REAL NOT NULL DEFAULT 0.5,\n source TEXT NOT NULL DEFAULT 'agent',\n source_priority INTEGER NOT NULL DEFAULT 0,\n entity TEXT NOT NULL DEFAULT '',\n predicate TEXT NOT NULL DEFAULT '',\n value_json TEXT NOT NULL DEFAULT '{}',\n valid_time TEXT NOT NULL DEFAULT '',\n tags TEXT NOT NULL DEFAULT '[]',\n status TEXT NOT NULL DEFAULT 'pending',\n related_claim_ids TEXT NOT NULL DEFAULT '[]',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_memory_proposals_user_status ON memory_proposals(user_id, status);\nCREATE INDEX IF NOT EXISTS idx_memory_proposals_fact ON memory_proposals(user_id, entity, predicate, valid_time);\n\nCREATE TABLE IF NOT EXISTS memory_claims (\n id TEXT PRIMARY KEY,\n memory_id TEXT NOT NULL DEFAULT '',\n user_id TEXT NOT NULL,\n entity TEXT NOT NULL DEFAULT '',\n predicate TEXT NOT NULL DEFAULT '',\n value_json TEXT NOT NULL DEFAULT '{}',\n text TEXT NOT NULL,\n category TEXT NOT NULL DEFAULT 'general',\n importance REAL NOT NULL DEFAULT 0.5,\n confidence REAL NOT NULL DEFAULT 0.5,\n source TEXT NOT NULL DEFAULT 'agent',\n source_priority INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'active',\n valid_time TEXT NOT NULL DEFAULT '',\n evidence_ids TEXT NOT NULL DEFAULT '[]',\n supersedes_claim_id TEXT NOT NULL DEFAULT '',\n conflict_group_id TEXT NOT NULL DEFAULT '',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_memory_claims_user_status ON memory_claims(user_id, status);\nCREATE INDEX IF NOT EXISTS idx_memory_claims_memory ON memory_claims(memory_id);\nCREATE INDEX IF NOT EXISTS idx_memory_claims_fact ON memory_claims(user_id, entity, predicate, valid_time);\n\nCREATE TABLE IF NOT EXISTS memory_conflicts (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n claim_a_id TEXT NOT NULL,\n claim_b_id TEXT NOT NULL,\n reason TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'open',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_memory_conflicts_user_status ON memory_conflicts(user_id, status);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(\n id UNINDEXED,\n user_id UNINDEXED,\n text,\n category,\n tags,\n content=memories,\n content_rowid=rowid,\n tokenize='unicode61 remove_diacritics 2'\n);\n\nCREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN\n INSERT INTO memories_fts(rowid, id, user_id, text, category, tags)\n VALUES (new.rowid, new.id, new.user_id, new.text, new.category, new.tags);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, id, user_id, text, category, tags)\n VALUES ('delete', old.rowid, old.id, old.user_id, old.text, old.category, old.tags);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, id, user_id, text, category, tags)\n VALUES ('delete', old.rowid, old.id, old.user_id, old.text, old.category, old.tags);\n INSERT INTO memories_fts(rowid, id, user_id, text, category, tags)\n VALUES (new.rowid, new.id, new.user_id, new.text, new.category, new.tags);\nEND;\n";
3
+ export declare function initializeMemorySchema(db: SqliteDatabase): void;
@@ -12,7 +12,7 @@ export interface PermissionCheckerDeps {
12
12
  /**
13
13
  * Callback to send an approval request to the host (Gateway/Electron).
14
14
  * Must return a promise that resolves when the user responds.
15
- * If the host does not support approval, this should reject or return denied.
15
+ * If the host does not support approval, this should reject or return deny.
16
16
  */
17
17
  onRequestApproval: (request: ApprovalRequest) => Promise<ApprovalResponse>;
18
18
  /** Called when a persistent permission update is returned from the approval dialog */
@@ -23,7 +23,7 @@ export declare class PermissionRuleEngine {
23
23
  *
24
24
  * Layer 0: Mode override
25
25
  * Layer 1: Explicit rules (first match wins)
26
- * Layer 2: Tool metadata (isReadOnly/isDangerous/requiresApproval)
26
+ * Layer 2: Unified tool risk metadata
27
27
  * Layer 3: Default behavior
28
28
  */
29
29
  check(input: ToolPermissionCheckInput): PermissionResult;
@@ -32,10 +32,7 @@ export declare class PermissionRuleEngine {
32
32
  /**
33
33
  * Parse permission config from Gateway-injected or local settings.
34
34
  *
35
- * Accepts cc-compatible format:
36
- * { mode?: "default", allow: [...], deny: [...], ask: [...], default?: "allow" }
37
- *
38
- * And extended rule format:
35
+ * Accepts only the canonical qlogicagent permission format:
39
36
  * { rules: [{ pattern, behavior, reason, source }] }
40
37
  */
41
38
  export declare function parsePermissionConfig(raw: unknown): PermissionConfig;
@@ -1,48 +1,19 @@
1
1
  /**
2
- * Settings Watcher CC settings.json hot-reload parity.
2
+ * Settings watcher for canonical qlogicagent permission settings.
3
3
  *
4
- * Watches the project-local settings file and reloads permission rules
5
- * when it changes on disk. This allows users to adjust permission rules
6
- * without restarting the agent session.
7
- *
8
- * Settings file location: `.qlogicagent/settings.json` in the project root
9
- *
10
- * Watched fields:
11
- * - permissions: PermissionConfig
12
- * - permissionMode: PermissionMode
13
- * - permissionRules: PermissionRuleEntry[]
14
- * - defaultBehavior: PermissionBehavior
15
- *
16
- * CC reference: src/utils/settings/settings.ts (watchSettings, applySettings)
4
+ * Only the `permissions` object is accepted. Removed top-level aliases such as
5
+ * `permissionMode`, `permissionRules`, and `defaultBehavior` must fail loudly.
17
6
  */
18
7
  import type { HookRegistry } from "../../contracts/hooks.js";
19
- import type { PermissionRuleEntry, PermissionMode, PermissionBehavior } from "./types.js";
20
- import { PermissionRuleEngine } from "./rule-engine.js";
21
- /** On-disk settings file schema */
8
+ import type { PermissionRuleEnginePort } from "../../runtime/ports/index.js";
22
9
  export interface SettingsFile {
23
10
  permissions?: unknown;
24
- permissionMode?: PermissionMode;
25
- permissionRules?: PermissionRuleEntry[];
26
- defaultBehavior?: PermissionBehavior;
27
11
  }
28
12
  export interface SettingsWatcherDeps {
29
- /** Project root directory (where .qlogicagent/ lives) */
30
13
  projectRoot: string;
31
- /** Permission rule engine to update on changes */
32
- ruleEngine: PermissionRuleEngine;
33
- /** Hook registry for config.changed events */
14
+ ruleEngine: PermissionRuleEnginePort;
34
15
  hooks?: HookRegistry;
35
- /** Logger */
36
16
  log?: (msg: string) => void;
37
17
  }
38
- /**
39
- * Watch the settings file for changes and hot-reload permission rules.
40
- *
41
- * Returns an unsubscribe function.
42
- */
43
18
  export declare function watchSettings(deps: SettingsWatcherDeps): () => void;
44
- /**
45
- * Load initial settings (non-watching).
46
- * Call at session start to apply project settings before the watcher starts.
47
- */
48
- export declare function loadInitialSettings(projectRoot: string, ruleEngine: PermissionRuleEngine): Promise<SettingsFile | null>;
19
+ export declare function loadInitialSettings(projectRoot: string, ruleEngine: PermissionRuleEnginePort): Promise<SettingsFile | null>;
@@ -1,2 +1,2 @@
1
1
  export { PERMISSION_MODES, } from "../../runtime/ports/permission-contracts.js";
2
- export type { ApprovalRequest, ApprovalResponse, PermissionAllowResult, PermissionAskResult, PermissionBehavior, PermissionConfig, PermissionDecisionReason, PermissionDenyResult, PermissionMode, PermissionResult, PermissionRuleEntry, PermissionUpdate, ToolPermissionCheckInput, } from "../../runtime/ports/permission-contracts.js";
2
+ export type { ApprovalRequest, ApprovalResponse, PermissionAllowResult, PermissionAskResult, PermissionBehavior, PermissionConfig, PermissionDecisionReason, PermissionDenyResult, PermissionMode, PermissionRiskLevel, PermissionResult, PermissionRuleEntry, PermissionUpdate, ToolPermissionCheckInput, } from "../../runtime/ports/permission-contracts.js";
@@ -1,6 +1,11 @@
1
+ import type { PortableTool } from "../portable-tool.js";
1
2
  import type { HookRegistry } from "../../contracts/hooks.js";
2
3
  import type { WorkspaceSkill } from "../skill-system/skill-types.js";
3
4
  import { type LoadedPlugin } from "./plugin-api.js";
5
+ interface PluginToolRegistry {
6
+ addTool(tool: PortableTool): void;
7
+ removeTool(name: string): boolean;
8
+ }
4
9
  export interface PluginLoaderConfig {
5
10
  /** Directories to scan for plugins (order = priority) */
6
11
  pluginDirs: string[];
@@ -11,6 +16,8 @@ export interface PluginLoaderConfig {
11
16
  info(msg: string): void;
12
17
  warn(msg: string): void;
13
18
  };
19
+ /** Runtime-owned tool catalog used for plugin tool registration. */
20
+ toolCatalog?: PluginToolRegistry;
14
21
  }
15
22
  export declare class PluginLoader {
16
23
  private config;
@@ -44,4 +51,7 @@ export declare class PluginLoader {
44
51
  */
45
52
  refreshActivations(): Promise<void>;
46
53
  private loadPlugin;
54
+ private addRegisteredTool;
55
+ private removeRegisteredTool;
47
56
  }
57
+ export {};
@@ -2,6 +2,7 @@
2
2
  * Content block returned by tool execution.
3
3
  * Compatible with OpenAI / Anthropic content array format.
4
4
  */
5
+ import type { PermissionRiskLevel } from "../runtime/ports/index.js";
5
6
  export interface ToolContentBlock {
6
7
  type: "text" | "image";
7
8
  text?: string;
@@ -27,6 +28,7 @@ export interface LocalizedText {
27
28
  values?: Partial<Record<LocaleCode, string>>;
28
29
  }
29
30
  export type CapabilityCategory = "orchestration" | "filesystem" | "web" | "search" | "memory" | "media" | "developer" | "mcp" | "automation" | "system" | "other";
31
+ export type ToolRiskLevel = PermissionRiskLevel;
30
32
  /**
31
33
  * Result of executing a portable tool.
32
34
  */
@@ -82,6 +84,14 @@ export interface PortableTool<TParams = Record<string, unknown>> {
82
84
  * Read-only tools can skip confirmation prompts in strict permission modes.
83
85
  */
84
86
  isReadOnly?: boolean;
87
+ /**
88
+ * Unified permission risk class.
89
+ * - read: no mutation, local or remote read-only operation
90
+ * - write: workspace-local mutation
91
+ * - system: shell/process/computer control or host-level mutation
92
+ * - external_egress: sends prompts/files/data to an external service
93
+ */
94
+ riskLevel?: ToolRiskLevel;
85
95
  /**
86
96
  * Whether the tool is currently available.
87
97
  * CC parity: tools that return false are excluded from getTools().
@@ -11,10 +11,6 @@ export interface CronToolParams {
11
11
  schedule?: string;
12
12
  /** Human-readable job name */
13
13
  name?: string;
14
- /** Legacy field rejected by the workflow-backed scheduler. */
15
- repeat?: number | null;
16
- /** Legacy field rejected by the workflow-backed scheduler. */
17
- allowedTools?: string[];
18
14
  /** Whether the job is enabled */
19
15
  enabled?: boolean;
20
16
  }
@@ -42,17 +38,6 @@ export declare const CRON_TOOL_SCHEMA: {
42
38
  readonly type: "string";
43
39
  readonly description: "Human-readable job name.";
44
40
  };
45
- readonly repeat: {
46
- readonly type: "number";
47
- readonly description: "Deprecated. Finite repeats must be modeled inside the workflow graph.";
48
- };
49
- readonly allowedTools: {
50
- readonly type: "array";
51
- readonly items: {
52
- readonly type: "string";
53
- };
54
- readonly description: "Deprecated. Tool access must be enforced by permission rules or workflow nodes.";
55
- };
56
41
  readonly enabled: {
57
42
  readonly type: "boolean";
58
43
  readonly description: "Whether the job is enabled (for update).";
@@ -68,14 +53,9 @@ export interface CronJob {
68
53
  scheduleDisplay: string;
69
54
  state: "scheduled" | "paused";
70
55
  enabled: boolean;
71
- repeat: {
72
- times: number | null;
73
- completed: number;
74
- };
75
56
  nextRunAt?: string;
76
57
  lastRunAt?: string;
77
58
  lastStatus?: "success" | "error" | null;
78
- allowedTools?: string[];
79
59
  }
80
60
  export interface CronResult {
81
61
  success: boolean;
@@ -1,80 +1,45 @@
1
1
  /**
2
- * Tool RegistryCC-aligned getAllBaseTools() pattern.
2
+ * Tool registry and compatibility facade.
3
3
  *
4
- * CC reference: claude-code-haha/src/tools.ts
5
- *
6
- * This is the SINGLE SOURCE OF TRUTH for all available tools.
7
- * Tools are returned as a flat array from getAllBaseTools().
8
- * Filtering/gating happens via getTools() using deny rules.
9
- *
10
- * Factory functions (createXxxTool) are kept because qlogicagent
11
- * tools receive deps at creation time (vs CC context at call time).
12
- * The registration pattern is aligned: pure function returns array.
4
+ * The registry is the single source of truth for locally executable tools.
5
+ * New runtime code should depend on a ToolCatalog/ToolRegistry instance; the
6
+ * module-level functions below remain as a compatibility facade for older
7
+ * bootstrap paths while those call sites are migrated.
13
8
  */
14
9
  import type { PortableTool } from "./portable-tool.js";
15
10
  import type { ToolDefinition } from "../protocol/wire/index.js";
16
11
  import { AGENT_DISALLOWED_TOOLS, CUSTOM_AGENT_DISALLOWED_TOOLS, filterToolsForAgent } from "./tool-access.js";
17
12
  export { AGENT_DISALLOWED_TOOLS, CUSTOM_AGENT_DISALLOWED_TOOLS, filterToolsForAgent };
18
- /**
19
- * Register tools into the internal pool. Called by initToolDeps().
20
- */
13
+ export declare class ToolRegistry {
14
+ private readonly toolPool;
15
+ private readonly activatedTools;
16
+ setTools(tools: PortableTool[]): void;
17
+ addTool(tool: PortableTool<any>): void;
18
+ addTools(tools: PortableTool<any>[]): void;
19
+ removeTool(name: string): boolean;
20
+ findTool(name: string): PortableTool | undefined;
21
+ hasTool(name: string): boolean;
22
+ getToolNames(): string[];
23
+ getToolCount(): number;
24
+ executeTool(name: string, toolCallId: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<import("./portable-tool.js").PortableToolResult>;
25
+ getTools(): PortableTool[];
26
+ activateTool(name: string): boolean;
27
+ isToolActivated(name: string): boolean;
28
+ clearActivatedTools(): void;
29
+ getToolManifest(includeDeferred?: boolean): ToolDefinition[];
30
+ }
31
+ export declare function getDefaultToolRegistry(): ToolRegistry;
21
32
  export declare function setToolPool(tools: PortableTool[]): void;
22
- /**
23
- * Add a single tool to the pool (for dynamic tools like MCP, plugins).
24
- */
25
33
  export declare function addTool(tool: PortableTool<any>): void;
26
- /**
27
- * Add multiple tools to the pool at once.
28
- */
29
34
  export declare function addTools(tools: PortableTool<any>[]): void;
30
- /**
31
- * Remove a tool by name. Returns true if it existed.
32
- */
33
35
  export declare function removeTool(name: string): boolean;
34
- /**
35
- * Find a tool by name.
36
- */
37
36
  export declare function findTool(name: string): PortableTool | undefined;
38
- /**
39
- * Check if a tool exists.
40
- */
41
37
  export declare function hasTool(name: string): boolean;
42
- /**
43
- * Get all tool names.
44
- */
45
38
  export declare function getToolNames(): string[];
46
- /**
47
- * Get the number of registered tools.
48
- */
49
39
  export declare function getToolCount(): number;
50
- /**
51
- * Execute a tool by name.
52
- */
53
40
  export declare function executeTool(name: string, toolCallId: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<import("./portable-tool.js").PortableToolResult>;
54
- /**
55
- * CC: getTools()return all enabled tools.
56
- * Filters the pool by isEnabled() gate; disabled tools are invisible to callers.
57
- * CC reference: claude-code-haha/src/tools.ts getTools()
58
- */
59
41
  export declare function getTools(): PortableTool[];
60
- /**
61
- * Activate a deferred tool so it appears in subsequent LLM manifests.
62
- * CC parity: tool_search select: 鈫?activateTool 鈫?tool included in manifest.
63
- * Returns true if the tool exists, is enabled, and was activated.
64
- */
65
42
  export declare function activateTool(name: string): boolean;
66
- /**
67
- * Check if a tool has been activated via tool_search.
68
- */
69
43
  export declare function isToolActivated(name: string): boolean;
70
- /**
71
- * Clear all tool activations (call at session/turn boundary if needed).
72
- */
73
44
  export declare function clearActivatedTools(): void;
74
- /**
75
- * Generate ToolDefinition[] manifest for LLM tool_use.
76
- * Filters by isEnabled()disabled tools never reach the model.
77
- * Deferred tools are excluded UNLESS they have been activated via tool_search.
78
- * CC: getTools() + manifest generation combined.
79
- */
80
45
  export declare function getToolManifest(includeDeferred?: boolean): ToolDefinition[];