@nxuss/lemma 1.43.0 → 1.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/brain-ingest.js +18 -0
- package/bin/cloud.js +228 -0
- package/dist/cjs/cli/hostHooks.d.ts +6 -0
- package/dist/cjs/cli/hostHooks.d.ts.map +1 -1
- package/dist/cjs/cli/hostHooks.js +13 -3
- package/dist/cjs/cli/hostHooks.js.map +1 -1
- package/dist/cjs/cloud/CloudBrainClient.d.ts +52 -0
- package/dist/cjs/cloud/CloudBrainClient.d.ts.map +1 -0
- package/dist/cjs/cloud/CloudBrainClient.js +161 -0
- package/dist/cjs/cloud/CloudBrainClient.js.map +1 -0
- package/dist/cjs/cloud/CloudConfig.d.ts +41 -0
- package/dist/cjs/cloud/CloudConfig.d.ts.map +1 -0
- package/dist/cjs/cloud/CloudConfig.js +133 -0
- package/dist/cjs/cloud/CloudConfig.js.map +1 -0
- package/dist/cjs/cloud/CloudEntitlement.d.ts +55 -0
- package/dist/cjs/cloud/CloudEntitlement.d.ts.map +1 -0
- package/dist/cjs/cloud/CloudEntitlement.js +174 -0
- package/dist/cjs/cloud/CloudEntitlement.js.map +1 -0
- package/dist/cjs/cloud/billing/stripeApi.d.ts +43 -0
- package/dist/cjs/cloud/billing/stripeApi.d.ts.map +1 -0
- package/dist/cjs/cloud/billing/stripeApi.js +111 -0
- package/dist/cjs/cloud/billing/stripeApi.js.map +1 -0
- package/dist/cjs/cloud/billing/stripeWebhook.d.ts +35 -0
- package/dist/cjs/cloud/billing/stripeWebhook.d.ts.map +1 -0
- package/dist/cjs/cloud/billing/stripeWebhook.js +185 -0
- package/dist/cjs/cloud/billing/stripeWebhook.js.map +1 -0
- package/dist/cjs/cloud/console/ConsoleStore.d.ts +111 -0
- package/dist/cjs/cloud/console/ConsoleStore.d.ts.map +1 -0
- package/dist/cjs/cloud/console/ConsoleStore.js +172 -0
- package/dist/cjs/cloud/console/ConsoleStore.js.map +1 -0
- package/dist/cjs/cloud/console/consoleRouter.d.ts +68 -0
- package/dist/cjs/cloud/console/consoleRouter.d.ts.map +1 -0
- package/dist/cjs/cloud/console/consoleRouter.js +263 -0
- package/dist/cjs/cloud/console/consoleRouter.js.map +1 -0
- package/dist/cjs/cloud/console/mailer.d.ts +22 -0
- package/dist/cjs/cloud/console/mailer.d.ts.map +1 -0
- package/dist/cjs/cloud/console/mailer.js +35 -0
- package/dist/cjs/cloud/console/mailer.js.map +1 -0
- package/dist/cjs/cloud/identity/PlanPolicy.d.ts +16 -1
- package/dist/cjs/cloud/identity/PlanPolicy.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/PlanPolicy.js +47 -7
- package/dist/cjs/cloud/identity/PlanPolicy.js.map +1 -1
- package/dist/cjs/cloud/identity/RateLimiter.d.ts +21 -1
- package/dist/cjs/cloud/identity/RateLimiter.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/RateLimiter.js +59 -2
- package/dist/cjs/cloud/identity/RateLimiter.js.map +1 -1
- package/dist/cjs/cloud/identity/TenantResolver.d.ts +4 -1
- package/dist/cjs/cloud/identity/TenantResolver.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/TenantResolver.js +1 -1
- package/dist/cjs/cloud/identity/TenantResolver.js.map +1 -1
- package/dist/cjs/cloud/identity/authenticateV2.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/authenticateV2.js +7 -4
- package/dist/cjs/cloud/identity/authenticateV2.js.map +1 -1
- package/dist/cjs/cloud/identity/identityStore.d.ts +85 -10
- package/dist/cjs/cloud/identity/identityStore.d.ts.map +1 -1
- package/dist/cjs/cloud/identity/identityStore.js +184 -2
- package/dist/cjs/cloud/identity/identityStore.js.map +1 -1
- package/dist/cjs/cloud/metering/PostgresLedgerStore.d.ts +16 -0
- package/dist/cjs/cloud/metering/PostgresLedgerStore.d.ts.map +1 -0
- package/dist/cjs/cloud/metering/PostgresLedgerStore.js +44 -0
- package/dist/cjs/cloud/metering/PostgresLedgerStore.js.map +1 -0
- package/dist/cjs/cloud/metering/UsageLedger.d.ts +37 -0
- package/dist/cjs/cloud/metering/UsageLedger.d.ts.map +1 -1
- package/dist/cjs/cloud/metering/UsageLedger.js +80 -17
- package/dist/cjs/cloud/metering/UsageLedger.js.map +1 -1
- package/dist/cjs/cloud/metering/index.d.ts +1 -0
- package/dist/cjs/cloud/metering/index.d.ts.map +1 -1
- package/dist/cjs/cloud/metering/index.js +1 -0
- package/dist/cjs/cloud/metering/index.js.map +1 -1
- package/dist/cjs/cloud/store/FileBrainStore.d.ts +1 -0
- package/dist/cjs/cloud/store/FileBrainStore.d.ts.map +1 -1
- package/dist/cjs/cloud/store/FileBrainStore.js +3 -0
- package/dist/cjs/cloud/store/FileBrainStore.js.map +1 -1
- package/dist/cjs/cloud/store/PostgresBrainStore.d.ts +1 -0
- package/dist/cjs/cloud/store/PostgresBrainStore.d.ts.map +1 -1
- package/dist/cjs/cloud/store/PostgresBrainStore.js +4 -0
- package/dist/cjs/cloud/store/PostgresBrainStore.js.map +1 -1
- package/dist/cjs/cloud/v2/app.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/app.js +6 -0
- package/dist/cjs/cloud/v2/app.js.map +1 -1
- package/dist/cjs/cloud/v2/inputGuard.d.ts +23 -0
- package/dist/cjs/cloud/v2/inputGuard.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/inputGuard.js +71 -0
- package/dist/cjs/cloud/v2/inputGuard.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/admin.d.ts +24 -0
- package/dist/cjs/cloud/v2/routes/admin.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/admin.js +329 -0
- package/dist/cjs/cloud/v2/routes/admin.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/entitlement.d.ts +13 -0
- package/dist/cjs/cloud/v2/routes/entitlement.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/entitlement.js +24 -0
- package/dist/cjs/cloud/v2/routes/entitlement.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/index.d.ts +14 -1
- package/dist/cjs/cloud/v2/routes/index.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/index.js +36 -0
- package/dist/cjs/cloud/v2/routes/index.js.map +1 -1
- package/dist/cjs/cloud/v2/routes/memories.d.ts +21 -2
- package/dist/cjs/cloud/v2/routes/memories.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/memories.js +77 -0
- package/dist/cjs/cloud/v2/routes/memories.js.map +1 -1
- package/dist/cjs/cloud/v2/routes/recall.d.ts +1 -0
- package/dist/cjs/cloud/v2/routes/recall.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/recall.js +4 -0
- package/dist/cjs/cloud/v2/routes/recall.js.map +1 -1
- package/dist/cjs/cloud/v2/routes/tenant.d.ts +35 -0
- package/dist/cjs/cloud/v2/routes/tenant.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/routes/tenant.js +62 -0
- package/dist/cjs/cloud/v2/routes/tenant.js.map +1 -0
- package/dist/cjs/cloud/v2/routes/usage.d.ts +1 -1
- package/dist/cjs/cloud/v2/routes/usage.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/verify.d.ts +1 -0
- package/dist/cjs/cloud/v2/routes/verify.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/routes/verify.js +4 -0
- package/dist/cjs/cloud/v2/routes/verify.js.map +1 -1
- package/dist/cjs/cloud/v2/server.d.ts +9 -3
- package/dist/cjs/cloud/v2/server.d.ts.map +1 -1
- package/dist/cjs/cloud/v2/server.js +36 -2
- package/dist/cjs/cloud/v2/server.js.map +1 -1
- package/dist/cjs/cloud/v2/usageRecorder.d.ts +19 -0
- package/dist/cjs/cloud/v2/usageRecorder.d.ts.map +1 -0
- package/dist/cjs/cloud/v2/usageRecorder.js +42 -0
- package/dist/cjs/cloud/v2/usageRecorder.js.map +1 -0
- package/dist/cjs/contracts/api-v2.types.d.ts +90 -2
- package/dist/cjs/contracts/api-v2.types.d.ts.map +1 -1
- package/dist/cjs/contracts/store.d.ts +2 -0
- package/dist/cjs/contracts/store.d.ts.map +1 -1
- package/dist/cjs/mcp/index.js +3 -0
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/memory.js +74 -4
- package/dist/cjs/mcp/tools/memory.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/proxy/KeyManager.d.ts.map +1 -1
- package/dist/cjs/proxy/KeyManager.js +5 -0
- package/dist/cjs/proxy/KeyManager.js.map +1 -1
- package/dist/cjs/subconscious/CloudBrain.d.ts +77 -0
- package/dist/cjs/subconscious/CloudBrain.d.ts.map +1 -0
- package/dist/cjs/subconscious/CloudBrain.js +347 -0
- package/dist/cjs/subconscious/CloudBrain.js.map +1 -0
- package/dist/cjs/subconscious/ProjectIdentity.d.ts +9 -0
- package/dist/cjs/subconscious/ProjectIdentity.d.ts.map +1 -0
- package/dist/cjs/subconscious/ProjectIdentity.js +63 -0
- package/dist/cjs/subconscious/ProjectIdentity.js.map +1 -0
- package/dist/cjs/subconscious/TeamBrain.d.ts +9 -3
- package/dist/cjs/subconscious/TeamBrain.d.ts.map +1 -1
- package/dist/cjs/subconscious/TeamBrain.js +39 -5
- package/dist/cjs/subconscious/TeamBrain.js.map +1 -1
- package/dist/cjs/utils/ProLicense.d.ts.map +1 -1
- package/dist/cjs/utils/ProLicense.js +11 -3
- package/dist/cjs/utils/ProLicense.js.map +1 -1
- package/dist/cjs/utils/SessionCapture.d.ts +2 -0
- package/dist/cjs/utils/SessionCapture.d.ts.map +1 -1
- package/dist/cjs/utils/SessionCapture.js +5 -0
- package/dist/cjs/utils/SessionCapture.js.map +1 -1
- package/dist/cjs/utils/StopNudge.d.ts +8 -0
- package/dist/cjs/utils/StopNudge.d.ts.map +1 -0
- package/dist/cjs/utils/StopNudge.js +93 -0
- package/dist/cjs/utils/StopNudge.js.map +1 -0
- package/dist/esm/cli/hostHooks.d.ts +6 -0
- package/dist/esm/cli/hostHooks.d.ts.map +1 -1
- package/dist/esm/cli/hostHooks.js +12 -2
- package/dist/esm/cli/hostHooks.js.map +1 -1
- package/dist/esm/cloud/CloudBrainClient.d.ts +52 -0
- package/dist/esm/cloud/CloudBrainClient.d.ts.map +1 -0
- package/dist/esm/cloud/CloudBrainClient.js +153 -0
- package/dist/esm/cloud/CloudBrainClient.js.map +1 -0
- package/dist/esm/cloud/CloudConfig.d.ts +41 -0
- package/dist/esm/cloud/CloudConfig.d.ts.map +1 -0
- package/dist/esm/cloud/CloudConfig.js +118 -0
- package/dist/esm/cloud/CloudConfig.js.map +1 -0
- package/dist/esm/cloud/CloudEntitlement.d.ts +55 -0
- package/dist/esm/cloud/CloudEntitlement.d.ts.map +1 -0
- package/dist/esm/cloud/CloudEntitlement.js +159 -0
- package/dist/esm/cloud/CloudEntitlement.js.map +1 -0
- package/dist/esm/cloud/billing/stripeApi.d.ts +43 -0
- package/dist/esm/cloud/billing/stripeApi.d.ts.map +1 -0
- package/dist/esm/cloud/billing/stripeApi.js +103 -0
- package/dist/esm/cloud/billing/stripeApi.js.map +1 -0
- package/dist/esm/cloud/billing/stripeWebhook.d.ts +35 -0
- package/dist/esm/cloud/billing/stripeWebhook.d.ts.map +1 -0
- package/dist/esm/cloud/billing/stripeWebhook.js +176 -0
- package/dist/esm/cloud/billing/stripeWebhook.js.map +1 -0
- package/dist/esm/cloud/console/ConsoleStore.d.ts +111 -0
- package/dist/esm/cloud/console/ConsoleStore.d.ts.map +1 -0
- package/dist/esm/cloud/console/ConsoleStore.js +161 -0
- package/dist/esm/cloud/console/ConsoleStore.js.map +1 -0
- package/dist/esm/cloud/console/consoleRouter.d.ts +68 -0
- package/dist/esm/cloud/console/consoleRouter.d.ts.map +1 -0
- package/dist/esm/cloud/console/consoleRouter.js +252 -0
- package/dist/esm/cloud/console/consoleRouter.js.map +1 -0
- package/dist/esm/cloud/console/mailer.d.ts +22 -0
- package/dist/esm/cloud/console/mailer.d.ts.map +1 -0
- package/dist/esm/cloud/console/mailer.js +30 -0
- package/dist/esm/cloud/console/mailer.js.map +1 -0
- package/dist/esm/cloud/identity/PlanPolicy.d.ts +16 -1
- package/dist/esm/cloud/identity/PlanPolicy.d.ts.map +1 -1
- package/dist/esm/cloud/identity/PlanPolicy.js +46 -6
- package/dist/esm/cloud/identity/PlanPolicy.js.map +1 -1
- package/dist/esm/cloud/identity/RateLimiter.d.ts +21 -1
- package/dist/esm/cloud/identity/RateLimiter.d.ts.map +1 -1
- package/dist/esm/cloud/identity/RateLimiter.js +57 -2
- package/dist/esm/cloud/identity/RateLimiter.js.map +1 -1
- package/dist/esm/cloud/identity/TenantResolver.d.ts +4 -1
- package/dist/esm/cloud/identity/TenantResolver.d.ts.map +1 -1
- package/dist/esm/cloud/identity/TenantResolver.js +1 -1
- package/dist/esm/cloud/identity/TenantResolver.js.map +1 -1
- package/dist/esm/cloud/identity/authenticateV2.d.ts.map +1 -1
- package/dist/esm/cloud/identity/authenticateV2.js +7 -4
- package/dist/esm/cloud/identity/authenticateV2.js.map +1 -1
- package/dist/esm/cloud/identity/identityStore.d.ts +85 -10
- package/dist/esm/cloud/identity/identityStore.d.ts.map +1 -1
- package/dist/esm/cloud/identity/identityStore.js +180 -1
- package/dist/esm/cloud/identity/identityStore.js.map +1 -1
- package/dist/esm/cloud/metering/PostgresLedgerStore.d.ts +16 -0
- package/dist/esm/cloud/metering/PostgresLedgerStore.d.ts.map +1 -0
- package/dist/esm/cloud/metering/PostgresLedgerStore.js +40 -0
- package/dist/esm/cloud/metering/PostgresLedgerStore.js.map +1 -0
- package/dist/esm/cloud/metering/UsageLedger.d.ts +37 -0
- package/dist/esm/cloud/metering/UsageLedger.d.ts.map +1 -1
- package/dist/esm/cloud/metering/UsageLedger.js +78 -16
- package/dist/esm/cloud/metering/UsageLedger.js.map +1 -1
- package/dist/esm/cloud/metering/index.d.ts +1 -0
- package/dist/esm/cloud/metering/index.d.ts.map +1 -1
- package/dist/esm/cloud/metering/index.js +1 -0
- package/dist/esm/cloud/metering/index.js.map +1 -1
- package/dist/esm/cloud/store/FileBrainStore.d.ts +1 -0
- package/dist/esm/cloud/store/FileBrainStore.d.ts.map +1 -1
- package/dist/esm/cloud/store/FileBrainStore.js +3 -0
- package/dist/esm/cloud/store/FileBrainStore.js.map +1 -1
- package/dist/esm/cloud/store/PostgresBrainStore.d.ts +1 -0
- package/dist/esm/cloud/store/PostgresBrainStore.d.ts.map +1 -1
- package/dist/esm/cloud/store/PostgresBrainStore.js +4 -0
- package/dist/esm/cloud/store/PostgresBrainStore.js.map +1 -1
- package/dist/esm/cloud/v2/app.d.ts.map +1 -1
- package/dist/esm/cloud/v2/app.js +6 -0
- package/dist/esm/cloud/v2/app.js.map +1 -1
- package/dist/esm/cloud/v2/inputGuard.d.ts +23 -0
- package/dist/esm/cloud/v2/inputGuard.d.ts.map +1 -0
- package/dist/esm/cloud/v2/inputGuard.js +63 -0
- package/dist/esm/cloud/v2/inputGuard.js.map +1 -0
- package/dist/esm/cloud/v2/routes/admin.d.ts +24 -0
- package/dist/esm/cloud/v2/routes/admin.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/admin.js +322 -0
- package/dist/esm/cloud/v2/routes/admin.js.map +1 -0
- package/dist/esm/cloud/v2/routes/entitlement.d.ts +13 -0
- package/dist/esm/cloud/v2/routes/entitlement.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/entitlement.js +21 -0
- package/dist/esm/cloud/v2/routes/entitlement.js.map +1 -0
- package/dist/esm/cloud/v2/routes/index.d.ts +14 -1
- package/dist/esm/cloud/v2/routes/index.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/index.js +37 -1
- package/dist/esm/cloud/v2/routes/index.js.map +1 -1
- package/dist/esm/cloud/v2/routes/memories.d.ts +21 -2
- package/dist/esm/cloud/v2/routes/memories.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/memories.js +75 -0
- package/dist/esm/cloud/v2/routes/memories.js.map +1 -1
- package/dist/esm/cloud/v2/routes/recall.d.ts +1 -0
- package/dist/esm/cloud/v2/routes/recall.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/recall.js +5 -1
- package/dist/esm/cloud/v2/routes/recall.js.map +1 -1
- package/dist/esm/cloud/v2/routes/tenant.d.ts +35 -0
- package/dist/esm/cloud/v2/routes/tenant.d.ts.map +1 -0
- package/dist/esm/cloud/v2/routes/tenant.js +58 -0
- package/dist/esm/cloud/v2/routes/tenant.js.map +1 -0
- package/dist/esm/cloud/v2/routes/usage.d.ts +1 -1
- package/dist/esm/cloud/v2/routes/usage.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/verify.d.ts +1 -0
- package/dist/esm/cloud/v2/routes/verify.d.ts.map +1 -1
- package/dist/esm/cloud/v2/routes/verify.js +5 -1
- package/dist/esm/cloud/v2/routes/verify.js.map +1 -1
- package/dist/esm/cloud/v2/server.d.ts +9 -3
- package/dist/esm/cloud/v2/server.d.ts.map +1 -1
- package/dist/esm/cloud/v2/server.js +36 -3
- package/dist/esm/cloud/v2/server.js.map +1 -1
- package/dist/esm/cloud/v2/usageRecorder.d.ts +19 -0
- package/dist/esm/cloud/v2/usageRecorder.d.ts.map +1 -0
- package/dist/esm/cloud/v2/usageRecorder.js +37 -0
- package/dist/esm/cloud/v2/usageRecorder.js.map +1 -0
- package/dist/esm/contracts/api-v2.types.d.ts +90 -2
- package/dist/esm/contracts/api-v2.types.d.ts.map +1 -1
- package/dist/esm/contracts/store.d.ts +2 -0
- package/dist/esm/contracts/store.d.ts.map +1 -1
- package/dist/esm/mcp/index.js +3 -0
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
- package/dist/esm/mcp/tools/memory.js +74 -4
- package/dist/esm/mcp/tools/memory.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/proxy/KeyManager.d.ts.map +1 -1
- package/dist/esm/proxy/KeyManager.js +5 -0
- package/dist/esm/proxy/KeyManager.js.map +1 -1
- package/dist/esm/subconscious/CloudBrain.d.ts +77 -0
- package/dist/esm/subconscious/CloudBrain.d.ts.map +1 -0
- package/dist/esm/subconscious/CloudBrain.js +330 -0
- package/dist/esm/subconscious/CloudBrain.js.map +1 -0
- package/dist/esm/subconscious/ProjectIdentity.d.ts +9 -0
- package/dist/esm/subconscious/ProjectIdentity.d.ts.map +1 -0
- package/dist/esm/subconscious/ProjectIdentity.js +56 -0
- package/dist/esm/subconscious/ProjectIdentity.js.map +1 -0
- package/dist/esm/subconscious/TeamBrain.d.ts +9 -3
- package/dist/esm/subconscious/TeamBrain.d.ts.map +1 -1
- package/dist/esm/subconscious/TeamBrain.js +39 -7
- package/dist/esm/subconscious/TeamBrain.js.map +1 -1
- package/dist/esm/utils/ProLicense.d.ts.map +1 -1
- package/dist/esm/utils/ProLicense.js +11 -3
- package/dist/esm/utils/ProLicense.js.map +1 -1
- package/dist/esm/utils/SessionCapture.d.ts +2 -0
- package/dist/esm/utils/SessionCapture.d.ts.map +1 -1
- package/dist/esm/utils/SessionCapture.js +5 -0
- package/dist/esm/utils/SessionCapture.js.map +1 -1
- package/dist/esm/utils/StopNudge.d.ts +8 -0
- package/dist/esm/utils/StopNudge.d.ts.map +1 -0
- package/dist/esm/utils/StopNudge.js +86 -0
- package/dist/esm/utils/StopNudge.js.map +1 -0
- package/lemma-proxy.cjs +5 -0
- package/package.json +2 -1
- package/sdks/crewai/dist/ts/src/client.d.ts +5 -1
- package/sdks/crewai/dist/ts/src/client.js +8 -0
- package/sdks/crewai/dist/ts/src/types.d.ts +32 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { CreateMemoryRequest, MemoryState } from '../contracts/api-v2.types';
|
|
2
|
+
import { CloudBrainClient } from '../cloud/CloudBrainClient';
|
|
3
|
+
import { BrainEntry } from './TheBrainV2';
|
|
4
|
+
import { type ProjectIdentity } from './ProjectIdentity';
|
|
5
|
+
/** Local entry id → the id Cloud gave it. Lets a re-share replace and a forget retract. */
|
|
6
|
+
type CloudMap = Record<string, string>;
|
|
7
|
+
export declare function readCloudMap(root: string): CloudMap;
|
|
8
|
+
/** The client for this process's environment, or null when Cloud is off / misconfigured. */
|
|
9
|
+
export declare function cloudClient(env?: NodeJS.ProcessEnv): CloudBrainClient | null;
|
|
10
|
+
/** Why Cloud is not active, as a sentence; null when it is active or simply not configured. */
|
|
11
|
+
export declare function cloudProblem(env?: NodeJS.ProcessEnv): string | null;
|
|
12
|
+
export type BuildResult = {
|
|
13
|
+
request: CreateMemoryRequest;
|
|
14
|
+
} | {
|
|
15
|
+
skip: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* A local entry as a /v2/memories request, with evidence keyed by repo-relative path. Refuses —
|
|
19
|
+
* with the reason — whatever a teammate could not verify: untracked memories, evidence outside the
|
|
20
|
+
* repo, or an upstream (`derivedFrom`) that has not been shared.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildRememberRequest(entry: BrainEntry, root: string, map?: CloudMap, project?: ProjectIdentity | null): BuildResult;
|
|
23
|
+
export interface ShareOutcome {
|
|
24
|
+
shared: boolean;
|
|
25
|
+
cloudId?: string;
|
|
26
|
+
/** Why it was not shared, or a note to show the caller. */
|
|
27
|
+
reason?: string;
|
|
28
|
+
replaced?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** Publish one entry. If it was shared before, the new version is stored first and the old one retracted. */
|
|
31
|
+
export declare function shareEntry(entry: BrainEntry, root: string, client: CloudBrainClient): Promise<ShareOutcome>;
|
|
32
|
+
/** Retract what this checkout shared under `localId`. A no-op when it never shared it. */
|
|
33
|
+
export declare function unshareEntry(localId: string, root: string, client: CloudBrainClient): Promise<{
|
|
34
|
+
retracted: boolean;
|
|
35
|
+
reason?: string;
|
|
36
|
+
}>;
|
|
37
|
+
export interface CloudHit {
|
|
38
|
+
cloudId: string;
|
|
39
|
+
text: string;
|
|
40
|
+
state: MemoryState;
|
|
41
|
+
/** Files/symbols that no longer match THIS checkout, when stale. */
|
|
42
|
+
changed: string[];
|
|
43
|
+
author?: string;
|
|
44
|
+
createdAt: number;
|
|
45
|
+
/** Tracked paths this client refused to hash (absolute or outside the repo). */
|
|
46
|
+
ignoredPaths: number;
|
|
47
|
+
/** Set on a memory written in ANOTHER repo: its paths are not this checkout's, so it has no state here. */
|
|
48
|
+
otherRepo?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A path the server sent that is safe to hash locally: relative, inside the repo. A poisoned
|
|
52
|
+
* memory must not make this client read /etc/passwd or ../../other-repo and report its hash.
|
|
53
|
+
*/
|
|
54
|
+
export declare function safeRelativePath(p: string): string | null;
|
|
55
|
+
export interface CloudSearch {
|
|
56
|
+
/** Memories written in this repo (or that do not say where): each carries the state proven here. */
|
|
57
|
+
hits: CloudHit[];
|
|
58
|
+
/** Memories written in other repos of the company: shown, never marked fresh or stale. */
|
|
59
|
+
others: CloudHit[];
|
|
60
|
+
/** Cloud memories left out because they are this checkout's own shares (already in the local results). */
|
|
61
|
+
ownOmitted: number;
|
|
62
|
+
}
|
|
63
|
+
export declare function searchCloud(query: string, root: string, client: CloudBrainClient, limit?: number, env?: NodeJS.ProcessEnv): Promise<CloudSearch>;
|
|
64
|
+
/** The block appended to search_memory: what the team knows, each marked with the state proven HERE. */
|
|
65
|
+
export declare function formatCloudSection(search: CloudSearch): string;
|
|
66
|
+
/** Test seam: the hint is per process. */
|
|
67
|
+
export declare function resetLoginHint(): void;
|
|
68
|
+
/**
|
|
69
|
+
* The Team Brain section for a search, or '' when Cloud is off or has nothing. Never throws: when
|
|
70
|
+
* Cloud is configured but fails, one short line says so, so an empty section is never mistaken for
|
|
71
|
+
* "the team knows nothing".
|
|
72
|
+
*/
|
|
73
|
+
export declare function cloudSearchSection(query: string, root?: string): Promise<string>;
|
|
74
|
+
/** Whether stores are shared without being asked (see autoShareFor). */
|
|
75
|
+
export declare function autoShareEnabled(env?: NodeJS.ProcessEnv): boolean;
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=CloudBrain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudBrain.d.ts","sourceRoot":"","sources":["../../../src/subconscious/CloudBrain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.readCloudMap = readCloudMap;
|
|
7
|
+
exports.cloudClient = cloudClient;
|
|
8
|
+
exports.cloudProblem = cloudProblem;
|
|
9
|
+
exports.buildRememberRequest = buildRememberRequest;
|
|
10
|
+
exports.shareEntry = shareEntry;
|
|
11
|
+
exports.unshareEntry = unshareEntry;
|
|
12
|
+
exports.safeRelativePath = safeRelativePath;
|
|
13
|
+
exports.searchCloud = searchCloud;
|
|
14
|
+
exports.formatCloudSection = formatCloudSection;
|
|
15
|
+
exports.resetLoginHint = resetLoginHint;
|
|
16
|
+
exports.cloudSearchSection = cloudSearchSection;
|
|
17
|
+
exports.autoShareEnabled = autoShareEnabled;
|
|
18
|
+
/**
|
|
19
|
+
* Lemma Cloud — the Brain's team memory in the cloud.
|
|
20
|
+
*
|
|
21
|
+
* What a dev learns is shared to the company's tenant; what teammates learned is searched from
|
|
22
|
+
* it. The point of the product is that nothing arrives as a bare claim: every memory comes back
|
|
23
|
+
* with a state the CLIENT proved against ITS OWN checkout. The server cannot do that (it has no
|
|
24
|
+
* filesystem), so the flow is: recall → read which files/symbols each claim is judged against →
|
|
25
|
+
* hash those locally → /v2/verify. A memory whose files changed here reads STALE, not true.
|
|
26
|
+
*
|
|
27
|
+
* Local-first, always: every function here is best-effort and never throws into a tool. With
|
|
28
|
+
* LEMMA_CLOUD_URL / LEMMA_CLOUD_KEY unset all of it is inert.
|
|
29
|
+
*/
|
|
30
|
+
const fs_1 = __importDefault(require("fs"));
|
|
31
|
+
const path_1 = __importDefault(require("path"));
|
|
32
|
+
const CloudBrainClient_1 = require("../cloud/CloudBrainClient");
|
|
33
|
+
const TheBrainV2_1 = require("./TheBrainV2");
|
|
34
|
+
const LocalFsResolver_1 = require("./freshness/LocalFsResolver");
|
|
35
|
+
const TeamBrain_1 = require("./TeamBrain");
|
|
36
|
+
const CloudConfig_1 = require("../cloud/CloudConfig");
|
|
37
|
+
const ProjectIdentity_1 = require("./ProjectIdentity");
|
|
38
|
+
const MAP_FILE = path_1.default.join('.lemma', 'session', 'cloud-map.json');
|
|
39
|
+
const MAX_CLAIMS = 50;
|
|
40
|
+
/** The API caps a body at 1 MB; leave room for the evidence and the envelope. */
|
|
41
|
+
const MAX_TEXT_CHARS = 700000;
|
|
42
|
+
const MISSING = 'MISSING';
|
|
43
|
+
function readCloudMap(root) {
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(fs_1.default.readFileSync(path_1.default.join(root, MAP_FILE), 'utf8'));
|
|
46
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
47
|
+
return {};
|
|
48
|
+
return Object.fromEntries(Object.entries(parsed).filter(([k, v]) => typeof k === 'string' && typeof v === 'string'));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function writeCloudMap(root, map) {
|
|
55
|
+
const file = path_1.default.join(root, MAP_FILE);
|
|
56
|
+
fs_1.default.mkdirSync(path_1.default.dirname(file), { recursive: true });
|
|
57
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
58
|
+
fs_1.default.writeFileSync(tmp, JSON.stringify(map, null, 2), 'utf8');
|
|
59
|
+
fs_1.default.renameSync(tmp, file);
|
|
60
|
+
}
|
|
61
|
+
/** The client for this process's environment, or null when Cloud is off / misconfigured. */
|
|
62
|
+
function cloudClient(env = process.env) {
|
|
63
|
+
const status = (0, CloudBrainClient_1.cloudConfigStatus)(env);
|
|
64
|
+
return status.config ? new CloudBrainClient_1.CloudBrainClient(status.config) : null;
|
|
65
|
+
}
|
|
66
|
+
/** Why Cloud is not active, as a sentence; null when it is active or simply not configured. */
|
|
67
|
+
function cloudProblem(env = process.env) {
|
|
68
|
+
const status = (0, CloudBrainClient_1.cloudConfigStatus)(env);
|
|
69
|
+
return status.config ? null : status.problem;
|
|
70
|
+
}
|
|
71
|
+
const splitSymbol = (key) => {
|
|
72
|
+
const sep = key.lastIndexOf('::');
|
|
73
|
+
return sep > 0 ? { filePath: key.substring(0, sep), symbolName: key.substring(sep + 2) } : null;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* A local entry as a /v2/memories request, with evidence keyed by repo-relative path. Refuses —
|
|
77
|
+
* with the reason — whatever a teammate could not verify: untracked memories, evidence outside the
|
|
78
|
+
* repo, or an upstream (`derivedFrom`) that has not been shared.
|
|
79
|
+
*/
|
|
80
|
+
function buildRememberRequest(entry, root, map = readCloudMap(root), project = (0, ProjectIdentity_1.projectIdentity)(root)) {
|
|
81
|
+
if ((0, TheBrainV2_1.trackedArtifactCount)(entry) === 0) {
|
|
82
|
+
return { skip: 'it tracks no files or symbols, so a teammate could never verify it (anchor it with refresh_memory first)' };
|
|
83
|
+
}
|
|
84
|
+
const rebased = (0, TeamBrain_1.rebaseEntry)(entry, (abs) => (0, TeamBrain_1.toPortable)(abs, root));
|
|
85
|
+
if (!rebased)
|
|
86
|
+
return { skip: 'it tracks files outside this repo' };
|
|
87
|
+
const upstream = rebased.derivedFrom ?? [];
|
|
88
|
+
const unshared = upstream.filter((id) => !map[id]);
|
|
89
|
+
if (unshared.length > 0) {
|
|
90
|
+
return { skip: `it is derived from ${unshared.length} memor${unshared.length === 1 ? 'y' : 'ies'} not shared yet (${unshared.slice(0, 3).join(', ')}): share ${unshared.length === 1 ? 'that one' : 'those'} first` };
|
|
91
|
+
}
|
|
92
|
+
const files = {};
|
|
93
|
+
const symbols = {};
|
|
94
|
+
const symbolsNormalized = {};
|
|
95
|
+
const claims = [];
|
|
96
|
+
const addClaim = (text, source) => {
|
|
97
|
+
Object.assign(files, source.fileHashes);
|
|
98
|
+
Object.assign(symbols, source.symbolHashes);
|
|
99
|
+
Object.assign(symbolsNormalized, source.symbolNormalizedHashes);
|
|
100
|
+
const filePaths = Object.keys(source.fileHashes ?? {});
|
|
101
|
+
const syms = Object.keys(source.symbolHashes ?? {}).map(splitSymbol).filter((s) => !!s);
|
|
102
|
+
claims.push({ text, ...(filePaths.length ? { filePaths } : {}), ...(syms.length ? { symbols: syms } : {}) });
|
|
103
|
+
};
|
|
104
|
+
const entryText = `${rebased.query}\n${rebased.response}`;
|
|
105
|
+
const entryTracks = Object.keys(rebased.fileHashes ?? {}).length + Object.keys(rebased.symbolHashes ?? {}).length > 0;
|
|
106
|
+
if (rebased.claims && rebased.claims.length > 0) {
|
|
107
|
+
for (const c of rebased.claims)
|
|
108
|
+
addClaim(c.text, c);
|
|
109
|
+
// Evidence the entry itself carries, beyond its claims, must still be judged by teammates.
|
|
110
|
+
if (entryTracks)
|
|
111
|
+
addClaim(rebased.query, rebased);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
addClaim(entryText, rebased);
|
|
115
|
+
}
|
|
116
|
+
if (claims.length > MAX_CLAIMS)
|
|
117
|
+
return { skip: `it has ${claims.length} claims (the limit is ${MAX_CLAIMS})` };
|
|
118
|
+
if (claims.reduce((n, c) => n + c.text.length, 0) > MAX_TEXT_CHARS)
|
|
119
|
+
return { skip: 'it is too large to share' };
|
|
120
|
+
const evidence = { files, symbols, symbolsNormalized };
|
|
121
|
+
return {
|
|
122
|
+
request: {
|
|
123
|
+
claims,
|
|
124
|
+
evidence,
|
|
125
|
+
// Which repo this was learned in, so a developer of ANOTHER service does not read its paths as their own.
|
|
126
|
+
...(project ? { project: { id: project.id, name: project.name } } : {}),
|
|
127
|
+
...(upstream.length > 0 ? { derivedFrom: upstream.map((id) => map[id]) } : {}),
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** Publish one entry. If it was shared before, the new version is stored first and the old one retracted. */
|
|
132
|
+
async function shareEntry(entry, root, client) {
|
|
133
|
+
try {
|
|
134
|
+
const map = readCloudMap(root);
|
|
135
|
+
const built = buildRememberRequest(entry, root, map);
|
|
136
|
+
if ('skip' in built)
|
|
137
|
+
return { shared: false, reason: built.skip };
|
|
138
|
+
const created = await client.remember(built.request);
|
|
139
|
+
const previous = map[entry.id];
|
|
140
|
+
map[entry.id] = created.id;
|
|
141
|
+
writeCloudMap(root, map);
|
|
142
|
+
let replaced = false;
|
|
143
|
+
if (previous && previous !== created.id) {
|
|
144
|
+
// Store-then-retract: if the retract fails the teammate sees a duplicate, never a gap.
|
|
145
|
+
await client.forget(previous).then(() => { replaced = true; }, () => undefined);
|
|
146
|
+
}
|
|
147
|
+
return { shared: true, cloudId: created.id, replaced };
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
return { shared: false, reason: (0, CloudBrainClient_1.describeCloudFailure)(err) };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Retract what this checkout shared under `localId`. A no-op when it never shared it. */
|
|
154
|
+
async function unshareEntry(localId, root, client) {
|
|
155
|
+
try {
|
|
156
|
+
const map = readCloudMap(root);
|
|
157
|
+
const cloudId = map[localId];
|
|
158
|
+
if (!cloudId)
|
|
159
|
+
return { retracted: false };
|
|
160
|
+
try {
|
|
161
|
+
await client.forget(cloudId);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
// Already gone on the server is the outcome we wanted.
|
|
165
|
+
if (!err?.status || err.status !== 404)
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
delete map[localId];
|
|
169
|
+
writeCloudMap(root, map);
|
|
170
|
+
return { retracted: true };
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
return { retracted: false, reason: (0, CloudBrainClient_1.describeCloudFailure)(err) };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* A path the server sent that is safe to hash locally: relative, inside the repo. A poisoned
|
|
178
|
+
* memory must not make this client read /etc/passwd or ../../other-repo and report its hash.
|
|
179
|
+
*/
|
|
180
|
+
function safeRelativePath(p) {
|
|
181
|
+
if (typeof p !== 'string' || p.length === 0 || p.length > 1024 || p.includes('\0'))
|
|
182
|
+
return null;
|
|
183
|
+
const normalized = path_1.default.posix.normalize(p.replace(/\\/g, '/'));
|
|
184
|
+
if (path_1.default.posix.isAbsolute(normalized) || /^[a-zA-Z]:/.test(normalized))
|
|
185
|
+
return null;
|
|
186
|
+
if (normalized === '..' || normalized.startsWith('../'))
|
|
187
|
+
return null;
|
|
188
|
+
return normalized;
|
|
189
|
+
}
|
|
190
|
+
function currentEvidenceFor(files, symbols, root) {
|
|
191
|
+
const resolver = new LocalFsResolver_1.LocalFsResolver(root);
|
|
192
|
+
const ev = { files: {}, symbols: {}, symbolsNormalized: {} };
|
|
193
|
+
for (const f of files)
|
|
194
|
+
ev.files[f] = resolver.hashFile(f) ?? MISSING;
|
|
195
|
+
for (const key of symbols) {
|
|
196
|
+
const parts = splitSymbol(key);
|
|
197
|
+
const safe = parts && safeRelativePath(parts.filePath);
|
|
198
|
+
if (!parts || !safe)
|
|
199
|
+
continue;
|
|
200
|
+
const h = resolver.hashSymbol(parts.filePath, parts.symbolName);
|
|
201
|
+
// A symbol that cannot be found any more is a change, not an unknown.
|
|
202
|
+
ev.symbols[key] = h?.raw ?? MISSING;
|
|
203
|
+
ev.symbolsNormalized[key] = h?.normalized ?? MISSING;
|
|
204
|
+
}
|
|
205
|
+
return ev;
|
|
206
|
+
}
|
|
207
|
+
const MAX_OTHER_REPO_HITS = 3;
|
|
208
|
+
async function searchCloud(query, root, client, limit = 5, env = process.env) {
|
|
209
|
+
// Ask for more than will be shown: other repos' memories can outrank this repo's on shared words.
|
|
210
|
+
const recalled = await client.recall({ query, includeMemory: true, limit: Math.min(Math.max(limit * 3, 10), 30) });
|
|
211
|
+
const own = new Set(Object.values(readCloudMap(root)));
|
|
212
|
+
const found = recalled.results.filter((r) => r.memory);
|
|
213
|
+
const mine = found.filter((r) => own.has(r.id));
|
|
214
|
+
const theirs = found.filter((r) => !own.has(r.id));
|
|
215
|
+
// Another repo only when BOTH sides are identifiable and differ. A checkout with no remote, or a
|
|
216
|
+
// memory from before projects were recorded, keeps the old behaviour: compare it with this tree.
|
|
217
|
+
const me = (0, ProjectIdentity_1.projectIdentity)(root);
|
|
218
|
+
const isOtherRepo = (r) => !!me && !!r.memory.project && r.memory.project.id !== me.id;
|
|
219
|
+
const comparable = theirs.filter((r) => !isOtherRepo(r)).slice(0, limit);
|
|
220
|
+
const elsewhere = env.LEMMA_CLOUD_CROSS_REPO === '0' ? [] : theirs.filter(isOtherRepo).slice(0, MAX_OTHER_REPO_HITS);
|
|
221
|
+
const base = (r) => ({
|
|
222
|
+
cloudId: r.id,
|
|
223
|
+
text: r.memory.claims.map((c) => c.text).join('\n'),
|
|
224
|
+
author: r.memory.author?.keyName,
|
|
225
|
+
createdAt: r.memory.createdAt,
|
|
226
|
+
});
|
|
227
|
+
const others = elsewhere.map((r) => ({ ...base(r), state: 'unverified', changed: [], ignoredPaths: 0, otherRepo: r.memory.project?.name || 'another repo' }));
|
|
228
|
+
if (comparable.length === 0)
|
|
229
|
+
return { hits: [], others, ownOmitted: mine.length };
|
|
230
|
+
// Only THIS repo's memories are hashed and sent for verification: another repo's paths are not ours.
|
|
231
|
+
const files = new Set();
|
|
232
|
+
const symbols = new Set();
|
|
233
|
+
let ignored = 0;
|
|
234
|
+
for (const r of comparable) {
|
|
235
|
+
for (const c of r.memory.claims) {
|
|
236
|
+
for (const f of c.files ?? []) {
|
|
237
|
+
const safe = safeRelativePath(f);
|
|
238
|
+
if (safe && safe === f)
|
|
239
|
+
files.add(f);
|
|
240
|
+
else
|
|
241
|
+
ignored++;
|
|
242
|
+
}
|
|
243
|
+
for (const s of c.symbols ?? []) {
|
|
244
|
+
const parts = splitSymbol(s);
|
|
245
|
+
if (parts && safeRelativePath(parts.filePath) === parts.filePath)
|
|
246
|
+
symbols.add(s);
|
|
247
|
+
else
|
|
248
|
+
ignored++;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// If a tracked path was refused above, the memory cannot come back 'fresh': its key is simply
|
|
253
|
+
// absent from our evidence, which the server reads as unverified (fail-closed).
|
|
254
|
+
const verified = await client.verify({
|
|
255
|
+
ids: comparable.map((r) => r.id),
|
|
256
|
+
currentEvidence: currentEvidenceFor(files, symbols, root),
|
|
257
|
+
});
|
|
258
|
+
const byId = new Map(verified.results.map((v) => [v.id, v]));
|
|
259
|
+
const hits = comparable.map((r) => {
|
|
260
|
+
const v = byId.get(r.id);
|
|
261
|
+
return { ...base(r), state: v?.state ?? 'unverified', changed: v?.staleFiles ?? [], ignoredPaths: ignored };
|
|
262
|
+
});
|
|
263
|
+
return { hits, others, ownOmitted: mine.length };
|
|
264
|
+
}
|
|
265
|
+
const MAX_CHARS_PER_HIT = 1200;
|
|
266
|
+
const MAX_OTHER_REPO_CHARS = 600;
|
|
267
|
+
const age = (ms) => {
|
|
268
|
+
if (!ms)
|
|
269
|
+
return 'unknown date';
|
|
270
|
+
const days = Math.floor((Date.now() - ms) / 86400000);
|
|
271
|
+
return days <= 0 ? 'today' : days === 1 ? '1d ago' : `${days}d ago`;
|
|
272
|
+
};
|
|
273
|
+
/**
|
|
274
|
+
* Display text from another developer: one short plain token, whatever the client sent. It is CUT at the
|
|
275
|
+
* first character outside the allowed set, not scrubbed of the bad ones: scrubbing would glue the words
|
|
276
|
+
* on the far side of a newline or a bracket into the name and still carry them into the agent's context.
|
|
277
|
+
*/
|
|
278
|
+
const plainName = (name) => (name.match(/^[A-Za-z0-9._-]+/)?.[0] ?? '').slice(0, 60) || 'another repo';
|
|
279
|
+
/** The block appended to search_memory: what the team knows, each marked with the state proven HERE. */
|
|
280
|
+
function formatCloudSection(search) {
|
|
281
|
+
if (search.hits.length === 0 && search.others.length === 0)
|
|
282
|
+
return '';
|
|
283
|
+
const body = (text, max) => (text.length > max ? `${text.slice(0, max)}…` : text).split('\n').map((l) => ` ${l}`).join('\n');
|
|
284
|
+
const sameRepo = (h, i) => {
|
|
285
|
+
const verdict = h.state === 'fresh' ? 'fresh here'
|
|
286
|
+
: h.state === 'stale' ? `STALE — changed here since: ${h.changed.join(', ') || 'a tracked file'}`
|
|
287
|
+
: 'unverified here — could not be checked against your files';
|
|
288
|
+
return `${i + 1}. [team] ${h.cloudId} (${h.author ? `by ${h.author}, ` : ''}${age(h.createdAt)}, ${verdict})\n${body(h.text, MAX_CHARS_PER_HIT)}`;
|
|
289
|
+
};
|
|
290
|
+
const elsewhere = (h, i) => `${i + 1}. [other repo: ${plainName(h.otherRepo ?? '')}] ${h.cloudId} (${h.author ? `by ${h.author}, ` : ''}${age(h.createdAt)})\n${body(h.text, MAX_OTHER_REPO_CHARS)}`;
|
|
291
|
+
const blocks = [];
|
|
292
|
+
if (search.hits.length > 0) {
|
|
293
|
+
blocks.push(`Team Brain (Lemma Cloud) — what teammates learned, each state proven against YOUR checkout:\n\n` +
|
|
294
|
+
search.hits.map(sameRepo).join('\n\n') +
|
|
295
|
+
(search.hits.some((h) => h.state !== 'fresh')
|
|
296
|
+
? `\n\nA STALE or unverified team memory may describe code that has since changed here: re-check it before relying on it.`
|
|
297
|
+
: ''));
|
|
298
|
+
}
|
|
299
|
+
if (search.others.length > 0) {
|
|
300
|
+
blocks.push(`Team Brain (Lemma Cloud) — from OTHER repos of your company. They were written against different code, ` +
|
|
301
|
+
`so they have no fresh/stale state here and their file paths are not yours:\n\n` +
|
|
302
|
+
search.others.map(elsewhere).join('\n\n'));
|
|
303
|
+
}
|
|
304
|
+
return blocks.join('\n\n');
|
|
305
|
+
}
|
|
306
|
+
let hinted = false;
|
|
307
|
+
/**
|
|
308
|
+
* One line, once per process, when the repo says it has a team but this machine is not logged in.
|
|
309
|
+
* Only the validated host of the repo's marker is printed: the marker is repo content anyone can
|
|
310
|
+
* edit, and what reaches the agent's context must not be free text from it.
|
|
311
|
+
*/
|
|
312
|
+
function loginHint(root) {
|
|
313
|
+
if (hinted)
|
|
314
|
+
return '';
|
|
315
|
+
const marker = (0, CloudConfig_1.findMarker)(root);
|
|
316
|
+
if (!marker)
|
|
317
|
+
return '';
|
|
318
|
+
hinted = true;
|
|
319
|
+
return `This repo's team shares memories on Lemma Cloud (${(0, CloudConfig_1.markerHost)(marker)}). Ask the user to run \`lemma cloud login\` once to see what teammates learned.`;
|
|
320
|
+
}
|
|
321
|
+
/** Test seam: the hint is per process. */
|
|
322
|
+
function resetLoginHint() {
|
|
323
|
+
hinted = false;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* The Team Brain section for a search, or '' when Cloud is off or has nothing. Never throws: when
|
|
327
|
+
* Cloud is configured but fails, one short line says so, so an empty section is never mistaken for
|
|
328
|
+
* "the team knows nothing".
|
|
329
|
+
*/
|
|
330
|
+
async function cloudSearchSection(query, root = process.cwd()) {
|
|
331
|
+
if (process.env.LEMMA_CLOUD_SEARCH === '0')
|
|
332
|
+
return '';
|
|
333
|
+
const status = (0, CloudBrainClient_1.cloudConfigStatus)();
|
|
334
|
+
if (!status.config)
|
|
335
|
+
return status.problem ? `Team Brain (Lemma Cloud) is not active: ${status.problem}` : loginHint(root);
|
|
336
|
+
try {
|
|
337
|
+
return formatCloudSection(await searchCloud(query, root, new CloudBrainClient_1.CloudBrainClient(status.config)));
|
|
338
|
+
}
|
|
339
|
+
catch (err) {
|
|
340
|
+
return `Team Brain (Lemma Cloud) was not searched: ${(0, CloudBrainClient_1.describeCloudFailure)(err)}.`;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/** Whether stores are shared without being asked (see autoShareFor). */
|
|
344
|
+
function autoShareEnabled(env = process.env) {
|
|
345
|
+
return (0, CloudBrainClient_1.autoShareFor)((0, CloudBrainClient_1.cloudConfigStatus)(env), env);
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=CloudBrain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudBrain.js","sourceRoot":"","sources":["../../../src/subconscious/CloudBrain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ProjectIdentity {
|
|
2
|
+
id: string;
|
|
3
|
+
/** Display name, restricted to [A-Za-z0-9._-]: other developers' agents read it. */
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
/** "git@github.com:acme/orders-svc.git" -> "orders-svc", whatever the characters in between. */
|
|
7
|
+
export declare function repoNameFrom(remote: string): string;
|
|
8
|
+
export declare function projectIdentity(cwd: string): ProjectIdentity | null;
|
|
9
|
+
//# sourceMappingURL=ProjectIdentity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectIdentity.d.ts","sourceRoot":"","sources":["../../../src/subconscious/ProjectIdentity.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;CACd;AA0BD,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAInE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.repoNameFrom = repoNameFrom;
|
|
7
|
+
exports.projectIdentity = projectIdentity;
|
|
8
|
+
/**
|
|
9
|
+
* Which repository a checkout is, in a form two developers agree on.
|
|
10
|
+
*
|
|
11
|
+
* A Lemma Cloud tenant is a whole company, so one tenant holds the memories of every service it
|
|
12
|
+
* has, and a memory's evidence is only relative paths: `src/db.js` in orders-svc and `src/db.js`
|
|
13
|
+
* in billing-svc are different files with the same key. Without knowing the repo, a reader marks
|
|
14
|
+
* another service's memory STALE ("changed here") when the file simply is not its own.
|
|
15
|
+
*
|
|
16
|
+
* The id is the one the local Brain already uses for a project (deriveProjectId: the git remote,
|
|
17
|
+
* normalized so ssh and https forms agree, so two clones at different paths share it). A checkout
|
|
18
|
+
* with NO remote has only a path-based id, which differs on every machine and says nothing about
|
|
19
|
+
* which repo it is: that returns null, and callers keep the behaviour they had before projects
|
|
20
|
+
* existed rather than guess.
|
|
21
|
+
*/
|
|
22
|
+
const fs_1 = __importDefault(require("fs"));
|
|
23
|
+
const path_1 = __importDefault(require("path"));
|
|
24
|
+
const TheBrainV2_1 = require("./TheBrainV2");
|
|
25
|
+
/** The first `url =` of the repo's git config, found the way deriveProjectId finds it; null without one. */
|
|
26
|
+
function remoteOf(cwd) {
|
|
27
|
+
let dir;
|
|
28
|
+
try {
|
|
29
|
+
dir = fs_1.default.realpathSync(path_1.default.resolve(cwd));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
dir = path_1.default.resolve(cwd);
|
|
33
|
+
}
|
|
34
|
+
for (let i = 0; i < 10; i++) {
|
|
35
|
+
const git = path_1.default.join(dir, '.git');
|
|
36
|
+
if (fs_1.default.existsSync(git)) {
|
|
37
|
+
try {
|
|
38
|
+
return fs_1.default.readFileSync(path_1.default.join(git, 'config'), 'utf8').match(/url\s*=\s*(.+)/)?.[1]?.trim() || null;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null; // a worktree/submodule .git file, or unreadable: not identifiable from here
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const parent = path_1.default.dirname(dir);
|
|
45
|
+
if (parent === dir)
|
|
46
|
+
break;
|
|
47
|
+
dir = parent;
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
/** "git@github.com:acme/orders-svc.git" -> "orders-svc", whatever the characters in between. */
|
|
52
|
+
function repoNameFrom(remote) {
|
|
53
|
+
const last = remote.replace(/[/\\]+$/, '').replace(/\.git$/i, '').split(/[/:\\]/).pop() ?? '';
|
|
54
|
+
const clean = last.replace(/[^A-Za-z0-9._-]/g, '-').replace(/^-+|-+$/g, '').slice(0, 60);
|
|
55
|
+
return clean || 'repo';
|
|
56
|
+
}
|
|
57
|
+
function projectIdentity(cwd) {
|
|
58
|
+
const remote = remoteOf(cwd);
|
|
59
|
+
if (!remote)
|
|
60
|
+
return null;
|
|
61
|
+
return { id: (0, TheBrainV2_1.deriveProjectId)(cwd), name: repoNameFrom(remote) };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=ProjectIdentity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectIdentity.js","sourceRoot":"","sources":["../../../src/subconscious/ProjectIdentity.ts"],"names":[],"mappings":";;;;;AAiDA,oCAIC;AAED,0CAIC;AA3DD;;;;;;;;;;;;;GAaG;AACH,4CAAoB;AACpB,gDAAwB;AACxB,6CAA+C;AAQ/C,4GAA4G;AAC5G,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,OAAO,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;YACxG,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC,CAAC,4EAA4E;YAC3F,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gGAAgG;AAChG,SAAgB,YAAY,CAAC,MAAc;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,OAAO,KAAK,IAAI,MAAM,CAAC;AACzB,CAAC;AAED,SAAgB,eAAe,CAAC,GAAW;IACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,EAAE,EAAE,EAAE,IAAA,4BAAe,EAAC,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* Publishing is always explicit (push). Pulling is safe to automate (post-merge hook): it only
|
|
18
18
|
* adds verifiable memories, and it only ever deletes ones this clone received from the team.
|
|
19
19
|
*/
|
|
20
|
-
import { TheBrainV2 } from './TheBrainV2';
|
|
20
|
+
import { BrainEntry, TheBrainV2 } from './TheBrainV2';
|
|
21
21
|
export declare const TEAM_DIR = ".lemma-brain";
|
|
22
22
|
export interface TeamSkip {
|
|
23
23
|
id: string;
|
|
@@ -31,6 +31,8 @@ export interface TeamPushResult {
|
|
|
31
31
|
unchanged: number;
|
|
32
32
|
removed: string[];
|
|
33
33
|
skipped: TeamSkip[];
|
|
34
|
+
/** Files already in the repo whose memory is a kind that stays local (published before it was refused). */
|
|
35
|
+
localOnlyPublished: string[];
|
|
34
36
|
dryRun: boolean;
|
|
35
37
|
message: string;
|
|
36
38
|
}
|
|
@@ -60,9 +62,13 @@ export interface TeamStatus {
|
|
|
60
62
|
/** The repo root git reports (already realpath'd), or the given dir outside a repo. */
|
|
61
63
|
export declare function repoRoot(cwd?: string): string;
|
|
62
64
|
/**
|
|
63
|
-
*
|
|
64
|
-
* the
|
|
65
|
+
* Absolute evidence path → repo-relative posix path, or null when it lives outside the repo.
|
|
66
|
+
* Tries the realpath of both sides: on macOS the same file is /tmp/x from one call site and
|
|
67
|
+
* /private/tmp/x from another, and treating those as "outside the repo" would silently refuse
|
|
68
|
+
* to share a perfectly shareable memory.
|
|
65
69
|
*/
|
|
70
|
+
export declare function toPortable(abs: string, root: string): string | null;
|
|
71
|
+
export declare function rebaseEntry(entry: BrainEntry, rebase: (p: string) => string | null): BrainEntry | null;
|
|
66
72
|
export declare function pushTeamBrain(cwd?: string, opts?: {
|
|
67
73
|
dryRun?: boolean;
|
|
68
74
|
brain?: TheBrainV2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamBrain.d.ts","sourceRoot":"","sources":["../../../src/subconscious/TeamBrain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,
|
|
1
|
+
{"version":3,"file":"TeamBrain.d.ts","sourceRoot":"","sources":["../../../src/subconscious/TeamBrain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EACL,UAAU,EAGV,UAAU,EAMX,MAAM,cAAc,CAAC;AAGtB,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AAuBvC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,2GAA2G;IAC3G,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,QAAQ,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,uFAAuF;AACvF,wBAAgB,QAAQ,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAa5D;AAMD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYnE;AAuED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAatG;AAgJD,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAAO,GAAG,cAAc,CAwD9H;AA2BD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAAO,GAAG,cAAc,CA2G9H;AAID,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAsB,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,UAAU,CAAA;CAAO,GAAG,UAAU,CA2B1G"}
|