@open-mercato/ai-assistant 0.5.1-develop.3036.f02c281f23 → 0.5.1-develop.3045.b4b3320cc2
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/.turbo/turbo-build.log +1 -1
- package/AGENTS.md +361 -0
- package/README.md +5 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +2 -2
- package/dist/modules/ai_assistant/__integration__/TC-AI-002-agent-policy.spec.js +73 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-002-agent-policy.spec.js.map +7 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-AGENT-SETTINGS-005-settings-page.spec.js +484 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-AGENT-SETTINGS-005-settings-page.spec.js.map +7 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-PLAYGROUND-004-playground.spec.js +251 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-PLAYGROUND-004-playground.spec.js.map +7 -0
- package/dist/modules/ai_assistant/__integration__/TC-INT-AI-TOOLS.spec.js +91 -0
- package/dist/modules/ai_assistant/__integration__/TC-INT-AI-TOOLS.spec.js.map +7 -0
- package/dist/modules/ai_assistant/ai-tools/attachments-pack.js +202 -0
- package/dist/modules/ai_assistant/ai-tools/attachments-pack.js.map +7 -0
- package/dist/modules/ai_assistant/ai-tools/meta-pack.js +121 -0
- package/dist/modules/ai_assistant/ai-tools/meta-pack.js.map +7 -0
- package/dist/modules/ai_assistant/ai-tools/search-pack.js +94 -0
- package/dist/modules/ai_assistant/ai-tools/search-pack.js.map +7 -0
- package/dist/modules/ai_assistant/ai-tools.js +14 -0
- package/dist/modules/ai_assistant/ai-tools.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/actions/[id]/cancel/route.js +175 -0
- package/dist/modules/ai_assistant/api/ai/actions/[id]/cancel/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/actions/[id]/confirm/route.js +174 -0
- package/dist/modules/ai_assistant/api/ai/actions/[id]/confirm/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/actions/[id]/route.js +101 -0
- package/dist/modules/ai_assistant/api/ai/actions/[id]/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/agents/[agentId]/mutation-policy/route.js +311 -0
- package/dist/modules/ai_assistant/api/ai/agents/[agentId]/mutation-policy/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/agents/[agentId]/prompt-override/route.js +246 -0
- package/dist/modules/ai_assistant/api/ai/agents/[agentId]/prompt-override/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/agents/route.js +94 -0
- package/dist/modules/ai_assistant/api/ai/agents/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/chat/route.js +173 -0
- package/dist/modules/ai_assistant/api/ai/chat/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/run-object/route.js +167 -0
- package/dist/modules/ai_assistant/api/ai/run-object/route.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js +1111 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/page.js +10 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/page.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/page.meta.js +28 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/page.meta.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/legacy/page.js +10 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/legacy/page.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/legacy/page.meta.js +30 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/legacy/page.meta.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/page.js +4 -6
- package/dist/modules/ai_assistant/backend/config/ai-assistant/page.js.map +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/page.meta.js +1 -21
- package/dist/modules/ai_assistant/backend/config/ai-assistant/page.meta.js.map +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.js +462 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/page.js +10 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/page.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/page.meta.js +28 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/page.meta.js.map +7 -0
- package/dist/modules/ai_assistant/cli.js +78 -12
- package/dist/modules/ai_assistant/cli.js.map +2 -2
- package/dist/modules/ai_assistant/data/entities/AiAgentMutationPolicyOverride.js +5 -0
- package/dist/modules/ai_assistant/data/entities/AiAgentMutationPolicyOverride.js.map +7 -0
- package/dist/modules/ai_assistant/data/entities/AiAgentPromptOverride.js +5 -0
- package/dist/modules/ai_assistant/data/entities/AiAgentPromptOverride.js.map +7 -0
- package/dist/modules/ai_assistant/data/entities/AiPendingAction.js +5 -0
- package/dist/modules/ai_assistant/data/entities/AiPendingAction.js.map +7 -0
- package/dist/modules/ai_assistant/data/entities.js +228 -0
- package/dist/modules/ai_assistant/data/entities.js.map +7 -0
- package/dist/modules/ai_assistant/data/repositories/AiAgentMutationPolicyOverrideRepository.js +95 -0
- package/dist/modules/ai_assistant/data/repositories/AiAgentMutationPolicyOverrideRepository.js.map +7 -0
- package/dist/modules/ai_assistant/data/repositories/AiAgentPromptOverrideRepository.js +95 -0
- package/dist/modules/ai_assistant/data/repositories/AiAgentPromptOverrideRepository.js.map +7 -0
- package/dist/modules/ai_assistant/data/repositories/AiPendingActionRepository.js +223 -0
- package/dist/modules/ai_assistant/data/repositories/AiPendingActionRepository.js.map +7 -0
- package/dist/modules/ai_assistant/events.js +33 -0
- package/dist/modules/ai_assistant/events.js.map +7 -0
- package/dist/modules/ai_assistant/i18n/de.json +252 -0
- package/dist/modules/ai_assistant/i18n/en.json +252 -0
- package/dist/modules/ai_assistant/i18n/es.json +252 -0
- package/dist/modules/ai_assistant/i18n/pl.json +252 -0
- package/dist/modules/ai_assistant/lib/agent-policy.js +168 -0
- package/dist/modules/ai_assistant/lib/agent-policy.js.map +7 -0
- package/dist/modules/ai_assistant/lib/agent-registry.js +195 -0
- package/dist/modules/ai_assistant/lib/agent-registry.js.map +7 -0
- package/dist/modules/ai_assistant/lib/agent-runtime.js +451 -0
- package/dist/modules/ai_assistant/lib/agent-runtime.js.map +7 -0
- package/dist/modules/ai_assistant/lib/agent-tools.js +223 -0
- package/dist/modules/ai_assistant/lib/agent-tools.js.map +7 -0
- package/dist/modules/ai_assistant/lib/agent-transport.js +25 -0
- package/dist/modules/ai_assistant/lib/agent-transport.js.map +7 -0
- package/dist/modules/ai_assistant/lib/ai-agent-definition.js +11 -0
- package/dist/modules/ai_assistant/lib/ai-agent-definition.js.map +7 -0
- package/dist/modules/ai_assistant/lib/ai-agents-generated.d.js +1 -0
- package/dist/modules/ai_assistant/lib/ai-agents-generated.d.js.map +7 -0
- package/dist/modules/ai_assistant/lib/ai-api-operation-runner.js +239 -0
- package/dist/modules/ai_assistant/lib/ai-api-operation-runner.js.map +7 -0
- package/dist/modules/ai_assistant/lib/ai-overrides.js +189 -0
- package/dist/modules/ai_assistant/lib/ai-overrides.js.map +7 -0
- package/dist/modules/ai_assistant/lib/ai-tool-definition.js +7 -0
- package/dist/modules/ai_assistant/lib/ai-tool-definition.js.map +7 -0
- package/dist/modules/ai_assistant/lib/ai-tools-generated.d.js +1 -0
- package/dist/modules/ai_assistant/lib/ai-tools-generated.d.js.map +7 -0
- package/dist/modules/ai_assistant/lib/api-backed-tool.js +48 -0
- package/dist/modules/ai_assistant/lib/api-backed-tool.js.map +7 -0
- package/dist/modules/ai_assistant/lib/attachment-bridge-types.js +1 -0
- package/dist/modules/ai_assistant/lib/attachment-bridge-types.js.map +7 -0
- package/dist/modules/ai_assistant/lib/attachment-parts.js +276 -0
- package/dist/modules/ai_assistant/lib/attachment-parts.js.map +7 -0
- package/dist/modules/ai_assistant/lib/model-factory.js +68 -0
- package/dist/modules/ai_assistant/lib/model-factory.js.map +7 -0
- package/dist/modules/ai_assistant/lib/pending-action-cancel.js +86 -0
- package/dist/modules/ai_assistant/lib/pending-action-cancel.js.map +7 -0
- package/dist/modules/ai_assistant/lib/pending-action-client.js +35 -0
- package/dist/modules/ai_assistant/lib/pending-action-client.js.map +7 -0
- package/dist/modules/ai_assistant/lib/pending-action-executor.js +243 -0
- package/dist/modules/ai_assistant/lib/pending-action-executor.js.map +7 -0
- package/dist/modules/ai_assistant/lib/pending-action-recheck.js +246 -0
- package/dist/modules/ai_assistant/lib/pending-action-recheck.js.map +7 -0
- package/dist/modules/ai_assistant/lib/pending-action-types.js +70 -0
- package/dist/modules/ai_assistant/lib/pending-action-types.js.map +7 -0
- package/dist/modules/ai_assistant/lib/prepare-mutation.js +315 -0
- package/dist/modules/ai_assistant/lib/prepare-mutation.js.map +7 -0
- package/dist/modules/ai_assistant/lib/prompt-composition-types.js +7 -0
- package/dist/modules/ai_assistant/lib/prompt-composition-types.js.map +7 -0
- package/dist/modules/ai_assistant/lib/prompt-override-merge.js +175 -0
- package/dist/modules/ai_assistant/lib/prompt-override-merge.js.map +7 -0
- package/dist/modules/ai_assistant/lib/schema-utils.js +5 -1
- package/dist/modules/ai_assistant/lib/schema-utils.js.map +2 -2
- package/dist/modules/ai_assistant/lib/tool-executor.js +13 -2
- package/dist/modules/ai_assistant/lib/tool-executor.js.map +2 -2
- package/dist/modules/ai_assistant/lib/tool-loader.js +86 -11
- package/dist/modules/ai_assistant/lib/tool-loader.js.map +2 -2
- package/dist/modules/ai_assistant/lib/tool-test-fixtures.js +120 -0
- package/dist/modules/ai_assistant/lib/tool-test-fixtures.js.map +7 -0
- package/dist/modules/ai_assistant/lib/tool-test-runner.js +418 -0
- package/dist/modules/ai_assistant/lib/tool-test-runner.js.map +7 -0
- package/dist/modules/ai_assistant/migrations/Migration20260419100521.js +17 -0
- package/dist/modules/ai_assistant/migrations/Migration20260419100521.js.map +7 -0
- package/dist/modules/ai_assistant/migrations/Migration20260419132948.js +16 -0
- package/dist/modules/ai_assistant/migrations/Migration20260419132948.js.map +7 -0
- package/dist/modules/ai_assistant/migrations/Migration20260419134235.js +17 -0
- package/dist/modules/ai_assistant/migrations/Migration20260419134235.js.map +7 -0
- package/dist/modules/ai_assistant/setup.js +36 -0
- package/dist/modules/ai_assistant/setup.js.map +2 -2
- package/dist/modules/ai_assistant/workers/ai-pending-action-cleanup.js +161 -0
- package/dist/modules/ai_assistant/workers/ai-pending-action-cleanup.js.map +7 -0
- package/generated/entities/ai_agent_mutation_policy_override/index.ts +9 -0
- package/generated/entities/ai_agent_prompt_override/index.ts +10 -0
- package/generated/entities/ai_pending_action/index.ts +24 -0
- package/generated/entities.ids.generated.ts +13 -0
- package/generated/entity-fields-registry.ts +57 -0
- package/jest.config.cjs +7 -0
- package/package.json +4 -4
- package/src/index.ts +215 -0
- package/src/modules/ai_assistant/__integration__/README.md +5 -0
- package/src/modules/ai_assistant/__integration__/TC-AI-002-agent-policy.spec.ts +115 -0
- package/src/modules/ai_assistant/__integration__/TC-AI-AGENT-SETTINGS-005-settings-page.spec.ts +574 -0
- package/src/modules/ai_assistant/__integration__/TC-AI-PLAYGROUND-004-playground.spec.ts +333 -0
- package/src/modules/ai_assistant/__integration__/TC-INT-AI-TOOLS.spec.ts +135 -0
- package/src/modules/ai_assistant/__tests__/events.test.ts +145 -0
- package/src/modules/ai_assistant/__tests__/integration/pending-action-contract.test.ts +1015 -0
- package/src/modules/ai_assistant/__tests__/integration/ws-c-attachment-bridge.test.ts +235 -0
- package/src/modules/ai_assistant/__tests__/integration/ws-c-policy-and-tools.test.ts +330 -0
- package/src/modules/ai_assistant/__tests__/integration/ws-c-tool-pack-coverage.test.ts +285 -0
- package/src/modules/ai_assistant/ai-tools/__tests__/attachments-pack.test.ts +322 -0
- package/src/modules/ai_assistant/ai-tools/__tests__/meta-pack.test.ts +218 -0
- package/src/modules/ai_assistant/ai-tools/__tests__/search-pack.test.ts +192 -0
- package/src/modules/ai_assistant/ai-tools/attachments-pack.ts +269 -0
- package/src/modules/ai_assistant/ai-tools/meta-pack.ts +140 -0
- package/src/modules/ai_assistant/ai-tools/search-pack.ts +122 -0
- package/src/modules/ai_assistant/ai-tools.ts +21 -0
- package/src/modules/ai_assistant/api/ai/actions/[id]/__tests__/route.test.ts +222 -0
- package/src/modules/ai_assistant/api/ai/actions/[id]/cancel/__tests__/route.test.ts +286 -0
- package/src/modules/ai_assistant/api/ai/actions/[id]/cancel/route.ts +237 -0
- package/src/modules/ai_assistant/api/ai/actions/[id]/confirm/__tests__/route.test.ts +339 -0
- package/src/modules/ai_assistant/api/ai/actions/[id]/confirm/route.ts +229 -0
- package/src/modules/ai_assistant/api/ai/actions/[id]/route.ts +142 -0
- package/src/modules/ai_assistant/api/ai/agents/[agentId]/mutation-policy/__tests__/route.test.ts +367 -0
- package/src/modules/ai_assistant/api/ai/agents/[agentId]/mutation-policy/route.ts +380 -0
- package/src/modules/ai_assistant/api/ai/agents/[agentId]/prompt-override/__tests__/route.test.ts +333 -0
- package/src/modules/ai_assistant/api/ai/agents/[agentId]/prompt-override/route.ts +307 -0
- package/src/modules/ai_assistant/api/ai/agents/route.ts +107 -0
- package/src/modules/ai_assistant/api/ai/chat/__tests__/route.test.ts +282 -0
- package/src/modules/ai_assistant/api/ai/chat/route.ts +207 -0
- package/src/modules/ai_assistant/api/ai/run-object/__tests__/route.test.ts +282 -0
- package/src/modules/ai_assistant/api/ai/run-object/route.ts +204 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.tsx +1419 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/agents/page.meta.ts +26 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/agents/page.tsx +12 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/legacy/page.meta.ts +28 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/legacy/page.tsx +12 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/page.meta.ts +8 -23
- package/src/modules/ai_assistant/backend/config/ai-assistant/page.tsx +15 -10
- package/src/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.tsx +604 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/playground/page.meta.ts +26 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/playground/page.tsx +12 -0
- package/src/modules/ai_assistant/cli.ts +99 -24
- package/src/modules/ai_assistant/data/__tests__/schema-unique-indexes.test.ts +69 -0
- package/src/modules/ai_assistant/data/entities/AiAgentMutationPolicyOverride.ts +7 -0
- package/src/modules/ai_assistant/data/entities/AiAgentPromptOverride.ts +7 -0
- package/src/modules/ai_assistant/data/entities/AiPendingAction.ts +7 -0
- package/src/modules/ai_assistant/data/entities.ts +270 -0
- package/src/modules/ai_assistant/data/repositories/AiAgentMutationPolicyOverrideRepository.ts +129 -0
- package/src/modules/ai_assistant/data/repositories/AiAgentPromptOverrideRepository.ts +132 -0
- package/src/modules/ai_assistant/data/repositories/AiPendingActionRepository.ts +334 -0
- package/src/modules/ai_assistant/data/repositories/__tests__/AiAgentMutationPolicyOverrideRepository.test.ts +195 -0
- package/src/modules/ai_assistant/data/repositories/__tests__/AiAgentPromptOverrideRepository.test.ts +197 -0
- package/src/modules/ai_assistant/data/repositories/__tests__/AiPendingActionRepository.test.ts +357 -0
- package/src/modules/ai_assistant/events.ts +112 -0
- package/src/modules/ai_assistant/i18n/de.json +252 -0
- package/src/modules/ai_assistant/i18n/en.json +252 -0
- package/src/modules/ai_assistant/i18n/es.json +252 -0
- package/src/modules/ai_assistant/i18n/pl.json +252 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-policy.mutation-override.test.ts +203 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-policy.test.ts +385 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-registry.test.ts +217 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime-object.test.ts +329 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime-parity.test.ts +573 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime.test.ts +291 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-tools.test.ts +172 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-transport.test.ts +41 -0
- package/src/modules/ai_assistant/lib/__tests__/ai-agent-definition.test.ts +183 -0
- package/src/modules/ai_assistant/lib/__tests__/ai-api-operation-runner.test.ts +432 -0
- package/src/modules/ai_assistant/lib/__tests__/ai-overrides.test.ts +308 -0
- package/src/modules/ai_assistant/lib/__tests__/api-backed-tool.test.ts +302 -0
- package/src/modules/ai_assistant/lib/__tests__/attachment-bridge-and-prompt-types.test.ts +188 -0
- package/src/modules/ai_assistant/lib/__tests__/attachment-parts.test.ts +531 -0
- package/src/modules/ai_assistant/lib/__tests__/max-steps-budget.integration.test.ts +263 -0
- package/src/modules/ai_assistant/lib/__tests__/model-factory.integration.test.ts +183 -0
- package/src/modules/ai_assistant/lib/__tests__/model-factory.test.ts +168 -0
- package/src/modules/ai_assistant/lib/__tests__/pending-action-cancel.test.ts +235 -0
- package/src/modules/ai_assistant/lib/__tests__/pending-action-client.test.ts +148 -0
- package/src/modules/ai_assistant/lib/__tests__/pending-action-executor.test.ts +348 -0
- package/src/modules/ai_assistant/lib/__tests__/pending-action-recheck.test.ts +378 -0
- package/src/modules/ai_assistant/lib/__tests__/phase-0-additive-contract.test.ts +299 -0
- package/src/modules/ai_assistant/lib/__tests__/prepare-mutation.test.ts +610 -0
- package/src/modules/ai_assistant/lib/__tests__/prompt-override-merge.test.ts +136 -0
- package/src/modules/ai_assistant/lib/__tests__/tool-loader.test.ts +125 -0
- package/src/modules/ai_assistant/lib/agent-policy.ts +270 -0
- package/src/modules/ai_assistant/lib/agent-registry.ts +277 -0
- package/src/modules/ai_assistant/lib/agent-runtime.ts +751 -0
- package/src/modules/ai_assistant/lib/agent-tools.ts +396 -0
- package/src/modules/ai_assistant/lib/agent-transport.ts +51 -0
- package/src/modules/ai_assistant/lib/ai-agent-definition.ts +86 -0
- package/src/modules/ai_assistant/lib/ai-agents-generated.d.ts +18 -0
- package/src/modules/ai_assistant/lib/ai-api-operation-runner.ts +333 -0
- package/src/modules/ai_assistant/lib/ai-overrides.ts +389 -0
- package/src/modules/ai_assistant/lib/ai-tool-definition.ts +7 -0
- package/src/modules/ai_assistant/lib/ai-tools-generated.d.ts +7 -0
- package/src/modules/ai_assistant/lib/api-backed-tool.ts +85 -0
- package/src/modules/ai_assistant/lib/attachment-bridge-types.ts +24 -0
- package/src/modules/ai_assistant/lib/attachment-parts.ts +433 -0
- package/src/modules/ai_assistant/lib/model-factory.ts +212 -0
- package/src/modules/ai_assistant/lib/pending-action-cancel.ts +179 -0
- package/src/modules/ai_assistant/lib/pending-action-client.ts +126 -0
- package/src/modules/ai_assistant/lib/pending-action-executor.ts +424 -0
- package/src/modules/ai_assistant/lib/pending-action-recheck.ts +410 -0
- package/src/modules/ai_assistant/lib/pending-action-types.ts +194 -0
- package/src/modules/ai_assistant/lib/prepare-mutation.ts +448 -0
- package/src/modules/ai_assistant/lib/prompt-composition-types.ts +24 -0
- package/src/modules/ai_assistant/lib/prompt-override-merge.ts +253 -0
- package/src/modules/ai_assistant/lib/schema-utils.ts +14 -2
- package/src/modules/ai_assistant/lib/tool-executor.ts +25 -3
- package/src/modules/ai_assistant/lib/tool-loader.ts +159 -13
- package/src/modules/ai_assistant/lib/tool-test-fixtures.ts +160 -0
- package/src/modules/ai_assistant/lib/tool-test-runner.ts +596 -0
- package/src/modules/ai_assistant/lib/types.ts +105 -2
- package/src/modules/ai_assistant/migrations/.snapshot-open-mercato.json +871 -0
- package/src/modules/ai_assistant/migrations/Migration20260419100521.ts +17 -0
- package/src/modules/ai_assistant/migrations/Migration20260419132948.ts +16 -0
- package/src/modules/ai_assistant/migrations/Migration20260419134235.ts +17 -0
- package/src/modules/ai_assistant/setup.ts +53 -0
- package/src/modules/ai_assistant/workers/__tests__/ai-pending-action-cleanup.test.ts +333 -0
- package/src/modules/ai_assistant/workers/ai-pending-action-cleanup.ts +269 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import type { AiAgentDefinition, AiAgentExtension, AiAgentSuggestion } from './ai-agent-definition'
|
|
2
|
+
import {
|
|
3
|
+
applyAgentOverrideMap,
|
|
4
|
+
composeAgentExtensionEntries,
|
|
5
|
+
composeAgentOverrideMap,
|
|
6
|
+
type AiAgentExtensionConfigEntry,
|
|
7
|
+
type AiAgentOverrideConfigEntry,
|
|
8
|
+
} from './ai-overrides'
|
|
9
|
+
|
|
10
|
+
const agentsById = new Map<string, AiAgentDefinition>()
|
|
11
|
+
let loaded = false
|
|
12
|
+
|
|
13
|
+
function isStringArray(value: unknown): value is string[] {
|
|
14
|
+
return Array.isArray(value) && value.every((item) => typeof item === 'string')
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function isAiAgentSuggestion(value: unknown): value is AiAgentSuggestion {
|
|
18
|
+
if (!value || typeof value !== 'object') return false
|
|
19
|
+
const candidate = value as Record<string, unknown>
|
|
20
|
+
return typeof candidate.label === 'string' && typeof candidate.prompt === 'string'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function isAiAgentExtension(value: unknown): value is AiAgentExtension {
|
|
24
|
+
if (!value || typeof value !== 'object') return false
|
|
25
|
+
const candidate = value as Record<string, unknown>
|
|
26
|
+
return (
|
|
27
|
+
typeof candidate.targetAgentId === 'string' &&
|
|
28
|
+
(!('replaceAllowedTools' in candidate) || isStringArray(candidate.replaceAllowedTools)) &&
|
|
29
|
+
(!('deleteAllowedTools' in candidate) || isStringArray(candidate.deleteAllowedTools)) &&
|
|
30
|
+
(!('appendAllowedTools' in candidate) || isStringArray(candidate.appendAllowedTools)) &&
|
|
31
|
+
(!('replaceSystemPrompt' in candidate) || typeof candidate.replaceSystemPrompt === 'string') &&
|
|
32
|
+
(!('appendSystemPrompt' in candidate) || typeof candidate.appendSystemPrompt === 'string') &&
|
|
33
|
+
(!('replaceSuggestions' in candidate) ||
|
|
34
|
+
(Array.isArray(candidate.replaceSuggestions) && candidate.replaceSuggestions.every(isAiAgentSuggestion))) &&
|
|
35
|
+
(!('deleteSuggestions' in candidate) || isStringArray(candidate.deleteSuggestions)) &&
|
|
36
|
+
(!('appendSuggestions' in candidate) ||
|
|
37
|
+
(Array.isArray(candidate.appendSuggestions) && candidate.appendSuggestions.every(isAiAgentSuggestion))) &&
|
|
38
|
+
(!('suggestions' in candidate) ||
|
|
39
|
+
(Array.isArray(candidate.suggestions) && candidate.suggestions.every(isAiAgentSuggestion)))
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function isAiAgentDefinition(value: unknown): value is AiAgentDefinition {
|
|
44
|
+
if (!value || typeof value !== 'object') return false
|
|
45
|
+
const candidate = value as Record<string, unknown>
|
|
46
|
+
return (
|
|
47
|
+
typeof candidate.id === 'string' &&
|
|
48
|
+
typeof candidate.moduleId === 'string' &&
|
|
49
|
+
typeof candidate.label === 'string' &&
|
|
50
|
+
typeof candidate.description === 'string' &&
|
|
51
|
+
typeof candidate.systemPrompt === 'string' &&
|
|
52
|
+
isStringArray(candidate.allowedTools)
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function uniqueStrings(values: readonly string[]): string[] {
|
|
57
|
+
return Array.from(new Set(values.filter((value) => typeof value === 'string' && value.length > 0)))
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function applyStringListPatch(
|
|
61
|
+
current: readonly string[],
|
|
62
|
+
patch: {
|
|
63
|
+
replace?: readonly string[]
|
|
64
|
+
delete?: readonly string[]
|
|
65
|
+
append?: readonly string[]
|
|
66
|
+
},
|
|
67
|
+
): string[] {
|
|
68
|
+
const deleted = new Set(patch.delete ?? [])
|
|
69
|
+
return uniqueStrings([
|
|
70
|
+
...(patch.replace ?? current).filter((value) => !deleted.has(value)),
|
|
71
|
+
...(patch.append ?? []),
|
|
72
|
+
])
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function suggestionDeleteKey(suggestion: AiAgentSuggestion): string[] {
|
|
76
|
+
return [suggestion.label, suggestion.prompt].filter((value) => value.length > 0)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function applySuggestionPatch(
|
|
80
|
+
current: readonly AiAgentSuggestion[],
|
|
81
|
+
patch: {
|
|
82
|
+
replace?: readonly AiAgentSuggestion[]
|
|
83
|
+
delete?: readonly string[]
|
|
84
|
+
append?: readonly AiAgentSuggestion[]
|
|
85
|
+
},
|
|
86
|
+
): AiAgentSuggestion[] {
|
|
87
|
+
const deleted = new Set(patch.delete ?? [])
|
|
88
|
+
const base = patch.replace ?? current
|
|
89
|
+
const out: AiAgentSuggestion[] = []
|
|
90
|
+
const seen = new Set<string>()
|
|
91
|
+
for (const suggestion of base) {
|
|
92
|
+
if (suggestionDeleteKey(suggestion).some((key) => deleted.has(key))) continue
|
|
93
|
+
const key = `${suggestion.label}\n${suggestion.prompt}`
|
|
94
|
+
if (seen.has(key)) continue
|
|
95
|
+
seen.add(key)
|
|
96
|
+
out.push(suggestion)
|
|
97
|
+
}
|
|
98
|
+
for (const suggestion of patch.append ?? []) {
|
|
99
|
+
const key = `${suggestion.label}\n${suggestion.prompt}`
|
|
100
|
+
if (seen.has(key)) continue
|
|
101
|
+
seen.add(key)
|
|
102
|
+
out.push(suggestion)
|
|
103
|
+
}
|
|
104
|
+
return out
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function populateFromAgents(agents: unknown[]): void {
|
|
108
|
+
for (const candidate of agents) {
|
|
109
|
+
if (!isAiAgentDefinition(candidate)) {
|
|
110
|
+
console.warn('[AI Agents] Skipping malformed agent entry in ai-agents.generated.ts')
|
|
111
|
+
continue
|
|
112
|
+
}
|
|
113
|
+
const existing = agentsById.get(candidate.id)
|
|
114
|
+
if (existing) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
`[AI Agents] Duplicate agent id "${candidate.id}" — already registered by module "${existing.moduleId}", conflicts with module "${candidate.moduleId}". Export \`aiAgentOverrides\` from your module's \`ai-agents.ts\` (or set it on the modules.ts entry) to replace an agent across modules.`
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
agentsById.set(candidate.id, candidate)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function loadOverrideEntries(): Promise<AiAgentOverrideConfigEntry[]> {
|
|
124
|
+
try {
|
|
125
|
+
const mod = (await import(
|
|
126
|
+
'@/.mercato/generated/ai-agents.generated'
|
|
127
|
+
)) as { aiAgentOverrideEntries?: unknown[] }
|
|
128
|
+
return Array.isArray(mod.aiAgentOverrideEntries)
|
|
129
|
+
? (mod.aiAgentOverrideEntries as AiAgentOverrideConfigEntry[])
|
|
130
|
+
: []
|
|
131
|
+
} catch {
|
|
132
|
+
// No generated file yet — pre-generate builds and tests fall through.
|
|
133
|
+
return []
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function applyOverridesToRegistry(entries: readonly AiAgentOverrideConfigEntry[]): void {
|
|
138
|
+
const overrideMap = composeAgentOverrideMap(entries)
|
|
139
|
+
if (Object.keys(overrideMap).length === 0) return
|
|
140
|
+
const overridden = applyAgentOverrideMap(Array.from(agentsById.values()), overrideMap)
|
|
141
|
+
agentsById.clear()
|
|
142
|
+
for (const agent of overridden) agentsById.set(agent.id, agent)
|
|
143
|
+
for (const [id, value] of Object.entries(overrideMap)) {
|
|
144
|
+
const verb = value === null ? 'disabled' : 'replaced'
|
|
145
|
+
console.info(`[AI Overrides] Agent "${id}" ${verb} by override.`)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function loadExtensionEntries(): Promise<AiAgentExtension[]> {
|
|
150
|
+
try {
|
|
151
|
+
const mod = (await import(
|
|
152
|
+
'@/.mercato/generated/ai-agents.generated'
|
|
153
|
+
)) as { aiAgentExtensionEntries?: unknown[] }
|
|
154
|
+
const entries = Array.isArray(mod.aiAgentExtensionEntries)
|
|
155
|
+
? (mod.aiAgentExtensionEntries as AiAgentExtensionConfigEntry[])
|
|
156
|
+
: []
|
|
157
|
+
return composeAgentExtensionEntries(entries).filter(isAiAgentExtension)
|
|
158
|
+
} catch {
|
|
159
|
+
return []
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function applyExtensionsToRegistry(extensions: readonly AiAgentExtension[]): void {
|
|
164
|
+
if (extensions.length === 0) return
|
|
165
|
+
for (const extension of extensions) {
|
|
166
|
+
const agent = agentsById.get(extension.targetAgentId)
|
|
167
|
+
if (!agent) {
|
|
168
|
+
console.warn(
|
|
169
|
+
`[AI Agents] Skipping extension for unknown agent "${extension.targetAgentId}".`,
|
|
170
|
+
)
|
|
171
|
+
continue
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const replacementSystemPrompt = extension.replaceSystemPrompt?.trim()
|
|
175
|
+
const appendSystemPrompt = extension.appendSystemPrompt?.trim()
|
|
176
|
+
const systemPrompt = replacementSystemPrompt ?? agent.systemPrompt.trim()
|
|
177
|
+
agentsById.set(agent.id, {
|
|
178
|
+
...agent,
|
|
179
|
+
allowedTools: applyStringListPatch(agent.allowedTools, {
|
|
180
|
+
replace: extension.replaceAllowedTools,
|
|
181
|
+
delete: extension.deleteAllowedTools,
|
|
182
|
+
append: extension.appendAllowedTools,
|
|
183
|
+
}),
|
|
184
|
+
systemPrompt: appendSystemPrompt
|
|
185
|
+
? `${systemPrompt}\n\n${appendSystemPrompt}`
|
|
186
|
+
: systemPrompt,
|
|
187
|
+
suggestions: applySuggestionPatch(agent.suggestions ?? [], {
|
|
188
|
+
replace: extension.replaceSuggestions,
|
|
189
|
+
delete: extension.deleteSuggestions,
|
|
190
|
+
append: [
|
|
191
|
+
...(extension.appendSuggestions ?? []),
|
|
192
|
+
...(extension.suggestions ?? []),
|
|
193
|
+
],
|
|
194
|
+
}),
|
|
195
|
+
})
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export async function loadAgentRegistry(): Promise<void> {
|
|
200
|
+
if (loaded) return
|
|
201
|
+
try {
|
|
202
|
+
const mod = (await import(
|
|
203
|
+
'@/.mercato/generated/ai-agents.generated'
|
|
204
|
+
)) as { allAiAgents?: unknown[] }
|
|
205
|
+
const agents = Array.isArray(mod.allAiAgents) ? mod.allAiAgents : []
|
|
206
|
+
populateFromAgents(agents)
|
|
207
|
+
} catch (error) {
|
|
208
|
+
console.error(
|
|
209
|
+
'[AI Agents] Could not load ai-agents.generated.ts (agent registry empty):',
|
|
210
|
+
error
|
|
211
|
+
)
|
|
212
|
+
} finally {
|
|
213
|
+
try {
|
|
214
|
+
const overrideEntries = await loadOverrideEntries()
|
|
215
|
+
applyOverridesToRegistry(overrideEntries)
|
|
216
|
+
const extensionEntries = await loadExtensionEntries()
|
|
217
|
+
applyExtensionsToRegistry(extensionEntries)
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.error('[AI Agents] Failed to apply agent overrides/extensions:', error)
|
|
220
|
+
}
|
|
221
|
+
loaded = true
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export function getAgent(id: string): AiAgentDefinition | undefined {
|
|
226
|
+
return agentsById.get(id)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function listAgents(): AiAgentDefinition[] {
|
|
230
|
+
return Array.from(agentsById.values()).sort((a, b) => a.id.localeCompare(b.id))
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function listAgentsByModule(moduleId: string): AiAgentDefinition[] {
|
|
234
|
+
return listAgents().filter((agent) => agent.moduleId === moduleId)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* @__internal
|
|
239
|
+
* Test-only hook — clears the cached registry so `loadAgentRegistry` re-evaluates its source.
|
|
240
|
+
*/
|
|
241
|
+
export function resetAgentRegistryForTests(): void {
|
|
242
|
+
agentsById.clear()
|
|
243
|
+
loaded = false
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* @__internal
|
|
248
|
+
* Test-only hook — seeds the registry directly from a fixture array without going through
|
|
249
|
+
* the dynamic generated-file import. Used by the registry's own unit tests.
|
|
250
|
+
*/
|
|
251
|
+
export function seedAgentRegistryForTests(agents: unknown[]): void {
|
|
252
|
+
agentsById.clear()
|
|
253
|
+
populateFromAgents(agents)
|
|
254
|
+
loaded = true
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* @__internal
|
|
259
|
+
* Test-only hook — apply override entries against the seeded registry to
|
|
260
|
+
* exercise the override pipeline without round-tripping through the
|
|
261
|
+
* generated file.
|
|
262
|
+
*/
|
|
263
|
+
export function applyAgentOverrideEntriesForTests(
|
|
264
|
+
entries: readonly AiAgentOverrideConfigEntry[],
|
|
265
|
+
): void {
|
|
266
|
+
applyOverridesToRegistry(entries)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* @__internal Test-only hook — apply additive extension entries against the
|
|
271
|
+
* seeded registry without round-tripping through the generated file.
|
|
272
|
+
*/
|
|
273
|
+
export function applyAgentExtensionEntriesForTests(
|
|
274
|
+
entries: readonly AiAgentExtension[],
|
|
275
|
+
): void {
|
|
276
|
+
applyExtensionsToRegistry(entries)
|
|
277
|
+
}
|