@vforsh/argus 0.1.18 → 0.1.19

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.
Files changed (84) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/argus.js +2802 -564
  3. package/dist/cli/plugins/pluginHost.d.ts.map +1 -1
  4. package/dist/cli/plugins/pluginHost.js +1 -0
  5. package/dist/cli/plugins/pluginHost.js.map +1 -1
  6. package/dist/cli/register/extensionCommands.d.ts.map +1 -1
  7. package/dist/cli/register/extensionCommands.js +103 -3
  8. package/dist/cli/register/extensionCommands.js.map +1 -1
  9. package/dist/cli/register/index.d.ts.map +1 -1
  10. package/dist/cli/register/index.js +6 -0
  11. package/dist/cli/register/index.js.map +1 -1
  12. package/dist/cli/register/recordCommands.d.ts +3 -0
  13. package/dist/cli/register/recordCommands.d.ts.map +1 -0
  14. package/dist/cli/register/recordCommands.js +90 -0
  15. package/dist/cli/register/recordCommands.js.map +1 -0
  16. package/dist/cli/register/skillCommands.d.ts +3 -0
  17. package/dist/cli/register/skillCommands.d.ts.map +1 -0
  18. package/dist/cli/register/skillCommands.js +13 -0
  19. package/dist/cli/register/skillCommands.js.map +1 -0
  20. package/dist/commands/domDrag.d.ts +21 -0
  21. package/dist/commands/domDrag.d.ts.map +1 -0
  22. package/dist/commands/domDrag.js +179 -0
  23. package/dist/commands/domDrag.js.map +1 -0
  24. package/dist/commands/extension/attach.d.ts +2 -0
  25. package/dist/commands/extension/attach.d.ts.map +1 -1
  26. package/dist/commands/extension/attach.js +31 -6
  27. package/dist/commands/extension/attach.js.map +1 -1
  28. package/dist/commands/extension/doctor.d.ts +6 -0
  29. package/dist/commands/extension/doctor.d.ts.map +1 -0
  30. package/dist/commands/extension/doctor.js +185 -0
  31. package/dist/commands/extension/doctor.js.map +1 -0
  32. package/dist/commands/extension/select.d.ts +7 -0
  33. package/dist/commands/extension/select.d.ts.map +1 -0
  34. package/dist/commands/extension/select.js +73 -0
  35. package/dist/commands/extension/select.js.map +1 -0
  36. package/dist/commands/extension/show.d.ts +4 -0
  37. package/dist/commands/extension/show.d.ts.map +1 -1
  38. package/dist/commands/extension/show.js +12 -88
  39. package/dist/commands/extension/show.js.map +1 -1
  40. package/dist/commands/extension/tabAttach.d.ts +28 -0
  41. package/dist/commands/extension/tabAttach.d.ts.map +1 -0
  42. package/dist/commands/extension/tabAttach.js +106 -0
  43. package/dist/commands/extension/tabAttach.js.map +1 -0
  44. package/dist/commands/extension/tabWatcher.d.ts +22 -0
  45. package/dist/commands/extension/tabWatcher.d.ts.map +1 -0
  46. package/dist/commands/extension/tabWatcher.js +89 -0
  47. package/dist/commands/extension/tabWatcher.js.map +1 -0
  48. package/dist/commands/extension/targetSelection.d.ts +62 -0
  49. package/dist/commands/extension/targetSelection.d.ts.map +1 -0
  50. package/dist/commands/extension/targetSelection.js +210 -0
  51. package/dist/commands/extension/targetSelection.js.map +1 -0
  52. package/dist/commands/extension/targets.d.ts +7 -0
  53. package/dist/commands/extension/targets.d.ts.map +1 -0
  54. package/dist/commands/extension/targets.js +73 -0
  55. package/dist/commands/extension/targets.js.map +1 -0
  56. package/dist/commands/extension/use.d.ts +13 -0
  57. package/dist/commands/extension/use.d.ts.map +1 -0
  58. package/dist/commands/extension/use.js +66 -0
  59. package/dist/commands/extension/use.js.map +1 -0
  60. package/dist/commands/record.d.ts +35 -0
  61. package/dist/commands/record.d.ts.map +1 -0
  62. package/dist/commands/record.js +210 -0
  63. package/dist/commands/record.js.map +1 -0
  64. package/dist/commands/skill.d.ts +6 -0
  65. package/dist/commands/skill.d.ts.map +1 -0
  66. package/dist/commands/skill.js +42 -0
  67. package/dist/commands/skill.js.map +1 -0
  68. package/dist/commands/watcherNativeHost.js +48 -1
  69. package/dist/commands/watcherNativeHost.js.map +1 -1
  70. package/dist/skill/argus/SKILL.md +200 -0
  71. package/dist/skill/argus/reference/CAPTURE.md +77 -0
  72. package/dist/skill/argus/reference/DIALOG.md +31 -0
  73. package/dist/skill/argus/reference/EVAL.md +137 -0
  74. package/dist/skill/argus/reference/EXTENSION.md +38 -0
  75. package/dist/skill/argus/reference/EXTENSION_IFRAME_EVAL.md +58 -0
  76. package/dist/skill/argus/reference/IFRAMES.md +46 -0
  77. package/dist/skill/argus/reference/INJECT.md +145 -0
  78. package/dist/skill/argus/reference/INSPECT.md +175 -0
  79. package/dist/skill/argus/reference/NET.md +108 -0
  80. package/dist/skill/argus/reference/PLUGINS.md +172 -0
  81. package/dist/skill/argus/reference/RUNTIME_CODE.md +42 -0
  82. package/dist/skill/argus/reference/START.md +120 -0
  83. package/dist/skill/argus/start-watcher.ts +108 -0
  84. package/package.json +2 -2
@@ -0,0 +1,73 @@
1
+ import { createOutput } from '../../output/io.js';
2
+ import { resolveWatcher } from '../../watchers/resolveWatcher.js';
3
+ import { formatWatcherLine } from '../../output/format.js';
4
+ import { hasTabSelector } from './tabSelection.js';
5
+ import { resolveOrAttachExtensionTabWatcher, writeFailure } from './tabWatcher.js';
6
+ import { fetchExtensionTargets, formatExtensionTargetLine, renderExtensionTargetTree } from './targetSelection.js';
7
+ export const runExtensionTargets = async (id, options) => {
8
+ const output = createOutput(options);
9
+ if (id && hasTabSelector(options)) {
10
+ writeFailure(output, options, 'Use either watcher id or --tab/--url/--title, not both.', 2);
11
+ return;
12
+ }
13
+ const resolved = id
14
+ ? await resolveExistingExtensionWatcher(id, options)
15
+ : await resolveOrAttachExtensionTabWatcher(options, output, {
16
+ missingSelectorReason: 'Specify a watcher id, --tab <tabId>, --url <substring>, or --title <substring>.',
17
+ });
18
+ if (!resolved) {
19
+ return;
20
+ }
21
+ const targets = await fetchExtensionTargets(resolved.watcher);
22
+ if (!targets.ok) {
23
+ writeFailure(output, options, targets.error, 1);
24
+ return;
25
+ }
26
+ const filteredTargets = filterTargets(targets.targets, options.type);
27
+ if (options.json) {
28
+ output.writeJson({ ok: true, watcherId: resolved.watcher.id, tab: resolved.tab, targets: filteredTargets });
29
+ return;
30
+ }
31
+ output.writeHuman(`Extension targets via ${resolved.watcher.id}`);
32
+ if (filteredTargets.length === 0) {
33
+ output.writeHuman(' (none)');
34
+ return;
35
+ }
36
+ if (options.tree) {
37
+ renderExtensionTargetTree(filteredTargets, output);
38
+ return;
39
+ }
40
+ for (const target of filteredTargets) {
41
+ output.writeHuman(` ${formatExtensionTargetLine(target)}`);
42
+ }
43
+ };
44
+ const resolveExistingExtensionWatcher = async (id, options) => {
45
+ const output = createOutput(options);
46
+ const resolved = await resolveWatcher({ id });
47
+ if (!resolved.ok) {
48
+ writeResolveFailure(output, options, resolved);
49
+ return null;
50
+ }
51
+ if (resolved.watcher.source !== 'extension') {
52
+ writeFailure(output, options, `Watcher ${resolved.watcher.id} is not extension-backed.`, 2);
53
+ return null;
54
+ }
55
+ return { watcher: resolved.watcher, tab: null };
56
+ };
57
+ const filterTargets = (targets, type) => {
58
+ const targetType = type?.trim();
59
+ return targetType ? targets.filter((target) => target.type === targetType) : targets;
60
+ };
61
+ const writeResolveFailure = (output, options, resolved) => {
62
+ if (options.json) {
63
+ output.writeJson({ ok: false, error: resolved.error, candidates: resolved.candidates?.map((watcher) => watcher.id) ?? [] });
64
+ }
65
+ else {
66
+ output.writeWarn(resolved.error);
67
+ for (const watcher of resolved.candidates ?? []) {
68
+ output.writeWarn(formatWatcherLine(watcher));
69
+ }
70
+ }
71
+ process.exitCode = resolved.exitCode;
72
+ };
73
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../../src/commands/extension/targets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type ExtensionUseOptions = {
2
+ tab?: string | number;
3
+ url?: string;
4
+ title?: string;
5
+ as?: string;
6
+ iframe?: string;
7
+ iframeUrl?: string;
8
+ iframeTitle?: string;
9
+ show?: boolean;
10
+ json?: boolean;
11
+ };
12
+ export declare const runExtensionUse: (options: ExtensionUseOptions) => Promise<void>;
13
+ //# sourceMappingURL=use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../../src/commands/extension/use.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,mBAAmB,GAAG;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAED,eAAO,MAAM,eAAe,GAAU,SAAS,mBAAmB,KAAG,OAAO,CAAC,IAAI,CA2BhF,CAAA"}
@@ -0,0 +1,66 @@
1
+ import { createOutput } from '../../output/io.js';
2
+ import { formatExtensionTabLine } from './tabSelection.js';
3
+ import { showWatcher } from './show.js';
4
+ import { resolveOrAttachExtensionTabWatcher, writeFailure } from './tabWatcher.js';
5
+ import { fetchExtensionTargets, hasExtensionTargetSelector, resolveExtensionTarget, selectExtensionTarget, waitForSelectedTarget, } from './targetSelection.js';
6
+ export const runExtensionUse = async (options) => {
7
+ const output = createOutput(options);
8
+ const resolved = await resolveOrAttachExtensionTabWatcher(options, output, {
9
+ missingSelectorReason: 'Specify --tab <tabId>, --url <substring>, or --title <substring>.',
10
+ });
11
+ if (!resolved) {
12
+ return;
13
+ }
14
+ const selectedTarget = await selectTargetIfRequested(resolved.watcher, options, output);
15
+ if (selectedTarget === false)
16
+ return;
17
+ if (options.show) {
18
+ await showWatcher(resolved.watcher, resolved.tab, output, options);
19
+ return;
20
+ }
21
+ if (options.json) {
22
+ output.writeJson({ ok: true, watcherId: resolved.watcher.id, tab: resolved.tab, status: resolved.status, selectedTarget });
23
+ return;
24
+ }
25
+ output.writeHuman(resolved.watcher.id);
26
+ output.writeHuman(` ${formatExtensionTabLine(resolved.tab)}`);
27
+ if (selectedTarget) {
28
+ output.writeHuman(` selected ${selectedTarget.id} ${selectedTarget.title || selectedTarget.url}`);
29
+ }
30
+ };
31
+ const selectTargetIfRequested = async (watcher, options, output) => {
32
+ if (!hasExtensionTargetSelector(options)) {
33
+ return null;
34
+ }
35
+ const targets = await fetchExtensionTargets(watcher);
36
+ if (!targets.ok) {
37
+ writeFailure(output, options, targets.error, 1);
38
+ return false;
39
+ }
40
+ const target = resolveExtensionTarget(targets.targets, options);
41
+ if (!target.ok) {
42
+ if (options.json) {
43
+ output.writeJson({ ok: false, error: target.reason, matches: target.matches ?? [] });
44
+ }
45
+ else {
46
+ output.writeWarn(target.reason);
47
+ for (const match of target.matches ?? []) {
48
+ output.writeWarn(` ${match.id} ${match.title || match.url}`);
49
+ }
50
+ }
51
+ process.exitCode = target.exitCode;
52
+ return false;
53
+ }
54
+ const selected = await selectExtensionTarget(watcher, target.target);
55
+ if (!selected.ok) {
56
+ writeFailure(output, options, selected.error, 1);
57
+ return false;
58
+ }
59
+ const ready = await waitForSelectedTarget(watcher, target.target);
60
+ if (!ready.ok) {
61
+ writeFailure(output, options, ready.error, 1);
62
+ return false;
63
+ }
64
+ return ready.target;
65
+ };
66
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../../src/commands/extension/use.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { RecordClipRegion, RecordFormat } from '@vforsh/argus-core';
2
+ export type RecordOptions = {
3
+ json?: boolean;
4
+ duration?: string;
5
+ out?: string;
6
+ selector?: string;
7
+ clip?: string;
8
+ fps?: string;
9
+ format?: string;
10
+ };
11
+ export type RecordStartOptions = Omit<RecordOptions, 'duration'>;
12
+ export type RecordStopOptions = {
13
+ json?: boolean;
14
+ recordId?: string;
15
+ out?: string;
16
+ };
17
+ export declare const runRecord: import("../cli/defineWatcherCommand.js").WatcherCommandRunner<[], RecordOptions>;
18
+ export declare const runRecordStart: import("../cli/defineWatcherCommand.js").WatcherCommandRunner<[], RecordStartOptions>;
19
+ export declare const runRecordStop: import("../cli/defineWatcherCommand.js").WatcherCommandRunner<[], RecordStopOptions>;
20
+ export declare const parseRecordFpsValue: (value: string | undefined) => {
21
+ value?: number;
22
+ error?: string;
23
+ };
24
+ export declare const parseRecordClipValue: (value: string | undefined) => {
25
+ value?: RecordClipRegion;
26
+ error?: string;
27
+ };
28
+ export declare const validateRecordOutFile: (outFile: string | undefined) => string | null;
29
+ export declare const parseRecordFormatValue: (value: string | undefined) => {
30
+ value?: RecordFormat;
31
+ error?: string;
32
+ };
33
+ export declare const inferRecordFormatFromOutFile: (outFile: string | undefined) => RecordFormat | undefined;
34
+ export declare const validateRecordOutFileForFormat: (outFile: string | undefined, format: RecordFormat) => string | null;
35
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/commands/record.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAA2D,MAAM,oBAAoB,CAAA;AAUjI,MAAM,MAAM,aAAa,GAAG;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;AAEhE,MAAM,MAAM,iBAAiB,GAAG;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,eAAO,MAAM,SAAS,kFAKpB,CAAA;AAEF,eAAO,MAAM,cAAc,uFAOzB,CAAA;AAEF,eAAO,MAAM,aAAa,sFAKxB,CAAA;AA6HF,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAW/F,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAgB1G,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,IAM5E,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG;IAAE,KAAK,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAWxG,CAAA;AAED,eAAO,MAAM,4BAA4B,GAAI,SAAS,MAAM,GAAG,SAAS,KAAG,YAAY,GAAG,SAKzF,CAAA;AAED,eAAO,MAAM,8BAA8B,GAAI,SAAS,MAAM,GAAG,SAAS,EAAE,QAAQ,YAAY,KAAG,MAAM,GAAG,IAQ3G,CAAA"}
@@ -0,0 +1,210 @@
1
+ import path from 'node:path';
2
+ import { RECORD_FORMATS } from '@vforsh/argus-core';
3
+ import { defineWatcherCommand } from '../cli/defineWatcherCommand.js';
4
+ import { parseDurationMs } from '../time.js';
5
+ const RECORD_STOP_TIMEOUT_MS = 60_000;
6
+ const RECORD_START_TIMEOUT_MS = 30_000;
7
+ const RECORD_ENCODER_GRACE_MS = 30_000;
8
+ export const runRecord = defineWatcherCommand({
9
+ build: (_args, options, output) => buildRecordPlan(options, output),
10
+ formatHuman: (response, { output }) => {
11
+ output.writeHuman(`Recording saved: ${response.outFile} (${response.frameCount} frames, ${formatDurationMs(response.durationMs)})`);
12
+ },
13
+ });
14
+ export const runRecordStart = defineWatcherCommand({
15
+ build: (_args, options, output) => buildRecordStartPlan(options, output),
16
+ formatHuman: (response, { output }) => {
17
+ output.writeHuman(`Recording started: ${response.recordId}`);
18
+ output.writeHuman(`Session: ${response.sessionName}`);
19
+ output.writeHuman(`Output: ${response.outFile}`);
20
+ },
21
+ });
22
+ export const runRecordStop = defineWatcherCommand({
23
+ build: (_args, options, output) => buildRecordStopPlan(options, output),
24
+ formatHuman: (response, { output }) => {
25
+ output.writeHuman(`Recording saved: ${response.outFile} (${response.frameCount} frames, ${formatDurationMs(response.durationMs)})`);
26
+ },
27
+ });
28
+ const buildRecordPlan = (options, output) => {
29
+ const durationMs = parseRecordDuration(options.duration, output);
30
+ if (durationMs == null) {
31
+ return null;
32
+ }
33
+ const body = buildRecordBody(options, output);
34
+ if (!body) {
35
+ return null;
36
+ }
37
+ return {
38
+ path: '/record',
39
+ method: 'POST',
40
+ body: {
41
+ ...body,
42
+ durationMs,
43
+ },
44
+ timeoutMs: durationMs + RECORD_ENCODER_GRACE_MS,
45
+ };
46
+ };
47
+ const buildRecordStartPlan = (options, output) => {
48
+ const body = buildRecordBody(options, output);
49
+ if (!body) {
50
+ return null;
51
+ }
52
+ return {
53
+ path: '/record/start',
54
+ method: 'POST',
55
+ body,
56
+ timeoutMs: RECORD_START_TIMEOUT_MS,
57
+ };
58
+ };
59
+ const buildRecordStopPlan = (options, output) => {
60
+ const outputError = validateRecordOutFile(options.out);
61
+ if (outputError) {
62
+ writeRecordOptionError(output, outputError);
63
+ return null;
64
+ }
65
+ return {
66
+ path: '/record/stop',
67
+ method: 'POST',
68
+ body: {
69
+ recordId: normalizeString(options.recordId),
70
+ outFile: options.out,
71
+ },
72
+ timeoutMs: RECORD_STOP_TIMEOUT_MS,
73
+ };
74
+ };
75
+ const buildRecordBody = (options, output) => {
76
+ const clip = parseRecordClip(options.clip, output);
77
+ if (clip === null) {
78
+ return null;
79
+ }
80
+ const selector = normalizeString(options.selector);
81
+ if (selector && clip) {
82
+ writeRecordOptionError(output, 'Cannot use both --selector and --clip');
83
+ return null;
84
+ }
85
+ const fps = parseRecordFps(options.fps, output);
86
+ if (fps === null) {
87
+ return null;
88
+ }
89
+ const format = parseRecordFormat(options.format, options.out, output);
90
+ if (!format) {
91
+ return null;
92
+ }
93
+ return {
94
+ outFile: options.out,
95
+ selector,
96
+ clip,
97
+ fps,
98
+ format,
99
+ };
100
+ };
101
+ const parseRecordDuration = (value, output) => {
102
+ if (!value) {
103
+ writeRecordOptionError(output, 'Missing --duration value');
104
+ return null;
105
+ }
106
+ const parsed = parseDurationMs(value);
107
+ if (!parsed || parsed <= 0) {
108
+ writeRecordOptionError(output, `Invalid --duration value: ${value}`);
109
+ return null;
110
+ }
111
+ return parsed;
112
+ };
113
+ const parseRecordFps = (value, output) => {
114
+ const parsed = parseRecordFpsValue(value);
115
+ if (parsed.error) {
116
+ writeRecordOptionError(output, parsed.error);
117
+ return null;
118
+ }
119
+ return parsed.value;
120
+ };
121
+ const parseRecordClip = (value, output) => {
122
+ const parsed = parseRecordClipValue(value);
123
+ if (parsed.error) {
124
+ writeRecordOptionError(output, parsed.error);
125
+ return null;
126
+ }
127
+ return parsed.value;
128
+ };
129
+ export const parseRecordFpsValue = (value) => {
130
+ if (value == null) {
131
+ return {};
132
+ }
133
+ const parsed = Number(value);
134
+ if (!Number.isFinite(parsed) || parsed < 1 || parsed > 60) {
135
+ return { error: 'Invalid --fps value: expected a number from 1 to 60.' };
136
+ }
137
+ return { value: Math.round(parsed) };
138
+ };
139
+ export const parseRecordClipValue = (value) => {
140
+ if (value == null) {
141
+ return {};
142
+ }
143
+ const parts = value.split(',').map((part) => part.trim());
144
+ if (parts.length !== 4 || parts.some((part) => !part)) {
145
+ return { error: 'Invalid --clip value: expected x,y,width,height.' };
146
+ }
147
+ const [x, y, width, height] = parts.map(Number);
148
+ if (![x, y, width, height].every(Number.isFinite) || width <= 0 || height <= 0) {
149
+ return { error: 'Invalid --clip value: x and y must be finite numbers; width and height must be > 0.' };
150
+ }
151
+ return { value: { x, y, width, height } };
152
+ };
153
+ export const validateRecordOutFile = (outFile) => {
154
+ const ext = path.extname(outFile?.trim() ?? '').toLowerCase();
155
+ if (!ext || ext === '.mp4' || ext === '.webm') {
156
+ return null;
157
+ }
158
+ return 'Recording output must use .mp4 or .webm when an extension is provided.';
159
+ };
160
+ export const parseRecordFormatValue = (value) => {
161
+ if (value == null) {
162
+ return {};
163
+ }
164
+ const normalized = value.trim().toLowerCase();
165
+ if (isRecordFormat(normalized)) {
166
+ return { value: normalized };
167
+ }
168
+ return { error: `Invalid --format value: expected one of ${RECORD_FORMATS.join(', ')}.` };
169
+ };
170
+ export const inferRecordFormatFromOutFile = (outFile) => {
171
+ const ext = path.extname(outFile?.trim() ?? '').toLowerCase();
172
+ if (ext === '.mp4')
173
+ return 'mp4';
174
+ if (ext === '.webm')
175
+ return 'webm';
176
+ return undefined;
177
+ };
178
+ export const validateRecordOutFileForFormat = (outFile, format) => {
179
+ const outputError = validateRecordOutFile(outFile);
180
+ if (outputError) {
181
+ return outputError;
182
+ }
183
+ const inferred = inferRecordFormatFromOutFile(outFile);
184
+ return inferred && inferred !== format ? `Output extension .${inferred} does not match --format ${format}.` : null;
185
+ };
186
+ const parseRecordFormat = (value, outFile, output) => {
187
+ const parsed = parseRecordFormatValue(value);
188
+ if (parsed.error) {
189
+ writeRecordOptionError(output, parsed.error);
190
+ return null;
191
+ }
192
+ const format = parsed.value ?? inferRecordFormatFromOutFile(outFile) ?? 'mp4';
193
+ const outputError = validateRecordOutFileForFormat(outFile, format);
194
+ if (outputError) {
195
+ writeRecordOptionError(output, outputError);
196
+ return null;
197
+ }
198
+ return format;
199
+ };
200
+ const isRecordFormat = (value) => RECORD_FORMATS.includes(value);
201
+ const normalizeString = (value) => {
202
+ const trimmed = value?.trim();
203
+ return trimmed ? trimmed : undefined;
204
+ };
205
+ const writeRecordOptionError = (output, message) => {
206
+ output.writeWarn(message);
207
+ process.exitCode = 2;
208
+ };
209
+ const formatDurationMs = (ms) => `${(ms / 1000).toFixed(3)}s`;
210
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/commands/record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type SkillOptions = {
2
+ json?: boolean;
3
+ };
4
+ export declare const runSkill: (options: SkillOptions) => void;
5
+ export declare const resolveArgusSkillPath: () => string | null;
6
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAA;CACd,CAAA;AAID,eAAO,MAAM,QAAQ,GAAI,SAAS,YAAY,KAAG,IAqBhD,CAAA;AAED,eAAO,MAAM,qBAAqB,QAAO,MAAM,GAAG,IAOjD,CAAA"}
@@ -0,0 +1,42 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { createOutput } from '../output/io.js';
5
+ const SKILL_PATH_PARTS = ['skill', 'argus', 'SKILL.md'];
6
+ export const runSkill = (options) => {
7
+ const output = createOutput(options);
8
+ const skillPath = resolveArgusSkillPath();
9
+ if (!skillPath) {
10
+ const message = `Argus skill file not found. Checked:\n${resolveArgusSkillCandidates().join('\n')}`;
11
+ if (options.json) {
12
+ output.writeJson({ ok: false, error: { message } });
13
+ }
14
+ else {
15
+ console.error(message);
16
+ }
17
+ process.exitCode = 2;
18
+ return;
19
+ }
20
+ if (options.json) {
21
+ output.writeJson({ ok: true, path: skillPath });
22
+ return;
23
+ }
24
+ output.writeHuman(skillPath);
25
+ };
26
+ export const resolveArgusSkillPath = () => {
27
+ for (const candidate of resolveArgusSkillCandidates()) {
28
+ if (fs.existsSync(candidate)) {
29
+ return candidate;
30
+ }
31
+ }
32
+ return null;
33
+ };
34
+ const resolveArgusSkillCandidates = () => {
35
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
36
+ return [
37
+ path.resolve(moduleDir, ...SKILL_PATH_PARTS),
38
+ path.resolve(moduleDir, '..', ...SKILL_PATH_PARTS),
39
+ path.resolve(moduleDir, '..', '..', '..', '..', ...SKILL_PATH_PARTS),
40
+ ];
41
+ };
42
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAM9C,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAU,CAAA;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAqB,EAAQ,EAAE;IACvD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAA;IAEzC,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,yCAAyC,2BAA2B,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;QACnG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QACpD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACP,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;QAC/C,OAAM;IACP,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;AAC7B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAkB,EAAE;IACxD,KAAK,MAAM,SAAS,IAAI,2BAA2B,EAAE,EAAE,CAAC;QACvD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAA;QACjB,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,2BAA2B,GAAG,GAAa,EAAE;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAE9D,OAAO;QACN,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,gBAAgB,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC;KACpE,CAAA;AACF,CAAC,CAAA"}
@@ -7,7 +7,6 @@
7
7
  */
8
8
  import { startWatcher } from '@vforsh/argus-watcher';
9
9
  export const runWatcherNativeHost = async (options) => {
10
- const watcherId = options.id?.trim() || 'extension';
11
10
  const role = options.role?.trim() || 'tab';
12
11
  if (role !== 'tab' && role !== 'control') {
13
12
  console.error(`Invalid native host role: ${role}. Expected "tab" or "control".`);
@@ -15,6 +14,7 @@ export const runWatcherNativeHost = async (options) => {
15
14
  }
16
15
  let handle;
17
16
  try {
17
+ const watcherId = role === 'tab' ? await resolveTabWatcherId(options.id?.trim()) : options.id?.trim() || 'extension';
18
18
  handle = await startWatcher({
19
19
  id: watcherId,
20
20
  source: 'extension',
@@ -60,4 +60,51 @@ export const runWatcherNativeHost = async (options) => {
60
60
  // Keep process running - Native Messaging will handle stdin/stdout
61
61
  await new Promise(() => { });
62
62
  };
63
+ const resolveTabWatcherId = async (fallback) => {
64
+ const message = await new Promise((resolve, reject) => {
65
+ let buffer = Buffer.alloc(0);
66
+ const timeout = setTimeout(() => {
67
+ cleanup();
68
+ reject(new Error('Timed out waiting for extension tab watcher init'));
69
+ }, 3000);
70
+ const cleanup = () => {
71
+ clearTimeout(timeout);
72
+ process.stdin.removeListener('data', onData);
73
+ process.stdin.removeListener('end', onDisconnect);
74
+ process.stdin.removeListener('close', onDisconnect);
75
+ process.stdin.pause();
76
+ };
77
+ const onDisconnect = () => {
78
+ cleanup();
79
+ reject(new Error('Extension disconnected before tab watcher init'));
80
+ };
81
+ const onData = (chunk) => {
82
+ buffer = Buffer.concat([buffer, chunk]);
83
+ if (buffer.length < 4) {
84
+ return;
85
+ }
86
+ const messageLength = buffer.readUInt32LE(0);
87
+ if (buffer.length < 4 + messageLength) {
88
+ return;
89
+ }
90
+ const messageBytes = buffer.subarray(4, 4 + messageLength);
91
+ cleanup();
92
+ try {
93
+ resolve(JSON.parse(messageBytes.toString('utf8')));
94
+ }
95
+ catch (error) {
96
+ reject(error instanceof Error ? error : new Error(String(error)));
97
+ }
98
+ };
99
+ process.stdin.setRawMode?.(true);
100
+ process.stdin.resume();
101
+ process.stdin.on('data', onData);
102
+ process.stdin.on('end', onDisconnect);
103
+ process.stdin.on('close', onDisconnect);
104
+ });
105
+ if (message.type !== 'init_tab_watcher') {
106
+ throw new Error(`Expected init_tab_watcher, received ${message.type ?? 'unknown message'}`);
107
+ }
108
+ return message.watcherId?.trim() || fallback || 'extension';
109
+ };
63
110
  //# sourceMappingURL=watcherNativeHost.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watcherNativeHost.js","sourceRoot":"","sources":["../../src/commands/watcherNativeHost.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAA;AAQxE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAA0B,EAAiB,EAAE;IACvF,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,WAAW,CAAA;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,CAAA;IAC1C,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,6BAA6B,IAAI,gCAAgC,CAAC,CAAA;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,IAAI,MAAqB,CAAA;IACzB,IAAI,CAAC;QACJ,MAAM,GAAG,MAAM,YAAY,CAAC;YAC3B,EAAE,EAAE,SAAS;YACb,MAAM,EAAE,WAAW;YACnB,aAAa,EAAE,IAAI;YACnB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;YACtB,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,KAAK,EAAE;SAC1C,CAAC,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,6DAA6D;QAC7D,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,wEAAwE;IACxE,OAAO,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,IAAI,SAAS,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAE/G,MAAM,OAAO,GAAG,KAAK,IAAmB,EAAE;QACzC,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC,CAAA;IACD,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC3B,IAAI,YAAY,EAAE,CAAC;YAClB,OAAM;QACP,CAAC;QACD,YAAY,GAAG,IAAI,CAAA;QACnB,KAAK,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAA;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACzB,QAAQ,EAAE,CAAA;IACX,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QAC1B,QAAQ,EAAE,CAAA;IACX,CAAC,CAAC,CAAA;IAEF,gFAAgF;IAChF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAEnC,mEAAmE;IACnE,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAC5B,CAAC,CAAA"}
1
+ {"version":3,"file":"watcherNativeHost.js","sourceRoot":"","sources":["../../src/commands/watcherNativeHost.ts"],"names":[],"mappings":"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"}