employee001 0.1.2 → 0.2.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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/(workspace)/handover/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/connections/[id]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/connections/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/council/chat/route.js +5 -5
- package/.next/standalone/.next/server/app/api/council/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/employees/[id]/task/route.js +2 -2
- package/.next/standalone/.next/server/app/api/employees/[id]/task/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/invites/[token]/complete/route.js +2 -2
- package/.next/standalone/.next/server/app/api/invites/[token]/complete/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/invites/[token]/connections/[toolkit]/disconnect/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/invites/[token]/connections/initiate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/invites/[token]/connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/invites/[token]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/invites/bulk-revoke/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/invites/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/marketplace/trial-chat/route.js +5 -5
- package/.next/standalone/.next/server/app/api/marketplace/trial-chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/routines/[id]/run/route.js +4 -4
- package/.next/standalone/.next/server/app/api/routines/[id]/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/routines/route.js +4 -4
- package/.next/standalone/.next/server/app/api/routines/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/twin/chat/route.js +4 -4
- package/.next/standalone/.next/server/app/api/twin/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit.html +1 -1
- package/.next/standalone/.next/server/app/audit.rsc +1 -1
- package/.next/standalone/.next/server/app/audit.segments/!KHdvcmtzcGFjZSk/audit/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/audit.segments/!KHdvcmtzcGFjZSk/audit.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/audit.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/audit.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/audit.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/audit.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/audit.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/budgets.html +1 -1
- package/.next/standalone/.next/server/app/budgets.rsc +1 -1
- package/.next/standalone/.next/server/app/budgets.segments/!KHdvcmtzcGFjZSk/budgets/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/budgets.segments/!KHdvcmtzcGFjZSk/budgets.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/budgets.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/budgets.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/budgets.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/budgets.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/budgets.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cockpit.html +1 -1
- package/.next/standalone/.next/server/app/cockpit.rsc +1 -1
- package/.next/standalone/.next/server/app/cockpit.segments/!KHdvcmtzcGFjZSk/cockpit/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cockpit.segments/!KHdvcmtzcGFjZSk/cockpit.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cockpit.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cockpit.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cockpit.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cockpit.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/cockpit.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/connections.html +1 -1
- package/.next/standalone/.next/server/app/connections.rsc +1 -1
- package/.next/standalone/.next/server/app/connections.segments/!KHdvcmtzcGFjZSk/connections/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/connections.segments/!KHdvcmtzcGFjZSk/connections.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/connections.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/connections.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/connections.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/connections.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/connections.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/council.html +1 -1
- package/.next/standalone/.next/server/app/council.rsc +1 -1
- package/.next/standalone/.next/server/app/council.segments/!KHdvcmtzcGFjZSk/council/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/council.segments/!KHdvcmtzcGFjZSk/council.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/council.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/council.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/council.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/council.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/council.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/employees.html +1 -1
- package/.next/standalone/.next/server/app/employees.rsc +1 -1
- package/.next/standalone/.next/server/app/employees.segments/!KHdvcmtzcGFjZSk/employees/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/employees.segments/!KHdvcmtzcGFjZSk/employees.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/employees.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/employees.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/employees.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/employees.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/employees.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/flow.html +1 -1
- package/.next/standalone/.next/server/app/flow.rsc +1 -1
- package/.next/standalone/.next/server/app/flow.segments/!KHdvcmtzcGFjZSk/flow/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/flow.segments/!KHdvcmtzcGFjZSk/flow.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/flow.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/flow.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/flow.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/flow.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/flow.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/focus.html +1 -1
- package/.next/standalone/.next/server/app/focus.rsc +1 -1
- package/.next/standalone/.next/server/app/focus.segments/!KHdvcmtzcGFjZSk/focus/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/focus.segments/!KHdvcmtzcGFjZSk/focus.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/focus.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/focus.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/focus.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/focus.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/focus.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/forgot-password.html +1 -1
- package/.next/standalone/.next/server/app/forgot-password.rsc +1 -1
- package/.next/standalone/.next/server/app/forgot-password.segments/!KGF1dGgp/forgot-password/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/forgot-password.segments/!KGF1dGgp/forgot-password.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/forgot-password.segments/!KGF1dGgp.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/forgot-password.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/forgot-password.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/forgot-password.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/forgot-password.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/generation.html +1 -1
- package/.next/standalone/.next/server/app/generation.rsc +1 -1
- package/.next/standalone/.next/server/app/generation.segments/!KHdvcmtzcGFjZSk/generation/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/generation.segments/!KHdvcmtzcGFjZSk/generation.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/generation.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/generation.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/generation.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/generation.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/generation.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.html +1 -1
- package/.next/standalone/.next/server/app/handover/live.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.segments/!KHdvcmtzcGFjZSk/handover/live/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.segments/!KHdvcmtzcGFjZSk/handover/live.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.segments/!KHdvcmtzcGFjZSk/handover.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover/live.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover.html +1 -1
- package/.next/standalone/.next/server/app/handover.rsc +2 -2
- package/.next/standalone/.next/server/app/handover.segments/!KHdvcmtzcGFjZSk/handover/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/handover.segments/!KHdvcmtzcGFjZSk/handover.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/handover.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/handover.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/inbox.html +1 -1
- package/.next/standalone/.next/server/app/inbox.rsc +1 -1
- package/.next/standalone/.next/server/app/inbox.segments/!KHdvcmtzcGFjZSk/inbox/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/inbox.segments/!KHdvcmtzcGFjZSk/inbox.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/inbox.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/inbox.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/inbox.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/inbox.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/inbox.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/join.html +1 -1
- package/.next/standalone/.next/server/app/join.rsc +1 -1
- package/.next/standalone/.next/server/app/join.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/join.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/join.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/join.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/join.segments/join/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/join.segments/join.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/launchpad.html +1 -1
- package/.next/standalone/.next/server/app/launchpad.rsc +1 -1
- package/.next/standalone/.next/server/app/launchpad.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/launchpad.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/launchpad.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/launchpad.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/launchpad.segments/launchpad/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/launchpad.segments/launchpad.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/learning.html +1 -1
- package/.next/standalone/.next/server/app/learning.rsc +1 -1
- package/.next/standalone/.next/server/app/learning.segments/!KHdvcmtzcGFjZSk/learning/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/learning.segments/!KHdvcmtzcGFjZSk/learning.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/learning.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/learning.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/learning.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/learning.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/learning.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/!KGF1dGgp/login/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/!KGF1dGgp/login.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/!KGF1dGgp.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/marketplace.html +1 -1
- package/.next/standalone/.next/server/app/marketplace.rsc +1 -1
- package/.next/standalone/.next/server/app/marketplace.segments/!KHdvcmtzcGFjZSk/marketplace/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/marketplace.segments/!KHdvcmtzcGFjZSk/marketplace.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/marketplace.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/marketplace.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/marketplace.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/marketplace.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/marketplace.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +1 -1
- package/.next/standalone/.next/server/app/onboarding.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.html +1 -1
- package/.next/standalone/.next/server/app/profile.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.segments/!KHdvcmtzcGFjZSk/profile/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.segments/!KHdvcmtzcGFjZSk/profile.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/routines.html +1 -1
- package/.next/standalone/.next/server/app/routines.rsc +1 -1
- package/.next/standalone/.next/server/app/routines.segments/!KHdvcmtzcGFjZSk/routines/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/routines.segments/!KHdvcmtzcGFjZSk/routines.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/routines.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/routines.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/routines.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/routines.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/routines.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/!KHdvcmtzcGFjZSk/settings/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/!KHdvcmtzcGFjZSk/settings.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.html +1 -1
- package/.next/standalone/.next/server/app/setup.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/setup.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/signup.html +1 -1
- package/.next/standalone/.next/server/app/signup.rsc +1 -1
- package/.next/standalone/.next/server/app/signup.segments/!KGF1dGgp/signup/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/signup.segments/!KGF1dGgp/signup.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/signup.segments/!KGF1dGgp.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/signup.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/signup.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/signup.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/signup.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sources.html +1 -1
- package/.next/standalone/.next/server/app/sources.rsc +1 -1
- package/.next/standalone/.next/server/app/sources.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sources.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sources.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sources.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sources.segments/sources/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/sources.segments/sources.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/tasks.html +1 -1
- package/.next/standalone/.next/server/app/tasks.rsc +1 -1
- package/.next/standalone/.next/server/app/tasks.segments/!KHdvcmtzcGFjZSk/tasks/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/tasks.segments/!KHdvcmtzcGFjZSk/tasks.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/tasks.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/templates.html +1 -1
- package/.next/standalone/.next/server/app/templates.rsc +1 -1
- package/.next/standalone/.next/server/app/templates.segments/!KHdvcmtzcGFjZSk/templates/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/templates.segments/!KHdvcmtzcGFjZSk/templates.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/templates.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/templates.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/templates.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/templates.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/twin-build.html +1 -1
- package/.next/standalone/.next/server/app/twin-build.rsc +1 -1
- package/.next/standalone/.next/server/app/twin-build.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/twin-build.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/twin-build.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/twin-build.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/twin-build.segments/twin-build/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/twin-build.segments/twin-build.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/welcome.html +1 -1
- package/.next/standalone/.next/server/app/welcome.rsc +1 -1
- package/.next/standalone/.next/server/app/welcome.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/welcome.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/welcome.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/welcome.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/welcome.segments/welcome/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/welcome.segments/welcome.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.html +1 -1
- package/.next/standalone/.next/server/app/workspace.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/!KHdvcmtzcGFjZSk/workspace/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/!KHdvcmtzcGFjZSk/workspace.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/!KHdvcmtzcGFjZSk.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1356xg3._.js → [root-of-the-server]__003k8.p._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07h84a1._.js +6 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0a_ynue._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ex2yk2._.js +32 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0f~5z1~._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j3azpj._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q3c~~d._.js +6 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__10ny17j._.js +6 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__11m~2bm._.js +8 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z-3x3f._.js → [root-of-the-server]__125y-wk._.js} +4 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12zipk.._.js +6 -0
- package/.next/standalone/.next/server/chunks/_059o3h8._.js +53 -25
- package/.next/standalone/.next/server/chunks/src_lib_routine-scheduler_ts_0vht_3x._.js +15 -14
- package/.next/standalone/.next/server/chunks/ssr/src_app_(workspace)_handover_page_tsx_07ypqvb._.js +11 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/0da2sz-erick..js +11 -0
- package/.next/standalone/CHANGELOG.md +33 -1
- package/.next/standalone/CLAUDE.md +57 -0
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/src/app/(workspace)/handover/page.tsx +173 -1
- package/.next/standalone/src/lib/consult-mcp.ts +99 -0
- package/.next/standalone/src/lib/council-runner.ts +51 -21
- package/.next/standalone/src/lib/shift-runner.ts +19 -1
- package/.next/standalone/src/lib/tool-policy.ts +6 -0
- package/.next/standalone/src/lib/twin-consult.ts +249 -0
- package/.next/static/chunks/0da2sz-erick..js +11 -0
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.lr-mi._.js +0 -32
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05-f-_8._.js +0 -8
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06jgjeu._.js +0 -6
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h-6u7~._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0mjn1lx._.js +0 -6
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0sg37l0._.js +0 -6
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13x7apk._.js +0 -6
- package/.next/standalone/.next/static/chunks/0gd374f-lp3~3.js +0 -1
- package/.next/static/chunks/0gd374f-lp3~3.js +0 -1
- /package/.next/standalone/.next/static/{1xm9LkIMmOAJXw3szDboz → hKlCROIMCh5LN5hzTxGHc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{1xm9LkIMmOAJXw3szDboz → hKlCROIMCh5LN5hzTxGHc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{1xm9LkIMmOAJXw3szDboz → hKlCROIMCh5LN5hzTxGHc}/_ssgManifest.js +0 -0
- /package/.next/static/{1xm9LkIMmOAJXw3szDboz → hKlCROIMCh5LN5hzTxGHc}/_buildManifest.js +0 -0
- /package/.next/static/{1xm9LkIMmOAJXw3szDboz → hKlCROIMCh5LN5hzTxGHc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{1xm9LkIMmOAJXw3szDboz → hKlCROIMCh5LN5hzTxGHc}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# CLAUDE.md — Employee001
|
|
2
|
+
|
|
3
|
+
Guidance for AI agents (and humans) working in this repo.
|
|
4
|
+
|
|
5
|
+
## What this is
|
|
6
|
+
|
|
7
|
+
`employee001` — a local-first "organizational brain": agent twins of real
|
|
8
|
+
employees, running on the user's own machine. Next.js 16 (App Router, Turbopack),
|
|
9
|
+
React 19, TypeScript (strict). Published to npm as **`employee001`** (`npx employee001`).
|
|
10
|
+
|
|
11
|
+
## Releasing
|
|
12
|
+
|
|
13
|
+
This repo publishes via a **tag-triggered** GitHub Actions workflow
|
|
14
|
+
(`.github/workflows/release.yml`, fires on `push: tags: v*`).
|
|
15
|
+
|
|
16
|
+
**Use the global `/release` skill** (`~/.claude/skills/release/`) for the full
|
|
17
|
+
runbook — it handles preflight gates, the version bump, the tag push, and
|
|
18
|
+
watch + verify. Repo-specific details it should honor:
|
|
19
|
+
|
|
20
|
+
- **Cadence:** pushes to `main` run CI only (`ci.yml`: lint + build) — they do
|
|
21
|
+
**not** publish. Only a `vX.Y.Z` tag publishes. Commit/push freely; batch many
|
|
22
|
+
commits into ONE release. Do not release per commit.
|
|
23
|
+
- **Bump command uses `--ignore-scripts`** (the project's chosen flow — skips the
|
|
24
|
+
`preversion`/`postversion` hooks so the push is explicit):
|
|
25
|
+
```bash
|
|
26
|
+
npm version <patch|minor|major> --ignore-scripts -m "release: v%s"
|
|
27
|
+
git push origin main --follow-tags
|
|
28
|
+
```
|
|
29
|
+
- **Data-leak scan:** `release.yml` runs a post-build scan to ensure no `data/`
|
|
30
|
+
directory or `.env` ships in the tarball. When verifying a publish, confirm the
|
|
31
|
+
packed tarball contains only `bin/ .next/ public/ .env.example README.md LICENSE`
|
|
32
|
+
— never `data/`.
|
|
33
|
+
- **Version-tombstone gotcha:** a published-then-unpublished npm version number is
|
|
34
|
+
permanently retired (e.g. `0.1.0` is dead — that's why first stable shipped as
|
|
35
|
+
`0.1.1`). Never reuse a number; always bump forward.
|
|
36
|
+
|
|
37
|
+
## Conventions
|
|
38
|
+
|
|
39
|
+
- Work directly on `main` (solo repo) unless asked otherwise.
|
|
40
|
+
- Inline-style objects with CSS custom properties (`var(--text)`, `var(--surface)`,
|
|
41
|
+
`var(--hairline)`, `var(--sp-*)`, `var(--fs-*)`) + framer-motion. No Tailwind /
|
|
42
|
+
shadcn in the app UI.
|
|
43
|
+
- Secrets live in `.env.local` (gitignored). The Claude Code harness shell exports
|
|
44
|
+
an empty `ANTHROPIC_API_KEY` that shadows `.env.local`; when launching the dev
|
|
45
|
+
server from that shell, `unset ANTHROPIC_API_KEY` first so `.env.local` wins.
|
|
46
|
+
- **npm supply-chain:** never consume a dependency version published <7 days ago
|
|
47
|
+
(Shai-Hulud worm family). See `docs/SECURITY-SHAI-HULUD.md` for the scan runbook.
|
|
48
|
+
TipTap is pinned to `3.23.6` via `package.json` overrides for this reason.
|
|
49
|
+
|
|
50
|
+
## Key surfaces
|
|
51
|
+
|
|
52
|
+
- `/profile` — twin profile; **Files** tab is a split-pane TipTap editor over the 9
|
|
53
|
+
base profile files + an uploadable `knowledge/` dir the twin reads on demand.
|
|
54
|
+
- `/handover` (+ `/handover/live`) — Relay: captures a departing employee's knowledge
|
|
55
|
+
into a portable Role Context Package (`rcp.json`). **DEMO module — not published.**
|
|
56
|
+
- `/flow`, `/cockpit`, `/connections` — twin chat with live memory graph, run
|
|
57
|
+
observability, and Composio tool connections.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "employee001",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "employee001",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.2.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@anthropic-ai/claude-agent-sdk": "^0.2.123",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "employee001",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Your company's organizational brain — agent twins of your real employees, running entirely on your own machine. MIT, no cloud, no telemetry.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Dolev Hayut",
|
|
@@ -704,6 +704,7 @@ function RcpItemList({ items, isTooling }: { items: (CapturedItem | ToolingRef)[
|
|
|
704
704
|
|
|
705
705
|
function RcpView({ rcp }: { rcp: RoleContextPackage }) {
|
|
706
706
|
const [rawJson, setRawJson] = useState(false);
|
|
707
|
+
const [showInfo, setShowInfo] = useState(false);
|
|
707
708
|
|
|
708
709
|
const sections: { field: CaptureArea; items: (CapturedItem | ToolingRef)[] }[] = useMemo(
|
|
709
710
|
() =>
|
|
@@ -714,10 +715,48 @@ function RcpView({ rcp }: { rcp: RoleContextPackage }) {
|
|
|
714
715
|
[rcp],
|
|
715
716
|
);
|
|
716
717
|
|
|
718
|
+
const downloadRcp = () => {
|
|
719
|
+
const subject = rcp.provenance?.consent?.subjectId ?? "handover";
|
|
720
|
+
const blob = new Blob([JSON.stringify(rcp, null, 2)], { type: "application/json" });
|
|
721
|
+
const url = URL.createObjectURL(blob);
|
|
722
|
+
const a = document.createElement("a");
|
|
723
|
+
a.href = url;
|
|
724
|
+
a.download = `rcp-${subject}.json`;
|
|
725
|
+
document.body.appendChild(a);
|
|
726
|
+
a.click();
|
|
727
|
+
a.remove();
|
|
728
|
+
URL.revokeObjectURL(url);
|
|
729
|
+
};
|
|
730
|
+
|
|
717
731
|
return (
|
|
732
|
+
<>
|
|
718
733
|
<Panel>
|
|
719
734
|
<div style={{ display: "flex", alignItems: "center", gap: "var(--sp-8)", marginBottom: 12 }}>
|
|
720
735
|
<SectionLabel>Role Context Package</SectionLabel>
|
|
736
|
+
<button
|
|
737
|
+
type="button"
|
|
738
|
+
onClick={() => setShowInfo(true)}
|
|
739
|
+
title="What is this package and how to load it into an agent?"
|
|
740
|
+
aria-label="About this package"
|
|
741
|
+
style={{
|
|
742
|
+
width: 18,
|
|
743
|
+
height: 18,
|
|
744
|
+
borderRadius: "50%",
|
|
745
|
+
border: "1px solid var(--text-subtle)",
|
|
746
|
+
background: "transparent",
|
|
747
|
+
color: "var(--text-muted)",
|
|
748
|
+
fontSize: 11,
|
|
749
|
+
fontWeight: 700,
|
|
750
|
+
cursor: "pointer",
|
|
751
|
+
display: "inline-flex",
|
|
752
|
+
alignItems: "center",
|
|
753
|
+
justifyContent: "center",
|
|
754
|
+
lineHeight: 1,
|
|
755
|
+
flexShrink: 0,
|
|
756
|
+
}}
|
|
757
|
+
>
|
|
758
|
+
?
|
|
759
|
+
</button>
|
|
721
760
|
<span
|
|
722
761
|
className="mono"
|
|
723
762
|
style={{
|
|
@@ -733,11 +772,19 @@ function RcpView({ rcp }: { rcp: RoleContextPackage }) {
|
|
|
733
772
|
<div style={{ flex: 1 }} />
|
|
734
773
|
<button
|
|
735
774
|
type="button"
|
|
736
|
-
className="btn
|
|
775
|
+
className="btn sm"
|
|
737
776
|
onClick={() => setRawJson((v) => !v)}
|
|
738
777
|
>
|
|
739
778
|
{rawJson ? "Sectioned view" : "Raw JSON"}
|
|
740
779
|
</button>
|
|
780
|
+
<button
|
|
781
|
+
type="button"
|
|
782
|
+
className="btn primary sm"
|
|
783
|
+
onClick={downloadRcp}
|
|
784
|
+
title="Download the Role Context Package as a JSON file"
|
|
785
|
+
>
|
|
786
|
+
↓ Download rcp.json
|
|
787
|
+
</button>
|
|
741
788
|
</div>
|
|
742
789
|
|
|
743
790
|
<p style={{ fontSize: "var(--fs-meta)", color: "var(--text-muted)", margin: "0 0 14px", lineHeight: 1.5 }}>
|
|
@@ -801,6 +848,131 @@ function RcpView({ rcp }: { rcp: RoleContextPackage }) {
|
|
|
801
848
|
</div>
|
|
802
849
|
)}
|
|
803
850
|
</Panel>
|
|
851
|
+
{showInfo && <RcpInfoModal subject={rcp.provenance?.consent?.subjectId ?? "the role"} onClose={() => setShowInfo(false)} />}
|
|
852
|
+
</>
|
|
853
|
+
);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// ─── "What is this package?" explainer modal ────────────────────────────────────
|
|
857
|
+
|
|
858
|
+
function RcpInfoModal({ subject, onClose }: { subject: string; onClose: () => void }) {
|
|
859
|
+
useEffect(() => {
|
|
860
|
+
const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); };
|
|
861
|
+
window.addEventListener("keydown", onKey);
|
|
862
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
863
|
+
}, [onClose]);
|
|
864
|
+
|
|
865
|
+
return (
|
|
866
|
+
<div
|
|
867
|
+
role="dialog"
|
|
868
|
+
aria-modal="true"
|
|
869
|
+
aria-label="About the Role Context Package"
|
|
870
|
+
onClick={onClose}
|
|
871
|
+
style={{
|
|
872
|
+
position: "fixed",
|
|
873
|
+
inset: 0,
|
|
874
|
+
zIndex: 1000,
|
|
875
|
+
background: "rgba(0,0,0,0.55)",
|
|
876
|
+
display: "grid",
|
|
877
|
+
placeItems: "center",
|
|
878
|
+
padding: "var(--sp-24)",
|
|
879
|
+
}}
|
|
880
|
+
>
|
|
881
|
+
<div
|
|
882
|
+
onClick={(e) => e.stopPropagation()}
|
|
883
|
+
className="scrollbar"
|
|
884
|
+
style={{
|
|
885
|
+
width: "min(640px, 100%)",
|
|
886
|
+
maxHeight: "82vh",
|
|
887
|
+
overflowY: "auto",
|
|
888
|
+
background: "var(--surface)",
|
|
889
|
+
border: "1px solid var(--hairline-strong)",
|
|
890
|
+
borderRadius: 12,
|
|
891
|
+
padding: "var(--sp-24)",
|
|
892
|
+
boxShadow: "0 24px 64px rgba(0,0,0,0.45)",
|
|
893
|
+
}}
|
|
894
|
+
>
|
|
895
|
+
<div style={{ display: "flex", alignItems: "center", gap: "var(--sp-8)", marginBottom: "var(--sp-12)" }}>
|
|
896
|
+
<h2 style={{ fontSize: "var(--fs-base)", fontWeight: 700, margin: 0, letterSpacing: "-0.01em" }}>
|
|
897
|
+
What is a Role Context Package?
|
|
898
|
+
</h2>
|
|
899
|
+
<div style={{ flex: 1 }} />
|
|
900
|
+
<button type="button" className="btn ghost sm" onClick={onClose} aria-label="Close">✕</button>
|
|
901
|
+
</div>
|
|
902
|
+
|
|
903
|
+
<p style={{ fontSize: "var(--fs-sm)", color: "var(--text-muted)", lineHeight: 1.6, margin: "0 0 var(--sp-14)" }}>
|
|
904
|
+
A portable JSON file that captures {subject}'s <strong style={{ color: "var(--text)" }}>undocumented
|
|
905
|
+
working knowledge</strong> — the “how,” not just the “what” — across 7 dimensions:
|
|
906
|
+
decision rules, playbooks, the contact graph, edge cases, the tooling map, glossary, and open loops. It carries
|
|
907
|
+
<strong style={{ color: "var(--text)" }}> zero Employee001 coupling</strong>, so a successor — human or AI agent —
|
|
908
|
+
can ingest it anywhere. Tooling is stored as <em>references only</em>, never credentials.
|
|
909
|
+
</p>
|
|
910
|
+
|
|
911
|
+
<div style={{ fontSize: "var(--fs-sm)", fontWeight: 700, color: "var(--text)", margin: "0 0 var(--sp-8)" }}>
|
|
912
|
+
How to load it into an agent like Claude
|
|
913
|
+
</div>
|
|
914
|
+
|
|
915
|
+
<InfoStep n={1} title="Into a successor's Employee001 twin">
|
|
916
|
+
Drop <span className="mono">rcp-*.json</span> into the new hire's <span className="mono">knowledge/</span> folder
|
|
917
|
+
(Profile → <strong style={{ color: "var(--text)" }}>Files</strong> → knowledge/). The twin reads it on demand — the
|
|
918
|
+
successor inherits the playbooks and decision rules from day one.
|
|
919
|
+
</InfoStep>
|
|
920
|
+
|
|
921
|
+
<InfoStep n={2} title="Claude API / Agent SDK — system-prompt context">
|
|
922
|
+
Inject the file as an authoritative context block in your system prompt:
|
|
923
|
+
<pre
|
|
924
|
+
className="scrollbar mono"
|
|
925
|
+
style={{
|
|
926
|
+
marginTop: 8, marginBottom: 0, padding: 12, background: "var(--bg-sunken)",
|
|
927
|
+
border: "1px solid var(--hairline)", borderRadius: 6, overflowX: "auto",
|
|
928
|
+
fontSize: "var(--fs-2xs)", lineHeight: 1.5, color: "var(--text)",
|
|
929
|
+
}}
|
|
930
|
+
>{`import { readFileSync } from "fs";
|
|
931
|
+
const rcp = readFileSync("rcp-${subject}.json", "utf8");
|
|
932
|
+
|
|
933
|
+
const system = \`You are taking over this role. The Role Context
|
|
934
|
+
Package below is your authoritative source for how the work is done
|
|
935
|
+
— decision rules, playbooks, contacts, edge cases, tooling, open loops:
|
|
936
|
+
|
|
937
|
+
\${rcp}\`;
|
|
938
|
+
|
|
939
|
+
// Anthropic SDK
|
|
940
|
+
await client.messages.create({ model, system, messages });`}</pre>
|
|
941
|
+
</InfoStep>
|
|
942
|
+
|
|
943
|
+
<InfoStep n={3} title="Claude Code / Claude.ai — drop-in context">
|
|
944
|
+
Save the file in your project and tell Claude to <span className="mono">Read</span> it, or attach it to the
|
|
945
|
+
conversation. For persistent context across sessions, paste the key sections into your{" "}
|
|
946
|
+
<span className="mono">CLAUDE.md</span>.
|
|
947
|
+
</InfoStep>
|
|
948
|
+
|
|
949
|
+
<p style={{ fontSize: "var(--fs-2xs)", color: "var(--text-subtle)", lineHeight: 1.5, margin: "var(--sp-14) 0 0" }}>
|
|
950
|
+
The schema (<span className="mono">relay-rcp-1</span>) is provider-agnostic — the same file works for any agent
|
|
951
|
+
framework that accepts text context, not just Claude.
|
|
952
|
+
</p>
|
|
953
|
+
</div>
|
|
954
|
+
</div>
|
|
955
|
+
);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
function InfoStep({ n, title, children }: { n: number; title: string; children: React.ReactNode }) {
|
|
959
|
+
return (
|
|
960
|
+
<div style={{ display: "flex", gap: "var(--sp-10)", marginBottom: "var(--sp-12)" }}>
|
|
961
|
+
<div
|
|
962
|
+
style={{
|
|
963
|
+
width: 20, height: 20, borderRadius: "50%", flexShrink: 0,
|
|
964
|
+
background: "var(--text)", color: "var(--bg)",
|
|
965
|
+
fontSize: 11, fontWeight: 700,
|
|
966
|
+
display: "grid", placeItems: "center", marginTop: 1,
|
|
967
|
+
}}
|
|
968
|
+
>
|
|
969
|
+
{n}
|
|
970
|
+
</div>
|
|
971
|
+
<div style={{ minWidth: 0, flex: 1 }}>
|
|
972
|
+
<div style={{ fontSize: "var(--fs-sm)", fontWeight: 600, color: "var(--text)", marginBottom: 3 }}>{title}</div>
|
|
973
|
+
<div style={{ fontSize: "var(--fs-meta)", color: "var(--text-muted)", lineHeight: 1.55 }}>{children}</div>
|
|
974
|
+
</div>
|
|
975
|
+
</div>
|
|
804
976
|
);
|
|
805
977
|
}
|
|
806
978
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// In-process MCP server exposing twin-to-twin consultation tools to a running
|
|
2
|
+
// twin. Pattern mirrors buildOrgBrainMcpServer in org-brain-mcp.ts: pure
|
|
3
|
+
// in-process, no external connection. The actual orchestration (depth caps,
|
|
4
|
+
// visited-set loop guard, nested runSingleTwin) lives in twin-consult.ts.
|
|
5
|
+
//
|
|
6
|
+
// Two tools:
|
|
7
|
+
// - consult_twin → ask another twin for advice; returns their answer.
|
|
8
|
+
// - request_approval → ask another twin to approve/reject an action.
|
|
9
|
+
//
|
|
10
|
+
// Both are classified `allow` by tool-policy (added to LOCAL_SAFE_TOOLS) so
|
|
11
|
+
// they pass the shift-mode canUseTool gate without an approval prompt.
|
|
12
|
+
|
|
13
|
+
import "server-only";
|
|
14
|
+
import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk";
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
import {
|
|
17
|
+
consultTwin,
|
|
18
|
+
requestApproval,
|
|
19
|
+
availableTargets,
|
|
20
|
+
type ConsultContext,
|
|
21
|
+
} from "@/lib/twin-consult";
|
|
22
|
+
|
|
23
|
+
function rosterLines(ctx: ConsultContext): string {
|
|
24
|
+
const targets = availableTargets(ctx);
|
|
25
|
+
if (targets.length === 0) return "(no other twins are available to consult right now)";
|
|
26
|
+
return targets.map((e) => `- \`${e.id}\` — ${e.name}, ${e.role}`).join("\n");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function buildConsultMcpServer(ctx: ConsultContext) {
|
|
30
|
+
const roster = rosterLines(ctx);
|
|
31
|
+
const atDepthCap = ctx.depth >= ctx.maxDepth;
|
|
32
|
+
|
|
33
|
+
return createSdkMcpServer({
|
|
34
|
+
name: "twin_consult",
|
|
35
|
+
version: "1.0.0",
|
|
36
|
+
tools: [
|
|
37
|
+
tool(
|
|
38
|
+
"consult_twin",
|
|
39
|
+
[
|
|
40
|
+
"Ask ANOTHER digital twin for advice or input, synchronously, mid-task.",
|
|
41
|
+
"Use this when answering well needs a colleague's expertise or perspective — e.g. a designer checking creative direction with the CEO, or anyone validating a call that crosses into another person's domain.",
|
|
42
|
+
"The consulted twin answers in their own voice; their full reply is returned to you as the tool result, then you continue your own work using it.",
|
|
43
|
+
"Don't over-use it: only consult when a colleague's input genuinely changes what you'd do. One focused question per call.",
|
|
44
|
+
atDepthCap
|
|
45
|
+
? "NOTE: consultation depth limit reached — this call will be refused. Decide with what you have."
|
|
46
|
+
: `Twins you can consult (use the exact id):\n${roster}`,
|
|
47
|
+
].join("\n"),
|
|
48
|
+
{
|
|
49
|
+
targetEmployeeId: z
|
|
50
|
+
.string()
|
|
51
|
+
.min(1)
|
|
52
|
+
.describe("The exact employee id of the twin to consult (from the list in this tool's description)."),
|
|
53
|
+
question: z
|
|
54
|
+
.string()
|
|
55
|
+
.min(8)
|
|
56
|
+
.max(800)
|
|
57
|
+
.describe("A single, focused question for that twin. Give enough context that they can answer without seeing your task."),
|
|
58
|
+
},
|
|
59
|
+
async ({ targetEmployeeId, question }) => {
|
|
60
|
+
const text = await consultTwin(targetEmployeeId, question, ctx);
|
|
61
|
+
return { content: [{ type: "text" as const, text }] };
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
tool(
|
|
65
|
+
"request_approval",
|
|
66
|
+
[
|
|
67
|
+
"Ask another twin to APPROVE or REJECT an action before you take it.",
|
|
68
|
+
"Use this (instead of consult_twin) when you need a decision/sign-off, not just advice — e.g. publishing content, committing spend, or anything that should clear a manager or the CEO first.",
|
|
69
|
+
"Returns the approver's verdict (approve/reject) plus their reasoning. The decision is also logged to the CEO's inbox so a human can override it later.",
|
|
70
|
+
"If you are NOT approved, do not take the action — note it for the CEO in your ShiftReport instead.",
|
|
71
|
+
atDepthCap
|
|
72
|
+
? "NOTE: consultation depth limit reached — this call will be refused (treated as not approved)."
|
|
73
|
+
: `Twins you can ask for approval (use the exact id):\n${roster}`,
|
|
74
|
+
].join("\n"),
|
|
75
|
+
{
|
|
76
|
+
approverEmployeeId: z
|
|
77
|
+
.string()
|
|
78
|
+
.min(1)
|
|
79
|
+
.describe("The exact employee id of the twin whose approval you need (from the list in this tool's description)."),
|
|
80
|
+
what: z
|
|
81
|
+
.string()
|
|
82
|
+
.min(8)
|
|
83
|
+
.max(400)
|
|
84
|
+
.describe("A one-line description of the action you want to take and have approved."),
|
|
85
|
+
context: z
|
|
86
|
+
.string()
|
|
87
|
+
.max(1200)
|
|
88
|
+
.optional()
|
|
89
|
+
.describe("Optional supporting context the approver needs to make the call (the draft, the numbers, the rationale)."),
|
|
90
|
+
},
|
|
91
|
+
async ({ approverEmployeeId, what, context }) => {
|
|
92
|
+
const verdict = await requestApproval(approverEmployeeId, what, context ?? "", ctx);
|
|
93
|
+
const text = `${verdict.approverName}'s decision: ${verdict.decision.toUpperCase()}\n\nReasoning: ${verdict.reason}`;
|
|
94
|
+
return { content: [{ type: "text" as const, text }] };
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
}
|
|
@@ -61,6 +61,8 @@ import {
|
|
|
61
61
|
type TwinSubagentName,
|
|
62
62
|
} from "@/lib/twin-subagents";
|
|
63
63
|
import { knowledgeIndexMarkdown } from "@/lib/knowledge-files";
|
|
64
|
+
import { buildConsultMcpServer } from "@/lib/consult-mcp";
|
|
65
|
+
import type { ConsultContext } from "@/lib/twin-consult";
|
|
64
66
|
|
|
65
67
|
// ─── Event types ──────────────────────────────────────────────────────────────
|
|
66
68
|
|
|
@@ -578,6 +580,21 @@ export type RunOptions = {
|
|
|
578
580
|
* `claude-sonnet-4-6`; CEO can pick `claude-opus-4-7` for harder asks.
|
|
579
581
|
*/
|
|
580
582
|
modelOverride?: string;
|
|
583
|
+
/**
|
|
584
|
+
* Lightweight consultation run — this twin is being consulted by another
|
|
585
|
+
* twin's run, not driving its own. Skips the personal Composio + org MCP
|
|
586
|
+
* setup and the intent planner, and caps turns lower, so a consultation
|
|
587
|
+
* chain stays cheap. The twin still has its profile, org-brain search,
|
|
588
|
+
* artifacts, and (when `consultContext` is set) the ability to consult on.
|
|
589
|
+
*/
|
|
590
|
+
consultMode?: boolean;
|
|
591
|
+
/**
|
|
592
|
+
* When set, registers the twin-to-twin consultation MCP server for this run
|
|
593
|
+
* so the twin can consult / request approval from peers. Threaded one hop
|
|
594
|
+
* deeper on each consultation; the shared `visited` set + depth cap inside
|
|
595
|
+
* prevent runaway chains. See twin-consult.ts.
|
|
596
|
+
*/
|
|
597
|
+
consultContext?: ConsultContext;
|
|
581
598
|
};
|
|
582
599
|
|
|
583
600
|
// ─── Mention detection ────────────────────────────────────────────────────────
|
|
@@ -775,25 +792,31 @@ export async function runSingleTwin(
|
|
|
775
792
|
// and merge in any org-wide custom MCP servers the CEO configured in /settings.
|
|
776
793
|
// Composio outages must NOT abort the twin's turn — degrade gracefully by
|
|
777
794
|
// omitting the toolkit so the twin can still answer from its profile files.
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
795
|
+
// Consultation runs stay light: skip the personal Composio + org-wide MCP
|
|
796
|
+
// setup entirely (the consulted twin gives advice from its profile +
|
|
797
|
+
// org-brain, it doesn't act on external systems on this hop).
|
|
798
|
+
const consultMode = options.consultMode === true;
|
|
799
|
+
const [composioMcp, orgMcpServers] = consultMode
|
|
800
|
+
? [null, {} as Awaited<ReturnType<typeof loadOrgCustomMcpServers>>]
|
|
801
|
+
: await Promise.all([
|
|
802
|
+
buildEmployeeMcpServer(employee.id).catch((err) => {
|
|
803
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
804
|
+
console.warn(`[composio] tools unavailable, twin will answer without them: ${msg}`);
|
|
805
|
+
onEvent({
|
|
806
|
+
type: "tool_blocked",
|
|
807
|
+
employeeId: employee.id,
|
|
808
|
+
tool: "composio",
|
|
809
|
+
reason: `Composio is temporarily unavailable — tools are degraded. ${msg}`,
|
|
810
|
+
ts: ts(),
|
|
811
|
+
});
|
|
812
|
+
return null;
|
|
813
|
+
}),
|
|
814
|
+
loadOrgCustomMcpServers().catch((err) => {
|
|
815
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
816
|
+
console.warn(`[org-mcp] load failed: ${msg}`);
|
|
817
|
+
return {};
|
|
818
|
+
}),
|
|
819
|
+
]);
|
|
797
820
|
|
|
798
821
|
const meetingId = options.teamMeetingContext?.meetingId;
|
|
799
822
|
|
|
@@ -807,6 +830,12 @@ export async function runSingleTwin(
|
|
|
807
830
|
// gate (the twin can already Read these files directly; the MCP
|
|
808
831
|
// tool is just a more efficient retrieval surface).
|
|
809
832
|
org_brain: buildOrgBrainMcpServer(),
|
|
833
|
+
// Twin-to-twin consultation — only when the caller threaded a context.
|
|
834
|
+
// Lets this twin synchronously consult / request approval from peers;
|
|
835
|
+
// the context's depth cap + shared visited-set guard against loops.
|
|
836
|
+
...(options.consultContext
|
|
837
|
+
? { twin_consult: buildConsultMcpServer(options.consultContext) }
|
|
838
|
+
: {}),
|
|
810
839
|
// Per-meeting scratch — only when we're inside a Team Meeting run.
|
|
811
840
|
// The handler callback fires after persistence succeeds; we forward
|
|
812
841
|
// it as `file_shared` so the UI can render the chip in the right
|
|
@@ -902,7 +931,8 @@ export async function runSingleTwin(
|
|
|
902
931
|
: "chat";
|
|
903
932
|
|
|
904
933
|
let responseIntentBlock = "";
|
|
905
|
-
|
|
934
|
+
// Skip the intent-planner LLM call on consultation hops — keeps chains cheap.
|
|
935
|
+
if (!consultMode) try {
|
|
906
936
|
const plan = await planEmployeeResponseIntent(question, {
|
|
907
937
|
employeeName: employee.name,
|
|
908
938
|
employeeRole: employee.role,
|
|
@@ -1126,7 +1156,7 @@ export async function runSingleTwin(
|
|
|
1126
1156
|
agents: buildTwinAgentDefinitions(),
|
|
1127
1157
|
toolConfig: { askUserQuestion: { previewFormat: "html" } },
|
|
1128
1158
|
...(hasMcp ? { mcpServers } : {}),
|
|
1129
|
-
maxTurns: hasMcp ? 20 : 6,
|
|
1159
|
+
maxTurns: consultMode ? 8 : hasMcp ? 20 : 6,
|
|
1130
1160
|
...(options.maxBudgetUsd ? { maxBudgetUsd: options.maxBudgetUsd } : {}),
|
|
1131
1161
|
includePartialMessages: true,
|
|
1132
1162
|
permissionMode: hasMcp ? "default" : "bypassPermissions",
|
|
@@ -17,6 +17,8 @@ import { appendFeedItem } from "@/lib/feed-store";
|
|
|
17
17
|
import { registerRun, updateRun, unregisterRun } from "@/lib/active-runs";
|
|
18
18
|
import { appendRunLog, logPathFor } from "@/lib/run-logs";
|
|
19
19
|
import { recordSpend } from "@/lib/twin-budget";
|
|
20
|
+
import { createConsultContext } from "@/lib/twin-consult";
|
|
21
|
+
import { buildConsultMcpServer } from "@/lib/consult-mcp";
|
|
20
22
|
|
|
21
23
|
// ─── Return type ──────────────────────────────────────────────────────────────
|
|
22
24
|
|
|
@@ -85,6 +87,7 @@ You are running in autonomous shift mode. No CEO is present. Your job is to:
|
|
|
85
87
|
- Read before you write. Prefer read-only tools first.
|
|
86
88
|
- Do NOT send messages, emails, or post to external channels without a prior decision recorded in your shift log.
|
|
87
89
|
- Destructive or external-facing actions are automatically deferred to /flow for CEO review.
|
|
90
|
+
- If a decision needs a colleague's expertise or sign-off, use \`consult_twin\` for advice or \`request_approval\` for a go/no-go — don't guess outside your lane. Use sparingly, only when their input changes what you'd do.
|
|
88
91
|
- Keep the summary to one short line: what actually happened, not what you planned.`;
|
|
89
92
|
|
|
90
93
|
const shiftLog = readShiftLog(employee.id);
|
|
@@ -241,6 +244,21 @@ export async function runShift(args: {
|
|
|
241
244
|
}
|
|
242
245
|
}
|
|
243
246
|
|
|
247
|
+
// Twin-to-twin consultation: this twin can synchronously consult / request
|
|
248
|
+
// approval from peers mid-shift. Created AFTER the no-MCP gate above so the
|
|
249
|
+
// gate still measures real action tools — consultation augments an
|
|
250
|
+
// action-capable shift, it isn't a reason to run an actionless one.
|
|
251
|
+
const consultCtx = await createConsultContext({
|
|
252
|
+
requester: employee,
|
|
253
|
+
runId,
|
|
254
|
+
surface: "shift",
|
|
255
|
+
maxDepth: 3,
|
|
256
|
+
});
|
|
257
|
+
const mcpServersWithConsult = {
|
|
258
|
+
...mcpServers,
|
|
259
|
+
twin_consult: buildConsultMcpServer(consultCtx),
|
|
260
|
+
};
|
|
261
|
+
|
|
244
262
|
const canUseTool: CanUseTool = async (
|
|
245
263
|
toolName,
|
|
246
264
|
input
|
|
@@ -306,7 +324,7 @@ export async function runShift(args: {
|
|
|
306
324
|
cwd: employeeDir,
|
|
307
325
|
systemPrompt: buildSystemPromptBlocks(employee, employeeDir, trigger, focusBlock),
|
|
308
326
|
allowedTools: ["TodoWrite"],
|
|
309
|
-
|
|
327
|
+
mcpServers: mcpServersWithConsult,
|
|
310
328
|
maxTurns: 12,
|
|
311
329
|
includePartialMessages: true,
|
|
312
330
|
permissionMode: hasMcp ? "default" : "bypassPermissions",
|
|
@@ -52,6 +52,12 @@ const LOCAL_SAFE_TOOLS = new Set([
|
|
|
52
52
|
"view_meeting_image",
|
|
53
53
|
"analyze_csv",
|
|
54
54
|
"query_csv",
|
|
55
|
+
// Twin-to-twin consultation — purely internal orchestration (a nested twin
|
|
56
|
+
// run on the same host). Loop-guarded by depth cap + visited set in
|
|
57
|
+
// twin-consult.ts; request_approval additionally logs to /inbox for the
|
|
58
|
+
// human to override. No external side effects of their own.
|
|
59
|
+
"consult_twin",
|
|
60
|
+
"request_approval",
|
|
55
61
|
]);
|
|
56
62
|
|
|
57
63
|
/**
|