@runfusion/fusion 0.74.0-beta.6 → 0.74.0-beta.7
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/dist/bin.js +4627 -1537
- package/dist/child-process-worker.js +5683 -3203
- package/dist/client/.vite/manifest.json +264 -264
- package/dist/client/assets/{AgentDetailView-CT2hKwhn.js → AgentDetailView-CTdyQL11.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-BMqSBRpX.js → AgentPermissionPolicyEditor-DBa7nIQV.js} +1 -1
- package/dist/client/assets/{AgentsView-DAIK9JPg.js → AgentsView-B5tss2oK.js} +3 -3
- package/dist/client/assets/{ChatView-CsassjQo.js → ChatView-DAKt1a2L.js} +1 -1
- package/dist/client/assets/{CommandCenter-CD_eYii-.js → CommandCenter-yPvRo9F6.js} +1 -1
- package/dist/client/assets/{DevServerView-BhJvx2id.js → DevServerView-BTyS2owH.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-6ySB9lk3.js → DirectoryPicker-BjGIupNU.js} +1 -1
- package/dist/client/assets/{DocumentsView-z-rj-4sA.js → DocumentsView-CuxfbpSZ.js} +1 -1
- package/dist/client/assets/{EvalsView-0_IzZ2jx.js → EvalsView-DGuy8SHR.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-DLFge369.js → ExperimentalAgentOnboardingModal-lK407ZAq.js} +1 -1
- package/dist/client/assets/{GoalsView-CefpkoSc.js → GoalsView-DAVN0ObR.js} +1 -1
- package/dist/client/assets/{InsightsView-GFGhepGN.js → InsightsView-BXQKcNof.js} +1 -1
- package/dist/client/assets/{MemoryView-C7hojff7.js → MemoryView-D7RKEtV7.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-D4FsXnph.js → PiExtensionsManager-CrOJ57R2.js} +1 -1
- package/dist/client/assets/{PluginManager-ikkYb7OH.js → PluginManager-D7_evt4j.js} +1 -1
- package/dist/client/assets/{PullRequestView-BuX9kCRk.js → PullRequestView-C0lRUbth.js} +1 -1
- package/dist/client/assets/{ReportModal-D7bsh7pE.js → ReportModal-Cy5fRNDK.js} +1 -1
- package/dist/client/assets/{ResearchView-BFe4NMWZ.js → ResearchView-e8st2Sxu.js} +1 -1
- package/dist/client/assets/{SecretsView-QygUAydB.js → SecretsView-BLzckrzb.js} +1 -1
- package/dist/client/assets/{SessionTerminal-C4eb1n3v.js → SessionTerminal-F_GIj4gh.js} +1 -1
- package/dist/client/assets/SettingsModal-KnUd0942.css +1 -0
- package/dist/client/assets/{SettingsModal-ByknzKck.js → SettingsModal-XAddgWkF.js} +1 -1
- package/dist/client/assets/SettingsModal-eQbxbkLU.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-DXfvYiJt.js → SettingsTextareaRow-DVjUHNQp.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-BwuGMrLy.js → SetupWizardModal-xID9yIff.js} +2 -2
- package/dist/client/assets/{SkillsView-DD8StfQ_.js → SkillsView-BNdMGu6E.js} +1 -1
- package/dist/client/assets/{TodoView-DTuwry8r.js → TodoView-xcOjHZm1.js} +1 -1
- package/dist/client/assets/WorkflowNodeEditor-DZ2WZ-ve.js +8 -0
- package/dist/client/assets/{agent-import-generation-vsLIvw1G.js → agent-import-generation-0tkW9WMt.js} +1 -1
- package/dist/client/assets/{app-DnU_Ms3J.js → app-BYsVLnn7.js} +1 -1
- package/dist/client/assets/{app-BA-Hv9Dp.js → app-C9uBeDNy.js} +1 -1
- package/dist/client/assets/{app-EPVWfJbN.js → app-Ce8B9NHC.js} +1 -1
- package/dist/client/assets/{app-DQPbnpE8.js → app-DNUIIhxX.js} +1 -1
- package/dist/client/assets/{app-kRWfpuDt.js → app-DafD7z0W.js} +1 -1
- package/dist/client/assets/{app-BfWIhd5U.js → app-DeCfyqkP.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-DmBoYHAS.js → architectureDiagram-3BPJPVTR-DP9_UvPn.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-DvfOqq3e.js → blockDiagram-GPEHLZMM-EgKwYMgQ.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-TuNnVwVt.js → c4Diagram-AAUBKEIU-Dzv0-_xt.js} +1 -1
- package/dist/client/assets/channel-BdTAZBkX.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CL-pxBEB.js → chunk-2J33WTMH-CNmFmJlQ.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DFIV-frO.js → chunk-4BX2VUAB-DwtF2sl5.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DPWp5Lh6.js → chunk-55IACEB6-DoDurT6F.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-CrwS92Ji.js → chunk-727SXJPM-DB87A9uH.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BVpzAmMY.js → chunk-AQP2D5EJ-ClTDkMp1.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BZG5ktXS.js → chunk-FMBD7UC4-BhY2wlYr.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-BZrWYbIy.js → chunk-ND2GUHAM-BB8mzlmk.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BFhxbI2F.js → chunk-QZHKN3VN-D81qQMGf.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CuoGzmwo.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CuoGzmwo.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DyW6mfTh.js → cose-bilkent-S5V4N54A-CCFUHBJX.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BQf1Wdfa.js → dagre-BM42HDAG-xr9MLhRA.js} +1 -1
- package/dist/client/assets/{dashboard-view-D1EpvgS9.js → dashboard-view-RXKFv3QV.js} +1 -1
- package/dist/client/assets/{dashboard-view-D_Ndb3sf.js → dashboard-view-lqwQ-pMo.js} +1 -1
- package/dist/client/assets/{dashboard-view-B8nSEub1.js → dashboard-view-oTFt91I3.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-S7TSWwU2.js → diagram-2AECGRRQ-mN_tYnBs.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-C4GzlP4a.js → diagram-5GNKFQAL-xznlq-5C.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-0JnapUpw.js → diagram-KO2AKTUF-ClRlj1ZA.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-D0XRQMOg.js → diagram-LMA3HP47-CNiPIQqT.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-C6G4KA3s.js → diagram-OG6HWLK6-DwQD-W0P.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35--kdN2pN2.js → erDiagram-TEJ5UH35-ZXkiCm8S.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-ymkGyM0r.js → flowDiagram-I6XJVG4X-DI5haEH9.js} +1 -1
- package/dist/client/assets/{folder-open-xBzS9zC8.js → folder-open-NenyCkrb.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CnQQpUKq.js → ganttDiagram-6RSMTGT7-BRHJpfOZ.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DRx5M7KB.js → gitGraphDiagram-PVQCEYII-iXT_YBAZ.js} +1 -1
- package/dist/client/assets/index-CITV-wDq.css +1 -0
- package/dist/client/assets/index-CrAJA2v0.js +2675 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BdN9zKk3.js → infoDiagram-5YYISTIA-BzkuQtqZ.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B0VwSJEo.js → ishikawaDiagram-YF4QCWOH-5hnPG_98.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-BEl1HAk7.js → journeyDiagram-JHISSGLW-Co3fnxbr.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-cHrcAXZu.js → kanban-definition-UN3LZRKU-PZFl_y-h.js} +1 -1
- package/dist/client/assets/{mermaid.core-a14VryZj.js → mermaid.core-CJRKeU9s.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-BCgOuHZV.js → mindmap-definition-RKZ34NQL-B15e2rkx.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-DXbChn1l.js → pieDiagram-4H26LBE5-kGF592D_.js} +1 -1
- package/dist/client/assets/{puzzle-CnKv0b6j.js → puzzle-Dgc4yzjO.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-3Vq6BaTq.js → quadrantDiagram-W4KKPZXB-CUShcj70.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-B0qzbRjy.js → requirementDiagram-4Y6WPE33-D2k4nLqQ.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DZKPqn47.js → sankeyDiagram-5OEKKPKP-CA03BxhT.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DQjljKXU.js → sequenceDiagram-3UESZ5HK-DDuFN2Pi.js} +1 -1
- package/dist/client/assets/{shield-alert-CPr2W8ik.js → shield-alert-BlYWqolM.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-DSqAxqXD.js → standing-instructions-template-ujl7UARV.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-DnTHiph-.js → stateDiagram-AJRCARHV-yJOkHK4Q.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-CMhyVGVs.js → stateDiagram-v2-BHNVJYJU-BgErHdAN.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-C4IUZuEQ.js → timeline-definition-PNZ67QCA-BUiDQw21.js} +1 -1
- package/dist/client/assets/{upload-DetqFi-N.js → upload-DmlZvpMp.js} +1 -1
- package/dist/client/assets/{users-B6KdA0ae.js → users-Cx6ACt-W.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-qJT9GL5e.js → vennDiagram-CIIHVFJN-DqyIjBY8.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-CtGl5oVu.js → wardley-L42UT6IY-C93tXAKH.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-D7_gISS5.js → wardleyDiagram-YWT4CUSO-DmH6-GJV.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-h3KBlQ_G.js → xychartDiagram-2RQKCTM6-BPwjE4Su.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/extension.js +3900 -1308
- package/dist/migrations/0040_fn_8684_task_lifecycle_outbox.sql +44 -0
- package/dist/migrations/0041_fn_8685_task_lifecycle_consumers.sql +88 -0
- package/dist/migrations/0042_fn_8694_validator_input_fingerprint.sql +9 -0
- package/dist/plugin-sdk/index.js +64 -2
- package/package.json +1 -1
- package/dist/client/assets/SettingsModal-BF1KzZ0q.css +0 -1
- package/dist/client/assets/SettingsModal-Dv-dgYB_.js +0 -21
- package/dist/client/assets/WorkflowNodeEditor-CVVt51aH.js +0 -8
- package/dist/client/assets/channel-Bi9AoUw5.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DDoJqQmh.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DDoJqQmh.js +0 -1
- package/dist/client/assets/index-B6fpQib0.css +0 -1
- package/dist/client/assets/index-BdKLlzTI.js +0 -2675
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
-- FNXC:LifecycleOutbox 2026-08-01-10:33:
|
|
2
|
+
-- PostgreSQL needs a durable, cross-process observation record for task:deleted after
|
|
3
|
+
-- FN-8683 removed the unreachable SQLite polling replica. The event and delete state
|
|
4
|
+
-- must commit together; the transactional counter avoids MAX(seq)+1 collisions and,
|
|
5
|
+
-- unlike a SEQUENCE, rolls back with a failed delete. Schema-applier versions run once,
|
|
6
|
+
-- while the policy/trigger guards keep repaired manual re-runs executable.
|
|
7
|
+
CREATE TABLE IF NOT EXISTS project.task_lifecycle_events (
|
|
8
|
+
project_id text NOT NULL DEFAULT current_setting('fusion.project_id', true),
|
|
9
|
+
seq bigint NOT NULL,
|
|
10
|
+
event_id text NOT NULL,
|
|
11
|
+
event_type text NOT NULL,
|
|
12
|
+
task_id text NOT NULL,
|
|
13
|
+
occurred_at text NOT NULL,
|
|
14
|
+
created_at text NOT NULL,
|
|
15
|
+
payload jsonb NOT NULL,
|
|
16
|
+
PRIMARY KEY (project_id, seq),
|
|
17
|
+
UNIQUE (project_id, event_id),
|
|
18
|
+
CONSTRAINT task_lifecycle_events_type_check CHECK (event_type IN ('task:deleted'))
|
|
19
|
+
);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS "idxTaskLifecycleEventsTask" ON project.task_lifecycle_events(project_id, task_id);
|
|
21
|
+
ALTER TABLE project.task_lifecycle_events ENABLE ROW LEVEL SECURITY;
|
|
22
|
+
ALTER TABLE project.task_lifecycle_events FORCE ROW LEVEL SECURITY;
|
|
23
|
+
DROP POLICY IF EXISTS fusion_project_isolation ON project.task_lifecycle_events;
|
|
24
|
+
CREATE POLICY fusion_project_isolation ON project.task_lifecycle_events
|
|
25
|
+
USING (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true))
|
|
26
|
+
WITH CHECK (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true));
|
|
27
|
+
DROP TRIGGER IF EXISTS fusion_assign_project_id ON project.task_lifecycle_events;
|
|
28
|
+
CREATE TRIGGER fusion_assign_project_id BEFORE INSERT OR UPDATE OF project_id ON project.task_lifecycle_events
|
|
29
|
+
FOR EACH ROW EXECUTE FUNCTION project.fusion_assign_project_id();
|
|
30
|
+
|
|
31
|
+
CREATE TABLE IF NOT EXISTS project.task_lifecycle_event_seq (
|
|
32
|
+
project_id text NOT NULL DEFAULT current_setting('fusion.project_id', true),
|
|
33
|
+
last_seq bigint NOT NULL DEFAULT 0,
|
|
34
|
+
PRIMARY KEY (project_id)
|
|
35
|
+
);
|
|
36
|
+
ALTER TABLE project.task_lifecycle_event_seq ENABLE ROW LEVEL SECURITY;
|
|
37
|
+
ALTER TABLE project.task_lifecycle_event_seq FORCE ROW LEVEL SECURITY;
|
|
38
|
+
DROP POLICY IF EXISTS fusion_project_isolation ON project.task_lifecycle_event_seq;
|
|
39
|
+
CREATE POLICY fusion_project_isolation ON project.task_lifecycle_event_seq
|
|
40
|
+
USING (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true))
|
|
41
|
+
WITH CHECK (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true));
|
|
42
|
+
DROP TRIGGER IF EXISTS fusion_assign_project_id ON project.task_lifecycle_event_seq;
|
|
43
|
+
CREATE TRIGGER fusion_assign_project_id BEFORE INSERT OR UPDATE OF project_id ON project.task_lifecycle_event_seq
|
|
44
|
+
FOR EACH ROW EXECUTE FUNCTION project.fusion_assign_project_id();
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
-- FNXC:CrossProcessDeleteObservation 2026-08-01-11:39:
|
|
2
|
+
-- FN-8685 adds the durable read half of the PostgreSQL task:deleted outbox. These rows
|
|
3
|
+
-- are partitioned by project and consumer identity so each independently observing runtime
|
|
4
|
+
-- has its own ordered at-least-once stream, fenced lease, receipts, and poison evidence.
|
|
5
|
+
CREATE TABLE IF NOT EXISTS project.task_lifecycle_consumer_registrations (
|
|
6
|
+
project_id text NOT NULL DEFAULT current_setting('fusion.project_id', true),
|
|
7
|
+
consumer_id text NOT NULL,
|
|
8
|
+
registered_at text NOT NULL,
|
|
9
|
+
last_seen_at text NOT NULL,
|
|
10
|
+
active integer NOT NULL DEFAULT 1,
|
|
11
|
+
PRIMARY KEY (project_id, consumer_id)
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE IF NOT EXISTS project.task_lifecycle_consumer_cursors (
|
|
15
|
+
project_id text NOT NULL DEFAULT current_setting('fusion.project_id', true),
|
|
16
|
+
consumer_id text NOT NULL,
|
|
17
|
+
last_acked_seq bigint NOT NULL DEFAULT 0,
|
|
18
|
+
retry_attempts integer NOT NULL DEFAULT 0,
|
|
19
|
+
retry_backoff_until text,
|
|
20
|
+
lease_token text,
|
|
21
|
+
fencing_token bigint NOT NULL DEFAULT 0,
|
|
22
|
+
lease_expires_at text,
|
|
23
|
+
updated_at text NOT NULL,
|
|
24
|
+
PRIMARY KEY (project_id, consumer_id)
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE TABLE IF NOT EXISTS project.task_lifecycle_consumer_receipts (
|
|
28
|
+
project_id text NOT NULL DEFAULT current_setting('fusion.project_id', true),
|
|
29
|
+
consumer_id text NOT NULL,
|
|
30
|
+
event_id text NOT NULL,
|
|
31
|
+
seq bigint NOT NULL,
|
|
32
|
+
processed_at text NOT NULL,
|
|
33
|
+
PRIMARY KEY (project_id, consumer_id, event_id)
|
|
34
|
+
);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS "idxTaskLifecycleConsumerReceiptsSequence" ON project.task_lifecycle_consumer_receipts(project_id, consumer_id, seq);
|
|
36
|
+
|
|
37
|
+
CREATE TABLE IF NOT EXISTS project.task_lifecycle_consumer_dead_letters (
|
|
38
|
+
project_id text NOT NULL DEFAULT current_setting('fusion.project_id', true),
|
|
39
|
+
consumer_id text NOT NULL,
|
|
40
|
+
event_id text NOT NULL,
|
|
41
|
+
seq bigint NOT NULL,
|
|
42
|
+
attempts integer NOT NULL,
|
|
43
|
+
failure_class text NOT NULL,
|
|
44
|
+
parked_at text NOT NULL,
|
|
45
|
+
updated_at text NOT NULL,
|
|
46
|
+
PRIMARY KEY (project_id, consumer_id, event_id)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
-- All new state has the same forced RLS and project-id trigger as the outbox writer.
|
|
50
|
+
ALTER TABLE project.task_lifecycle_consumer_registrations ENABLE ROW LEVEL SECURITY;
|
|
51
|
+
ALTER TABLE project.task_lifecycle_consumer_registrations FORCE ROW LEVEL SECURITY;
|
|
52
|
+
DROP POLICY IF EXISTS fusion_project_isolation ON project.task_lifecycle_consumer_registrations;
|
|
53
|
+
CREATE POLICY fusion_project_isolation ON project.task_lifecycle_consumer_registrations
|
|
54
|
+
USING (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true))
|
|
55
|
+
WITH CHECK (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true));
|
|
56
|
+
DROP TRIGGER IF EXISTS fusion_assign_project_id ON project.task_lifecycle_consumer_registrations;
|
|
57
|
+
CREATE TRIGGER fusion_assign_project_id BEFORE INSERT OR UPDATE OF project_id ON project.task_lifecycle_consumer_registrations
|
|
58
|
+
FOR EACH ROW EXECUTE FUNCTION project.fusion_assign_project_id();
|
|
59
|
+
|
|
60
|
+
ALTER TABLE project.task_lifecycle_consumer_cursors ENABLE ROW LEVEL SECURITY;
|
|
61
|
+
ALTER TABLE project.task_lifecycle_consumer_cursors FORCE ROW LEVEL SECURITY;
|
|
62
|
+
DROP POLICY IF EXISTS fusion_project_isolation ON project.task_lifecycle_consumer_cursors;
|
|
63
|
+
CREATE POLICY fusion_project_isolation ON project.task_lifecycle_consumer_cursors
|
|
64
|
+
USING (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true))
|
|
65
|
+
WITH CHECK (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true));
|
|
66
|
+
DROP TRIGGER IF EXISTS fusion_assign_project_id ON project.task_lifecycle_consumer_cursors;
|
|
67
|
+
CREATE TRIGGER fusion_assign_project_id BEFORE INSERT OR UPDATE OF project_id ON project.task_lifecycle_consumer_cursors
|
|
68
|
+
FOR EACH ROW EXECUTE FUNCTION project.fusion_assign_project_id();
|
|
69
|
+
|
|
70
|
+
ALTER TABLE project.task_lifecycle_consumer_receipts ENABLE ROW LEVEL SECURITY;
|
|
71
|
+
ALTER TABLE project.task_lifecycle_consumer_receipts FORCE ROW LEVEL SECURITY;
|
|
72
|
+
DROP POLICY IF EXISTS fusion_project_isolation ON project.task_lifecycle_consumer_receipts;
|
|
73
|
+
CREATE POLICY fusion_project_isolation ON project.task_lifecycle_consumer_receipts
|
|
74
|
+
USING (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true))
|
|
75
|
+
WITH CHECK (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true));
|
|
76
|
+
DROP TRIGGER IF EXISTS fusion_assign_project_id ON project.task_lifecycle_consumer_receipts;
|
|
77
|
+
CREATE TRIGGER fusion_assign_project_id BEFORE INSERT OR UPDATE OF project_id ON project.task_lifecycle_consumer_receipts
|
|
78
|
+
FOR EACH ROW EXECUTE FUNCTION project.fusion_assign_project_id();
|
|
79
|
+
|
|
80
|
+
ALTER TABLE project.task_lifecycle_consumer_dead_letters ENABLE ROW LEVEL SECURITY;
|
|
81
|
+
ALTER TABLE project.task_lifecycle_consumer_dead_letters FORCE ROW LEVEL SECURITY;
|
|
82
|
+
DROP POLICY IF EXISTS fusion_project_isolation ON project.task_lifecycle_consumer_dead_letters;
|
|
83
|
+
CREATE POLICY fusion_project_isolation ON project.task_lifecycle_consumer_dead_letters
|
|
84
|
+
USING (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true))
|
|
85
|
+
WITH CHECK (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true));
|
|
86
|
+
DROP TRIGGER IF EXISTS fusion_assign_project_id ON project.task_lifecycle_consumer_dead_letters;
|
|
87
|
+
CREATE TRIGGER fusion_assign_project_id BEFORE INSERT OR UPDATE OF project_id ON project.task_lifecycle_consumer_dead_letters
|
|
88
|
+
FOR EACH ROW EXECUTE FUNCTION project.fusion_assign_project_id();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
-- FNXC:MissionValidation 2026-08-01-16:21:
|
|
2
|
+
-- FN-8694 records the exact content-addressed validator input and narrow blocked
|
|
3
|
+
-- provenance so recovery can stop deterministic repeat spend without reopening
|
|
4
|
+
-- unrelated operator/remediation blocks.
|
|
5
|
+
ALTER TABLE project.mission_validator_runs ADD COLUMN IF NOT EXISTS input_fingerprint text;
|
|
6
|
+
CREATE INDEX IF NOT EXISTS "idxValidatorRunsFeatureFingerprint" ON project.mission_validator_runs(project_id, feature_id, input_fingerprint);
|
|
7
|
+
ALTER TABLE project.mission_features ADD COLUMN IF NOT EXISTS validation_budget_fingerprint text;
|
|
8
|
+
ALTER TABLE project.mission_features ADD COLUMN IF NOT EXISTS validation_budget_run_id text;
|
|
9
|
+
ALTER TABLE project.mission_features ADD COLUMN IF NOT EXISTS validation_budget_blocked_at text;
|
package/dist/plugin-sdk/index.js
CHANGED
|
@@ -6137,6 +6137,60 @@ var symbolLocks = projectSchema.table("symbol_locks", {
|
|
|
6137
6137
|
index("idxSymbolLocksOwner").on(t.projectId, t.ownerTaskId),
|
|
6138
6138
|
index("idxSymbolLocksExpiry").on(t.status, t.expiresAt)
|
|
6139
6139
|
]);
|
|
6140
|
+
var taskLifecycleEvents = projectSchema.table("task_lifecycle_events", {
|
|
6141
|
+
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6142
|
+
seq: bigint("seq", { mode: "bigint" }).notNull(),
|
|
6143
|
+
eventId: text("event_id").notNull(),
|
|
6144
|
+
eventType: text("event_type").notNull(),
|
|
6145
|
+
taskId: text("task_id").notNull(),
|
|
6146
|
+
occurredAt: text("occurred_at").notNull(),
|
|
6147
|
+
createdAt: text("created_at").notNull(),
|
|
6148
|
+
payload: jsonb("payload").notNull()
|
|
6149
|
+
}, (t) => [
|
|
6150
|
+
primaryKey({ columns: [t.projectId, t.seq] }),
|
|
6151
|
+
unique("task_lifecycle_events_project_event_unique").on(t.projectId, t.eventId),
|
|
6152
|
+
check("task_lifecycle_events_type_check", sql`${t.eventType} IN ('task:deleted')`),
|
|
6153
|
+
index("idxTaskLifecycleEventsTask").on(t.projectId, t.taskId)
|
|
6154
|
+
]);
|
|
6155
|
+
var taskLifecycleEventSeq = projectSchema.table("task_lifecycle_event_seq", {
|
|
6156
|
+
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6157
|
+
lastSeq: bigint("last_seq", { mode: "bigint" }).notNull().default(sql`0`)
|
|
6158
|
+
}, (t) => [primaryKey({ columns: [t.projectId] })]);
|
|
6159
|
+
var taskLifecycleConsumerRegistrations = projectSchema.table("task_lifecycle_consumer_registrations", {
|
|
6160
|
+
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6161
|
+
consumerId: text("consumer_id").notNull(),
|
|
6162
|
+
registeredAt: text("registered_at").notNull(),
|
|
6163
|
+
lastSeenAt: text("last_seen_at").notNull(),
|
|
6164
|
+
active: integer("active").notNull().default(1)
|
|
6165
|
+
}, (t) => [primaryKey({ columns: [t.projectId, t.consumerId] })]);
|
|
6166
|
+
var taskLifecycleConsumerCursors = projectSchema.table("task_lifecycle_consumer_cursors", {
|
|
6167
|
+
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6168
|
+
consumerId: text("consumer_id").notNull(),
|
|
6169
|
+
lastAckedSeq: bigint("last_acked_seq", { mode: "bigint" }).notNull().default(sql`0`),
|
|
6170
|
+
retryAttempts: integer("retry_attempts").notNull().default(0),
|
|
6171
|
+
retryBackoffUntil: text("retry_backoff_until"),
|
|
6172
|
+
leaseToken: text("lease_token"),
|
|
6173
|
+
fencingToken: bigint("fencing_token", { mode: "bigint" }).notNull().default(sql`0`),
|
|
6174
|
+
leaseExpiresAt: text("lease_expires_at"),
|
|
6175
|
+
updatedAt: text("updated_at").notNull()
|
|
6176
|
+
}, (t) => [primaryKey({ columns: [t.projectId, t.consumerId] })]);
|
|
6177
|
+
var taskLifecycleConsumerReceipts = projectSchema.table("task_lifecycle_consumer_receipts", {
|
|
6178
|
+
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6179
|
+
consumerId: text("consumer_id").notNull(),
|
|
6180
|
+
eventId: text("event_id").notNull(),
|
|
6181
|
+
seq: bigint("seq", { mode: "bigint" }).notNull(),
|
|
6182
|
+
processedAt: text("processed_at").notNull()
|
|
6183
|
+
}, (t) => [primaryKey({ columns: [t.projectId, t.consumerId, t.eventId] })]);
|
|
6184
|
+
var taskLifecycleConsumerDeadLetters = projectSchema.table("task_lifecycle_consumer_dead_letters", {
|
|
6185
|
+
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
6186
|
+
consumerId: text("consumer_id").notNull(),
|
|
6187
|
+
eventId: text("event_id").notNull(),
|
|
6188
|
+
seq: bigint("seq", { mode: "bigint" }).notNull(),
|
|
6189
|
+
attempts: integer("attempts").notNull(),
|
|
6190
|
+
failureClass: text("failure_class").notNull(),
|
|
6191
|
+
parkedAt: text("parked_at").notNull(),
|
|
6192
|
+
updatedAt: text("updated_at").notNull()
|
|
6193
|
+
}, (t) => [primaryKey({ columns: [t.projectId, t.consumerId, t.eventId] })]);
|
|
6140
6194
|
var workflowSteps = projectSchema.table("workflow_steps", {
|
|
6141
6195
|
id: text("id").primaryKey(),
|
|
6142
6196
|
templateId: text("template_id"),
|
|
@@ -6977,6 +7031,9 @@ var missionFeatures = projectSchema.table("mission_features", {
|
|
|
6977
7031
|
implementationStopReason: text("implementation_stop_reason"),
|
|
6978
7032
|
implementationStoppedAt: text("implementation_stopped_at"),
|
|
6979
7033
|
implementationStopOrigin: text("implementation_stop_origin"),
|
|
7034
|
+
validationBudgetFingerprint: text("validation_budget_fingerprint"),
|
|
7035
|
+
validationBudgetRunId: text("validation_budget_run_id"),
|
|
7036
|
+
validationBudgetBlockedAt: text("validation_budget_blocked_at"),
|
|
6980
7037
|
lastValidatorRunId: text("last_validator_run_id"),
|
|
6981
7038
|
lastValidatorStatus: text("last_validator_status"),
|
|
6982
7039
|
generatedFromFeatureId: text("generated_from_feature_id"),
|
|
@@ -7514,13 +7571,15 @@ var missionValidatorRuns = projectSchema.table("mission_validator_runs", {
|
|
|
7514
7571
|
completedAt: text("completed_at"),
|
|
7515
7572
|
createdAt: text("created_at").notNull(),
|
|
7516
7573
|
updatedAt: text("updated_at").notNull(),
|
|
7517
|
-
taskId: text("task_id")
|
|
7574
|
+
taskId: text("task_id"),
|
|
7575
|
+
inputFingerprint: text("input_fingerprint")
|
|
7518
7576
|
}, (t) => [
|
|
7519
7577
|
primaryKey({ columns: [t.projectId, t.id] }),
|
|
7520
7578
|
index("idxValidatorRunsFeatureId").on(t.featureId),
|
|
7521
7579
|
index("idxValidatorRunsMilestoneId").on(t.milestoneId),
|
|
7522
7580
|
index("idxValidatorRunsSliceId").on(t.sliceId),
|
|
7523
|
-
index("idxValidatorRunsStatus").on(t.status)
|
|
7581
|
+
index("idxValidatorRunsStatus").on(t.status),
|
|
7582
|
+
index("idxValidatorRunsFeatureFingerprint").on(t.projectId, t.featureId, t.inputFingerprint)
|
|
7524
7583
|
]);
|
|
7525
7584
|
var missionValidatorFailures = projectSchema.table("mission_validator_failures", {
|
|
7526
7585
|
projectId: text("project_id").notNull().default(sql`current_setting('fusion.project_id', true)`),
|
|
@@ -8591,6 +8650,9 @@ function createLogger(prefix) {
|
|
|
8591
8650
|
// ../core/src/types/merge-policy.ts
|
|
8592
8651
|
var severityAuditLog = createLogger("core-merge-policy");
|
|
8593
8652
|
|
|
8653
|
+
// ../core/src/types/task-core.ts
|
|
8654
|
+
var WEDGE_RENOTIFY_COOLDOWN_MS = 6 * 60 * 60 * 1e3;
|
|
8655
|
+
|
|
8594
8656
|
// ../core/src/task-merge.ts
|
|
8595
8657
|
var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
8596
8658
|
"failed",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "0.74.0-beta.
|
|
3
|
+
"version": "0.74.0-beta.7",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
|
|
6
6
|
"homepage": "https://github.com/Runfusion/Fusion#readme",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.language-selector{display:flex;flex-direction:column;gap:8px}.language-selector-title{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted, #888)}.language-options{display:flex;flex-wrap:wrap;gap:8px}.language-option{display:inline-flex;align-items:center;padding:6px 12px;border:1px solid var(--border);border-radius:6px;background:var(--bg-secondary, transparent);color:var(--text);font-size:.875rem;cursor:pointer;transition:border-color .15s ease,background .15s ease}.language-option:hover{border-color:var(--accent)}.language-option.active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);font-weight:600}.mcp-servers-card{display:flex;flex-direction:column;gap:var(--space-md)}.mcp-servers-card__header,.mcp-server-row,.mcp-discovery__header,.mcp-discovery-row,.mcp-import-export,.mcp-sensitive-row,.mcp-inline-actions{display:flex;gap:var(--space-md)}.mcp-servers-card__header,.mcp-server-row,.mcp-discovery__header,.mcp-discovery-row{align-items:flex-start;justify-content:space-between}.mcp-servers-card__title,.mcp-server-row p,.mcp-discovery p,.mcp-discovery h6,.mcp-import-export h6{margin:0}.mcp-servers-card__description,.mcp-server-row p,.mcp-discovery p,.mcp-empty,.mcp-empty-inline,.mcp-effective-count{color:var(--text-muted)}.mcp-server-list,.mcp-discovery,.mcp-discovery__group,.mcp-editor,.mcp-sensitive-list,.mcp-import-export__pane,.mcp-server-row__main{display:flex;flex-direction:column;gap:var(--space-sm)}.mcp-server-row,.mcp-discovery,.mcp-discovery-row,.mcp-editor,.mcp-import-export__pane{padding:var(--space-md);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.mcp-discovery-row{background:var(--surface-hover)}.mcp-discovery__notes,.mcp-discovery-row__note{color:var(--color-warning)}.mcp-server-row__titleline,.mcp-validation-status,.mcp-server-row__actions{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.mcp-state-badge,.mcp-transport-badge{display:inline-flex;align-items:center;border-radius:var(--radius-full);padding:var(--space-xs) var(--space-xs);font-size:var(--font-size-xs);line-height:var(--line-height-tight);border:var(--border-width) solid var(--border);color:var(--text-muted)}.mcp-state-badge--disabled,.mcp-state-badge--disabled-global{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 12%,transparent)}.mcp-state-badge--overridden,.mcp-state-badge--project-local{color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent)}.mcp-state-badge--inherited{color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 12%,transparent)}.mcp-state-badge--configured{color:var(--color-success);background:color-mix(in srgb,var(--color-success) 12%,transparent)}.mcp-state-badge--required{color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 12%,transparent)}.mcp-validation-status{color:var(--text-muted)}.mcp-validation-status__badge{display:inline-flex;align-items:center;border-radius:var(--radius-full);padding:var(--space-xs) var(--space-xs);border:var(--border-width) solid var(--border);color:inherit}.mcp-validation-status--pending{color:var(--color-warning)}.mcp-validation-status--valid{color:var(--color-success)}.mcp-validation-status--unreachable,.mcp-validation-status--error{color:var(--color-error)}.mcp-editor-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md)}.mcp-editor-grid__wide,.mcp-import-export__pane,.mcp-server-row__main{flex:1 1 auto;min-width:0}.mcp-sensitive-row{align-items:center;flex-wrap:wrap}.mcp-sensitive-row .input,.mcp-sensitive-row .select{flex:1 1 var(--settings-field-min-width, 12rem);min-width:0}.mcp-subheading{font-weight:var(--font-weight-semibold)}.mcp-json-textarea{min-height:calc(var(--space-xl) * 4);resize:vertical;font-family:var(--font-mono)}.mcp-enabled-toggle{align-self:flex-start}@media(max-width:768px){.mcp-servers-card__header,.mcp-server-row,.mcp-discovery__header,.mcp-discovery-row,.mcp-import-export,.mcp-server-row__actions,.mcp-sensitive-row,.mcp-inline-actions{flex-direction:column;align-items:stretch}.mcp-editor-grid{grid-template-columns:1fr}.mcp-server-row__actions .btn,.mcp-inline-actions .btn,.mcp-sensitive-row .btn{justify-content:center}}.model-pricing-section{display:flex;flex-direction:column;gap:var(--space-md)}.model-pricing-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md)}.model-pricing-section__meta{margin:var(--space-xs) 0 0}.model-pricing-summary{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);padding:var(--space-md);border:thin solid var(--border);border-radius:var(--radius-md);background:var(--surface-secondary)}.model-pricing-summary__empty,.model-pricing-modal__subtitle{margin:var(--space-xs) 0 0}.model-pricing-modal__body{overflow-x:auto}.model-pricing-table{display:flex;flex-direction:column;gap:var(--space-xs);min-width:min-content}.model-pricing-row{display:grid;grid-template-columns:minmax(12rem,1.4fr) minmax(7rem,1fr) minmax(7rem,1fr) minmax(7rem,1fr) minmax(7rem,1fr) minmax(10rem,1.2fr) minmax(5rem,auto);gap:var(--space-xs);align-items:center}.model-pricing-row--head{color:var(--text-muted);font-size:var(--font-size-xs);font-weight:600}.model-pricing-row--add{padding-top:var(--space-xs);border-top:thin solid var(--border)}.model-pricing-key{overflow-wrap:anywhere;color:var(--text)}.model-pricing-empty{grid-column:1 / -1}@media(max-width:768px){.model-pricing-section__header,.model-pricing-summary{flex-direction:column}.model-pricing-section__header .btn,.model-pricing-summary .btn{width:100%}.model-pricing-modal__body{overflow-x:visible}.model-pricing-table{min-width:0}.model-pricing-row{grid-template-columns:minmax(14rem,1fr);padding:var(--space-sm);border:thin solid var(--border);border-radius:var(--radius-md)}.model-pricing-row--head{display:none}.model-pricing-row--add{border-top:thin solid var(--border)}}.grok-cli-provider-card .auth-provider-cli-actions,.grok-cli-provider-card .onboarding-provider-card__actions{display:flex;gap:var(--space-sm);align-items:center}.grok-cli-provider-card__body{display:flex;flex-direction:column;gap:var(--space-sm);padding:0 var(--space-md) var(--space-sm)}.grok-cli-provider-card__key-hint{opacity:.75}.grok-cli-binary-path-control{display:grid;gap:var(--space-xs);margin-top:var(--space-sm)}.grok-cli-binary-path-label{color:var(--text-muted);font-size:.78rem;font-weight:600}.grok-cli-binary-path-row{display:flex;gap:var(--space-sm);align-items:center}.grok-cli-binary-path-input{min-width:0;flex:1 1 18rem;height:2rem;border:1px solid var(--border-subtle);border-radius:var(--radius-sm);background:var(--surface-elevated);color:var(--text-primary);padding:0 var(--space-sm)}@media(max-width:768px){.grok-cli-provider-card .auth-provider-cli-actions,.grok-cli-provider-card .onboarding-provider-card__actions,.grok-cli-binary-path-row{flex-wrap:wrap}.grok-cli-binary-path-row .btn,.grok-cli-binary-path-input{width:100%}.grok-cli-provider-card__body{padding:0 var(--space-sm) var(--space-sm)}}.omp-cli-provider-card .auth-provider-cli-actions,.omp-cli-provider-card .onboarding-provider-card__actions{display:flex;gap:var(--space-sm);align-items:center}.omp-cli-provider-card__body{display:flex;flex-direction:column;gap:var(--space-sm);padding:0 var(--space-md) var(--space-sm)}.omp-cli-provider-card__hint{opacity:.75}.omp-cli-binary-path-control{display:grid;gap:var(--space-xs);margin-top:var(--space-sm)}.omp-cli-binary-path-label{color:var(--text-muted);font-size:.78rem;font-weight:600}.omp-cli-binary-path-row{display:flex;gap:var(--space-sm);align-items:center}.omp-cli-binary-path-input{min-width:0;flex:1 1 18rem;height:2rem;border:1px solid var(--border-subtle);border-radius:var(--radius-sm);background:var(--surface-elevated);color:var(--text-primary);padding:0 var(--space-sm)}@media(max-width:768px){.omp-cli-provider-card .auth-provider-cli-actions,.omp-cli-provider-card .onboarding-provider-card__actions,.omp-cli-binary-path-row{flex-wrap:wrap}.omp-cli-binary-path-row .btn,.omp-cli-binary-path-input{width:100%}.omp-cli-provider-card__body{padding:0 var(--space-sm) var(--space-sm)}}@keyframes custom-provider-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.custom-providers-section .onboarding-disclosure-content{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.custom-provider-list{display:flex;flex-direction:column;gap:var(--space-sm)}.custom-provider-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.custom-provider-item:hover{border-color:var(--text-dim)}.custom-provider-item-info{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.custom-provider-item-name{font-weight:600;color:var(--text)}.custom-provider-item-meta{color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-provider-item-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.custom-provider-refresh-btn{white-space:nowrap}.custom-provider-detect-actions{display:flex;align-items:center;gap:var(--space-sm);margin-top:var(--space-xs)}.custom-provider-row-message{display:flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-xs);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm)}.custom-provider-row-message--success{color:var(--color-success);background:color-mix(in srgb,var(--color-success) 10%,transparent)}.custom-provider-row-message--error{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.custom-provider-badge{display:inline-flex;align-items:center;padding:var(--space-xs);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.custom-provider-empty{color:var(--text-muted);padding:var(--space-sm) 0}.custom-provider-add-btn{margin-top:var(--space-sm)}.custom-provider-form{padding:var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-top:var(--space-sm)}.custom-provider-form-row{margin-bottom:var(--space-sm)}.custom-provider-form-actions{display:flex;gap:var(--space-sm);margin-top:var(--space-md)}.custom-provider-form-error{display:flex;align-items:center;gap:var(--space-xs);color:var(--color-error);margin-top:var(--space-xs);background:color-mix(in srgb,var(--color-error) 10%,transparent);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm)}.custom-provider-item-edit-form{margin-top:var(--space-xs)}.custom-provider-form-checkbox-row{display:flex;flex-direction:column;gap:var(--space-xs)}.custom-provider-form-checkbox-row label{display:flex;align-items:center;gap:var(--space-xs)}.custom-provider-form-hint{color:var(--text-muted);font-size:var(--font-size-xs);margin:0}.custom-provider-spin{animation:custom-provider-spin calc(var(--duration-slow) * 4) linear infinite}@media(max-width:768px){.custom-provider-item{flex-direction:column;align-items:flex-start;gap:var(--space-xs)}.custom-provider-item-meta{max-width:100%}.custom-provider-form{padding:var(--space-sm)}.custom-provider-item-actions{align-self:stretch;justify-content:flex-start;margin-top:var(--space-xs)}.custom-provider-refresh-btn{flex:1 1 auto;justify-content:center}}.prompt-manager{display:flex;flex-direction:column;gap:var(--space-md);padding:0 var(--space-xl);margin-top:var(--space-md)}.prompt-manager-tabs{display:flex;gap:var(--space-xs);border-bottom:1px solid var(--border);padding-bottom:var(--space-sm)}.prompt-manager-tab{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);background:none;border:1px solid transparent;border-radius:var(--radius-md);color:var(--text-muted);font-size:13px;cursor:pointer;transition:all var(--transition-fast)}.prompt-manager-tab:hover{color:var(--text);background:var(--surface)}.prompt-manager-tab:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.prompt-manager-tab.active{color:var(--text);background:var(--surface);border-color:var(--border)}.prompt-manager-content{min-height:200px}.prompt-manager-templates-tab,.prompt-manager-assignments-tab,.prompt-manager-overrides-tab{display:flex;flex-direction:column;gap:var(--space-lg)}.prompt-template-section{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-section-title{font-size:14px;font-weight:600;color:var(--text);margin:0}.prompt-template-section-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-template-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-card{padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.prompt-template-card:hover{border-color:var(--text-dim)}.prompt-template-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-bottom:var(--space-sm)}.prompt-template-card-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.prompt-template-card-name{font-weight:600;color:var(--text);font-size:14px}.prompt-template-badge-built-in,.prompt-template-badge-custom,.prompt-template-badge-override{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.02em}.prompt-template-badge-built-in{background:var(--surface);color:var(--text-muted);border:1px solid var(--border)}.prompt-template-badge-custom{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.prompt-template-badge-override{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.prompt-template-badge-role{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;border-radius:var(--radius-sm)}.prompt-template-badge-built-in,.prompt-template-badge-role,.prompt-role-badge{--prompt-role-color: var(--color-muted)}.prompt-role-tone--executor{--prompt-role-color: var(--todo)}.prompt-role-tone--triage{--prompt-role-color: var(--triage)}.prompt-role-tone--reviewer{--prompt-role-color: var(--in-review)}.prompt-role-tone--merger{--prompt-role-color: var(--done)}.prompt-role-tone--scheduler{--prompt-role-color: var(--color-info)}.prompt-role-tone--engineer{--prompt-role-color: var(--color-warning)}.prompt-role-tone--custom{--prompt-role-color: var(--color-muted)}.prompt-template-badge-role,.prompt-role-badge{background:color-mix(in srgb,var(--prompt-role-color) 15%,transparent);color:var(--prompt-role-color)}.prompt-template-badge-built-in.prompt-role-tone--executor,.prompt-template-badge-built-in.prompt-role-tone--triage,.prompt-template-badge-built-in.prompt-role-tone--reviewer,.prompt-template-badge-built-in.prompt-role-tone--merger,.prompt-template-badge-built-in.prompt-role-tone--scheduler,.prompt-template-badge-built-in.prompt-role-tone--engineer,.prompt-template-badge-built-in.prompt-role-tone--custom{border-color:var(--prompt-role-color)}.prompt-template-card-actions{display:flex;gap:var(--space-xs)}.prompt-template-card-actions .btn-icon{padding:var(--space-xs)}.prompt-template-card-description{font-size:12px;color:var(--text-muted);margin:0 0 var(--space-sm) 0;line-height:1.4}.prompt-template-card-preview{background:var(--surface);border-radius:var(--radius-sm);padding:var(--space-sm);overflow:hidden}.prompt-template-card-preview code{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;display:block;max-height:120px;overflow-y:auto}.prompt-template-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:13px;background:var(--surface);border:1px dashed var(--border);border-radius:var(--radius-md)}.prompt-template-add-btn{align-self:flex-start;margin-top:var(--space-sm)}.prompt-template-editor{padding:var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.prompt-template-editor-title{font-size:14px;font-weight:600;color:var(--text);margin:0 0 var(--space-md) 0}.prompt-template-editor-fields{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-field{display:flex;flex-direction:column;gap:var(--space-xs)}.prompt-template-field label{font-size:12px;font-weight:500;color:var(--text-muted)}.prompt-template-field input,.prompt-template-field select,.prompt-template-prompt-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;transition:border-color var(--transition-fast)}.prompt-template-field input:focus,.prompt-template-field select:focus,.prompt-template-prompt-textarea:focus{outline:none;border-color:var(--todo)}.prompt-template-prompt-textarea{font-family:var(--font-mono);font-size:12px;line-height:1.5;resize:vertical;min-height:120px}.prompt-template-error{padding:var(--space-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-sm);color:var(--color-error);font-size:12px}.prompt-template-editor-actions{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-sm)}.prompt-template-delete-confirm{padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-template-delete-confirm p{margin:0;font-size:13px;color:var(--text)}.prompt-template-delete-actions{display:flex;gap:var(--space-sm)}.prompt-assignments-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-role-assignment-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-role-assignment-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-lg);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md)}.prompt-role-assignment-label{display:flex;align-items:center;gap:var(--space-md)}.prompt-role-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);font-size:12px;font-weight:600;border-radius:var(--radius-sm)}.prompt-role-assignment-status{font-size:12px;color:var(--text-muted)}.prompt-role-select{min-width:200px;padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;cursor:pointer}.prompt-role-select:focus{outline:none;border-color:var(--todo)}.prompt-role-select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.prompt-assignments-note{margin-top:var(--space-md);padding:var(--space-md);background:var(--surface);border-radius:var(--radius-md);font-size:12px;color:var(--text-muted);line-height:1.5}.prompt-assignments-note strong{color:var(--text)}.prompt-overrides-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-overrides-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-override-item{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.prompt-override-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md);cursor:pointer;transition:background var(--transition-fast)}.prompt-override-header:hover{background:var(--card-hover)}.prompt-override-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm);flex:1;min-width:0;border:none;background:none;color:inherit;padding:0;text-align:left;font:inherit;cursor:pointer;border-radius:var(--radius-sm)}.prompt-override-info:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.prompt-override-name{font-weight:600;color:var(--text);font-size:13px}.prompt-override-key{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);padding:calc(var(--space-xs) * .5) var(--space-xs);background:var(--surface);border-radius:var(--radius-sm)}.prompt-override-badge{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning);border-radius:var(--radius-sm)}.prompt-override-expand-btn{display:flex;align-items:center;justify-content:center;width:var(--space-xl);height:var(--space-xl);background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-expand-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-expand-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);color:var(--text);background:var(--surface)}.prompt-override-description{font-size:12px;color:var(--text-muted);margin:0;padding:0 var(--space-md) var(--space-md);line-height:1.4}.prompt-override-editor{padding:var(--space-md);border-top:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-override-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:12px;font-family:var(--font-mono);line-height:1.5;resize:vertical;min-height:calc(var(--space-xl) * 3 + var(--space-sm));transition:border-color var(--transition-fast)}.prompt-override-textarea:focus{outline:none;border-color:var(--todo)}.prompt-override-footer{display:flex;align-items:center;gap:var(--space-md)}.prompt-override-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.prompt-override-header-actions{display:flex;align-items:center;gap:var(--space-xs)}.prompt-override-fullscreen-btn{display:flex;align-items:center;justify-content:center;width:var(--space-xl);height:var(--space-xl);background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-fullscreen-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-fullscreen-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);color:var(--text);background:var(--surface)}.prompt-override-fullscreen{position:fixed;inset:0;z-index:10000;background:var(--surface);padding:max(var(--space-lg),env(safe-area-inset-top,0px)) max(var(--space-lg),env(safe-area-inset-right,0px)) max(var(--space-lg),env(safe-area-inset-bottom,0px)) max(var(--space-lg),env(safe-area-inset-left,0px));display:flex;flex-direction:column}.prompt-override-fullscreen-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md);flex-shrink:0}.prompt-override-fullscreen-title{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:var(--space-sm)}.prompt-override-fullscreen-close{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:none;border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;font-size:12px;transition:all var(--transition-fast)}.prompt-override-fullscreen-close:hover{color:var(--text);border-color:var(--text-muted)}.prompt-override-fullscreen-close:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.prompt-override-fullscreen textarea{flex:1;min-height:unset;resize:none;border-radius:var(--radius-md);font-size:14px;line-height:1.6}.prompt-template-fullscreen-pre{flex:1;font-family:var(--font-mono);font-size:13px;line-height:1.6;color:var(--text);white-space:pre-wrap;word-break:break-word;overflow-y:auto;padding:var(--space-md);background:var(--bg);border-radius:var(--radius-md);border:1px solid var(--border);margin:0}.prompt-override-fullscreen .prompt-override-footer{flex-shrink:0;padding-top:var(--space-sm)}.prompt-template-prompt-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.prompt-template-prompt-label-row label{display:block}.prompt-template-fullscreen-btn{vertical-align:middle}.prompt-template-prompt-label-row .prompt-template-fullscreen-btn{margin-left:var(--space-xs)}@media(max-width:768px){.prompt-manager{padding:0 var(--space-lg)}.prompt-manager-tabs{flex-wrap:wrap}.prompt-manager-tab{flex:1;justify-content:center;min-width:calc(50% - var(--space-xs))}.prompt-role-assignment-row{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.prompt-role-select{width:100%}.prompt-template-editor-actions{flex-direction:column}.prompt-template-editor-actions .btn{width:100%}.prompt-override-fullscreen{padding:max(var(--space-md),env(safe-area-inset-top,0px)) max(var(--space-md),env(safe-area-inset-right,0px)) max(var(--space-md),env(safe-area-inset-bottom,0px)) max(var(--space-md),env(safe-area-inset-left,0px))}.prompt-override-fullscreen textarea{font-size:16px}.prompt-override-expand-btn,.prompt-override-fullscreen-btn{width:calc(var(--space-lg) * 2 + var(--space-xs));height:calc(var(--space-lg) * 2 + var(--space-xs))}}.settings-moved-stub{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface-2, var(--surface))}.settings-moved-stub__message{margin:0;font-size:var(--font-size-sm);color:var(--text-muted)}.settings-moved-stub__action{align-self:flex-start;padding:var(--space-xs) var(--space-md);font-size:var(--font-size-sm);font-weight:600;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background-color var(--duration-fast) ease,border-color var(--duration-fast) ease}.settings-moved-stub__action:hover:not(:disabled){background:var(--surface-hover, var(--surface-2, var(--surface)));border-color:var(--accent, var(--border))}.settings-moved-stub__action:disabled{opacity:.6;cursor:not-allowed}.cli-binary-panel{display:flex;flex-direction:column;gap:12px;padding:0 var(--space-xl);margin-top:var(--space-lg);border:0;background:transparent}.cli-binary-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.cli-binary-header .settings-section-heading{margin:0}.cli-binary-pill{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase}.cli-binary-pill--ok{background:color-mix(in srgb,var(--color-success) 18%,transparent);color:var(--color-success);border:1px solid color-mix(in srgb,var(--color-success) 40%,transparent)}.cli-binary-pill--warn{background:color-mix(in srgb,var(--color-warning) 18%,transparent);color:var(--color-warning);border:1px solid color-mix(in srgb,var(--color-warning) 40%,transparent)}.cli-binary-pill--err{background:color-mix(in srgb,var(--color-error) 18%,transparent);color:var(--color-error);border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent)}.cli-binary-help{color:var(--text-muted);line-height:1.4}.cli-binary-help code{background:color-mix(in srgb,var(--text) 6%,transparent);padding:1px 6px;border-radius:4px;font-size:.92em}.cli-binary-status-line{margin:0;color:var(--text-muted)}.cli-binary-status-line code{background:color-mix(in srgb,var(--text) 6%,transparent);padding:1px 6px;border-radius:4px}.cli-binary-detail{display:flex;flex-direction:column;gap:12px}.cli-binary-info-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px;font-size:13px}.cli-binary-info-list li{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.cli-binary-info-list span{color:var(--text-muted);min-width:64px}.cli-binary-info-list code{background:color-mix(in srgb,var(--text) 6%,transparent);padding:1px 6px;border-radius:4px;word-break:break-all}.cli-binary-expected{color:var(--text-muted);font-size:12px}.cli-binary-actions{display:flex;gap:8px;flex-wrap:wrap}.cli-binary-install-btn,.cli-binary-refresh-btn,.cli-binary-copy-btn{cursor:pointer;border-radius:6px;padding:6px 12px;font-size:13px;border:1px solid transparent;transition:background .15s ease,border-color .15s ease}.cli-binary-install-btn{background:var(--accent, #3b82f6);color:var(--accent-text)}.cli-binary-install-btn:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 88%,var(--text) 12%)}.cli-binary-install-btn:disabled,.cli-binary-refresh-btn:disabled{opacity:.55;cursor:not-allowed}.cli-binary-refresh-btn,.cli-binary-copy-btn{background:color-mix(in srgb,var(--text) 4%,transparent);color:var(--text);border-color:color-mix(in srgb,var(--text) 12%,transparent)}.cli-binary-refresh-btn:hover:not(:disabled),.cli-binary-copy-btn:hover{background:color-mix(in srgb,var(--text) 8%,transparent)}.cli-binary-commands{display:flex;flex-direction:column;gap:6px}.cli-binary-commands label{font-size:12px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}.cli-binary-command-row{display:flex;align-items:center;gap:8px;background:color-mix(in srgb,var(--bg) 25%,transparent);border:1px solid color-mix(in srgb,var(--text) 6%,transparent);border-radius:6px;padding:6px 8px 6px 12px}.cli-binary-command-row code{flex:1;font-family:var(--font-mono, ui-monospace, "SFMono-Regular", monospace);font-size:12.5px;color:var(--text);white-space:nowrap;overflow-x:auto}.cli-binary-install-log{border-top:1px solid color-mix(in srgb,var(--text) 6%,transparent);padding-top:10px;font-size:12.5px}.cli-binary-install-log summary{cursor:pointer;color:var(--text-muted)}.cli-binary-install-output{margin:6px 0 0;padding:8px 10px;background:color-mix(in srgb,var(--bg) 35%,transparent);border-radius:4px;max-height:220px;overflow:auto;white-space:pre-wrap;font-size:12px;line-height:1.4}.cli-binary-install-output--err{color:var(--color-error)}.cli-binary-permissions-hint{margin:6px 0;padding:8px 10px;background:color-mix(in srgb,var(--color-error) 10%,transparent);border-left:3px solid color-mix(in srgb,var(--color-error) 55%,transparent);border-radius:0 var(--radius-sm) var(--radius-sm) 0;color:var(--color-error);font-size:12.5px;line-height:1.5}.tracking-repo-select{display:flex;flex-direction:column;gap:var(--space-sm)}.tracking-repo-select__custom-input{margin-top:0}.tracking-repo-select__hint{color:var(--text-muted)}.tracking-repo-select__hint--error{color:var(--color-error)}@media(max-width:768px){.tracking-repo-select{gap:var(--space-xs)}}.agent-provisioning-policy-editor{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-lg)}.agent-provisioning-policy-help{color:var(--text-muted);font-size:.75rem;margin:0}.agent-provisioning-policy-help code{font-family:var(--font-mono)}.agent-provisioning-policy-textarea{min-height:calc(var(--space-2xl) + var(--space-xl));resize:vertical}@media(max-width:768px){.agent-provisioning-policy-editor{padding:var(--space-md)}}.voice-input-section{display:grid;gap:var(--space-xs)}.voice-input-section__message{margin:0;color:var(--color-warning);font-size:var(--font-size-xs)}.voice-input-section__status{color:var(--text-muted);font-size:var(--font-size-sm)}.voice-input-section__status--installed{color:var(--color-success)}.voice-input-section__status--error,.voice-input-section__status--unknown{color:var(--color-error)}.voice-input-section__status--downloading,.voice-input-section__status--queued{color:var(--color-warning)}.voice-input-section__actions{display:flex;flex-wrap:wrap;gap:var(--space-sm)}@media(max-width:768px){.voice-input-section__actions .btn{inline-size:100%;justify-content:center}}.configuration-versions-section{display:grid;gap:var(--space-sm)}.configuration-versions-section__list{display:grid;gap:var(--space-sm);margin:0;padding:0;list-style:none}.configuration-versions-section__item{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);padding-block:var(--space-sm);border-block-end:1px solid var(--border-subtle)}.configuration-versions-section__item span{display:grid;gap:var(--space-xs);min-inline-size:0}.configuration-versions-section__item strong{color:var(--text)}.configuration-versions-section__item small{color:var(--text-muted)}.configuration-versions-section__error{color:var(--color-error)}@media(max-width:768px){.configuration-versions-section__item{align-items:stretch;flex-direction:column}.configuration-versions-section__item .btn{inline-size:100%;justify-content:center}}
|