copilot-operator 0.1.34 → 0.1.35
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/src/api/operator.service.js +30 -1
- package/dist/src/cli.js +11 -8
- package/dist/src/orchestrator/taskRunner.js +29 -1
- package/dist/src/plan/systemGuide.js +24 -0
- package/dist/src/transport/copilotTransport.js +47 -18
- package/dist/src/transport/locators.js +7 -2
- package/dist/src/transport/modelMatch.js +12 -1
- package/dist/web/404.html +2 -2
- package/dist/web/_next/static/chunks/867-562abd8d5f8c3dc8.js +1 -0
- package/dist/web/_next/static/chunks/app/layout-df7bec3acad93f15.js +1 -0
- package/dist/web/appearance.html +2 -2
- package/dist/web/appearance.txt +10 -10
- package/dist/web/defaults.html +2 -2
- package/dist/web/defaults.txt +10 -10
- package/dist/web/history.html +2 -2
- package/dist/web/history.txt +10 -10
- package/dist/web/import.html +2 -2
- package/dist/web/import.txt +10 -10
- package/dist/web/index.html +2 -2
- package/dist/web/index.txt +10 -10
- package/dist/web/level1.html +2 -2
- package/dist/web/level1.txt +10 -10
- package/dist/web/presets.html +2 -2
- package/dist/web/presets.txt +10 -10
- package/dist/web/sessions/view.html +2 -2
- package/dist/web/sessions/view.txt +10 -10
- package/dist/web/system.html +2 -2
- package/dist/web/system.txt +10 -10
- package/package.json +2 -1
- package/dist/web/_next/static/chunks/867-dfaaa8047cbf2fc2.js +0 -1
- package/dist/web/_next/static/chunks/app/layout-3efbb282292ccc38.js +0 -1
- /package/dist/web/_next/static/{pfa56tOBq6o-WBQZnyUn2 → k4MMPCGaEGVTHKLfTmYlf}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{pfa56tOBq6o-WBQZnyUn2 → k4MMPCGaEGVTHKLfTmYlf}/_ssgManifest.js +0 -0
|
@@ -1102,6 +1102,7 @@ let OperatorService = class OperatorService {
|
|
|
1102
1102
|
// The page is the source of the model names: Settings and the saved list follow it (see `ModelHooks`).
|
|
1103
1103
|
models: {
|
|
1104
1104
|
locate: async (name) => (await this.store.getModels())?.options.find((o) => sameModel(o.name, name))?.locator,
|
|
1105
|
+
askHelp: (ask) => this.askModelHelp(ask, controller.signal),
|
|
1105
1106
|
renamedDefault: async (which, from, to) => {
|
|
1106
1107
|
const now = (await this.settings.load()).copilot;
|
|
1107
1108
|
if (which === 'model' && (now.defaultModel ?? '').trim() === from)
|
|
@@ -1866,6 +1867,34 @@ let OperatorService = class OperatorService {
|
|
|
1866
1867
|
};
|
|
1867
1868
|
}
|
|
1868
1869
|
// --- approvals ------------------------------------------------------------------------
|
|
1870
|
+
/**
|
|
1871
|
+
* Asks the operator to choose the model in the Copilot window, when the runner could not (operator's
|
|
1872
|
+
* request, 2026-10-06). It waits on the approvals card like a held step, in every mode, until it is
|
|
1873
|
+
* answered or the run is stopped.
|
|
1874
|
+
*/
|
|
1875
|
+
askModelHelp(ask, signal) {
|
|
1876
|
+
return new Promise((resolveAnswer) => {
|
|
1877
|
+
if (signal.aborted) {
|
|
1878
|
+
resolveAnswer('stop');
|
|
1879
|
+
return;
|
|
1880
|
+
}
|
|
1881
|
+
const approval = {
|
|
1882
|
+
id: newId('a-'),
|
|
1883
|
+
sessionId: ask.sessionId,
|
|
1884
|
+
taskId: '',
|
|
1885
|
+
stepId: 0,
|
|
1886
|
+
description: `Choose "${ask.asked}" in the Copilot window`,
|
|
1887
|
+
createdAt: new Date().toISOString(),
|
|
1888
|
+
model: { asked: ask.asked, shown: ask.shown, why: ask.why, tries: ask.tries },
|
|
1889
|
+
};
|
|
1890
|
+
this.waiting.set(approval.id, {
|
|
1891
|
+
approval,
|
|
1892
|
+
resolve: (d) => resolveAnswer(d.action === 'run' ? 'recheck' : d.action === 'skip' ? 'continue' : 'stop'),
|
|
1893
|
+
});
|
|
1894
|
+
this.bus.publish({ sessionId: ask.sessionId, type: 'approval-requested', level: 'warn',
|
|
1895
|
+
message: `choose "${ask.asked}" in the Copilot window, then answer on the card`, data: { approvalId: approval.id, model: approval.model } });
|
|
1896
|
+
});
|
|
1897
|
+
}
|
|
1869
1898
|
pendingApprovals(sessionId) {
|
|
1870
1899
|
return [...this.waiting.values()].map((w) => w.approval).filter((a) => !sessionId || a.sessionId === sessionId);
|
|
1871
1900
|
}
|
|
@@ -1952,7 +1981,7 @@ let OperatorService = class OperatorService {
|
|
|
1952
1981
|
if (w.approval.sessionId !== sessionId)
|
|
1953
1982
|
continue;
|
|
1954
1983
|
// A fetch waits for its own answer: "run the rest without asking" is not an answer to it.
|
|
1955
|
-
if (w.approval.network)
|
|
1984
|
+
if (w.approval.network || w.approval.model)
|
|
1956
1985
|
continue;
|
|
1957
1986
|
this.waiting.delete(id);
|
|
1958
1987
|
w.resolve({ action: 'run' });
|
package/dist/src/cli.js
CHANGED
|
@@ -195,7 +195,7 @@ program
|
|
|
195
195
|
replyTimeoutMs: 60_000,
|
|
196
196
|
signInTimeoutMs: 15 * 60_000,
|
|
197
197
|
humanWaitMs: 15 * 60_000,
|
|
198
|
-
onEvent: (e, d) => process.stdout.write(` ${e}${d && Object.keys(d).length ? ' ' + JSON.stringify(d) : ''}
|
|
198
|
+
onEvent: (e, d) => process.stdout.write(` ${e}${d && Object.keys(d).length ? ' ' + JSON.stringify(d) : ''}
|
|
199
199
|
`),
|
|
200
200
|
});
|
|
201
201
|
await transport.open();
|
|
@@ -383,6 +383,7 @@ program
|
|
|
383
383
|
.option('--url <url>', 'chat url', Url.chat)
|
|
384
384
|
.option('--json', 'print the raw list, for pasting into an issue')
|
|
385
385
|
.option('--set <name>', 'also switch the chat to this model, by its exact name')
|
|
386
|
+
.option('--steps', 'with --set: print each step of the choice with its time, and keep a picture of each in runs/_models')
|
|
386
387
|
.action(async (opts) => {
|
|
387
388
|
const transport = new CopilotTransport({
|
|
388
389
|
profileDir: opts.profile,
|
|
@@ -392,7 +393,9 @@ program
|
|
|
392
393
|
headless: false,
|
|
393
394
|
replyTimeoutMs: 60_000,
|
|
394
395
|
signInTimeoutMs: 900_000,
|
|
395
|
-
|
|
396
|
+
// The time of each step, to the millisecond: the pauses between them are what is being looked at.
|
|
397
|
+
onEvent: (e, d) => console.log(` ${new Date().toISOString().slice(11, 23)} [${e}]${d ? ' ' + JSON.stringify(d) : ''}`),
|
|
398
|
+
...(opts.steps ? { modelStepShots: true } : {}),
|
|
396
399
|
});
|
|
397
400
|
try {
|
|
398
401
|
await transport.open();
|
|
@@ -488,14 +491,14 @@ program
|
|
|
488
491
|
console.log('');
|
|
489
492
|
console.log(`task "${done?.title}": ${done?.status} after ${done?.iterations ?? 0} iteration(s)`);
|
|
490
493
|
if (done?.summary)
|
|
491
|
-
console.log(`
|
|
492
|
-
Summary:
|
|
494
|
+
console.log(`
|
|
495
|
+
Summary:
|
|
493
496
|
${done.summary}`);
|
|
494
497
|
if (done?.reason)
|
|
495
|
-
console.log(`
|
|
498
|
+
console.log(`
|
|
496
499
|
Reason: ${done.reason}`);
|
|
497
500
|
if (final?.chat)
|
|
498
|
-
console.log(`
|
|
501
|
+
console.log(`
|
|
499
502
|
chat: ${final.chat.name} — ${final.chat.url}`);
|
|
500
503
|
if (done?.runId)
|
|
501
504
|
console.log(`log: ${join(cfg.resolved.runsDir, done.runId, 'task-log.txt')}`);
|
|
@@ -515,8 +518,8 @@ program
|
|
|
515
518
|
return;
|
|
516
519
|
}
|
|
517
520
|
const c = withChat.chat;
|
|
518
|
-
console.log(`${c.name}
|
|
519
|
-
${c.url}
|
|
521
|
+
console.log(`${c.name}
|
|
522
|
+
${c.url}
|
|
520
523
|
session ${withChat.id}, ${withChat.tasks.length} task(s), created ${c.createdAt}`);
|
|
521
524
|
});
|
|
522
525
|
program.parseAsync(process.argv).catch((e) => {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import { createHash } from 'node:crypto';
|
|
14
14
|
import { readFile, mkdir, writeFile, appendFile } from 'node:fs/promises';
|
|
15
15
|
import { join, resolve } from 'node:path';
|
|
16
|
+
import { buttonShows } from '../transport/modelMatch.js';
|
|
16
17
|
import { createTransport, isReplyTimeout } from '../transport/chatTransport.js';
|
|
17
18
|
import { buildChatName, chatCode, loadPointer, savePointer } from '../transport/chatSession.js';
|
|
18
19
|
import { parseReply, formatErrorMessage, findLikelyDamage, damageGuidance } from '../protocol/parser.js';
|
|
@@ -535,11 +536,36 @@ async function applySessionModel(transport, session, bus, cfg, store, hooks) {
|
|
|
535
536
|
if (!wanted)
|
|
536
537
|
return {};
|
|
537
538
|
const locator = await hooks?.locate?.(wanted).catch(() => undefined);
|
|
538
|
-
|
|
539
|
+
let result = await transport.selectModel(wanted, { locator }).catch((e) => ({
|
|
539
540
|
ok: false,
|
|
540
541
|
current: null,
|
|
541
542
|
reason: e.message,
|
|
542
543
|
}));
|
|
544
|
+
/*
|
|
545
|
+
* The operator's hand, when the runner could not do it (operator's request, 2026-10-06): the run waits
|
|
546
|
+
* on a card in the UI asking them to choose the model in the Copilot window; "check and go on" reads
|
|
547
|
+
* the picker button again, and asks again while it still shows another model.
|
|
548
|
+
*/
|
|
549
|
+
let goOnAsItIs = false;
|
|
550
|
+
for (let tries = 1; !result.ok && hooks?.askHelp; tries += 1) {
|
|
551
|
+
const shown = await transport.currentModel().catch(() => null);
|
|
552
|
+
bus.publish({ sessionId: session.id, type: 'model-help-asked', level: 'warn',
|
|
553
|
+
message: `the chat could not be put on "${wanted}" by the runner; asking the operator to choose it in the Copilot window (picker shows "${shown ?? 'nothing'}")`,
|
|
554
|
+
data: { asked: wanted, shown, why: result.reason ?? '', tries } });
|
|
555
|
+
const answer = await hooks.askHelp({ sessionId: session.id, asked: wanted, shown, why: result.reason ?? 'unknown reason', tries });
|
|
556
|
+
if (answer === 'stop')
|
|
557
|
+
break;
|
|
558
|
+
if (answer === 'continue') {
|
|
559
|
+
goOnAsItIs = true;
|
|
560
|
+
bus.publish({ sessionId: session.id, type: 'model-help-continue', level: 'warn', message: `the operator chose to go on with the model the chat is on ("${shown ?? 'unknown'}"), not "${wanted}"`, data: { asked: wanted, shown } });
|
|
561
|
+
result = { ok: false, current: shown, reason: `the operator chose to go on with "${shown ?? 'unknown'}"` };
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
const now = await transport.currentModel().catch(() => null);
|
|
565
|
+
result = buttonShows(now, wanted)
|
|
566
|
+
? { ok: true, current: wanted, by: 'hand' }
|
|
567
|
+
: { ok: false, current: now, reason: `the picker still shows "${now ?? 'nothing'}", not "${wanted}"` };
|
|
568
|
+
}
|
|
543
569
|
const renamed = await followPageModels('model', wanted, result, session, store, hooks, modelFrom);
|
|
544
570
|
if (renamed)
|
|
545
571
|
bus.publish({ sessionId: session.id, type: 'model-renamed', level: 'warn', message: renamed, data: { asked: wanted, chosen: result.matched } });
|
|
@@ -570,6 +596,8 @@ async function applySessionModel(transport, session, bus, cfg, store, hooks) {
|
|
|
570
596
|
* A model the operator chose and the chat is not on is not worked around: the run went on Auto with a
|
|
571
597
|
* warning nobody saw, and its work was then taken for the chosen model's (2026-10-05). Nothing goes out.
|
|
572
598
|
*/
|
|
599
|
+
if (!result.ok && goOnAsItIs)
|
|
600
|
+
return { current: result.current ?? undefined };
|
|
573
601
|
if (!result.ok) {
|
|
574
602
|
return {
|
|
575
603
|
current: result.current ?? undefined,
|
|
@@ -230,6 +230,30 @@ export const SYSTEM_GUIDE = [
|
|
|
230
230
|
doesEn: 'Ends the whole task here, aborted; its remaining steps are not run.',
|
|
231
231
|
doesBg: 'Прекратява цялата задача тук; останалите ѝ стъпки не се изпълняват.',
|
|
232
232
|
},
|
|
233
|
+
{
|
|
234
|
+
key: 'approval.modelChosen',
|
|
235
|
+
kind: 'button',
|
|
236
|
+
en: 'I chose it — check and continue',
|
|
237
|
+
bg: 'Избрах го — провери и продължи',
|
|
238
|
+
doesEn: 'On the card that appears when the bot could not choose the model: after you chose it in the Copilot window, the bot reads the picker and goes on, or asks again if it shows another model.',
|
|
239
|
+
doesBg: 'На картата, която се появява, когато ботът не успее да избере модела: след като го изберете в прозореца на Copilot, ботът проверява менюто и продължава, или пита пак, ако то показва друг модел.',
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
key: 'approval.modelAsItIs',
|
|
243
|
+
kind: 'button',
|
|
244
|
+
en: 'Continue on the model it is on',
|
|
245
|
+
bg: 'Продължи на текущия модел',
|
|
246
|
+
doesEn: 'The run goes on with whatever model the chat is on, and the record says so.',
|
|
247
|
+
doesBg: 'Изпълнението продължава с модела, на който е чатът, и записът го казва.',
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
key: 'approval.modelStop',
|
|
251
|
+
kind: 'button',
|
|
252
|
+
en: 'Stop',
|
|
253
|
+
bg: 'Спри',
|
|
254
|
+
doesEn: 'Nothing is sent: the session stops, its tasks stay queued.',
|
|
255
|
+
doesBg: 'Нищо не се изпраща: сесията спира, задачите ѝ остават на опашката.',
|
|
256
|
+
},
|
|
233
257
|
],
|
|
234
258
|
},
|
|
235
259
|
],
|
|
@@ -940,31 +940,60 @@ Current URL: ${url}`);
|
|
|
940
940
|
const textOf = async (el) => (((await el.innerText().catch(() => '')) ?? '').split('\n')[0] ?? '').trim();
|
|
941
941
|
// A fixed pause after every opening and every press (see `ModelPicking`); the checks give it less.
|
|
942
942
|
const settle = () => this.p.waitForTimeout(this.opts.modelSettleMs ?? ModelPicking.settleMs);
|
|
943
|
-
|
|
944
|
-
const
|
|
943
|
+
const pause = this.opts.modelBeforePressMs ?? ModelPicking.beforePressMs;
|
|
944
|
+
const poll = this.opts.modelPollMs ?? ModelPicking.pollMs;
|
|
945
945
|
const appear = this.opts.modelAppearMs ?? ModelPicking.appearMs;
|
|
946
|
-
|
|
947
|
-
|
|
946
|
+
let shot = 0;
|
|
947
|
+
/** With `modelStepShots`, a picture and the menu's HTML at each step, numbered, beside the transport's files. */
|
|
948
|
+
const picture = async (label) => {
|
|
949
|
+
if (!this.opts.modelStepShots)
|
|
950
|
+
return;
|
|
951
|
+
shot += 1;
|
|
952
|
+
await this.captureMenu(`step-${String(shot).padStart(2, '0')}-${label.replace(/[^A-Za-z0-9._-]+/g, '-').slice(0, 40)}`, await this.readMenuRows().catch(() => [])).catch(() => undefined);
|
|
953
|
+
};
|
|
954
|
+
/*
|
|
955
|
+
* The operator's rhythm for every element of the picker (2026-10-06): look for it; while it is not
|
|
956
|
+
* there, wait two seconds and look again; once it is there, wait two seconds more, then press it.
|
|
957
|
+
* Each look and each pause is in the record with its time, so the pauses can be seen.
|
|
958
|
+
*/
|
|
959
|
+
const waitThenFind = async (label, find) => {
|
|
960
|
+
const deadline = Date.now() + appear;
|
|
961
|
+
let looks = 1;
|
|
962
|
+
let el = await find();
|
|
963
|
+
while (!el && Date.now() < deadline) {
|
|
964
|
+
this.emit('model-step', { step: 'not there yet, waiting', what: label, look: looks, waitMs: poll });
|
|
965
|
+
await this.p.waitForTimeout(poll);
|
|
966
|
+
looks += 1;
|
|
967
|
+
el = await find();
|
|
968
|
+
}
|
|
969
|
+
if (!el) {
|
|
970
|
+
this.emit('model-step', { step: 'never appeared', what: label, looks });
|
|
971
|
+
return null;
|
|
972
|
+
}
|
|
973
|
+
this.emit('model-step', { step: 'there, pausing before the press', what: label, look: looks, text: await textOf(el), pauseMs: pause });
|
|
974
|
+
await this.p.waitForTimeout(pause);
|
|
975
|
+
await picture(`before-${label}`);
|
|
976
|
+
return el;
|
|
977
|
+
};
|
|
978
|
+
const visible = async (el) => (el && (await el.isVisible().catch(() => false)) ? el : null);
|
|
948
979
|
const reach = async () => {
|
|
949
|
-
const button = await this.resolveModelButton();
|
|
980
|
+
const button = await waitThenFind('the picker button', async () => visible(await this.resolveModelButton(1_000)));
|
|
950
981
|
if (!button)
|
|
951
982
|
return { problem: 'This chat does not show a model picker.' };
|
|
952
|
-
await
|
|
953
|
-
await button.click();
|
|
983
|
+
await button.click({ timeout: 5_000 }).catch(() => undefined);
|
|
954
984
|
await settle();
|
|
955
985
|
if (!(await this.waitForPopup()))
|
|
956
986
|
return { problem: 'The model picker did not open.' };
|
|
957
987
|
this.emit('model-step', { step: 'picker opened' });
|
|
958
988
|
if (target.group) {
|
|
959
|
-
const group = await this.rowByXPath(target.group.xpath, target.group.name,
|
|
960
|
-
if (!group
|
|
989
|
+
const group = await waitThenFind(`the "${target.group.name}" group`, () => this.rowByXPath(target.group.xpath, target.group.name, 0));
|
|
990
|
+
if (!group)
|
|
961
991
|
return { problem: `the "${target.group.name}" row was not found by ${target.group.xpath}` };
|
|
962
|
-
this.emit('model-step', { step: 'group found', text: await textOf(group) });
|
|
963
992
|
/*
|
|
964
993
|
* Opened without the mouse first: a mouse click goes to coordinates, and the picker moves while it
|
|
965
994
|
* opens, so on the work machine a press meant for "GPT" (now second) opened "Claude" (now first)
|
|
966
995
|
* (2026-10-06). A click sent to the element itself cannot land on another row; then the keyboard
|
|
967
|
-
* (focus, ArrowRight opens a submenu); the mouse only last. Each time, its model must
|
|
996
|
+
* (focus, ArrowRight opens a submenu); the mouse only last. Each time, its model must appear.
|
|
968
997
|
*/
|
|
969
998
|
const ways = [
|
|
970
999
|
['click on the element', async () => { await group.evaluate((el) => el.click(), undefined, { timeout: 3_000 }); }],
|
|
@@ -973,21 +1002,21 @@ Current URL: ${url}`);
|
|
|
973
1002
|
['mouse click', async () => { await group.click({ timeout: 3_000 }); }],
|
|
974
1003
|
];
|
|
975
1004
|
for (const [how, act] of ways) {
|
|
976
|
-
await beforePress();
|
|
977
1005
|
await act().catch(() => undefined);
|
|
978
1006
|
await settle();
|
|
979
|
-
const row = await this.rowByXPath(target.xpath, target.model,
|
|
980
|
-
if (row
|
|
1007
|
+
const row = await waitThenFind(`"${target.model}"`, () => this.rowByXPath(target.xpath, target.model, 0));
|
|
1008
|
+
if (row) {
|
|
981
1009
|
this.emit('model-step', { step: 'group opened', how, model: await textOf(row) });
|
|
982
1010
|
return { row };
|
|
983
1011
|
}
|
|
984
1012
|
this.emit('model-step', { step: 'group not opened', how });
|
|
1013
|
+
await this.p.waitForTimeout(pause);
|
|
985
1014
|
}
|
|
986
1015
|
await this.captureMenu('select-failed', await this.readMenuRows().catch(() => [])).catch(() => undefined);
|
|
987
1016
|
return { problem: `"${target.model}" did not appear after opening "${target.group.name}" every way (${target.xpath}); the menu is kept as models-select-failed.html/.png` };
|
|
988
1017
|
}
|
|
989
|
-
const row = await this.rowByXPath(target.xpath, target.model,
|
|
990
|
-
if (!row
|
|
1018
|
+
const row = await waitThenFind(`"${target.model}"`, () => this.rowByXPath(target.xpath, target.model, 0));
|
|
1019
|
+
if (!row) {
|
|
991
1020
|
await this.captureMenu('select-failed', await this.readMenuRows().catch(() => [])).catch(() => undefined);
|
|
992
1021
|
return { problem: `"${target.model}" was not found by ${target.xpath}; the menu is kept as models-select-failed.html/.png` };
|
|
993
1022
|
}
|
|
@@ -1017,14 +1046,14 @@ Current URL: ${url}`);
|
|
|
1017
1046
|
}
|
|
1018
1047
|
// On the element itself, for the same reason as the group; the mouse only when that does nothing.
|
|
1019
1048
|
this.emit('model-step', { step: 'model pressed', attempt, text: await textOf(found.row) });
|
|
1020
|
-
await beforePress();
|
|
1021
1049
|
await found.row.evaluate((el) => el.click(), undefined, { timeout: 3_000 }).catch(() => undefined);
|
|
1022
1050
|
await settle();
|
|
1023
1051
|
if ((await this.modelMenuOpen()) && !(await checked(found.row))) {
|
|
1024
|
-
await
|
|
1052
|
+
await this.p.waitForTimeout(pause);
|
|
1025
1053
|
await found.row.click({ timeout: 3_000 }).catch(() => undefined);
|
|
1026
1054
|
await settle();
|
|
1027
1055
|
}
|
|
1056
|
+
await picture('after-press');
|
|
1028
1057
|
await this.closeMenu();
|
|
1029
1058
|
await settle();
|
|
1030
1059
|
/*
|
|
@@ -167,10 +167,15 @@ export const OperatorModelLocators = {
|
|
|
167
167
|
*/
|
|
168
168
|
export const ModelPicking = {
|
|
169
169
|
attempts: 6,
|
|
170
|
-
/**
|
|
170
|
+
/**
|
|
171
|
+
* The operator's rhythm (2026-10-06): an element of the picker is looked for; while it is not there the
|
|
172
|
+
* runner waits `pollMs` and looks again, up to `appearMs`; once it is there it waits `beforePressMs`
|
|
173
|
+
* more, then presses it.
|
|
174
|
+
*/
|
|
175
|
+
pollMs: 2_000,
|
|
171
176
|
beforePressMs: 2_000,
|
|
172
177
|
settleMs: 1_500,
|
|
173
|
-
appearMs:
|
|
178
|
+
appearMs: 20_000,
|
|
174
179
|
};
|
|
175
180
|
/** A text as an XPath string literal, whatever quotes it holds. */
|
|
176
181
|
export function xpathText(text) {
|
|
@@ -19,7 +19,18 @@ export function buttonShows(shown, asked) {
|
|
|
19
19
|
return false;
|
|
20
20
|
const s = normModel(shown);
|
|
21
21
|
const a = normModel(asked);
|
|
22
|
-
|
|
22
|
+
if (s.length === 0)
|
|
23
|
+
return false;
|
|
24
|
+
if (s === a)
|
|
25
|
+
return true;
|
|
26
|
+
/*
|
|
27
|
+
* The button drops the last word ("GPT-5.6 Sol Think deeper" reads "GPT-5.6 Sol Think"), no more: a
|
|
28
|
+
* shorter start — "GPT" alone — would agree with every model of the group, and a run would take the
|
|
29
|
+
* chat for set and choose nothing (2026-10-06).
|
|
30
|
+
*/
|
|
31
|
+
const sw = s.split(' ');
|
|
32
|
+
const aw = a.split(' ');
|
|
33
|
+
return sw.length >= aw.length - 1 && aw.length > 1 && a.startsWith(`${s} `);
|
|
23
34
|
}
|
|
24
35
|
const words = (name) => normModel(name).split(' ').filter(Boolean);
|
|
25
36
|
const isVersion = (w) => /^v?\d+(?:\.\d+)*$/.test(w);
|
package/dist/web/404.html
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--k4MMPCGaEGVTHKLfTmYlf--><html lang="en" data-theme="light" data-textsize="normal" data-contrast="normal" data-motion="normal" data-links="plain" data-focus="normal"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/c37978b44194c37b.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0f31b926d9a9c5a4.js"/><script src="/_next/static/chunks/c7879cf7-b5ab1053c1d9a2e7.js" async=""></script><script src="/_next/static/chunks/131-bae98f790a541679.js" async=""></script><script src="/_next/static/chunks/main-app-e3a5f713ba31557e.js" async=""></script><script src="/_next/static/chunks/197-f7c33a0114fc3db3.js" async=""></script><script src="/_next/static/chunks/867-562abd8d5f8c3dc8.js" async=""></script><script src="/_next/static/chunks/549-7e35e4fdefadb05d.js" async=""></script><script src="/_next/static/chunks/app/layout-df7bec3acad93f15.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>copilot-operator</title><meta name="description" content="Runs task loops with Microsoft 365 Copilot on this machine."/><script>
|
|
2
2
|
(function () {
|
|
3
3
|
try {
|
|
4
4
|
var d = document.documentElement;
|
|
@@ -13,4 +13,4 @@
|
|
|
13
13
|
d.dataset.focus = a.strongFocus ? 'strong' : 'normal';
|
|
14
14
|
} catch (e) {}
|
|
15
15
|
})();
|
|
16
|
-
</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><a class="skip-link" href="#main">Skip to the content</a><div class="wrap"><header class="top"><h1><a href="/">copilot-operator</a></h1><nav aria-label="Main"><a href="/"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M4 5h16v4H4zM4 11h16v4H4zM4 17h10v2H4z"></path></svg><span>Sessions</span></a><a href="/defaults"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zm8.5 4 1.5 1-1.6 2.8-1.8-.4a7 7 0 0 1-1.5 1.5l.4 1.8L14.7 21l-1-1.5a7 7 0 0 1-3.4 0l-1 1.5-2.8-1.6.4-1.8A7 7 0 0 1 5.4 16l-1.8.4L2 13.6 3.5 12.6V11.4L2 10.4l1.6-2.8 1.8.4A7 7 0 0 1 6.9 6.5l-.4-1.8L9.3 3l1 1.5a7 7 0 0 1 3.4 0l1-1.5 2.8 1.6-.4 1.8a7 7 0 0 1 1.5 1.5l1.8-.4L22 10.4l-1.5 1z"></path></svg><span>Settings</span></a><a href="/import"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 3v10m0 0 4-4m-4 4-4-4M4 15v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg><span>Plan from JSON</span></a><a href="/history"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 3a9 9 0 1 0 8.5 6M12 7v5l3 2M3 4v5h5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg><span>Task register</span></a><a href="/level1"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M6 3h9l5 5v13H6zM14 3v6h6M9 13h7M9 17h7" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"></path></svg><span>Level 1 prompt</span></a><a href="/presets"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M5 4h14v4H5zM5 10h14v4H5zM5 16h9v4H5z" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"></path></svg><span>Level 2 presets</span></a><a href="/appearance"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 3a9 9 0 0 0 0 18c1.5 0 2-1 2-2s-1-1.5-1-2.5S14 15 15.5 15H17a4 4 0 0 0 4-4 8 8 0 0 0-9-8zM8 9a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm4-3a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm4 3a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"></path></svg><span>Appearance</span></a><a href="/system"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M4 5h16v10H4zM2 19h20M9 15v4M15 15v4" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"></path></svg><span>System</span></a><select aria-label="Language" style="width:auto"><option value="en" selected="">English</option><option value="bg">Български</option></select></nav></header><main id="main"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/webpack-0f31b926d9a9c5a4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8078,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-dfaaa8047cbf2fc2.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-3efbb282292ccc38.js\"],\"AppearanceProvider\"]\n3:I[867,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-dfaaa8047cbf2fc2.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-3efbb282292ccc38.js\"],\"LanguageProvider\"]\n4:I[1035,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-dfaaa8047cbf2fc2.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-3efbb282292ccc38.js\"],\"DialogHost\"]\n5:I[8214,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-dfaaa8047cbf2fc2.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-3efbb282292ccc38.js\"],\"SkipLink\"]\n6:I[8197,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-dfaaa8047cbf2fc2.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-3efbb282292ccc38.js\"],\"\"]\n7:I[8214,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-dfaaa8047cbf2fc2.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-3efbb282292ccc38.js\"],\"Nav\"]\n8:I[6657,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-dfaaa8047cbf2fc2.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-3efbb282292ccc38.js\"],\"GlobalApprovals\"]\n9:I[5204,[],\"\"]\na:I[2642,[],\"\"]\nb:I[7712,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-dfaaa8047cbf2fc2.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-3efbb282292ccc38.js\"],\"ScrollJump\"]\nc:I[433,[],\"OutletBoundary\"]\ne:I[9884,[],\"AsyncMetadataOutlet\"]\n10:I[433,[],\"ViewportBoundary\"]\n12:I[433,[],\"MetadataBoundary\"]\n13:\"$Sreact.suspense\"\n15:I[3536,[],\"\"]\n:HL[\"/_next/static/css/c37978b44194c37b.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"pfa56tOBq6o-WBQZnyUn2\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/c37978b44194c37b.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"data-theme\":\"light\",\"data-textsize\":\"normal\",\"data-contrast\":\"normal\",\"data-motion\":\"normal\",\"data-links\":\"plain\",\"data-focus\":\"normal\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n(function () {\\n try {\\n var d = document.documentElement;\\n var raw = localStorage.getItem('cop.appearance');\\n var a = raw ? JSON.parse(raw) : {};\\n if (!a || typeof a !== 'object') a = {};\\n d.dataset.theme = a.theme === 'dark' ? 'dark' : 'light';\\n d.dataset.textsize = [\\\"small\\\",\\\"normal\\\",\\\"large\\\",\\\"huge\\\",\\\"giant\\\"].indexOf(a.textSize) \u003e= 0 ? a.textSize : 'normal';\\n d.dataset.contrast = a.highContrast ? 'high' : 'normal';\\n d.dataset.motion = a.reduceMotion ? 'reduced' : 'normal';\\n d.dataset.links = a.underlineLinks ? 'underline' : 'plain';\\n d.dataset.focus = a.strongFocus ? 'strong' : 'normal';\\n } catch (e) {}\\n})();\\n\"}}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[[\"$\",\"$L5\",null,{}],[\"$\",\"div\",null,{\"className\":\"wrap\",\"children\":[[\"$\",\"header\",null,{\"className\":\"top\",\"children\":[[\"$\",\"h1\",null,{\"children\":[\"$\",\"$L6\",null,{\"href\":\"/\",\"children\":\"copilot-operator\"}]}],[\"$\",\"$L7\",null,{}]]}],[\"$\",\"$L8\",null,{}],[\"$\",\"main\",null,{\"id\":\"main\",\"children\":[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}],[\"$\",\"$Lb\",null,{}]]}]}]}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$Lc\",null,{\"children\":[\"$Ld\",[\"$\",\"$Le\",null,{\"promise\":\"$@f\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L10\",null,{\"children\":\"$L11\"}],null],[\"$\",\"$L12\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$13\",null,{\"fallback\":null,\"children\":\"$L14\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$15\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"11:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nd:null\n"])</script><script>self.__next_f.push([1,"f:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"copilot-operator\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Runs task loops with Microsoft 365 Copilot on this machine.\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"14:\"$f:metadata\"\n"])</script></body></html>
|
|
16
|
+
</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><a class="skip-link" href="#main">Skip to the content</a><div class="wrap"><header class="top"><h1><a href="/">copilot-operator</a></h1><nav aria-label="Main"><a href="/"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M4 5h16v4H4zM4 11h16v4H4zM4 17h10v2H4z"></path></svg><span>Sessions</span></a><a href="/defaults"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zm8.5 4 1.5 1-1.6 2.8-1.8-.4a7 7 0 0 1-1.5 1.5l.4 1.8L14.7 21l-1-1.5a7 7 0 0 1-3.4 0l-1 1.5-2.8-1.6.4-1.8A7 7 0 0 1 5.4 16l-1.8.4L2 13.6 3.5 12.6V11.4L2 10.4l1.6-2.8 1.8.4A7 7 0 0 1 6.9 6.5l-.4-1.8L9.3 3l1 1.5a7 7 0 0 1 3.4 0l1-1.5 2.8 1.6-.4 1.8a7 7 0 0 1 1.5 1.5l1.8-.4L22 10.4l-1.5 1z"></path></svg><span>Settings</span></a><a href="/import"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 3v10m0 0 4-4m-4 4-4-4M4 15v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg><span>Plan from JSON</span></a><a href="/history"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 3a9 9 0 1 0 8.5 6M12 7v5l3 2M3 4v5h5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg><span>Task register</span></a><a href="/level1"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M6 3h9l5 5v13H6zM14 3v6h6M9 13h7M9 17h7" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"></path></svg><span>Level 1 prompt</span></a><a href="/presets"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M5 4h14v4H5zM5 10h14v4H5zM5 16h9v4H5z" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"></path></svg><span>Level 2 presets</span></a><a href="/appearance"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 3a9 9 0 0 0 0 18c1.5 0 2-1 2-2s-1-1.5-1-2.5S14 15 15.5 15H17a4 4 0 0 0 4-4 8 8 0 0 0-9-8zM8 9a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm4-3a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm4 3a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"></path></svg><span>Appearance</span></a><a href="/system"><svg class="nav-icon" viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M4 5h16v10H4zM2 19h20M9 15v4M15 15v4" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"></path></svg><span>System</span></a><select aria-label="Language" style="width:auto"><option value="en" selected="">English</option><option value="bg">Български</option></select></nav></header><main id="main"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/webpack-0f31b926d9a9c5a4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8078,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-562abd8d5f8c3dc8.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-df7bec3acad93f15.js\"],\"AppearanceProvider\"]\n3:I[867,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-562abd8d5f8c3dc8.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-df7bec3acad93f15.js\"],\"LanguageProvider\"]\n4:I[1035,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-562abd8d5f8c3dc8.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-df7bec3acad93f15.js\"],\"DialogHost\"]\n5:I[8214,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-562abd8d5f8c3dc8.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-df7bec3acad93f15.js\"],\"SkipLink\"]\n6:I[8197,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-562abd8d5f8c3dc8.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-df7bec3acad93f15.js\"],\"\"]\n7:I[8214,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-562abd8d5f8c3dc8.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-df7bec3acad93f15.js\"],\"Nav\"]\n8:I[6657,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-562abd8d5f8c3dc8.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-df7bec3acad93f15.js\"],\"GlobalApprovals\"]\n9:I[5204,[],\"\"]\na:I[2642,[],\"\"]\nb:I[7712,[\"197\",\"static/chunks/197-f7c33a0114fc3db3.js\",\"867\",\"static/chunks/867-562abd8d5f8c3dc8.js\",\"549\",\"static/chunks/549-7e35e4fdefadb05d.js\",\"177\",\"static/chunks/app/layout-df7bec3acad93f15.js\"],\"ScrollJump\"]\nc:I[433,[],\"OutletBoundary\"]\ne:I[9884,[],\"AsyncMetadataOutlet\"]\n10:I[433,[],\"ViewportBoundary\"]\n12:I[433,[],\"MetadataBoundary\"]\n13:\"$Sreact.suspense\"\n15:I[3536,[],\"\"]\n:HL[\"/_next/static/css/c37978b44194c37b.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"k4MMPCGaEGVTHKLfTmYlf\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/c37978b44194c37b.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"data-theme\":\"light\",\"data-textsize\":\"normal\",\"data-contrast\":\"normal\",\"data-motion\":\"normal\",\"data-links\":\"plain\",\"data-focus\":\"normal\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n(function () {\\n try {\\n var d = document.documentElement;\\n var raw = localStorage.getItem('cop.appearance');\\n var a = raw ? JSON.parse(raw) : {};\\n if (!a || typeof a !== 'object') a = {};\\n d.dataset.theme = a.theme === 'dark' ? 'dark' : 'light';\\n d.dataset.textsize = [\\\"small\\\",\\\"normal\\\",\\\"large\\\",\\\"huge\\\",\\\"giant\\\"].indexOf(a.textSize) \u003e= 0 ? a.textSize : 'normal';\\n d.dataset.contrast = a.highContrast ? 'high' : 'normal';\\n d.dataset.motion = a.reduceMotion ? 'reduced' : 'normal';\\n d.dataset.links = a.underlineLinks ? 'underline' : 'plain';\\n d.dataset.focus = a.strongFocus ? 'strong' : 'normal';\\n } catch (e) {}\\n})();\\n\"}}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[[\"$\",\"$L5\",null,{}],[\"$\",\"div\",null,{\"className\":\"wrap\",\"children\":[[\"$\",\"header\",null,{\"className\":\"top\",\"children\":[[\"$\",\"h1\",null,{\"children\":[\"$\",\"$L6\",null,{\"href\":\"/\",\"children\":\"copilot-operator\"}]}],[\"$\",\"$L7\",null,{}]]}],[\"$\",\"$L8\",null,{}],[\"$\",\"main\",null,{\"id\":\"main\",\"children\":[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}],[\"$\",\"$Lb\",null,{}]]}]}]}]}]]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$Lc\",null,{\"children\":[\"$Ld\",[\"$\",\"$Le\",null,{\"promise\":\"$@f\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L10\",null,{\"children\":\"$L11\"}],null],[\"$\",\"$L12\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$13\",null,{\"fallback\":null,\"children\":\"$L14\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$15\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"11:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nd:null\n"])</script><script>self.__next_f.push([1,"f:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"copilot-operator\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Runs task loops with Microsoft 365 Copilot on this machine.\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"14:\"$f:metadata\"\n"])</script></body></html>
|