46 Commits

Author SHA1 Message Date
928d9ad950 fix(api): redact memory provider details in aiConsent/status for members 2026-09-22 07:05:26 +00:00
Cursor Agent
c8c6d9e042 fix(db): require run owner for all secret and approval answers
answerRunInput already blocked cross-member answers for credential
secret asks and always-allow approvals, but one-time allow/deny and
generic OTP secret asks had no run.userId check. Align the DB gate so
shared-space prompt answers cannot be hijacked at the persistence layer.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 07:04:47 +00:00
Cursor Agent
ca292d2cc0 chore(api): drop unused db imports after follow-up extract
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 07:04:42 +00:00
Cursor Agent
57f3ee4958 fix(api): route group follow-ups to the waiting member bot
Group threads/followUp always steered to members[0], so a follow-up
while a later member had waiting_input went to the wrong bot or started
a fresh run on the first member instead of continuing the ask.

Resolve the target bot like group sends: prefer waiting ask/takeover on
any member, then the newest steerable active run, then @mentions, then
the default first member. Extract followUpGroupThreadMessage and add
regression tests.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 07:04:42 +00:00
Cursor Agent
4264ef682f fix(adapters): scope spawnBot replay to spawning member in shared Spaces
spawnKey is unique per Space, not per user. createBot already rejects
cross-member replay, but spawnBot caught that error and returned the
other member's bot anyway. Match createBot by requiring existing.userId
=== spawnedBy.userId before treating a spawnKey conflict as idempotent.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 07:04:34 +00:00
Cursor Agent
33ce657201 fix: sort adapter imports for biome
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 07:04:29 +00:00
Cursor Agent
0b5cd4ed43 fix(api): scope Team Computer export to exporting bot workspace
Team mode shares one disk per Space. export/bot walked the entire
team home, so a member exporting their own bot received every other
member's workspace files too.

Scope exportHome with the exporting bot's bots/<id>/ prefix and add
regression coverage for the shared-Space case.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 07:04:29 +00:00
39a6a5a525 chore: update resume — TS repair complete, 0 errors
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-22 06:58:32 +00:00
0a8a8319a7 fix(adapters): repair TypeScript errors from cherry-pick merges — 0 TS errors restored
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-22 06:57:55 +00:00
cc4a46fb5a chore: update CLAUDE-RESUME — PR cleanup complete
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-22 06:31:54 +00:00
Cursor Agent
797d73145e fix(cockpit): replace blanket CORS * with origin allowlist
Mission Control previously set Access-Control-Allow-Origin: * on every
route. That widens cross-origin browser access when Cockpit binds beyond
loopback, even with bearer auth.

Add server-config helpers compatible with PR #28 bind/token patterns:
- loopback binds default to local web/API origins for the Heute shell
- privileged /api/* routes never receive *; only reflected allowlist hits
- non-loopback binds require explicit EVOO_COCKPIT_CORS_ORIGIN
- default bind moves to 127.0.0.1 with token gate off-loopback

Document env vars in .env.example and cover config/CORS in unit tests.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:23:52 +00:00
beece5a383 fix(adapters): persist tool-call budget across worker handoffs 2026-09-22 06:22:24 +00:00
6e33307c7f fix(handoff): keine Workshop-Einladung bei generischem Handoff-Fehler 2026-09-22 06:22:13 +00:00
696a37ac0b fix(adapters): mirror group completion after in-app approval 2026-09-22 06:22:03 +00:00
9c87398f53 fix(api): scope routines/remove to owner in shared Spaces 2026-09-22 06:21:53 +00:00
Cursor Agent
e8e0b20828 Bound computer-busy run retries with a clear exhaustion error
Computer-busy requeues previously retried forever via retryForever,
which could hang runs and burn worker cycles on a stuck computer.

Add a small retry policy helper that tracks consecutive busy waits in
an internal run.error marker, preserves that marker across lease claims,
caps retries at 24 with existing exponential backoff, and fails the run
with a clear message when the bound is reached. Database connection
pressure retries remain unbounded.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:21:10 +00:00
Cursor Agent
a91fc1cb98 fix(desktop): deny shell cwd outside bot computer home
Remove hostRoots from this-mac desktop sandbox so shell execution stays
inside the bot computer workspace, matching container path rules.

Add resolveDesktopExecuteCwd to map virtual /home/rakazo paths onto the
local home and reject host-absolute cwd requests via containment checks.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:21:08 +00:00
Cursor Agent
ed7ba490b1 fix(core): gate respond_agent_connection behind owner approval
The respond_agent_connection builtin could flip a pending agent connection
to approved without the target owner's YES/NO DM or authenticated API
response. Treat it like other security-boundary builtins so the executor
shows an approval card before the status change runs.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:21:03 +00:00
Cursor Agent
f9ffe06aeb fix(adapters): only mark messagingMirroredAt after durable mirror
mirrorMessagingOutbound always stamped messagingMirroredAt even when
mirrorRun returned early, so the job reconciler never retried completed
messaging runs whose channel or DM mirror was skipped or not yet durable.

Gate the recovery marker on mirror disposition (complete vs retry), only
set it for completed messaging runs, and leave it null when mirrorable
bot text still exists but was not written to the outbox.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:21:01 +00:00
Cursor Agent
644d003b82 fix(messaging): hold general outbound on ambiguous send failures
Apply the connect-invite at-most-once pattern to mirrored DMs, group
posts, channel invites, and intros. Provider send errors now keep the
outbox row claimed as sent without a handle instead of reverting to
pending and risking duplicate delivery.

Pre-send setup failures (thread resolution) still retry with backoff.
Pass outbox idempotency keys through to sendToThread for future provider
dedupe.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:59 +00:00
Cursor Agent
18934e03c9 fix(api): skip group membership sweep on partial participant rosters
Group inbound webhooks often report only the sender in participants,
not the full roster. Sweeping on any non-empty list incorrectly marked
approved members as left, silently dropping them from channel fan-out.

Gate the sweep on participantsAuthoritative so adapters opt in only when
the provider supplies a complete roster.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:56 +00:00
Cursor Agent
c8b06ec7a8 fix(api): gate memory/providerConfig read behind Space owner authz
Non-owner Space members could read provider settings (mode, baseUrl,
endpoint metadata) while connect/disconnect/setDefaultScope already
required owner role. Align the read path with write authz.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:54 +00:00
Cursor Agent
be9c310e1e fix(adapters): scope agent secrets to run owner in shared Spaces
Agent secrets are owner-managed via the API but the executor loaded every
secret in the Space and injected decrypted values into shell environment
variables for any member's bot run.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:51 +00:00
Cursor Agent
8ae36763a7 fix(api): scope Team Computer bot homes per member in shared Spaces
Team mode shares one disk per Space. RPC and executor paths under
bots/<otherBotId>/ were reachable with any member-owned entry bot,
leaking another member's workspace files while same-user cross-bot
access stays intentional.

Add path guards, filter bot listings, regression tests.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:49 +00:00
Cursor Agent
4defccae95 chore(api): sort imports for clear-thread error mapping
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:47 +00:00
Cursor Agent
32af2398d6 fix(adapters): retry delegated bot returns when wake message is gone
When a delegated bot finishes but its wake message was deleted (e.g.
thread clear), returnBotMessageOutcome used to mark botOutcomeReturnedAt
and drop the coordinator reply silently. Retry instead, and block
clearThread while completed bot_message runs still owe a return.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:47 +00:00
Cursor Agent
60520a1986 style: biome format messaging-delivery
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:45 +00:00
Cursor Agent
bf65df8603 fix(messaging): monotonic outbound status webhooks
Drain claims outbox rows as sent before the provider acks. Late ERROR
webhooks were regressing delivered rows to failed; late DELIVERED could
upgrade exhausted failures. Gate webhook updates by allowed source status.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:45 +00:00
Cursor Agent
a38cfb437f style(adapters): sort memory provider imports
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:43 +00:00
Cursor Agent
016fd0c628 fix(adapters): gate memory provider runtime resolve to Space owners
Cloud/public memory providers are owner-managed infrastructure. The RPC
read path is owner-gated separately; this aligns executor, history
compaction, and thread-clear purge with the same boundary so non-owner
members cannot load credentials or reach external endpoints at runtime.

Deployment-owner local/private providers remain available to all Space
members when the deployment owner configured them.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 06:20:43 +00:00
75b33c4be6 docs: update CLAUDE-RESUME-NOW.md — all tasks verified complete, cleanup notes 2026-09-22 06:13:49 +00:00
8f612feee5 chore: update status — all TS errors resolved, 0 across both packages 2026-09-22 04:58:20 +00:00
5e8b3e328e fix: resolve all remaining TypeScript errors (6 adapters + 0 web)
- executor.ts: MessageBlock import (type → value+type alias), source.bot cast
- executor.ts: resolveDuplicateEffectGate casts for recordedEffect.recordedForAsk
- prose-handoff-recovery.ts: explicit boolean type for nextHandedOff/blockedUpward

Result: 0 TS errors across apps/web AND packages/adapters
2026-09-22 04:48:39 +00:00
a3eac211bd fix: clean up remaining pre-existing TypeScript errors
- dictation.ts: Uint8Array cast for getByteTimeDomainData
- user-help-vibe.test.ts + user-profile-harvest.test.ts: computerHost 'evo' → null
- executor-utils.ts: import AgentRunRequest from adapter-kit, MessageBlock from contracts
- pi-model-config.ts: import AgentToolExecutionResult from adapter-kit

Results: apps/web 0 TS errors (was 4), packages/adapters 15→6 errors
2026-09-22 04:37:18 +00:00
e3853fab86 chore: update status — splits completed by other agent 2026-09-22 04:33:03 +00:00
Cursor Agent
cae230a98f refactor(adapters): wire executor and pi-runtime splits via imports
Remove duplicate definitions from executor.ts and pi-runtime.ts that
already live in executor-*.ts and pi-model-config.ts. Import extracted
symbols with .js extensions and re-export the public executor/pi-runtime
surface for existing callers.

Export a few pi-model-config helpers required by pi-runtime (including
boundAgentToolResult and toolCallBudgetFor) and align beginToolCall queue
typing with AgentRuntimeEvent.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-22 00:08:38 +00:00
9e0850d346 docs: executor + pi-runtime split handoff for another agent 2026-09-21 23:59:20 +00:00
7f7d477f15 chore: update status — executor.ts split failed after 3 attempts 2026-09-21 23:55:35 +00:00
Cursor Agent
57c968dc8b fix(web): keep project create in shell, not onboarding
Projekte + shared the new-space post-create path and always sent users
to /onboarding. Route project variant to /app with the new space selected;
keep /onboarding for global New space when a first bot is still needed.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-21 23:41:58 +00:00
bb51852c7d chore: update status — executor/pi-runtime splits abandoned 2026-09-21 23:38:56 +00:00
Cursor Agent
cc59fce7bd fix(web): Projekte + opens project create, not group form
Wire the Projekte sidebar + and empty-state action to NewSpaceDialog
with project labels instead of the group creation panel. Keep space
wording for the global create menu. Add de locale strings and an e2e
regression test.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-09-21 23:30:57 +00:00
ed621b1467 chore: update CLAUDE-RESUME-NOW.md — onboarding emoji-first complete 2026-09-21 23:19:19 +00:00
9aeb2c01f8 feat: emoji-first onboarding flow with accessory/pose customization, language step
- Rewrite Onboarding.tsx: 5-step flow (emoji → preferences → language → integrations → bot)
- Remove model selection from onboarding entirely
- Add shape selector (8 GrokShapes), color picker (12 colors), accessory (9 options), pose (8 poses)
- Add user preference form (name, timezone, hobbies, work style, communication style)
- Add language selection step with 9 locales persisting to localStorage
- Persist avatarValue ({color}::shape_{index}) on bot creation
- Persist user preferences to bot instructions
- Update onboarding-discovery: 3 items (profile, tools, crew), no model
- Update OnboardingDiscoveryShell: remove model-ready source label
- Export GROK_COLOR_LIST, GROK_SHAPES, GrokColorDef, SHIPPED_SHAPE_KEYS from ui-web
- Update onboarding-discovery.test.ts with proper mock types
2026-09-21 23:18:34 +00:00
afba3cef5a fix: remove pi-tool-utils.ts, fix executor.test.ts imports
- Remove pi-tool-utils.ts (too many dependencies on pi-runtime internals)
- Fix executor.test.ts to import from extracted modules
- Remove pi-tool-utils from index.ts exports
- Build verified green
2026-09-21 23:01:30 +00:00
a570e9e71b feat: complete onboarding redesign + major file splits
Onboarding: emoji-first flow with shape/color selection, user preferences,
language setup (9 locales), and bot creation with avatarValue persistence.

executor.ts: split 4928→4159 lines into 8 modules (completion, computer,
effects, model, utils, tools, attachments, types).

pi-runtime.ts: split 1726→561 lines into 2 modules (model-config, tool-utils).

E2E: new onboarding-emoji-first tests + updated completeOnboarding helper.
2026-09-21 22:52:04 +00:00
cynarAI
6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00