titan-agent 6.5.2 → 7.0.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 +180 -53
- package/assets/agent-skills/NOTICE-ECC.md +39 -0
- package/assets/agent-skills/agent-introspection-debugging/SKILL.md +153 -0
- package/assets/agent-skills/continuous-agent-loop/SKILL.md +45 -0
- package/assets/agent-skills/continuous-learning/SKILL.md +131 -0
- package/assets/agent-skills/continuous-learning/config.json +18 -0
- package/assets/agent-skills/continuous-learning/evaluate-session.sh +69 -0
- package/assets/agent-skills/production-audit/SKILL.md +206 -0
- package/assets/agent-skills/recursive-decision-ledger/SKILL.md +79 -0
- package/assets/agent-skills/scientific-thinking-literature-review/SKILL.md +192 -0
- package/assets/agent-skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
- package/assets/agent-skills/verification-loop/SKILL.md +126 -0
- package/dist/agent/agent.js +67 -26
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/agentLoop.js +6 -2
- package/dist/agent/agentLoop.js.map +1 -1
- package/dist/agent/autoModeClassifier.js +26 -2
- package/dist/agent/autoModeClassifier.js.map +1 -1
- package/dist/agent/goalDriver.js +2 -0
- package/dist/agent/goalDriver.js.map +1 -1
- package/dist/agent/goalSpec.js +229 -0
- package/dist/agent/goalSpec.js.map +1 -0
- package/dist/agent/heartbeat.js +130 -0
- package/dist/agent/heartbeat.js.map +1 -0
- package/dist/agent/missionDecompose.js +38 -0
- package/dist/agent/missionDecompose.js.map +1 -0
- package/dist/agent/muscleMemory.js +291 -0
- package/dist/agent/muscleMemory.js.map +1 -0
- package/dist/agent/observationWriter.js +56 -0
- package/dist/agent/observationWriter.js.map +1 -0
- package/dist/agent/promptSectionCaps.js +6 -0
- package/dist/agent/promptSectionCaps.js.map +1 -1
- package/dist/agent/reminders.js +101 -0
- package/dist/agent/reminders.js.map +1 -0
- package/dist/agent/systemWidgets.js +41 -0
- package/dist/agent/systemWidgets.js.map +1 -0
- package/dist/agent/toolRunner.js +24 -0
- package/dist/agent/toolRunner.js.map +1 -1
- package/dist/agent/toolSearch.js +3 -0
- package/dist/agent/toolSearch.js.map +1 -1
- package/dist/channels/messenger.js +39 -0
- package/dist/channels/messenger.js.map +1 -1
- package/dist/config/config.js +7 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/schema.js +18 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/eval/harness.js +13 -3
- package/dist/eval/harness.js.map +1 -1
- package/dist/gateway/onboarding.js +91 -0
- package/dist/gateway/onboarding.js.map +1 -0
- package/dist/gateway/routes/skills.js +2 -1
- package/dist/gateway/routes/skills.js.map +1 -1
- package/dist/gateway/routes/studioRouter.js +88 -0
- package/dist/gateway/routes/studioRouter.js.map +1 -0
- package/dist/gateway/routes/watchRouter.js +4 -4
- package/dist/gateway/routes/watchRouter.js.map +1 -1
- package/dist/gateway/server.js +251 -43
- package/dist/gateway/server.js.map +1 -1
- package/dist/memory/taxonomy.js +117 -0
- package/dist/memory/taxonomy.js.map +1 -0
- package/dist/providers/modelCapabilities.js +13 -0
- package/dist/providers/modelCapabilities.js.map +1 -1
- package/dist/providers/ollama.js +8 -2
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openai.js +1 -1
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openai_compat.js +38 -2
- package/dist/providers/openai_compat.js.map +1 -1
- package/dist/providers/router.js +14 -0
- package/dist/providers/router.js.map +1 -1
- package/dist/recipes/runner.js +8 -1
- package/dist/recipes/runner.js.map +1 -1
- package/dist/recipes/store.js +2 -1
- package/dist/recipes/store.js.map +1 -1
- package/dist/skills/builtin/codebase_explore.js +214 -0
- package/dist/skills/builtin/codebase_explore.js.map +1 -0
- package/dist/skills/builtin/config_audit.js +160 -0
- package/dist/skills/builtin/config_audit.js.map +1 -0
- package/dist/skills/builtin/delegate_agent.js +107 -0
- package/dist/skills/builtin/delegate_agent.js.map +1 -0
- package/dist/skills/builtin/memory_map.js +38 -0
- package/dist/skills/builtin/memory_map.js.map +1 -0
- package/dist/skills/builtin/reminders.js +67 -0
- package/dist/skills/builtin/reminders.js.map +1 -0
- package/dist/skills/builtin/spec.js +139 -0
- package/dist/skills/builtin/spec.js.map +1 -0
- package/dist/skills/builtin/widget_gallery.js +12 -5
- package/dist/skills/builtin/widget_gallery.js.map +1 -1
- package/dist/skills/frontmatterLoader.js +7 -1
- package/dist/skills/frontmatterLoader.js.map +1 -1
- package/dist/skills/registry.js +12 -0
- package/dist/skills/registry.js.map +1 -1
- package/dist/substrate/traceBus.js.map +1 -1
- package/dist/telemetry/traceStore.js +127 -0
- package/dist/telemetry/traceStore.js.map +1 -0
- package/dist/utils/constants.js +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/contrast.js +69 -0
- package/dist/utils/contrast.js.map +1 -0
- package/dist/watch/sessionContext.js +14 -0
- package/dist/watch/sessionContext.js.map +1 -0
- package/dist/watch/sessionTrace.js +51 -0
- package/dist/watch/sessionTrace.js.map +1 -0
- package/dist/watch/studioBuffer.js +53 -0
- package/dist/watch/studioBuffer.js.map +1 -0
- package/package.json +4 -3
- package/ui/dist/assets/AboutYouMemory-CZKEOd_O.js +11 -0
- package/ui/dist/assets/AuditPanel-Bu71N5Er.js +1 -0
- package/ui/dist/assets/{AutonomyPanel-CmaXJV8d.js → AutonomyPanel-DB-39dX4.js} +2 -2
- package/ui/dist/assets/{AutopilotPanel-CbohPtXW.js → AutopilotPanel-Cj8oKxWv.js} +1 -1
- package/ui/dist/assets/{AutoresearchPanel-DCwiQ2v2.js → AutoresearchPanel-3s8pjm6Z.js} +2 -2
- package/ui/dist/assets/BackupPanel-EUQJMJE7.js +1 -0
- package/ui/dist/assets/{BrowserPanel-D6UaSxap.js → BrowserPanel-Beo4F5Ar.js} +2 -2
- package/ui/dist/assets/Button-MdXmb4_n.js +1 -0
- package/ui/dist/assets/CPActivity-B1Se9VVc.js +1 -0
- package/ui/dist/assets/CPAgentDetail-BYji6tT8.js +1 -0
- package/ui/dist/assets/CPAgents-BSUKucTe.js +1 -0
- package/ui/dist/assets/CPApprovals-B4v0em6e.js +1 -0
- package/ui/dist/assets/CPCosts-9ikh61Kv.js +1 -0
- package/ui/dist/assets/CPDashboard-sOok2T5v.js +1 -0
- package/ui/dist/assets/{CPFiles-BO73EZwJ.js → CPFiles-DB2nY5JE.js} +1 -1
- package/ui/dist/assets/CPGoals-8Z1yOY8e.js +1 -0
- package/ui/dist/assets/CPInbox-Cq6-UY8F.js +11 -0
- package/ui/dist/assets/CPIssueDetail-NAGfmJg8.js +1 -0
- package/ui/dist/assets/CPIssues-BzX6Rckx.js +1 -0
- package/ui/dist/assets/CPLayout-BcRM6QSg.js +2 -0
- package/ui/dist/assets/CPOrg-B7DQ4UQP.js +1 -0
- package/ui/dist/assets/CPRuns-D-cpPw_M.js +1 -0
- package/ui/dist/assets/{CPSocial-Qw5rKy_4.js → CPSocial-DshtmcK0.js} +3 -3
- package/ui/dist/assets/CPVoice-DfXRnQVU.js +1 -0
- package/ui/dist/assets/{ChannelsPanel-DS21E-Iz.js → ChannelsPanel-BnaTOeyf.js} +1 -1
- package/ui/dist/assets/CheckpointsPanel-C62naE4U.js +1 -0
- package/ui/dist/assets/CommandPostHub-B_L1CAss.js +24 -0
- package/ui/dist/assets/ConfirmDialog-VErHWAbo.js +1 -0
- package/ui/dist/assets/CronPanel-BwMrrZ5d.js +1 -0
- package/ui/dist/assets/{DataTable-PnhPeDBG.js → DataTable-BCqSUuN7.js} +1 -1
- package/ui/dist/assets/{DreamPanel-DIrtlk2K.js → DreamPanel-BNAcCLBB.js} +2 -2
- package/ui/dist/assets/EmptyState-D9kQf1PX.js +1 -0
- package/ui/dist/assets/{EvalHarnessPanel-uYb_ZEQG.js → EvalHarnessPanel-BaMLdBNm.js} +2 -2
- package/ui/dist/assets/EvalPanel-CW-SSjtg.js +1 -0
- package/ui/dist/assets/{FileViewer-CVO3TRs3.js → FileViewer-BL00nsd7.js} +1 -1
- package/ui/dist/assets/FilesPanel-CeC6YUSd.js +16 -0
- package/ui/dist/assets/FleetPanel-EyWF7l3W.js +1 -0
- package/ui/dist/assets/{HomelabPanel-BZvN4LPM.js → HomelabPanel-BRfKRYe7.js} +2 -2
- package/ui/dist/assets/InfraView-Jmqhg_Yc.js +2 -0
- package/ui/dist/assets/{InlineEditableField-mBzpbcLB.js → InlineEditableField-DgMrLDj1.js} +1 -1
- package/ui/dist/assets/Input-CBTwa_Iw.js +1 -0
- package/ui/dist/assets/IntegrationsPanel-DQL-7Ec6.js +1 -0
- package/ui/dist/assets/IntelligenceView-DxD78qfP.js +2 -0
- package/ui/dist/assets/LearningPanel-C_JzSbJU.js +1 -0
- package/ui/dist/assets/LiveStudio-Db5yeaWo.js +7 -0
- package/ui/dist/assets/{LogsPanel-DbP3Mwnr.js → LogsPanel-CpinKwaZ.js} +1 -1
- package/ui/dist/assets/McpPanel-D-MqN_f-.js +1 -0
- package/ui/dist/assets/MemoryGraphPanel-BnD5jRqf.js +1 -0
- package/ui/dist/assets/MemoryTaxonomyPanel-BBI202dd.js +6 -0
- package/ui/dist/assets/MemoryWikiPanel-Dn3XZHL0.js +6 -0
- package/ui/dist/assets/{MeshPanel-Bf-4brXL.js → MeshPanel-C-mRJpr0.js} +1 -1
- package/ui/dist/assets/{MissionCanvas-CJyhnauG.js → MissionCanvas-CbZW83Ch.js} +1 -1
- package/ui/dist/assets/{MissionChat-C2Nto3zM.js → MissionChat-Bs75jPAD.js} +1 -1
- package/ui/dist/assets/{MissionLibrary-RXyBHsLL.js → MissionLibrary-BxQ6SxPe.js} +1 -1
- package/ui/dist/assets/MissionStart-CBuBPasl.js +1 -0
- package/ui/dist/assets/Modal-ybPGvlQs.js +9 -0
- package/ui/dist/assets/{NvidiaPanel-4DlcQlyl.js → NvidiaPanel-DdG13OX4.js} +1 -1
- package/ui/dist/assets/OrganismPanel-xZWUJKyr.js +1 -0
- package/ui/dist/assets/OverviewPanel-B45ZYhJV.js +1 -0
- package/ui/dist/assets/{PageHeader-bnc85wQN.js → PageHeader-DdrbS1aq.js} +1 -1
- package/ui/dist/assets/PersonaProfilesPanel-CKER-EU5.js +8 -0
- package/ui/dist/assets/{PersonasPanel-dR8VppcD.js → PersonasPanel-CMMQ3nh3.js} +1 -1
- package/ui/dist/assets/{PhoneDeskPanel-CdVOY7H9.js → PhoneDeskPanel-Bw_Y-cVE.js} +2 -2
- package/ui/dist/assets/RecipesPanel-DzMcxpJJ.js +1 -0
- package/ui/dist/assets/SecurityPanel-BCq3Fzbr.js +1 -0
- package/ui/dist/assets/SelfImprovePanel-YE3hT8jK.js +1 -0
- package/ui/dist/assets/SelfProposalsPanel-DXuqBM6p.js +1 -0
- package/ui/dist/assets/SessionsPanel-DORz5goR.js +1 -0
- package/ui/dist/assets/SessionsTab-qYHDOuC8.js +1 -0
- package/ui/dist/assets/SettingsPanel-BbwPu1i7.js +1 -0
- package/ui/dist/assets/SettingsView-zgqkDDBJ.js +2 -0
- package/ui/dist/assets/{SkeletonLoader-Cax7YTqW.js → SkeletonLoader-r6OGXaU9.js} +1 -1
- package/ui/dist/assets/SkillsPanel-BjEOBMRo.js +11 -0
- package/ui/dist/assets/{SomaView-eG3wI4S1.js → SomaView-DLzApZVW.js} +2 -2
- package/ui/dist/assets/{StatCard-Djr487DV.js → StatCard-DLq8aBps.js} +1 -1
- package/ui/dist/assets/{StatusBadge-JpCoA33_.js → StatusBadge-BqlvIbdj.js} +1 -1
- package/ui/dist/assets/{Tabs-DJHu-roP.js → Tabs-DdUThlp1.js} +1 -1
- package/ui/dist/assets/TeamsPanel-uIIKoU7I.js +1 -0
- package/ui/dist/assets/{TelemetryPanel-D4PXsd-X.js → TelemetryPanel-dVr3yQQr.js} +1 -1
- package/ui/dist/assets/TitanCanvas-xHAJqwG2.js +945 -0
- package/ui/dist/assets/ToolsView-CG1mZdiy.js +2 -0
- package/ui/dist/assets/{Tooltip-B1LhTXJ8.js → Tooltip-C2tXJcrN.js} +1 -1
- package/ui/dist/assets/TraceViewer-BIMD_Osr.js +1 -0
- package/ui/dist/assets/TracesPanel-nMUiyMj5.js +1 -0
- package/ui/dist/assets/TrainingPanel-CT5R4HWm.js +1 -0
- package/ui/dist/assets/{VoiceOverlay-B_ss7Zg_.js → VoiceOverlay-Br4QnCtw.js} +3 -3
- package/ui/dist/assets/VramPanel-CdnJYytg.js +1 -0
- package/ui/dist/assets/WatchView-TNU6Ns1Q.js +13 -0
- package/ui/dist/assets/WorkTab-wTlX_UKP.js +1 -0
- package/ui/dist/assets/WorkflowBuilderPanel-CDpVt5ux.js +6 -0
- package/ui/dist/assets/WorkflowsPanel-zsFqsLdn.js +11 -0
- package/ui/dist/assets/{archive-gZFnGd5A.js → archive-Bh689DNg.js} +1 -1
- package/ui/dist/assets/{arrow-left-qA0Qer2h.js → arrow-left-WkVYLm80.js} +1 -1
- package/ui/dist/assets/{book-open-DIxdPqmD.js → book-open-ohEXgUsS.js} +1 -1
- package/ui/dist/assets/{bot-CvIF1uHi.js → bot-DvEcyQcD.js} +1 -1
- package/ui/dist/assets/{chart-column-BQiM-Td4.js → chart-column-w3goFd5f.js} +1 -1
- package/ui/dist/assets/{check-DgyDEFtq.js → check-CuRYh4Zh.js} +1 -1
- package/ui/dist/assets/{chevron-right-CQ1NTOtd.js → chevron-right-DbLSHmff.js} +1 -1
- package/ui/dist/assets/{circle-check-big-CAFcaPPH.js → circle-check-big-Bkba568b.js} +1 -1
- package/ui/dist/assets/{circle-stop-C-8xGv0n.js → circle-stop-Bx2ohEg8.js} +1 -1
- package/ui/dist/assets/{clipboard-list-9DdqBj1F.js → clipboard-list-Dj9tORnu.js} +1 -1
- package/ui/dist/assets/{clock-CF9BCIpL.js → clock-JyQAYy6X.js} +1 -1
- package/ui/dist/assets/{dollar-sign-LDRZBae6.js → dollar-sign-XxwPAA2a.js} +1 -1
- package/ui/dist/assets/{download-BBNXvBO0.js → download-D1izVEOL.js} +1 -1
- package/ui/dist/assets/{external-link-D_ji4Bec.js → external-link-DZ_rZsIt.js} +1 -1
- package/ui/dist/assets/{file-text-DrdTDEYp.js → file-text-Cfawu8Bs.js} +1 -1
- package/ui/dist/assets/{flask-conical-BGn5PgFX.js → flask-conical-Ql8QxhgY.js} +1 -1
- package/ui/dist/assets/{folder-BeZZUGnK.js → folder-DAdIw-Pb.js} +1 -1
- package/ui/dist/assets/{funnel-CAJgGO5M.js → funnel-FycfZcXo.js} +1 -1
- package/ui/dist/assets/{git-branch-BcXabeOs.js → git-branch-C2qrhGGu.js} +1 -1
- package/ui/dist/assets/index-Cml2x9pA.js +507 -0
- package/ui/dist/assets/index-yWybhcfI.css +1 -0
- package/ui/dist/assets/{layers-DxYDmPA_.js → layers-yzjtGlHB.js} +1 -1
- package/ui/dist/assets/{legacy-dHWI7k8P.js → legacy-D21WSMF1.js} +1 -1
- package/ui/dist/assets/{lightbulb-B0Du4SM4.js → lightbulb-BZJNK69S.js} +1 -1
- package/ui/dist/assets/{link-CUpaumqr.js → link-CnFkBkaY.js} +1 -1
- package/ui/dist/assets/{list-todo-CDDhmPQB.js → list-todo-BlgfQHup.js} +1 -1
- package/ui/dist/assets/{message-square-D5VWlv-Q.js → message-square-CRsG9u6_.js} +1 -1
- package/ui/dist/assets/{mic-Ddcc6Ann.js → mic-B32RHc7Y.js} +1 -1
- package/ui/dist/assets/{missions-2zox16Tc.js → missions-1iw8Z2_0.js} +1 -1
- package/ui/dist/assets/{network-DaJ7ugwX.js → network-C9RXQGrV.js} +1 -1
- package/ui/dist/assets/{pause-BukaK6rs.js → pause-BT1Bc2q3.js} +1 -1
- package/ui/dist/assets/{pencil-D_YwQBeg.js → pencil-BK5IU6o0.js} +1 -1
- package/ui/dist/assets/{play-BjdwtYMk.js → play-Cl1nC_gc.js} +1 -1
- package/ui/dist/assets/{plug-yISDdeW2.js → plug-DvcpOalj.js} +1 -1
- package/ui/dist/assets/{plus-BSjTdepW.js → plus-Dpo1qfrl.js} +1 -1
- package/ui/dist/assets/{radio-B7kX_yWE.js → radio-C5c9IyqX.js} +1 -1
- package/ui/dist/assets/{refresh-cw-CwDpzXUn.js → refresh-cw-C-iZkzuS.js} +1 -1
- package/ui/dist/assets/{rotate-ccw-7SQDTI0_.js → rotate-ccw-qzrB3SNw.js} +1 -1
- package/ui/dist/assets/{save-CjTPAQM0.js → save-DwR9wQVu.js} +1 -1
- package/ui/dist/assets/{search-BP7VlNxX.js → search-D10l0m3-.js} +1 -1
- package/ui/dist/assets/{send-C2XDuRPf.js → send-DtXGsaFW.js} +1 -1
- package/ui/dist/assets/{server-BE8W-AT4.js → server-BzisF3LL.js} +1 -1
- package/ui/dist/assets/settings-Dbwd1_-c.js +6 -0
- package/ui/dist/assets/{shield-check-s7la2J2K.js → shield-check-CXlDJyAW.js} +1 -1
- package/ui/dist/assets/square-BBC-JKzY.js +11 -0
- package/ui/dist/assets/{terminal-B8IK4WsO.js → terminal-DaBIlWEM.js} +1 -1
- package/ui/dist/assets/{test-tube-Xfn9DJeg.js → test-tube-CDATRD5t.js} +1 -1
- package/ui/dist/assets/{toggle-right-CHpzOIlj.js → toggle-right-DTmrC5RD.js} +1 -1
- package/ui/dist/assets/{trash-2-B1C85ePK.js → trash-2-CTeyjxD_.js} +1 -1
- package/ui/dist/assets/{trending-up-DDGHQZY1.js → trending-up-CXPRjRV4.js} +1 -1
- package/ui/dist/assets/{trophy-D0LhJSPA.js → trophy-DbVdXRtU.js} +1 -1
- package/ui/dist/assets/{volume-2-DMaE91b5.js → volume-2-DYDBmm3M.js} +1 -1
- package/ui/dist/assets/{wifi-off-DR9h8HGA.js → wifi-off-BBuIGbiP.js} +1 -1
- package/ui/dist/assets/zoom-out-D47_pRAO.js +16 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/sw.js +1 -1
- package/ui/dist/assets/AuditPanel-BaftX5MP.js +0 -1
- package/ui/dist/assets/BackupPanel-DAy9G7Wt.js +0 -1
- package/ui/dist/assets/CPActivity-BYDsUoMn.js +0 -1
- package/ui/dist/assets/CPAgentDetail-Bb9-GAJY.js +0 -1
- package/ui/dist/assets/CPAgents-BTZuGnki.js +0 -1
- package/ui/dist/assets/CPApprovals-BME2ARkO.js +0 -1
- package/ui/dist/assets/CPCosts-mOXwWq0i.js +0 -1
- package/ui/dist/assets/CPDashboard-CTlKGXXQ.js +0 -1
- package/ui/dist/assets/CPGoals-BNWhNP14.js +0 -1
- package/ui/dist/assets/CPInbox-ybe4r8LW.js +0 -16
- package/ui/dist/assets/CPIssueDetail-DaMMGbjw.js +0 -1
- package/ui/dist/assets/CPIssues-BgpQOISw.js +0 -1
- package/ui/dist/assets/CPLayout-bgErauTx.js +0 -2
- package/ui/dist/assets/CPOrg-C8l5SIWJ.js +0 -8
- package/ui/dist/assets/CPRuns-DB8S7loF.js +0 -1
- package/ui/dist/assets/CPVoice-DfwHPewA.js +0 -1
- package/ui/dist/assets/CheckpointsPanel-9-l_8GdG.js +0 -1
- package/ui/dist/assets/CommandPostHub-z55Yrhj1.js +0 -24
- package/ui/dist/assets/CronPanel-kEZK3gpx.js +0 -1
- package/ui/dist/assets/EmptyState-CfvU7SdB.js +0 -1
- package/ui/dist/assets/EvalPanel-CDG-njyj.js +0 -1
- package/ui/dist/assets/FilesPanel-CaLPog2e.js +0 -16
- package/ui/dist/assets/FleetPanel-BtlaV6pH.js +0 -1
- package/ui/dist/assets/InfraView-C0zEuFrR.js +0 -2
- package/ui/dist/assets/Input-CbrMbLgn.js +0 -1
- package/ui/dist/assets/IntegrationsPanel-B4TyR6jC.js +0 -1
- package/ui/dist/assets/IntelligenceView-DZ4HxYZ3.js +0 -2
- package/ui/dist/assets/LearningPanel-B4RIm_iQ.js +0 -1
- package/ui/dist/assets/McpPanel-BmNUFozc.js +0 -1
- package/ui/dist/assets/MemoryGraphPanel-JPurHV0L.js +0 -16
- package/ui/dist/assets/MemoryWikiPanel-DdvCAZHa.js +0 -6
- package/ui/dist/assets/MissionStart-wUkcEP0T.js +0 -1
- package/ui/dist/assets/Modal-BmS7C6FN.js +0 -1
- package/ui/dist/assets/OrganismPanel-C2LYDPrn.js +0 -1
- package/ui/dist/assets/OverviewPanel-DK8uuq4D.js +0 -1
- package/ui/dist/assets/PersonaProfilesPanel-DGtokXUu.js +0 -8
- package/ui/dist/assets/RecipesPanel-D3Zs2wxr.js +0 -1
- package/ui/dist/assets/SecurityPanel-BMERf796.js +0 -1
- package/ui/dist/assets/SelfImprovePanel-BxqWHXCU.js +0 -1
- package/ui/dist/assets/SelfProposalsPanel-CuC94vdx.js +0 -2
- package/ui/dist/assets/SessionsPanel-CQ8qvzp7.js +0 -1
- package/ui/dist/assets/SessionsTab-B3eHV3jf.js +0 -1
- package/ui/dist/assets/SettingsPanel-Cumls7N2.js +0 -1
- package/ui/dist/assets/SettingsView-BtA67pol.js +0 -2
- package/ui/dist/assets/SkillsPanel-CA415CT8.js +0 -11
- package/ui/dist/assets/TeamsPanel-C_Vu6vnY.js +0 -1
- package/ui/dist/assets/TitanCanvas-TuYZSZO7.js +0 -1117
- package/ui/dist/assets/ToolsView-BvTN6vFn.js +0 -2
- package/ui/dist/assets/TraceViewer-Bh8Jo3Dr.js +0 -1
- package/ui/dist/assets/TrainingPanel-Dmbd1rJ-.js +0 -1
- package/ui/dist/assets/VramPanel-CPICbZ2s.js +0 -1
- package/ui/dist/assets/WatchView-BCgLVfiV.js +0 -13
- package/ui/dist/assets/WorkTab-iptofXO9.js +0 -1
- package/ui/dist/assets/WorkflowsPanel-3RYkFHyf.js +0 -11
- package/ui/dist/assets/chevron-up-UyfdjRp6.js +0 -6
- package/ui/dist/assets/index-CUgepw5Q.js +0 -337
- package/ui/dist/assets/index-Dm6zcSTS.css +0 -1
- package/ui/dist/assets/proxy-CWET5FFX.js +0 -9
|
@@ -20,6 +20,22 @@ function getAutoModePolicy() {
|
|
|
20
20
|
}
|
|
21
21
|
return "standard";
|
|
22
22
|
}
|
|
23
|
+
const NAME_GATED_EXACT = /* @__PURE__ */ new Set([
|
|
24
|
+
"shell",
|
|
25
|
+
"run_shell",
|
|
26
|
+
"bash",
|
|
27
|
+
"run_command",
|
|
28
|
+
"execute_command",
|
|
29
|
+
"exec",
|
|
30
|
+
"delete_file",
|
|
31
|
+
"bulk_delete_labels",
|
|
32
|
+
"phone_call",
|
|
33
|
+
"make_call"
|
|
34
|
+
]);
|
|
35
|
+
const NAME_GATED_PATTERN = /(^|_)(delete|destroy|wipe|purge|deploy|publish|transfer|payment|purchase|wire|send_email|email_send)(_|$)/i;
|
|
36
|
+
function nameLooksHighImpact(toolName) {
|
|
37
|
+
return NAME_GATED_EXACT.has(toolName) || NAME_GATED_PATTERN.test(toolName);
|
|
38
|
+
}
|
|
23
39
|
function classifyToolCall(toolName) {
|
|
24
40
|
const policy = getAutoModePolicy();
|
|
25
41
|
const contract = getToolContract(toolName);
|
|
@@ -42,9 +58,16 @@ function classifyToolCall(toolName) {
|
|
|
42
58
|
};
|
|
43
59
|
}
|
|
44
60
|
if (!contract) {
|
|
61
|
+
if (nameLooksHighImpact(toolName)) {
|
|
62
|
+
return {
|
|
63
|
+
decision: "gate",
|
|
64
|
+
reason: `no contract + high-impact name "${toolName}" \u2014 gating`,
|
|
65
|
+
policy
|
|
66
|
+
};
|
|
67
|
+
}
|
|
45
68
|
return {
|
|
46
|
-
decision: "
|
|
47
|
-
reason: `no contract
|
|
69
|
+
decision: "notify",
|
|
70
|
+
reason: `no contract for "${toolName}" \u2014 notify (benign long-tail)`,
|
|
48
71
|
policy
|
|
49
72
|
};
|
|
50
73
|
}
|
|
@@ -90,6 +113,7 @@ export {
|
|
|
90
113
|
classifyToolCall,
|
|
91
114
|
formatBreadcrumb,
|
|
92
115
|
getAutoModePolicy,
|
|
116
|
+
nameLooksHighImpact,
|
|
93
117
|
shouldGate
|
|
94
118
|
};
|
|
95
119
|
//# sourceMappingURL=autoModeClassifier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/agent/autoModeClassifier.ts"],"sourcesContent":["/**\n * TITAN — Auto-Mode Classifier (v6.1.0-beta.16, Phase D.4)\n *\n * Reads the tool contract registry to decide whether an incoming\n * tool call can run autonomously, deserves a passive notification,\n * or requires explicit human approval. Pattern from Anthropic's\n * \"Claude Code auto-mode\" blog (in the Picrew/awesome-agent-harness\n * featured-reading list): classifier-backed approval delegation\n * gives the agent autonomy on safe paths while keeping a kill\n * switch on the risky ones.\n *\n * THREE DECISIONS:\n *\n * - 'auto' — run without prompting. Read-only ops + workspace\n * writes. Most missions run mostly 'auto' calls.\n * - 'notify' — run, but record a passive notification so a\n * watcher (Mission Canvas, log tail) can see it\n * happened. Default for network calls.\n * - 'gate' — require explicit human approval before running.\n * Default for destructive ops (shell, delete, etc.)\n * AND for any tool without a registered contract\n * (unknown → conservative).\n *\n * POLICY OVERRIDES (config.security.autoMode.policy):\n *\n * - 'standard' (default) — riskLevel drives the decision per\n * the table above.\n * - 'paranoid' — every tool call is 'gate'. For\n * demos, regulated environments, or\n * when Tony is debugging a misbehaving\n * agent.\n * - 'permissive' — riskLevel 'moderate' is auto-run\n * (still 'gate' on 'high'). For\n * trusted hot loops where ping-the-user\n * on every web_search is annoying.\n * - 'yolo' — everything auto, including 'high'.\n * ONLY for sandboxed eval runs. Logs\n * a loud warning on init.\n *\n * WHY this module exists:\n *\n * - Phase D.3 added riskLevel + sideEffects metadata to the 9\n * canonical contracts. D.4 makes the metadata actually do\n * something — gating decisions, not just labels.\n *\n * - The existing approval-gate path in toolRunner uses a hardcoded\n * \"is this tool name dangerous?\" list. That's a string-match\n * allowlist that doesn't scale and doesn't account for HOW the\n * tool is being used. The classifier is the structural answer:\n * contracts declare risk; the classifier reads contracts.\n *\n * - Decoupling the policy from the runner means changing the\n * gating semantics (e.g. add a new 'risky-during-business-hours'\n * decision) is a one-file change — never a wholesale runner\n * refactor.\n *\n * TRADE-OFFS:\n *\n * - First cut keys decisions on contract.riskLevel alone. A\n * follow-up could consider call ARGS (e.g. shell with\n * `command: 'ls'` could be 'auto' while shell with\n * `command: 'rm -rf'` is still 'gate'). Skipped for now to\n * keep the surface small + predictable.\n *\n * - Tools without a registered contract default to 'gate'. This\n * is conservative but means the long-tail 239 skills will hit\n * the approval gate on every call until their contracts ship.\n * If that becomes painful, lift the default to 'notify' via\n * the `unknownToolDefault` config field.\n *\n * FOLLOW-UP:\n *\n * - Phase D.5 reads sideEffects==='destructive' to route the\n * call into a worktree-isolated executor.\n * - Args-aware classification (shell `rm -rf` vs shell `ls`).\n * - Per-session policy override so a \"draft a quick email\"\n * mission can opt into 'permissive' while a \"review and merge\n * this PR\" mission stays on 'paranoid'.\n */\n\nimport { getToolContract, type RiskLevel } from './toolContract.js';\nimport { loadConfig } from '../config/config.js';\nimport logger from '../utils/logger.js';\n\nconst COMPONENT = 'autoMode';\n\n/* ────────────────────────── Types ────────────────────────── */\n\nexport type AutoModeDecision = 'auto' | 'notify' | 'gate';\nexport type AutoModePolicy = 'standard' | 'paranoid' | 'permissive' | 'yolo';\n\nexport interface ClassificationResult {\n /** What the runner should do with the call. */\n decision: AutoModeDecision;\n /** Plain-english reason — logged and surfaced in the trajectory. */\n reason: string;\n /** Policy that produced this decision (drives observability). */\n policy: AutoModePolicy;\n /** Risk level from the contract, if any. Undefined for unknown tools. */\n riskLevel?: RiskLevel;\n}\n\n/* ────────────────────────── Policy loader ────────────────────────── */\n\n/**\n * Resolve the current auto-mode policy. Reads\n * `config.security.autoMode.policy` if present; defaults to 'standard'.\n * Pure synchronous lookup — no IO, safe to call per-tool-call.\n */\nexport function getAutoModePolicy(): AutoModePolicy {\n // beta.21 — env override. Lets the test suite (and any embedder\n // that wants a process-wide policy without touching config files)\n // short-circuit the classifier without mutating loaded config.\n // Production callers should configure via `config.security.autoMode.policy`\n // — this env hook is opt-in and silent when unset.\n const envPolicy = process.env.TITAN_AUTOMODE_POLICY;\n if (envPolicy === 'paranoid' || envPolicy === 'permissive' || envPolicy === 'yolo' || envPolicy === 'standard') {\n return envPolicy;\n }\n try {\n const cfg = loadConfig();\n const sec = (cfg as Record<string, unknown>).security as Record<string, unknown> | undefined;\n const am = sec?.autoMode as Record<string, unknown> | undefined;\n const policy = am?.policy as string | undefined;\n if (policy === 'paranoid' || policy === 'permissive' || policy === 'yolo' || policy === 'standard') {\n return policy;\n }\n } catch { /* config unavailable — fall through */ }\n return 'standard';\n}\n\n/* ────────────────────────── Classifier ────────────────────────── */\n\n/**\n * Decide whether a tool call should run automatically, with a\n * notification, or with explicit approval. The runner uses this to\n * decide whether to short-circuit the existing approval-gate path.\n *\n * Pure: no IO beyond reading the config + contract registry. Cheap\n * enough to call on every tool call without measuring.\n */\nexport function classifyToolCall(toolName: string): ClassificationResult {\n const policy = getAutoModePolicy();\n const contract = getToolContract(toolName);\n const riskLevel = contract?.riskLevel;\n\n // yolo short-circuit: regardless of risk, run. ONLY for sandboxed\n // eval runs — logs a loud warning the first time per process.\n if (policy === 'yolo') {\n warnYoloOnce();\n return {\n decision: 'auto',\n reason: 'yolo policy — gating disabled',\n policy,\n riskLevel,\n };\n }\n\n // paranoid short-circuit: every call gated.\n if (policy === 'paranoid') {\n return {\n decision: 'gate',\n reason: 'paranoid policy — every tool call requires approval',\n policy,\n riskLevel,\n };\n }\n\n // Unknown tool (no registered contract) → conservative 'gate'.\n // The long-tail 239 skills without contracts hit this branch\n // until their contracts ship. Override via config if the prompt\n // pings become annoying.\n if (!contract) {\n return {\n decision: 'gate',\n reason: `no contract registered for \"${toolName}\" — gating by default`,\n policy,\n };\n }\n\n // Standard + permissive paths read riskLevel.\n if (riskLevel === 'safe') {\n return { decision: 'auto', reason: 'contract riskLevel=safe', policy, riskLevel };\n }\n if (riskLevel === 'moderate') {\n if (policy === 'permissive') {\n return { decision: 'auto', reason: 'permissive policy — moderate risk auto-runs', policy, riskLevel };\n }\n return { decision: 'notify', reason: 'contract riskLevel=moderate', policy, riskLevel };\n }\n if (riskLevel === 'high') {\n return { decision: 'gate', reason: 'contract riskLevel=high', policy, riskLevel };\n }\n\n // Defensive fallback for an unknown future riskLevel value.\n return {\n decision: 'gate',\n reason: `unrecognised riskLevel \"${riskLevel}\" — gating defensively`,\n policy,\n riskLevel,\n };\n}\n\n/* ────────────────────────── Helpers ────────────────────────── */\n\nlet _yoloWarned = false;\nfunction warnYoloOnce(): void {\n if (_yoloWarned) return;\n _yoloWarned = true;\n logger.warn(\n COMPONENT,\n 'AUTO_MODE=yolo — every tool call will run without approval. This mode is ONLY intended for sandboxed eval runs. If you see this in production logs, something is misconfigured.',\n );\n}\n\n/** For tests. */\nexport function _resetYoloWarning(): void {\n _yoloWarned = false;\n}\n\n/**\n * Convenience: returns true iff the decision means the call should\n * NOT proceed without explicit human approval. Used by the runner\n * to short-circuit the existing approval-gate path on 'auto' /\n * 'notify' decisions.\n */\nexport function shouldGate(result: ClassificationResult): boolean {\n return result.decision === 'gate';\n}\n\n/**\n * Format the classification as a one-line breadcrumb suitable for\n * the trajectory `note` event. Used by the runner on 'notify'\n * decisions so the trajectory captures what the agent did\n * autonomously vs what required a human prompt.\n */\nexport function formatBreadcrumb(toolName: string, result: ClassificationResult): string {\n return `automode:${result.decision} tool=${toolName} risk=${result.riskLevel ?? 'unknown'} policy=${result.policy} (${result.reason})`;\n}\n"],"mappings":";AAgFA,SAAS,uBAAuC;AAChD,SAAS,kBAAkB;AAC3B,OAAO,YAAY;AAEnB,MAAM,YAAY;AAyBX,SAAS,oBAAoC;AAMhD,QAAM,YAAY,QAAQ,IAAI;AAC9B,MAAI,cAAc,cAAc,cAAc,gBAAgB,cAAc,UAAU,cAAc,YAAY;AAC5G,WAAO;AAAA,EACX;AACA,MAAI;AACA,UAAM,MAAM,WAAW;AACvB,UAAM,MAAO,IAAgC;AAC7C,UAAM,KAAK,KAAK;AAChB,UAAM,SAAS,IAAI;AACnB,QAAI,WAAW,cAAc,WAAW,gBAAgB,WAAW,UAAU,WAAW,YAAY;AAChG,aAAO;AAAA,IACX;AAAA,EACJ,QAAQ;AAAA,EAA0C;AAClD,SAAO;AACX;AAYO,SAAS,iBAAiB,UAAwC;AACrE,QAAM,SAAS,kBAAkB;AACjC,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,YAAY,UAAU;AAI5B,MAAI,WAAW,QAAQ;AACnB,iBAAa;AACb,WAAO;AAAA,MACH,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAGA,MAAI,WAAW,YAAY;AACvB,WAAO;AAAA,MACH,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAMA,MAAI,CAAC,UAAU;AACX,WAAO;AAAA,MACH,UAAU;AAAA,MACV,QAAQ,+BAA+B,QAAQ;AAAA,MAC/C;AAAA,IACJ;AAAA,EACJ;AAGA,MAAI,cAAc,QAAQ;AACtB,WAAO,EAAE,UAAU,QAAQ,QAAQ,2BAA2B,QAAQ,UAAU;AAAA,EACpF;AACA,MAAI,cAAc,YAAY;AAC1B,QAAI,WAAW,cAAc;AACzB,aAAO,EAAE,UAAU,QAAQ,QAAQ,oDAA+C,QAAQ,UAAU;AAAA,IACxG;AACA,WAAO,EAAE,UAAU,UAAU,QAAQ,+BAA+B,QAAQ,UAAU;AAAA,EAC1F;AACA,MAAI,cAAc,QAAQ;AACtB,WAAO,EAAE,UAAU,QAAQ,QAAQ,2BAA2B,QAAQ,UAAU;AAAA,EACpF;AAGA,SAAO;AAAA,IACH,UAAU;AAAA,IACV,QAAQ,2BAA2B,SAAS;AAAA,IAC5C;AAAA,IACA;AAAA,EACJ;AACJ;AAIA,IAAI,cAAc;AAClB,SAAS,eAAqB;AAC1B,MAAI,YAAa;AACjB,gBAAc;AACd,SAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;AAGO,SAAS,oBAA0B;AACtC,gBAAc;AAClB;AAQO,SAAS,WAAW,QAAuC;AAC9D,SAAO,OAAO,aAAa;AAC/B;AAQO,SAAS,iBAAiB,UAAkB,QAAsC;AACrF,SAAO,YAAY,OAAO,QAAQ,SAAS,QAAQ,SAAS,OAAO,aAAa,SAAS,WAAW,OAAO,MAAM,KAAK,OAAO,MAAM;AACvI;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/agent/autoModeClassifier.ts"],"sourcesContent":["/**\n * TITAN — Auto-Mode Classifier (v6.1.0-beta.16, Phase D.4)\n *\n * Reads the tool contract registry to decide whether an incoming\n * tool call can run autonomously, deserves a passive notification,\n * or requires explicit human approval. Pattern from Anthropic's\n * \"Claude Code auto-mode\" blog (in the Picrew/awesome-agent-harness\n * featured-reading list): classifier-backed approval delegation\n * gives the agent autonomy on safe paths while keeping a kill\n * switch on the risky ones.\n *\n * THREE DECISIONS:\n *\n * - 'auto' — run without prompting. Read-only ops + workspace\n * writes. Most missions run mostly 'auto' calls.\n * - 'notify' — run, but record a passive notification so a\n * watcher (Mission Canvas, log tail) can see it\n * happened. Default for network calls.\n * - 'gate' — require explicit human approval before running.\n * Default for destructive ops (shell, delete, etc.)\n * AND for any tool without a registered contract\n * (unknown → conservative).\n *\n * POLICY OVERRIDES (config.security.autoMode.policy):\n *\n * - 'standard' (default) — riskLevel drives the decision per\n * the table above.\n * - 'paranoid' — every tool call is 'gate'. For\n * demos, regulated environments, or\n * when Tony is debugging a misbehaving\n * agent.\n * - 'permissive' — riskLevel 'moderate' is auto-run\n * (still 'gate' on 'high'). For\n * trusted hot loops where ping-the-user\n * on every web_search is annoying.\n * - 'yolo' — everything auto, including 'high'.\n * ONLY for sandboxed eval runs. Logs\n * a loud warning on init.\n *\n * WHY this module exists:\n *\n * - Phase D.3 added riskLevel + sideEffects metadata to the 9\n * canonical contracts. D.4 makes the metadata actually do\n * something — gating decisions, not just labels.\n *\n * - The existing approval-gate path in toolRunner uses a hardcoded\n * \"is this tool name dangerous?\" list. That's a string-match\n * allowlist that doesn't scale and doesn't account for HOW the\n * tool is being used. The classifier is the structural answer:\n * contracts declare risk; the classifier reads contracts.\n *\n * - Decoupling the policy from the runner means changing the\n * gating semantics (e.g. add a new 'risky-during-business-hours'\n * decision) is a one-file change — never a wholesale runner\n * refactor.\n *\n * TRADE-OFFS:\n *\n * - First cut keys decisions on contract.riskLevel alone. A\n * follow-up could consider call ARGS (e.g. shell with\n * `command: 'ls'` could be 'auto' while shell with\n * `command: 'rm -rf'` is still 'gate'). Skipped for now to\n * keep the surface small + predictable.\n *\n * - Tools without a registered contract default to 'gate'. This\n * is conservative but means the long-tail 239 skills will hit\n * the approval gate on every call until their contracts ship.\n * If that becomes painful, lift the default to 'notify' via\n * the `unknownToolDefault` config field.\n *\n * FOLLOW-UP:\n *\n * - Phase D.5 reads sideEffects==='destructive' to route the\n * call into a worktree-isolated executor.\n * - Args-aware classification (shell `rm -rf` vs shell `ls`).\n * - Per-session policy override so a \"draft a quick email\"\n * mission can opt into 'permissive' while a \"review and merge\n * this PR\" mission stays on 'paranoid'.\n */\n\nimport { getToolContract, type RiskLevel } from './toolContract.js';\nimport { loadConfig } from '../config/config.js';\nimport logger from '../utils/logger.js';\n\nconst COMPONENT = 'autoMode';\n\n/* ────────────────────────── Types ────────────────────────── */\n\nexport type AutoModeDecision = 'auto' | 'notify' | 'gate';\nexport type AutoModePolicy = 'standard' | 'paranoid' | 'permissive' | 'yolo';\n\nexport interface ClassificationResult {\n /** What the runner should do with the call. */\n decision: AutoModeDecision;\n /** Plain-english reason — logged and surfaced in the trajectory. */\n reason: string;\n /** Policy that produced this decision (drives observability). */\n policy: AutoModePolicy;\n /** Risk level from the contract, if any. Undefined for unknown tools. */\n riskLevel?: RiskLevel;\n}\n\n/* ────────────────────────── Policy loader ────────────────────────── */\n\n/**\n * Resolve the current auto-mode policy. Reads\n * `config.security.autoMode.policy` if present; defaults to 'standard'.\n * Pure synchronous lookup — no IO, safe to call per-tool-call.\n */\nexport function getAutoModePolicy(): AutoModePolicy {\n // beta.21 — env override. Lets the test suite (and any embedder\n // that wants a process-wide policy without touching config files)\n // short-circuit the classifier without mutating loaded config.\n // Production callers should configure via `config.security.autoMode.policy`\n // — this env hook is opt-in and silent when unset.\n const envPolicy = process.env.TITAN_AUTOMODE_POLICY;\n if (envPolicy === 'paranoid' || envPolicy === 'permissive' || envPolicy === 'yolo' || envPolicy === 'standard') {\n return envPolicy;\n }\n try {\n const cfg = loadConfig();\n const sec = (cfg as Record<string, unknown>).security as Record<string, unknown> | undefined;\n const am = sec?.autoMode as Record<string, unknown> | undefined;\n const policy = am?.policy as string | undefined;\n if (policy === 'paranoid' || policy === 'permissive' || policy === 'yolo' || policy === 'standard') {\n return policy;\n }\n } catch { /* config unavailable — fall through */ }\n return 'standard';\n}\n\n/**\n * Inherently high-impact operations that stay gated even without a declared\n * contract — arbitrary command execution, destructive deletes, deploys, and\n * irreversible external sends/payments. Everything else uncontracted runs with\n * a notify (see classifyToolCall). Curated conservatively; a tool that should\n * gate but is missing here can still be added to the user approval list.\n */\nconst NAME_GATED_EXACT = new Set<string>([\n 'shell', 'run_shell', 'bash', 'run_command', 'execute_command', 'exec',\n 'delete_file', 'bulk_delete_labels', 'phone_call', 'make_call',\n]);\nconst NAME_GATED_PATTERN = /(^|_)(delete|destroy|wipe|purge|deploy|publish|transfer|payment|purchase|wire|send_email|email_send)(_|$)/i;\n\nexport function nameLooksHighImpact(toolName: string): boolean {\n return NAME_GATED_EXACT.has(toolName) || NAME_GATED_PATTERN.test(toolName);\n}\n\n/* ────────────────────────── Classifier ────────────────────────── */\n\n/**\n * Decide whether a tool call should run automatically, with a\n * notification, or with explicit approval. The runner uses this to\n * decide whether to short-circuit the existing approval-gate path.\n *\n * Pure: no IO beyond reading the config + contract registry. Cheap\n * enough to call on every tool call without measuring.\n */\nexport function classifyToolCall(toolName: string): ClassificationResult {\n const policy = getAutoModePolicy();\n const contract = getToolContract(toolName);\n const riskLevel = contract?.riskLevel;\n\n // yolo short-circuit: regardless of risk, run. ONLY for sandboxed\n // eval runs — logs a loud warning the first time per process.\n if (policy === 'yolo') {\n warnYoloOnce();\n return {\n decision: 'auto',\n reason: 'yolo policy — gating disabled',\n policy,\n riskLevel,\n };\n }\n\n // paranoid short-circuit: every call gated.\n if (policy === 'paranoid') {\n return {\n decision: 'gate',\n reason: 'paranoid policy — every tool call requires approval',\n policy,\n riskLevel,\n };\n }\n\n // Unknown tool (no registered contract). The long-tail of ~239 skills has\n // no contract, so gating ALL of them walled benign actions (search, read,\n // widget-building, …) behind approval on every call — which broke the\n // \"ask TITAN to build a weather widget\" flow and made the agent feel broken.\n //\n // v7.0 fix: uncontracted tools run with a 'notify' (visible, logged) by\n // default, EXCEPT a curated set of inherently high-impact operations that\n // stay gated by name. Dangerous shell commands + URLs are independently\n // caught by preExecScan (toolRunner), and external-send tools (email/slack/\n // x/publisher) self-gate via the approval_gates skill — so 'notify' here is\n // safe for the benign majority. Strict users can still set policy='paranoid'.\n if (!contract) {\n if (nameLooksHighImpact(toolName)) {\n return {\n decision: 'gate',\n reason: `no contract + high-impact name \"${toolName}\" — gating`,\n policy,\n };\n }\n return {\n decision: 'notify',\n reason: `no contract for \"${toolName}\" — notify (benign long-tail)`,\n policy,\n };\n }\n\n // Standard + permissive paths read riskLevel.\n if (riskLevel === 'safe') {\n return { decision: 'auto', reason: 'contract riskLevel=safe', policy, riskLevel };\n }\n if (riskLevel === 'moderate') {\n if (policy === 'permissive') {\n return { decision: 'auto', reason: 'permissive policy — moderate risk auto-runs', policy, riskLevel };\n }\n return { decision: 'notify', reason: 'contract riskLevel=moderate', policy, riskLevel };\n }\n if (riskLevel === 'high') {\n return { decision: 'gate', reason: 'contract riskLevel=high', policy, riskLevel };\n }\n\n // Defensive fallback for an unknown future riskLevel value.\n return {\n decision: 'gate',\n reason: `unrecognised riskLevel \"${riskLevel}\" — gating defensively`,\n policy,\n riskLevel,\n };\n}\n\n/* ────────────────────────── Helpers ────────────────────────── */\n\nlet _yoloWarned = false;\nfunction warnYoloOnce(): void {\n if (_yoloWarned) return;\n _yoloWarned = true;\n logger.warn(\n COMPONENT,\n 'AUTO_MODE=yolo — every tool call will run without approval. This mode is ONLY intended for sandboxed eval runs. If you see this in production logs, something is misconfigured.',\n );\n}\n\n/** For tests. */\nexport function _resetYoloWarning(): void {\n _yoloWarned = false;\n}\n\n/**\n * Convenience: returns true iff the decision means the call should\n * NOT proceed without explicit human approval. Used by the runner\n * to short-circuit the existing approval-gate path on 'auto' /\n * 'notify' decisions.\n */\nexport function shouldGate(result: ClassificationResult): boolean {\n return result.decision === 'gate';\n}\n\n/**\n * Format the classification as a one-line breadcrumb suitable for\n * the trajectory `note` event. Used by the runner on 'notify'\n * decisions so the trajectory captures what the agent did\n * autonomously vs what required a human prompt.\n */\nexport function formatBreadcrumb(toolName: string, result: ClassificationResult): string {\n return `automode:${result.decision} tool=${toolName} risk=${result.riskLevel ?? 'unknown'} policy=${result.policy} (${result.reason})`;\n}\n"],"mappings":";AAgFA,SAAS,uBAAuC;AAChD,SAAS,kBAAkB;AAC3B,OAAO,YAAY;AAEnB,MAAM,YAAY;AAyBX,SAAS,oBAAoC;AAMhD,QAAM,YAAY,QAAQ,IAAI;AAC9B,MAAI,cAAc,cAAc,cAAc,gBAAgB,cAAc,UAAU,cAAc,YAAY;AAC5G,WAAO;AAAA,EACX;AACA,MAAI;AACA,UAAM,MAAM,WAAW;AACvB,UAAM,MAAO,IAAgC;AAC7C,UAAM,KAAK,KAAK;AAChB,UAAM,SAAS,IAAI;AACnB,QAAI,WAAW,cAAc,WAAW,gBAAgB,WAAW,UAAU,WAAW,YAAY;AAChG,aAAO;AAAA,IACX;AAAA,EACJ,QAAQ;AAAA,EAA0C;AAClD,SAAO;AACX;AASA,MAAM,mBAAmB,oBAAI,IAAY;AAAA,EACrC;AAAA,EAAS;AAAA,EAAa;AAAA,EAAQ;AAAA,EAAe;AAAA,EAAmB;AAAA,EAChE;AAAA,EAAe;AAAA,EAAsB;AAAA,EAAc;AACvD,CAAC;AACD,MAAM,qBAAqB;AAEpB,SAAS,oBAAoB,UAA2B;AAC3D,SAAO,iBAAiB,IAAI,QAAQ,KAAK,mBAAmB,KAAK,QAAQ;AAC7E;AAYO,SAAS,iBAAiB,UAAwC;AACrE,QAAM,SAAS,kBAAkB;AACjC,QAAM,WAAW,gBAAgB,QAAQ;AACzC,QAAM,YAAY,UAAU;AAI5B,MAAI,WAAW,QAAQ;AACnB,iBAAa;AACb,WAAO;AAAA,MACH,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAGA,MAAI,WAAW,YAAY;AACvB,WAAO;AAAA,MACH,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAaA,MAAI,CAAC,UAAU;AACX,QAAI,oBAAoB,QAAQ,GAAG;AAC/B,aAAO;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,mCAAmC,QAAQ;AAAA,QACnD;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,MACH,UAAU;AAAA,MACV,QAAQ,oBAAoB,QAAQ;AAAA,MACpC;AAAA,IACJ;AAAA,EACJ;AAGA,MAAI,cAAc,QAAQ;AACtB,WAAO,EAAE,UAAU,QAAQ,QAAQ,2BAA2B,QAAQ,UAAU;AAAA,EACpF;AACA,MAAI,cAAc,YAAY;AAC1B,QAAI,WAAW,cAAc;AACzB,aAAO,EAAE,UAAU,QAAQ,QAAQ,oDAA+C,QAAQ,UAAU;AAAA,IACxG;AACA,WAAO,EAAE,UAAU,UAAU,QAAQ,+BAA+B,QAAQ,UAAU;AAAA,EAC1F;AACA,MAAI,cAAc,QAAQ;AACtB,WAAO,EAAE,UAAU,QAAQ,QAAQ,2BAA2B,QAAQ,UAAU;AAAA,EACpF;AAGA,SAAO;AAAA,IACH,UAAU;AAAA,IACV,QAAQ,2BAA2B,SAAS;AAAA,IAC5C;AAAA,IACA;AAAA,EACJ;AACJ;AAIA,IAAI,cAAc;AAClB,SAAS,eAAqB;AAC1B,MAAI,YAAa;AACjB,gBAAc;AACd,SAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;AAGO,SAAS,oBAA0B;AACtC,gBAAc;AAClB;AAQO,SAAS,WAAW,QAAuC;AAC9D,SAAO,OAAO,aAAa;AAC/B;AAQO,SAAS,iBAAiB,UAAkB,QAAsC;AACrF,SAAO,YAAY,OAAO,QAAQ,SAAS,QAAQ,SAAS,OAAO,aAAa,SAAS,WAAW,OAAO,MAAM,KAAK,OAAO,MAAM;AACvI;","names":[]}
|
package/dist/agent/goalDriver.js
CHANGED
|
@@ -817,6 +817,7 @@ ${spawn.artifacts.map((a) => ` - [${a.type}] ${a.ref}${a.description ? ` \u2014
|
|
|
817
817
|
state.phase = "iterating";
|
|
818
818
|
}
|
|
819
819
|
}
|
|
820
|
+
const __internal_tickVerifying = tickVerifying;
|
|
820
821
|
async function tickReporting(goal, state) {
|
|
821
822
|
const durationMs = Date.now() - new Date(state.startedAt).getTime();
|
|
822
823
|
const specialistsUsed = [...new Set(
|
|
@@ -1366,6 +1367,7 @@ function _resetDriverStateForTests(goalId) {
|
|
|
1366
1367
|
}
|
|
1367
1368
|
export {
|
|
1368
1369
|
SAME_BLOCK_TWICE_WINDOW_MS,
|
|
1370
|
+
__internal_tickVerifying,
|
|
1369
1371
|
_resetDriverStateForTests,
|
|
1370
1372
|
cancelDriver,
|
|
1371
1373
|
composeApprovalGuidance,
|