agentix-cli 0.58.0 → 0.60.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/apps/mac-voice/Sources/AgentXVoice/AgentClient.swift +4 -0
- package/apps/mac-voice/Sources/AgentXVoice/AnswerView.swift +228 -0
- package/apps/mac-voice/Sources/AgentXVoice/HistoryClient.swift +55 -0
- package/apps/mac-voice/Sources/AgentXVoice/HistoryModel.swift +153 -0
- package/apps/mac-voice/Sources/AgentXVoice/HistoryWindow.swift +301 -0
- package/apps/mac-voice/Sources/AgentXVoice/LocalSTT.swift +79 -0
- package/apps/mac-voice/Sources/AgentXVoice/ModelStore.swift +184 -0
- package/apps/mac-voice/Sources/AgentXVoice/Orb.swift +36 -9
- package/apps/mac-voice/Sources/AgentXVoice/Panel.swift +126 -55
- package/apps/mac-voice/Sources/AgentXVoice/PanelAnswer.swift +113 -0
- package/apps/mac-voice/Sources/AgentXVoice/Parakeet.swift +264 -0
- package/apps/mac-voice/Sources/AgentXVoice/PillPlacement.swift +28 -17
- package/apps/mac-voice/Sources/AgentXVoice/Recorder.swift +81 -3
- package/apps/mac-voice/Sources/AgentXVoice/SettingsLook.swift +90 -0
- package/apps/mac-voice/Sources/AgentXVoice/SettingsWindow.swift +20 -5
- package/apps/mac-voice/Sources/AgentXVoice/SileroVAD.swift +92 -0
- package/apps/mac-voice/Sources/AgentXVoice/Speech.swift +7 -5
- package/apps/mac-voice/Sources/AgentXVoice/StatusMenu.swift +14 -1
- package/apps/mac-voice/Sources/AgentXVoice/Surface.swift +105 -0
- package/apps/mac-voice/Sources/AgentXVoice/TurnEnd.swift +110 -0
- package/apps/mac-voice/Sources/AgentXVoice/VoiceSettings.swift +54 -0
- package/apps/mac-voice/Sources/AgentXVoice/main.swift +35 -36
- package/apps/mac-voice/build.sh +10 -1
- package/dist/{App-Z5VOAUXB.js → App-LQXWKBVY.js} +2 -2
- package/dist/{ChatApp-BE7ONQKS.js → ChatApp-75TL4LKW.js} +2 -2
- package/dist/{agent-Q74EISKP.js → agent-DH4FMMMY.js} +2 -2
- package/dist/{board-dashboard-A7PQOI6C.js → board-dashboard-BVRRDYAG.js} +223 -138
- package/dist/board-dashboard-BVRRDYAG.js.map +1 -0
- package/dist/{chunk-NKMFHEGV.js → chunk-27P5NLTC.js} +2 -2
- package/dist/{chunk-5LLGIX5M.js → chunk-2VQIPJH5.js} +2 -2
- package/dist/{chunk-V7ZK6ZIO.js → chunk-3XVTFNYM.js} +2 -2
- package/dist/{chunk-KW7TIOS3.js → chunk-B3DCYBP4.js} +2 -2
- package/dist/{chunk-547G3HYQ.js → chunk-CRSXKQLZ.js} +2 -2
- package/dist/{chunk-5W7NJHCS.js → chunk-DTEQNXK3.js} +2 -2
- package/dist/{chunk-XTD3SZIP.js → chunk-E2BJVHBR.js} +2 -2
- package/dist/{chunk-RXEAACVH.js → chunk-E2PWCU2N.js} +2 -2
- package/dist/{chunk-I2LYULR4.js → chunk-JO3PSLWL.js} +5 -5
- package/dist/{chunk-U5YBQJ5Q.js → chunk-JORXRF4E.js} +2 -2
- package/dist/{chunk-2MIOMYT2.js → chunk-LXUG2X26.js} +2 -2
- package/dist/{chunk-Q6SMLSRO.js → chunk-N5KD3TVN.js} +2 -2
- package/dist/{chunk-VI7GBDKV.js → chunk-NBGNPKAF.js} +2 -2
- package/dist/{chunk-6QNPCVRN.js → chunk-PAOV37KQ.js} +3 -3
- package/dist/chunk-PAOV37KQ.js.map +1 -0
- package/dist/{chunk-OZZPJ2YG.js → chunk-RYFUFX6F.js} +194 -181
- package/dist/chunk-RYFUFX6F.js.map +1 -0
- package/dist/chunk-S7TCVIET.js +15 -0
- package/dist/chunk-S7TCVIET.js.map +1 -0
- package/dist/{chunk-POL7RAJQ.js → chunk-TM762AXU.js} +159 -153
- package/dist/chunk-TM762AXU.js.map +1 -0
- package/dist/{chunk-6OABTCRA.js → chunk-WBGC7MWX.js} +2 -2
- package/dist/{chunk-CQUVUVXR.js → chunk-WIBMNQKJ.js} +2 -2
- package/dist/{chunk-KKGFZEXS.js → chunk-WOPFHKBF.js} +37 -36
- package/dist/chunk-WOPFHKBF.js.map +1 -0
- package/dist/{chunk-VVBGPT6W.js → chunk-YQCOX4R3.js} +2 -2
- package/dist/cli.js +1 -1
- package/dist/client-QVZIZFV4.js +2 -0
- package/dist/config-3XC7EYB7.js +2 -0
- package/dist/config-mutator-HKU63FJM.js +2 -0
- package/dist/doctor-YFA4ZSRH.js +2 -0
- package/dist/index.d.ts +66 -7
- package/dist/index.js +1 -1
- package/dist/program-BOCLU6ES.js +2 -0
- package/dist/{promote-KVPLDSKT.js → promote-UR2GSHKC.js} +2 -2
- package/dist/query-XUP3BMVS.js +2 -0
- package/dist/{registry-AUOI4TW2.js → registry-PGALUW5L.js} +2 -2
- package/dist/{request-planner-LMZ5ZAXC.js → request-planner-NHE3IRJN.js} +2 -2
- package/dist/{review-candidates-WCBXLLDS.js → review-candidates-6GKRSRBQ.js} +2 -2
- package/dist/{routing-FBASYKUL.js → routing-AQKHAU3Z.js} +2 -2
- package/dist/schedule-tool-6NMCLTIH.js +2 -0
- package/dist/scheduler-RAYGNDWT.js +2 -0
- package/dist/{seat-DBFW3Z5P.js → seat-6FMW2QI4.js} +2 -2
- package/dist/{select-6CNVVFA5.js → select-5VONJMLH.js} +2 -2
- package/dist/{set-enabled-AYZH3KSB.js → set-enabled-YHD3IJJZ.js} +2 -2
- package/dist/{tool-PKS4NBZ6.js → tool-MXJGLJZ5.js} +2 -2
- package/dist/wiki-ZQLEYY24.js +2 -0
- package/package.json +1 -1
- package/apps/mac-voice/Sources/AgentXVoice/ResultCard.swift +0 -198
- package/dist/board-dashboard-A7PQOI6C.js.map +0 -1
- package/dist/chunk-6QNPCVRN.js.map +0 -1
- package/dist/chunk-ERL6AS3O.js +0 -15
- package/dist/chunk-ERL6AS3O.js.map +0 -1
- package/dist/chunk-KKGFZEXS.js.map +0 -1
- package/dist/chunk-OZZPJ2YG.js.map +0 -1
- package/dist/chunk-POL7RAJQ.js.map +0 -1
- package/dist/client-EFP2PKA3.js +0 -2
- package/dist/config-P6YXC6XZ.js +0 -2
- package/dist/config-mutator-3GKXLTHH.js +0 -2
- package/dist/doctor-JEWMHXYH.js +0 -2
- package/dist/program-7DUQJDSQ.js +0 -2
- package/dist/query-AGOMCYTT.js +0 -2
- package/dist/schedule-tool-RJRJ63SS.js +0 -2
- package/dist/scheduler-ATA7Z44S.js +0 -2
- package/dist/wiki-QW6BDNEQ.js +0 -2
- /package/dist/{App-Z5VOAUXB.js.map → App-LQXWKBVY.js.map} +0 -0
- /package/dist/{ChatApp-BE7ONQKS.js.map → ChatApp-75TL4LKW.js.map} +0 -0
- /package/dist/{agent-Q74EISKP.js.map → agent-DH4FMMMY.js.map} +0 -0
- /package/dist/{chunk-NKMFHEGV.js.map → chunk-27P5NLTC.js.map} +0 -0
- /package/dist/{chunk-5LLGIX5M.js.map → chunk-2VQIPJH5.js.map} +0 -0
- /package/dist/{chunk-V7ZK6ZIO.js.map → chunk-3XVTFNYM.js.map} +0 -0
- /package/dist/{chunk-KW7TIOS3.js.map → chunk-B3DCYBP4.js.map} +0 -0
- /package/dist/{chunk-547G3HYQ.js.map → chunk-CRSXKQLZ.js.map} +0 -0
- /package/dist/{chunk-5W7NJHCS.js.map → chunk-DTEQNXK3.js.map} +0 -0
- /package/dist/{chunk-XTD3SZIP.js.map → chunk-E2BJVHBR.js.map} +0 -0
- /package/dist/{chunk-RXEAACVH.js.map → chunk-E2PWCU2N.js.map} +0 -0
- /package/dist/{chunk-I2LYULR4.js.map → chunk-JO3PSLWL.js.map} +0 -0
- /package/dist/{chunk-U5YBQJ5Q.js.map → chunk-JORXRF4E.js.map} +0 -0
- /package/dist/{chunk-2MIOMYT2.js.map → chunk-LXUG2X26.js.map} +0 -0
- /package/dist/{chunk-Q6SMLSRO.js.map → chunk-N5KD3TVN.js.map} +0 -0
- /package/dist/{chunk-VI7GBDKV.js.map → chunk-NBGNPKAF.js.map} +0 -0
- /package/dist/{chunk-6OABTCRA.js.map → chunk-WBGC7MWX.js.map} +0 -0
- /package/dist/{chunk-CQUVUVXR.js.map → chunk-WIBMNQKJ.js.map} +0 -0
- /package/dist/{chunk-VVBGPT6W.js.map → chunk-YQCOX4R3.js.map} +0 -0
- /package/dist/{client-EFP2PKA3.js.map → client-QVZIZFV4.js.map} +0 -0
- /package/dist/{config-P6YXC6XZ.js.map → config-3XC7EYB7.js.map} +0 -0
- /package/dist/{config-mutator-3GKXLTHH.js.map → config-mutator-HKU63FJM.js.map} +0 -0
- /package/dist/{doctor-JEWMHXYH.js.map → doctor-YFA4ZSRH.js.map} +0 -0
- /package/dist/{program-7DUQJDSQ.js.map → program-BOCLU6ES.js.map} +0 -0
- /package/dist/{promote-KVPLDSKT.js.map → promote-UR2GSHKC.js.map} +0 -0
- /package/dist/{query-AGOMCYTT.js.map → query-XUP3BMVS.js.map} +0 -0
- /package/dist/{registry-AUOI4TW2.js.map → registry-PGALUW5L.js.map} +0 -0
- /package/dist/{request-planner-LMZ5ZAXC.js.map → request-planner-NHE3IRJN.js.map} +0 -0
- /package/dist/{review-candidates-WCBXLLDS.js.map → review-candidates-6GKRSRBQ.js.map} +0 -0
- /package/dist/{routing-FBASYKUL.js.map → routing-AQKHAU3Z.js.map} +0 -0
- /package/dist/{schedule-tool-RJRJ63SS.js.map → schedule-tool-6NMCLTIH.js.map} +0 -0
- /package/dist/{scheduler-ATA7Z44S.js.map → scheduler-RAYGNDWT.js.map} +0 -0
- /package/dist/{seat-DBFW3Z5P.js.map → seat-6FMW2QI4.js.map} +0 -0
- /package/dist/{select-6CNVVFA5.js.map → select-5VONJMLH.js.map} +0 -0
- /package/dist/{set-enabled-AYZH3KSB.js.map → set-enabled-YHD3IJJZ.js.map} +0 -0
- /package/dist/{tool-PKS4NBZ6.js.map → tool-MXJGLJZ5.js.map} +0 -0
- /package/dist/{wiki-QW6BDNEQ.js.map → wiki-ZQLEYY24.js.map} +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -1803,6 +1803,9 @@ declare const agentConfigSchema: z.ZodObject<{
|
|
|
1803
1803
|
presence: z.ZodOptional<z.ZodObject<{
|
|
1804
1804
|
/** Cursor colour, as #RRGGBB. Default: derived from the agent id. */
|
|
1805
1805
|
color: z.ZodOptional<z.ZodString>;
|
|
1806
|
+
/** The voice orb's gradient, one of src/voice/orb-palettes.ts.
|
|
1807
|
+
* Default: the palette nearest `color`. */
|
|
1808
|
+
palette: z.ZodOptional<z.ZodEnum<[string, ...string[]]>>;
|
|
1806
1809
|
/** One or two letters on the cursor. Default: from the name. */
|
|
1807
1810
|
initial: z.ZodOptional<z.ZodString>;
|
|
1808
1811
|
/** Name shown under the cursor. Default: the agent's name. */
|
|
@@ -1814,11 +1817,13 @@ declare const agentConfigSchema: z.ZodObject<{
|
|
|
1814
1817
|
initial?: string | undefined;
|
|
1815
1818
|
label?: string | undefined;
|
|
1816
1819
|
color?: string | undefined;
|
|
1820
|
+
palette?: string | undefined;
|
|
1817
1821
|
allowActions?: boolean | undefined;
|
|
1818
1822
|
}, {
|
|
1819
1823
|
initial?: string | undefined;
|
|
1820
1824
|
label?: string | undefined;
|
|
1821
1825
|
color?: string | undefined;
|
|
1826
|
+
palette?: string | undefined;
|
|
1822
1827
|
allowActions?: boolean | undefined;
|
|
1823
1828
|
}>>;
|
|
1824
1829
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -1902,6 +1907,7 @@ declare const agentConfigSchema: z.ZodObject<{
|
|
|
1902
1907
|
initial?: string | undefined;
|
|
1903
1908
|
label?: string | undefined;
|
|
1904
1909
|
color?: string | undefined;
|
|
1910
|
+
palette?: string | undefined;
|
|
1905
1911
|
allowActions?: boolean | undefined;
|
|
1906
1912
|
} | undefined;
|
|
1907
1913
|
}, {
|
|
@@ -1985,6 +1991,7 @@ declare const agentConfigSchema: z.ZodObject<{
|
|
|
1985
1991
|
initial?: string | undefined;
|
|
1986
1992
|
label?: string | undefined;
|
|
1987
1993
|
color?: string | undefined;
|
|
1994
|
+
palette?: string | undefined;
|
|
1988
1995
|
allowActions?: boolean | undefined;
|
|
1989
1996
|
} | undefined;
|
|
1990
1997
|
}>;
|
|
@@ -2591,6 +2598,9 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
2591
2598
|
presence: z.ZodOptional<z.ZodObject<{
|
|
2592
2599
|
/** Cursor colour, as #RRGGBB. Default: derived from the agent id. */
|
|
2593
2600
|
color: z.ZodOptional<z.ZodString>;
|
|
2601
|
+
/** The voice orb's gradient, one of src/voice/orb-palettes.ts.
|
|
2602
|
+
* Default: the palette nearest `color`. */
|
|
2603
|
+
palette: z.ZodOptional<z.ZodEnum<[string, ...string[]]>>;
|
|
2594
2604
|
/** One or two letters on the cursor. Default: from the name. */
|
|
2595
2605
|
initial: z.ZodOptional<z.ZodString>;
|
|
2596
2606
|
/** Name shown under the cursor. Default: the agent's name. */
|
|
@@ -2602,11 +2612,13 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
2602
2612
|
initial?: string | undefined;
|
|
2603
2613
|
label?: string | undefined;
|
|
2604
2614
|
color?: string | undefined;
|
|
2615
|
+
palette?: string | undefined;
|
|
2605
2616
|
allowActions?: boolean | undefined;
|
|
2606
2617
|
}, {
|
|
2607
2618
|
initial?: string | undefined;
|
|
2608
2619
|
label?: string | undefined;
|
|
2609
2620
|
color?: string | undefined;
|
|
2621
|
+
palette?: string | undefined;
|
|
2610
2622
|
allowActions?: boolean | undefined;
|
|
2611
2623
|
}>>;
|
|
2612
2624
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -2690,6 +2702,7 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
2690
2702
|
initial?: string | undefined;
|
|
2691
2703
|
label?: string | undefined;
|
|
2692
2704
|
color?: string | undefined;
|
|
2705
|
+
palette?: string | undefined;
|
|
2693
2706
|
allowActions?: boolean | undefined;
|
|
2694
2707
|
} | undefined;
|
|
2695
2708
|
}, {
|
|
@@ -2773,6 +2786,7 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
2773
2786
|
initial?: string | undefined;
|
|
2774
2787
|
label?: string | undefined;
|
|
2775
2788
|
color?: string | undefined;
|
|
2789
|
+
palette?: string | undefined;
|
|
2776
2790
|
allowActions?: boolean | undefined;
|
|
2777
2791
|
} | undefined;
|
|
2778
2792
|
}>>>;
|
|
@@ -4466,6 +4480,15 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
4466
4480
|
* set and the local Whisper otherwise; "elevenlabs" or "local" pick
|
|
4467
4481
|
* one (ElevenLabs still falls back to local when it fails). */
|
|
4468
4482
|
stt: z.ZodDefault<z.ZodEnum<["auto", "elevenlabs", "local"]>>;
|
|
4483
|
+
/** The on-device engine behind "local" and every fallback:
|
|
4484
|
+
* mlx-whisper (Python, all languages) or Parakeet (Core ML, 25
|
|
4485
|
+
* European languages, no Arabic; 483 MB downloaded on first use into
|
|
4486
|
+
* ~/.agentx/models). mlx-whisper answers until Parakeet is ready. */
|
|
4487
|
+
localStt: z.ZodDefault<z.ZodEnum<["mlx-whisper", "parakeet"]>>;
|
|
4488
|
+
/** How AgentX Voice hears the end of a hands-free turn: "vad" (Silero
|
|
4489
|
+
* voice detection, 0.9 MB downloaded on first use; the volume
|
|
4490
|
+
* threshold until then) or "volume" (the old fixed threshold). */
|
|
4491
|
+
endOfTurn: z.ZodDefault<z.ZodEnum<["vad", "volume"]>>;
|
|
4469
4492
|
/** AgentX Voice shortcuts: hold `talk` to speak, `stop` silences every
|
|
4470
4493
|
* voice, `paste` is smart paste. */
|
|
4471
4494
|
hotkeys: z.ZodDefault<z.ZodObject<{
|
|
@@ -4481,16 +4504,36 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
4481
4504
|
talk?: string | undefined;
|
|
4482
4505
|
paste?: string | undefined;
|
|
4483
4506
|
}>>;
|
|
4507
|
+
/** The answer text AgentX Voice shows inside its pill. */
|
|
4508
|
+
card: z.ZodDefault<z.ZodObject<{
|
|
4509
|
+
/** Seconds the answer stays open once it has been spoken; 0 keeps
|
|
4510
|
+
* it open until closed. */
|
|
4511
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
4512
|
+
/** Tallest the answer grows, in points, before it scrolls. */
|
|
4513
|
+
maxHeight: z.ZodDefault<z.ZodNumber>;
|
|
4514
|
+
}, "strip", z.ZodTypeAny, {
|
|
4515
|
+
timeout: number;
|
|
4516
|
+
maxHeight: number;
|
|
4517
|
+
}, {
|
|
4518
|
+
timeout?: number | undefined;
|
|
4519
|
+
maxHeight?: number | undefined;
|
|
4520
|
+
}>>;
|
|
4484
4521
|
}, "strip", z.ZodTypeAny, {
|
|
4485
4522
|
provider: "system" | "elevenlabs";
|
|
4486
4523
|
fallback: "system" | "none";
|
|
4487
4524
|
locale: string;
|
|
4488
4525
|
stt: "auto" | "local" | "elevenlabs";
|
|
4526
|
+
localStt: "mlx-whisper" | "parakeet";
|
|
4527
|
+
endOfTurn: "volume" | "vad";
|
|
4489
4528
|
hotkeys: {
|
|
4490
4529
|
stop: string;
|
|
4491
4530
|
talk: string;
|
|
4492
4531
|
paste: string;
|
|
4493
4532
|
};
|
|
4533
|
+
card: {
|
|
4534
|
+
timeout: number;
|
|
4535
|
+
maxHeight: number;
|
|
4536
|
+
};
|
|
4494
4537
|
system?: string | Record<string, string> | undefined;
|
|
4495
4538
|
listener?: string | undefined;
|
|
4496
4539
|
}, {
|
|
@@ -4500,11 +4543,17 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
4500
4543
|
locale?: string | undefined;
|
|
4501
4544
|
listener?: string | undefined;
|
|
4502
4545
|
stt?: "auto" | "local" | "elevenlabs" | undefined;
|
|
4546
|
+
localStt?: "mlx-whisper" | "parakeet" | undefined;
|
|
4547
|
+
endOfTurn?: "volume" | "vad" | undefined;
|
|
4503
4548
|
hotkeys?: {
|
|
4504
4549
|
stop?: string | undefined;
|
|
4505
4550
|
talk?: string | undefined;
|
|
4506
4551
|
paste?: string | undefined;
|
|
4507
4552
|
} | undefined;
|
|
4553
|
+
card?: {
|
|
4554
|
+
timeout?: number | undefined;
|
|
4555
|
+
maxHeight?: number | undefined;
|
|
4556
|
+
} | undefined;
|
|
4508
4557
|
}>>;
|
|
4509
4558
|
business: z.ZodOptional<z.ZodObject<{
|
|
4510
4559
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -4688,8 +4737,7 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
4688
4737
|
workTickMinutes: z.ZodDefault<z.ZodNumber>;
|
|
4689
4738
|
idleQueueThreshold: z.ZodDefault<z.ZodNumber>;
|
|
4690
4739
|
standup: z.ZodDefault<z.ZodObject<{
|
|
4691
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
4692
|
-
* works: "on" for everything but cron, "all" to include cron. */
|
|
4740
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
4693
4741
|
plansDir: z.ZodDefault<z.ZodString>;
|
|
4694
4742
|
maxAgentsPerDay: z.ZodDefault<z.ZodNumber>;
|
|
4695
4743
|
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -4982,11 +5030,6 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
4982
5030
|
token: z.ZodOptional<z.ZodString>;
|
|
4983
5031
|
daemonUrl: z.ZodDefault<z.ZodString>;
|
|
4984
5032
|
daemons: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
4985
|
-
/**
|
|
4986
|
-
* Canonical kind list — for autocomplete + doctor validation. Open string
|
|
4987
|
-
* schema so new services drop in without a bump; doctor warns when a kind
|
|
4988
|
-
* is outside this list.
|
|
4989
|
-
*/
|
|
4990
5033
|
name: z.ZodString;
|
|
4991
5034
|
url: z.ZodString;
|
|
4992
5035
|
dashboardUrl: z.ZodOptional<z.ZodString>;
|
|
@@ -5005,6 +5048,8 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
5005
5048
|
dashboardUrl?: string | undefined;
|
|
5006
5049
|
dashboardToken?: string | undefined;
|
|
5007
5050
|
}>, "many">>;
|
|
5051
|
+
/** A keyboard shortcut for AgentX Voice, e.g. "opt+space" or
|
|
5052
|
+
* "ctrl+opt+1". See src/voice/hotkey.ts. */
|
|
5008
5053
|
draftAgent: z.ZodOptional<z.ZodString>;
|
|
5009
5054
|
}, "strip", z.ZodTypeAny, {
|
|
5010
5055
|
enabled: boolean;
|
|
@@ -5862,6 +5907,7 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
5862
5907
|
initial?: string | undefined;
|
|
5863
5908
|
label?: string | undefined;
|
|
5864
5909
|
color?: string | undefined;
|
|
5910
|
+
palette?: string | undefined;
|
|
5865
5911
|
allowActions?: boolean | undefined;
|
|
5866
5912
|
} | undefined;
|
|
5867
5913
|
}>;
|
|
@@ -5903,11 +5949,17 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
5903
5949
|
fallback: "system" | "none";
|
|
5904
5950
|
locale: string;
|
|
5905
5951
|
stt: "auto" | "local" | "elevenlabs";
|
|
5952
|
+
localStt: "mlx-whisper" | "parakeet";
|
|
5953
|
+
endOfTurn: "volume" | "vad";
|
|
5906
5954
|
hotkeys: {
|
|
5907
5955
|
stop: string;
|
|
5908
5956
|
talk: string;
|
|
5909
5957
|
paste: string;
|
|
5910
5958
|
};
|
|
5959
|
+
card: {
|
|
5960
|
+
timeout: number;
|
|
5961
|
+
maxHeight: number;
|
|
5962
|
+
};
|
|
5911
5963
|
system?: string | Record<string, string> | undefined;
|
|
5912
5964
|
listener?: string | undefined;
|
|
5913
5965
|
};
|
|
@@ -6507,6 +6559,7 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
6507
6559
|
initial?: string | undefined;
|
|
6508
6560
|
label?: string | undefined;
|
|
6509
6561
|
color?: string | undefined;
|
|
6562
|
+
palette?: string | undefined;
|
|
6510
6563
|
allowActions?: boolean | undefined;
|
|
6511
6564
|
} | undefined;
|
|
6512
6565
|
}> | undefined;
|
|
@@ -6550,11 +6603,17 @@ declare const daemonConfigSchema: z.ZodObject<{
|
|
|
6550
6603
|
locale?: string | undefined;
|
|
6551
6604
|
listener?: string | undefined;
|
|
6552
6605
|
stt?: "auto" | "local" | "elevenlabs" | undefined;
|
|
6606
|
+
localStt?: "mlx-whisper" | "parakeet" | undefined;
|
|
6607
|
+
endOfTurn?: "volume" | "vad" | undefined;
|
|
6553
6608
|
hotkeys?: {
|
|
6554
6609
|
stop?: string | undefined;
|
|
6555
6610
|
talk?: string | undefined;
|
|
6556
6611
|
paste?: string | undefined;
|
|
6557
6612
|
} | undefined;
|
|
6613
|
+
card?: {
|
|
6614
|
+
timeout?: number | undefined;
|
|
6615
|
+
maxHeight?: number | undefined;
|
|
6616
|
+
} | undefined;
|
|
6558
6617
|
} | undefined;
|
|
6559
6618
|
graph?: {
|
|
6560
6619
|
enabled?: boolean | undefined;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as L}from"./chunk-Y57CULGE.js";import{a as St,b as kt,c as vt,d as xt,e as $t,f as Ct,g as Pt,
|
|
1
|
+
import{a as L}from"./chunk-Y57CULGE.js";import{a as St,b as kt,c as vt,d as xt,e as $t,f as Ct,g as Pt,oa as bt,pa as Tt,qa as Mt}from"./chunk-RYFUFX6F.js";import"./chunk-PAOV37KQ.js";import"./chunk-E2PWCU2N.js";import"./chunk-S7CVSKOX.js";import"./chunk-LQRBGQIR.js";import"./chunk-ZVP6GB4G.js";import"./chunk-27P5NLTC.js";import"./chunk-LXUG2X26.js";import"./chunk-2AXFYDWF.js";import"./chunk-AQASR6KR.js";import"./chunk-2D3RYIDU.js";import"./chunk-L53FTKEP.js";import{S as yt,l as lt,m as ct,n as dt,o as mt,p as pt}from"./chunk-JO3PSLWL.js";import"./chunk-WIBMNQKJ.js";import"./chunk-WP6KLXTP.js";import"./chunk-N6EWZGIX.js";import"./chunk-DP7RTNDM.js";import{s as ut}from"./chunk-JORXRF4E.js";import"./chunk-CRSXKQLZ.js";import{A as D,B as z,C as V,a as ye,b as we,c as Se,d as Ae,e as Ie,f as Oe,g as Ne,h as He,i as je,j as Ue,k as _e,l as I,m as q,n as Be,o as qe,p as Ye,q as O,r as ze,s as Ve,t as Xe,u as x,v as Y,w as Qe,x as Ze,y as et,z as wt}from"./chunk-B3DCYBP4.js";import{a as B,b as M,c as F}from"./chunk-SFQUP3BP.js";import"./chunk-J3SOEFRE.js";import"./chunk-SIU6STB2.js";import"./chunk-X5C5W3E4.js";import"./chunk-76Z4VHDX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-WBGC7MWX.js";import"./chunk-DWADWDMU.js";import"./chunk-NO2HOK4B.js";import"./chunk-QD6IICK7.js";import"./chunk-VWTBHLMX.js";import"./chunk-2VQIPJH5.js";import{a as gt,b as ft,e as ht}from"./chunk-E2BJVHBR.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-YQCOX4R3.js";import"./chunk-TFVUOC2C.js";import"./chunk-2GIDVZ4H.js";import{j as it,k as rt,l as at}from"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-QOYAX2FT.js";import{a as ke,b as ve,c as xe,d as $e,e as Ce,f as Pe,g as be,h as Te,i as Me,j as Re,l as Ee,m as Ge,o as T,p as W}from"./chunk-SZJMS7K4.js";import{a as m,b as G}from"./chunk-7I7IEX4S.js";import{a as Fe,b as Le,c as A,d as De}from"./chunk-VDMYBPYB.js";import{a as Ke,b as Je,e as We}from"./chunk-DSYKYZMT.js";import{u as tt,w as st,x as ot,z as nt}from"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";W();G();import{execa as Rt}from"execa";import{existsSync as se,promises as X}from"fs";import S from"path";import ie from"node-fetch";async function Et(o,e){let t=o.split("/");if(t.length<2)throw new Error(`Invalid skill package ID: ${o}. Expected format: owner/repo`);let s=t[0],i=t[1],n=t[2];try{let a=n?`${s}/${i}/${n}`:`${s}/${i}`;await Rt("npx",["-y","skills","add",a],{cwd:e,stdio:"pipe"}),m.success(`Installed skill package: ${o}`);let r=S.resolve(e,".skills",`${s}_${i}`);if(se(r))return await ne(r,o);let d=S.resolve(e,".skills");return se(d)?await ne(d,o):[]}catch{return m.info(`Fetching skills directly from GitHub: ${s}/${i}`),await Gt(s,i,n,e)}}async function Gt(o,e,t,s){let i=[];try{let n=`https://api.github.com/repos/${o}/${e}/git/trees/main?recursive=1`,a=await ie(n);if(!a.ok)throw new Error(`GitHub API error: ${a.status}`);let d=(await a.json()).tree.filter(p=>p.type==="blob"&&p.path.endsWith("SKILL.md"));if(t){let p=d.find(f=>f.path.includes(`/${t}/`)||f.path===`${t}/SKILL.md`);if(p){let f=await oe(o,e,p.path,s);f&&i.push(f)}}else for(let p of d){let f=await oe(o,e,p.path,s);f&&i.push(f)}}catch(n){m.error(`Failed to fetch skills from GitHub: ${n.message}`)}return i}async function oe(o,e,t,s){try{let i=`https://raw.githubusercontent.com/${o}/${e}/main/${t}`,n=await ie(i);if(!n.ok)return null;let a=await n.text(),r=A(a);if(r){r.source="remote",r.packageId=`${o}/${e}`;let d=S.dirname(t),p=S.resolve(s,".skills",`${o}_${e}`,d);await X.mkdir(p,{recursive:!0}),await X.writeFile(S.resolve(p,"SKILL.md"),a),r.path=S.resolve(p,"SKILL.md")}return r}catch{return null}}async function ne(o,e){let t=[],{default:s}=await import("fast-glob"),i=await s.glob("**/SKILL.md",{cwd:o,deep:5});for(let n of i)try{let a=S.resolve(o,n),r=await X.readFile(a,"utf8"),d=A(r);d&&(d.source="remote",d.path=a,d.packageId=e,t.push(d))}catch{}return t}async function At(o,e,t,s,i){let n=["---",`name: ${o}`,`description: ${e}`];if(s?.length){n.push("tags:");for(let a of s)n.push(` - ${a}`)}if(i?.length){n.push("globs:");for(let a of i)n.push(` - ${a}`)}return n.push("---"),`${n.join(`
|
|
2
2
|
`)}
|
|
3
3
|
|
|
4
4
|
${t}`}async function It(o){let{loadLocalSkills:e}=await import("./loader-EVHZ2R73.js");return e(o)}async function Ot(o,e,t,s,i){let a=[{role:"system",content:`You are a skill author for the Agent Skills ecosystem (skills.sh).
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a}from"./chunk-TM762AXU.js";import"./chunk-DTEQNXK3.js";import"./chunk-N5KD3TVN.js";import"./chunk-WOPFHKBF.js";import"./chunk-Z3IP66SL.js";import"./chunk-KAFO5QZR.js";import"./chunk-RKPAVWXF.js";import"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-SZDACK6O.js";import"./chunk-RYFUFX6F.js";import"./chunk-PAOV37KQ.js";import"./chunk-E2PWCU2N.js";import"./chunk-S7CVSKOX.js";import"./chunk-LQRBGQIR.js";import"./chunk-ZVP6GB4G.js";import"./chunk-27P5NLTC.js";import"./chunk-LXUG2X26.js";import"./chunk-2AXFYDWF.js";import"./chunk-AQASR6KR.js";import"./chunk-2D3RYIDU.js";import"./chunk-L53FTKEP.js";import"./chunk-JO3PSLWL.js";import"./chunk-WIBMNQKJ.js";import"./chunk-WP6KLXTP.js";import"./chunk-N6EWZGIX.js";import"./chunk-DP7RTNDM.js";import"./chunk-JORXRF4E.js";import"./chunk-CRSXKQLZ.js";import"./chunk-B3DCYBP4.js";import"./chunk-SFQUP3BP.js";import"./chunk-J3SOEFRE.js";import"./chunk-SIU6STB2.js";import"./chunk-X5C5W3E4.js";import"./chunk-76Z4VHDX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-WBGC7MWX.js";import"./chunk-DWADWDMU.js";import"./chunk-NO2HOK4B.js";import"./chunk-QD6IICK7.js";import"./chunk-VWTBHLMX.js";import"./chunk-2VQIPJH5.js";import"./chunk-E2BJVHBR.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-YQCOX4R3.js";import"./chunk-TFVUOC2C.js";import"./chunk-2GIDVZ4H.js";import"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-QOYAX2FT.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-VDMYBPYB.js";import"./chunk-DSYKYZMT.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{a as buildProgram};
|
|
2
|
+
//# sourceMappingURL=program-BOCLU6ES.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,q as p,r as q,s as r,t as s,u as t}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=promote-
|
|
1
|
+
import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,q as p,r as q,s as r,t as s,u as t}from"./chunk-LXUG2X26.js";import"./chunk-2AXFYDWF.js";import"./chunk-AQASR6KR.js";import"./chunk-DP7RTNDM.js";import"./chunk-E2BJVHBR.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-TFVUOC2C.js";import"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-QOYAX2FT.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{b as DEFAULT_PROMOTE_TYPES,a as PROMOTER_OWNER,c as PROMOTION_LEDGER_FILE,j as appendPromotionLedger,s as approveProposal,n as callPromotionLlm,p as estimateTokens,r as evidenceFor,m as getUnpromotedMemories,k as groupCandidates,h as listAllAgentMemories,d as memoryKey,e as memoryStamp,g as mergeSources,f as parseMemoryStamp,l as parsePromotionResponse,i as readPromotionLedger,t as rejectProposal,o as runPromotion,q as sourceKind};
|
|
2
|
+
//# sourceMappingURL=promote-UR2GSHKC.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a}from"./chunk-YQCOX4R3.js";import"./chunk-TFVUOC2C.js";import"./chunk-2GIDVZ4H.js";import"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-QOYAX2FT.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{a as agenticQuery};
|
|
2
|
+
//# sourceMappingURL=query-XUP3BMVS.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{I as a,J as b,K as c,L as d,M as e,N as f,O as g,P as h,Q as i,R as j,S as k}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=registry-
|
|
1
|
+
import{I as a,J as b,K as c,L as d,M as e,N as f,O as g,P as h,Q as i,R as j,S as k}from"./chunk-JO3PSLWL.js";import"./chunk-WIBMNQKJ.js";import"./chunk-WP6KLXTP.js";import"./chunk-N6EWZGIX.js";import"./chunk-DP7RTNDM.js";import"./chunk-JORXRF4E.js";import"./chunk-CRSXKQLZ.js";import"./chunk-J3SOEFRE.js";import"./chunk-SIU6STB2.js";import"./chunk-X5C5W3E4.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-WBGC7MWX.js";import"./chunk-DWADWDMU.js";import"./chunk-NO2HOK4B.js";import"./chunk-QD6IICK7.js";import"./chunk-VWTBHLMX.js";import"./chunk-2VQIPJH5.js";import"./chunk-E2BJVHBR.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-YQCOX4R3.js";import"./chunk-TFVUOC2C.js";import"./chunk-2GIDVZ4H.js";import"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-QOYAX2FT.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-DSYKYZMT.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{k as AgentRegistry,f as TRACE_STEP_SUMMARY_BYTES,c as buildEntryMeta,d as buildEventDigest,e as buildWikiContext,g as clipForTrace,j as emitTraceStepsFromStreamEvent,i as firstMissingRequiredTool,b as getGlobalRegistry,a as setGlobalRegistry,h as tallyToolUses};
|
|
2
|
+
//# sourceMappingURL=registry-PGALUW5L.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{q as m,t as p,v as d,w as x}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=request-planner-
|
|
1
|
+
import{q as m,t as p,v as d,w as x}from"./chunk-NBGNPKAF.js";import{a as u,f}from"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";x();f();var l="request-gate",h="request-context",g=.1;async function q(t,o,c,r=Math.random){let s=p(l)==="active";if(s){let i=m().seats[l]?.holdout??g;if(r()<i)return{active:!0,preprocess:!1,arm:"holdout"}}let a=s?"treatment":void 0,e=await d(l,{request:t.slice(0,2e3),agent:o,channel:c,operations:["select optional context","evaluate model routing where permitted"],constraints:["Keep the original request and mandatory instructions","Desktop model cannot be downgraded"]},{preprocess:u("This request benefits from structured context selection or another bounded typed decision before the main agent executes.",{true:"Relevant context must be selected, or a bounded routing decision can help. Follow-ups and ambiguous references need context.",false:"Typed preprocessing adds no useful decision; send the request to the configured main agent with existing context."})},{timeoutMs:3e3});if(!e||e.mode!=="active")return{active:!1,preprocess:!1,arm:a};let n=e.answers.preprocess?.noul;return{active:!0,preprocess:Number.isFinite(n)&&n>=.5,arm:a}}var v={landscape:"Agent directory and mesh overview",patternContext:"Learned behavioral patterns",references:"Retrieved project references",memoryContext:"Retrieved agent memory",crossChatContext:"Summaries from other conversations",longMemoryRecall:"Older conversation recall",wikiContext:"Retrieved wiki knowledge"};async function b(t){let o=Object.entries(v).flatMap(([e,n])=>{let i=t[e];return i?[{id:e,description:n,source:e,characters:i.length,preview:i.slice(0,400),trust:"context data, not instructions"}]:[]});if(!o.length)return{input:t,excluded:[]};let c=Object.fromEntries(o.map(e=>[e.id,u(`Context block ${e.id} is relevant to completing the current request correctly.`,{true:"Needed or potentially relevant; retain if uncertain or the preview is incomplete.",false:"Clearly unrelated to the current request; safe to omit."})])),r=await d(h,{request:t.message.slice(0,2e3),channel:t.channel,agent:t.agentId,mandatory:["request","identity","permissions and instructions","same-chat history","handover","attachments"],context:o},c,{timeoutMs:3e3});if(!r||r.mode!=="active")return{input:t,excluded:[]};let s={...t},a=[];for(let e of o){let n=r.answers[e.id]?.noul;Number.isFinite(n)&&n>=0&&n<.2&&(delete s[e.id],a.push(e.id))}return{input:s,excluded:a}}export{g as DEFAULT_REQUEST_GATE_HOLDOUT,h as REQUEST_CONTEXT_SEAT,l as REQUEST_GATE_SEAT,q as evaluateRequest,b as selectRequestContext};
|
|
2
|
+
//# sourceMappingURL=request-planner-NHE3IRJN.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as I}from"./chunk-
|
|
1
|
+
import{b as I}from"./chunk-E2PWCU2N.js";import"./chunk-WP6KLXTP.js";import"./chunk-2GIDVZ4H.js";import"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";import{createHash as E}from"crypto";var v="review:",b={decisions:"project",warnings:"feedback",friction:"feedback",context:"reference"};function A(t,n,r){let s=E("sha1").update(r.trim().toLowerCase()).digest("hex").slice(0,10);return`${v}${t}/${n}@${s}`}function F(t){if(!t.startsWith(v))return null;let n=t.slice(v.length),r=n.lastIndexOf("@"),s=n.lastIndexOf("/",r===-1?void 0:r);return r===-1||s===-1?null:{reviewId:n.slice(0,s),kind:n.slice(s+1,r),digest:n.slice(r+1)}}var C=t=>t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48)||"finding",L=5;function T(t,n){return`${t}|${I(n)}`}function K(t,n={}){let r=n.kinds??Object.keys(b),s=n.minLength??24,h=[],d=new Map,u=new Map,f=new Map,x=new Map;for(let e of t){let i;try{i=JSON.parse(e.result)}catch{continue}let o=e.updated_at?new Date(e.updated_at).toISOString():new Date().toISOString();for(let c of r){let l=b[c];if(!l)continue;let R=i[c];if(Array.isArray(R))for(let $ of R){let a=String($?.text??"").trim();if(a.length<s)continue;let g=A(e.id,c,a),_=g.slice(g.lastIndexOf("@")),w=`${c}${_}`,y=T(c,a),S=f.get(y)??new Set;if(S.add(e.session_id??e.id),f.set(y,S),d.has(w))continue;let O=String($?.evidence??"").trim(),k={occurrences:1,agentId:e.agent,key:`${e.agent}/${l}_${C(a)}`,stamp:g,memory:{name:C(a),type:l,description:a.slice(0,200),body:"",createdAt:o,updatedAt:o}};x.set(g,{text:a,evidence:O,agent:e.agent,source:e.source}),d.set(w,k),u.set(w,y),h.push(k)}}}for(let[e,i]of d){let o=f.get(u.get(e)??"");i.occurrences=o?.size??1,i.sessions=[...o??[]].slice(0,L);let c=x.get(i.stamp);i.memory.body=D(c,i.occurrences)}let m=new Map;for(let[e,i]of d){let o=u.get(e)??e,c=m.get(o)??[];c.push(i),m.set(o,c)}let M=[...m.values()].sort((e,i)=>i[0].occurrences-e[0].occurrences),p=[];for(let e=0;p.length<h.length;e++){let i=!1;for(let o of M)e<o.length&&(p.push(o[e]),i=!0);if(!i)break}return p}function D(t,n){let r=`${t.agent}${t.source?` via ${t.source}`:""}`,s=[];return n>1?(s.push(`Observed in ${n} separate sessions. Most recently stated as:`),s.push(`> ${t.text}`),s.push(`Recurring across ${n} sessions is what makes this worth recording \u2014 any single occurrence is session state, the repetition is the finding.`)):s.push(t.text),t.evidence&&s.push(`**Evidence:** ${t.evidence}`),s.push(`_From ${n>1?"session reviews":"a session review"} of ${r}._`),s.join(`
|
|
2
2
|
|
|
3
3
|
`)}export{L as MAX_EVIDENCE_SESSIONS,b as PROMOTABLE_KINDS,v as REVIEW_STAMP_PREFIX,F as parseReviewStamp,A as reviewStamp,K as reviewsToCandidates};
|
|
4
|
-
//# sourceMappingURL=review-candidates-
|
|
4
|
+
//# sourceMappingURL=review-candidates-6GKRSRBQ.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=routing-
|
|
1
|
+
import{a,b}from"./chunk-WBGC7MWX.js";import"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{a as cheapModelForEngine,b as routeTaskModel};
|
|
2
|
+
//# sourceMappingURL=routing-AQKHAU3Z.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a,b}from"./chunk-3XVTFNYM.js";import"./chunk-RKPAVWXF.js";import"./chunk-27P5NLTC.js";import"./chunk-JORXRF4E.js";import"./chunk-CRSXKQLZ.js";import"./chunk-FCPTN6NF.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-QIJLFPWE.js";export{b as resolveScheduleCaller,a as runScheduleTool};
|
|
2
|
+
//# sourceMappingURL=schedule-tool-6NMCLTIH.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as a,o as b,p as c,q as d,r as e,s as f}from"./chunk-JORXRF4E.js";import"./chunk-CRSXKQLZ.js";import"./chunk-FCPTN6NF.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-QIJLFPWE.js";export{a as AGENT_RUN_TIMEOUT_FLOOR,f as CronScheduler,b as agentRunTimeout,e as cronRunId,d as getNextCronDate,c as runLinkIds};
|
|
2
|
+
//# sourceMappingURL=scheduler-RAYGNDWT.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as a,p as b,q as c,r as d,s as e,t as f,u as g,v as h,w as i}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=seat-
|
|
1
|
+
import{o as a,p as b,q as c,r as d,s as e,t as f,u as g,v as h,w as i}from"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";i();export{h as askSeat,a as configureDecisions,c as decisionsRuntime,f as getSeatMode,d as parseSeatMode,g as recordSeatOutcome,b as resetDecisionsRuntime,e as seatEnvVar};
|
|
2
|
+
//# sourceMappingURL=seat-6FMW2QI4.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{v as S,w}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=select-
|
|
1
|
+
import{v as S,w}from"./chunk-NBGNPKAF.js";import{a as g,b as h,f as R}from"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import{d as f}from"./chunk-VDMYBPYB.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";w();R();var p="skill-select";function y(l){return{task:d(l.task,1200),...l.agent?{agent:l.agent}:{},skills:l.candidates.map(t=>({name:t.name,purpose:d(t.description,300),...t.category?{category:t.category}:{},...t.tags?.length?{tags:t.tags.slice(0,8)}:{}}))}}function b(l){let t={};for(let i of l)t[i.name]=d(i.description,300);return{anyRelevant:g("At least one of these skills is about the task at hand.",{true:"The task is the kind of work one of these skills exists for, and following it would change how the work is done \u2014 it names the same system, the same procedure or the same kind of artefact.",false:"None of them is about this task. They may share vocabulary with it, mention the same tools, or belong to the same project without bearing on what is being asked. Sharing words with a task is not being about it."}),best:h(t,"Which skill is this task most about?")}}function v(l){let t=l.anyRelevant,i=l.best,o=Object.entries(i.probabilities??{}).map(([e,s])=>({name:e,p:Number(s)||0})).sort((e,s)=>s.p-e.p);return{anyRelevant:t.noul,name:i.choice,confidence:i.confidence,ranked:o}}function d(l,t){return l.length>t?`${l.slice(0,t)}\u2026`:l}var x=.1,A=12;async function E(l,t,i={}){let o=i.minRelevant??.6,e=f(l,t).filter(n=>n.relevance>=x).slice(0,A),s=e.map(n=>({name:n.skill.frontmatter.name,lexical:n.relevance}));if(e.length===0)return{skill:null,anyRelevant:0,confidence:0,shortlist:s,judged:!1,reason:"no skill mentions anything in this task"};if(e.length===1)return{skill:e[0].skill,anyRelevant:e[0].relevance,confidence:e[0].relevance,shortlist:s,judged:!1,reason:`only ${e[0].skill.frontmatter.name} matched (${e[0].matchReason})`};let r=e.map(n=>({name:n.skill.frontmatter.name,description:n.skill.frontmatter.description,category:n.skill.frontmatter.category??null,tags:n.skill.frontmatter.tags})),m=await S(p,y({task:t,agent:i.agent??null,candidates:r}),b(r),{incumbent:{best:r[0].name},features:{agent:i.agent??"unknown",candidates:r.length}});if(!m)return{skill:e[0].skill,anyRelevant:e[0].relevance,confidence:e[0].relevance,shortlist:s,judged:!1,reason:`seat off \u2014 lexical top match (${e[0].matchReason})`};let a=v(m.answers),c=s.map(n=>({...n,p:a.ranked.find(k=>k.name===n.name)?.p??0})).sort((n,k)=>(k.p??0)-(n.p??0));if(a.anyRelevant<o)return{skill:null,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`nothing on the shortlist is about this task (${a.anyRelevant.toFixed(2)} below ${o})`};let u=e.find(n=>n.skill.frontmatter.name===a.name);return u?{skill:u.skill,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`${a.name} (confidence ${a.confidence.toFixed(2)})`}:{skill:null,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`seat chose "${a.name}", which was not on the shortlist`}}export{E as pickSkillForTask};
|
|
2
|
+
//# sourceMappingURL=select-5VONJMLH.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as a}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=set-enabled-
|
|
1
|
+
import{b as a}from"./chunk-CRSXKQLZ.js";import"./chunk-S7TCVIET.js";import"./chunk-QIJLFPWE.js";async function i(o,r,s={}){let e=null,n=await a(l=>{let t=l.crons?.[o];if(t?r&&t.approval?.action==="create"?e={ok:!1,status:409,error:`schedule "${o}" is waiting for approval: agentx schedule approve ${o}`}:t.enabled===r&&(e={ok:!0,id:o,enabled:r,changed:!1}):e={ok:!1,status:404,error:`no schedule "${o}"`},e)throw new Error("no write");t.enabled=r,e={ok:!0,id:o,enabled:r,changed:!0}},{configPath:s.configPath,reload:!1});return e&&(!e.ok||!e.changed)?e:n.success?e??{ok:!1,status:500,error:"mutation did not run"}:{ok:!1,status:500,error:n.error||"could not write agentx.json"}}export{i as setCronEnabled};
|
|
2
|
+
//# sourceMappingURL=set-enabled-YHD3IJJZ.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as p}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=tool-
|
|
1
|
+
import{b as p}from"./chunk-3XVTFNYM.js";import"./chunk-RKPAVWXF.js";import"./chunk-27P5NLTC.js";import"./chunk-JORXRF4E.js";import"./chunk-CRSXKQLZ.js";import"./chunk-FCPTN6NF.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-QIJLFPWE.js";var f=new Set(["cron","heartbeat","api","a2a","mesh","approvals"]);function u(t){return typeof t=="string"?t.trim():""}async function y(t,i){let c=i.fetch??fetch,d=i.daemonUrl.replace(/\/$/,""),s=(u(t.action)||"create").toLowerCase(),r=p(t,i.env??process.env);if(s==="status"){let o=u(t.id);if(!o)return"Error: `id` is required for status (the card id you got when you raised it).";try{let n=await c(`${d}/approvals/${encodeURIComponent(o)}`,{signal:AbortSignal.timeout(1e4)}),a=await n.json().catch(()=>({}));if(!n.ok)return`Error: ${a?.error||`HTTP ${n.status}`}`;let e=a.card;return r&&e.raised_by!==r.agentId?`Error: card "${o}" was raised by another agent.`:e.status==="pending"?`Card ${e.id} is still waiting for the operator. It expires ${e.expires}; then "${e.if_silent}" applies.`:e.status==="decided"?`Card ${e.id}: the operator said ${String(e.verdict).toUpperCase()}.${e.note?` Note: ${e.note}`:""}`:`Card ${e.id} expired unanswered; the default applied: ${e.outcome??e.if_silent}.`}catch(n){return`Error: couldn't reach the daemon (${n?.message??n}).`}}if(s!=="create")return`Error: unknown action "${s}". Use create or status.`;if(!r)return"Error: couldn't tell which agent you are. Pass callerAgentId.";let l=r.channel&&r.chatId&&!f.has(r.channel)?{channel:r.channel,chatId:r.chatId,...r.accountId?{accountId:r.accountId}:{}}:void 0,h={title:t.title,ask:t.ask,recommend:t.recommend,if_silent:t.if_silent,expires:t.expires,source:t.source,raised_by:r.agentId,...l?{reply:l}:{}};try{let o=await c(`${d}/approvals`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(h),signal:AbortSignal.timeout(1e4)}),n=await o.json().catch(()=>({}));if(!o.ok)return`Error: ${n?.error||`HTTP ${o.status}`}`;let a=n.card;return[`Decision card ${a.id} is in the operator's Approvals inbox.`,`If nobody answers by ${a.expires}, "${a.if_silent}" applies.`,"You will get a message with the result. Tell the requester it is waiting for approval; don't ask the operator again in chat."].join(" ")}catch(o){return`Error: couldn't reach the daemon (${o?.message??o}).`}}export{y as runApprovalTool};
|
|
2
|
+
//# sourceMappingURL=tool-MXJGLJZ5.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./chunk-VWTBHLMX.js";import{a as b}from"./chunk-2VQIPJH5.js";import{e as a}from"./chunk-E2BJVHBR.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import{a as c}from"./chunk-YQCOX4R3.js";import"./chunk-TFVUOC2C.js";import"./chunk-2GIDVZ4H.js";import"./chunk-NBGNPKAF.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-FX3D7YON.js";import"./chunk-QOYAX2FT.js";import"./chunk-SZJMS7K4.js";import"./chunk-7I7IEX4S.js";import"./chunk-S7TCVIET.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{b as WikiHub,a as WikiStore,c as agenticQuery};
|
|
2
|
+
//# sourceMappingURL=wiki-ZQLEYY24.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentix-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.60.0",
|
|
4
4
|
"description": "AI operations layer for small and medium businesses. Routes Telegram, WhatsApp, GitLab, GitHub, crons, webhooks, and mesh tasks to AI agents. Web wizard for operators, CLI for engineers. Self-hosted.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import AppKit
|
|
2
|
-
import WebKit
|
|
3
|
-
|
|
4
|
-
/// What the agent said, in a form you can read, click and copy.
|
|
5
|
-
///
|
|
6
|
-
/// Speech is lossy in one specific way that matters: a URL cannot be
|
|
7
|
-
/// spoken usefully, an image cannot be spoken at all, and a name you have
|
|
8
|
-
/// not seen written is a name you cannot act on. The spoken answer is
|
|
9
|
-
/// deliberately short and stripped of exactly those things — so without a
|
|
10
|
-
/// visual surface, everything worth keeping from a turn is the part that
|
|
11
|
-
/// gets thrown away.
|
|
12
|
-
///
|
|
13
|
-
/// Rich content arrives through the same `agentx:ui` directive Telegram
|
|
14
|
-
/// and WhatsApp already use, parsed server-side, so an agent has one way to
|
|
15
|
-
/// attach a link or a picture regardless of where it is speaking.
|
|
16
|
-
final class ResultCard: NSPanel {
|
|
17
|
-
// A web view, because agents write markdown — headings, bullets,
|
|
18
|
-
// fenced code, tables. An NSTextView shows that as a mess of asterisks
|
|
19
|
-
// and hashes, which defeats the card's only purpose: being MORE
|
|
20
|
-
// readable than the spoken answer, not less.
|
|
21
|
-
private let web = WKWebView()
|
|
22
|
-
private let links = NSStackView()
|
|
23
|
-
private let thumb = NSImageView()
|
|
24
|
-
|
|
25
|
-
/// The pill's frame on screen, which the card attaches to. Set by the app.
|
|
26
|
-
var anchor: (() -> NSRect)?
|
|
27
|
-
|
|
28
|
-
init() {
|
|
29
|
-
super.init(contentRect: NSRect(x: 0, y: 0, width: 380, height: 260),
|
|
30
|
-
styleMask: [.titled, .closable, .resizable, .utilityWindow, .nonactivatingPanel],
|
|
31
|
-
backing: .buffered, defer: false)
|
|
32
|
-
title = "Agent"
|
|
33
|
-
// Brand radius on the utility panel so it matches the pill it
|
|
34
|
-
// sits above rather than defaulting to the system's corner.
|
|
35
|
-
contentView?.wantsLayer = true
|
|
36
|
-
isFloatingPanel = true
|
|
37
|
-
level = .floating
|
|
38
|
-
hidesOnDeactivate = false
|
|
39
|
-
collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
|
|
40
|
-
|
|
41
|
-
let content = NSView(frame: contentRect(forFrameRect: frame))
|
|
42
|
-
content.autoresizingMask = [.width, .height]
|
|
43
|
-
|
|
44
|
-
// Selectable, so the whole point — copying a link or a name out —
|
|
45
|
-
// actually works. Editable would let a stray keystroke destroy the
|
|
46
|
-
// answer before it is read.
|
|
47
|
-
web.setValue(false, forKey: "drawsBackground")
|
|
48
|
-
web.navigationDelegate = self
|
|
49
|
-
web.autoresizingMask = [.width, .height]
|
|
50
|
-
content.addSubview(web)
|
|
51
|
-
|
|
52
|
-
thumb.imageScaling = .scaleProportionallyUpOrDown
|
|
53
|
-
thumb.isHidden = true
|
|
54
|
-
content.addSubview(thumb)
|
|
55
|
-
|
|
56
|
-
links.orientation = .horizontal
|
|
57
|
-
links.spacing = 8
|
|
58
|
-
links.edgeInsets = NSEdgeInsets(top: 6, left: 10, bottom: 6, right: 10)
|
|
59
|
-
content.addSubview(links)
|
|
60
|
-
|
|
61
|
-
contentView = content
|
|
62
|
-
layout(content)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
private func layout(_ content: NSView) {
|
|
66
|
-
let w = content.bounds.width, h = content.bounds.height
|
|
67
|
-
let linkH: CGFloat = links.arrangedSubviews.isEmpty ? 0 : 34
|
|
68
|
-
let imgH: CGFloat = thumb.isHidden ? 0 : 120
|
|
69
|
-
thumb.frame = NSRect(x: 10, y: h - imgH - 10, width: w - 20, height: imgH)
|
|
70
|
-
web.frame = NSRect(x: 0, y: linkH, width: w, height: h - linkH - imgH - (imgH > 0 ? 16 : 0))
|
|
71
|
-
links.frame = NSRect(x: 0, y: 0, width: w, height: linkH)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/// Does this turn have anything the spoken answer did not already
|
|
75
|
-
/// deliver?
|
|
76
|
-
///
|
|
77
|
-
/// The card opened on every turn, including "Ok." — a window with one
|
|
78
|
-
/// word in it, appearing and demanding dismissal, for an answer you had
|
|
79
|
-
/// already heard. A surface that adds nothing is worse than no surface:
|
|
80
|
-
/// it trains you to ignore it, so the turn where it DOES carry a link
|
|
81
|
-
/// gets ignored too.
|
|
82
|
-
///
|
|
83
|
-
/// Worth showing when there is rich content, a URL you could click, or
|
|
84
|
-
/// materially more written than was spoken. Otherwise the speech was
|
|
85
|
-
/// the whole answer.
|
|
86
|
-
static func isWorthShowing(spoken: String, written: String?, buttons: [(String, String)], imageURL: String?) -> Bool {
|
|
87
|
-
if !buttons.isEmpty || imageURL != nil { return true }
|
|
88
|
-
let text = (written?.isEmpty == false ? written! : spoken)
|
|
89
|
-
if text.range(of: #"https?://"#, options: .regularExpression) != nil { return true }
|
|
90
|
-
// Speech drops formatting, so written is often a little longer for
|
|
91
|
-
// the same content. Only a real difference counts.
|
|
92
|
-
let spokenLen = spoken.trimmingCharacters(in: .whitespacesAndNewlines).count
|
|
93
|
-
let writtenLen = text.trimmingCharacters(in: .whitespacesAndNewlines).count
|
|
94
|
-
if writtenLen > spokenLen + 80 { return true }
|
|
95
|
-
// Long enough that re-reading it beats re-hearing it.
|
|
96
|
-
return writtenLen > 280
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/// `spoken` is what was said; `written` is the fuller answer with the
|
|
100
|
-
/// URLs and formatting the spoken form had to drop.
|
|
101
|
-
@MainActor
|
|
102
|
-
func show(spoken: String, written: String?, buttons: [(String, String)], imageURL: String?) {
|
|
103
|
-
let source = (written?.isEmpty == false ? written! : spoken)
|
|
104
|
-
web.loadHTMLString(Markdown.page(Markdown.toHTML(source), css: Brand.cardCSS), baseURL: nil)
|
|
105
|
-
|
|
106
|
-
links.arrangedSubviews.forEach { links.removeArrangedSubview($0); $0.removeFromSuperview() }
|
|
107
|
-
for (label, url) in buttons.prefix(4) {
|
|
108
|
-
let b = NSButton(title: label, target: self, action: #selector(openLink(_:)))
|
|
109
|
-
b.bezelStyle = .rounded
|
|
110
|
-
b.toolTip = url
|
|
111
|
-
b.identifier = NSUserInterfaceItemIdentifier(url)
|
|
112
|
-
links.addArrangedSubview(b)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
thumb.isHidden = true
|
|
116
|
-
if let s = imageURL, let u = URL(string: s) {
|
|
117
|
-
// Off the main thread: a slow image must never stall the UI,
|
|
118
|
-
// and the card is useful without it.
|
|
119
|
-
URLSession.shared.dataTask(with: u) { [weak self] data, _, _ in
|
|
120
|
-
guard let data, let img = NSImage(data: data) else { return }
|
|
121
|
-
Task { @MainActor in
|
|
122
|
-
guard let self else { return }
|
|
123
|
-
self.thumb.image = img
|
|
124
|
-
self.thumb.isHidden = false
|
|
125
|
-
if let c = self.contentView { self.layout(c) }
|
|
126
|
-
}
|
|
127
|
-
}.resume()
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if let c = contentView { layout(c) }
|
|
131
|
-
slideIn()
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/// Where the card goes against the pill: above it when there is at
|
|
135
|
-
/// least as much room above as below, else below; right edges aligned.
|
|
136
|
-
@MainActor
|
|
137
|
-
private func placement() -> PillPlacement.Card? {
|
|
138
|
-
guard let pill = anchor?() else { return nil }
|
|
139
|
-
let screen = NSScreen.screens.first { $0.frame.intersects(pill) } ?? NSScreen.main
|
|
140
|
-
guard let visible = screen?.visibleFrame else { return nil }
|
|
141
|
-
return PillPlacement.card(size: frame.size, pill: pill, visible: visible)
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/// The pill moved: the open card moves with it, without animation.
|
|
145
|
-
@MainActor
|
|
146
|
-
func follow() {
|
|
147
|
-
guard isVisible, let spot = placement() else { return }
|
|
148
|
-
setFrameOrigin(spot.origin)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/// Slides out of the pill into place: up when it opens above, down
|
|
152
|
-
/// when below. With Reduce Motion it simply appears there.
|
|
153
|
-
@MainActor
|
|
154
|
-
private func slideIn() {
|
|
155
|
-
guard let spot = placement() else { alphaValue = 1; orderFrontRegardless(); return }
|
|
156
|
-
let target = spot.origin
|
|
157
|
-
let wasVisible = isVisible
|
|
158
|
-
guard !wasVisible, !NSWorkspace.shared.accessibilityDisplayShouldReduceMotion else {
|
|
159
|
-
setFrameOrigin(target)
|
|
160
|
-
alphaValue = 1
|
|
161
|
-
orderFrontRegardless()
|
|
162
|
-
return
|
|
163
|
-
}
|
|
164
|
-
setFrameOrigin(NSPoint(x: target.x, y: target.y + (spot.above ? -18 : 18)))
|
|
165
|
-
alphaValue = 0
|
|
166
|
-
orderFrontRegardless()
|
|
167
|
-
NSAnimationContext.runAnimationGroup { ctx in
|
|
168
|
-
ctx.duration = 0.28
|
|
169
|
-
ctx.timingFunction = Brand.ease
|
|
170
|
-
animator().setFrameOrigin(target)
|
|
171
|
-
animator().alphaValue = 1
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
@objc private func openLink(_ sender: NSButton) {
|
|
176
|
-
guard let s = sender.identifier?.rawValue, let u = URL(string: s) else { return }
|
|
177
|
-
NSWorkspace.shared.open(u)
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
override var canBecomeKey: Bool { true }
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
extension ResultCard: WKNavigationDelegate {
|
|
184
|
-
/// Links open in the real browser. A 380-point utility panel is not a
|
|
185
|
-
/// place to read a web page, and navigating away would replace the
|
|
186
|
-
/// answer the card exists to hold.
|
|
187
|
-
func webView(_ webView: WKWebView,
|
|
188
|
-
decidePolicyFor navigationAction: WKNavigationAction,
|
|
189
|
-
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
|
|
190
|
-
if navigationAction.navigationType == .linkActivated,
|
|
191
|
-
let url = navigationAction.request.url {
|
|
192
|
-
NSWorkspace.shared.open(url)
|
|
193
|
-
decisionHandler(.cancel)
|
|
194
|
-
return
|
|
195
|
-
}
|
|
196
|
-
decisionHandler(.allow)
|
|
197
|
-
}
|
|
198
|
-
}
|