copilot-operator 0.1.33 → 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.
Files changed (33) hide show
  1. package/dist/src/api/operator.service.js +30 -1
  2. package/dist/src/cli.js +11 -8
  3. package/dist/src/orchestrator/taskRunner.js +29 -1
  4. package/dist/src/plan/systemGuide.js +24 -0
  5. package/dist/src/transport/copilotTransport.js +60 -14
  6. package/dist/src/transport/locators.js +8 -1
  7. package/dist/src/transport/modelMatch.js +12 -1
  8. package/dist/web/404.html +2 -2
  9. package/dist/web/_next/static/chunks/867-562abd8d5f8c3dc8.js +1 -0
  10. package/dist/web/_next/static/chunks/app/layout-df7bec3acad93f15.js +1 -0
  11. package/dist/web/appearance.html +2 -2
  12. package/dist/web/appearance.txt +10 -10
  13. package/dist/web/defaults.html +2 -2
  14. package/dist/web/defaults.txt +10 -10
  15. package/dist/web/history.html +2 -2
  16. package/dist/web/history.txt +10 -10
  17. package/dist/web/import.html +2 -2
  18. package/dist/web/import.txt +10 -10
  19. package/dist/web/index.html +2 -2
  20. package/dist/web/index.txt +10 -10
  21. package/dist/web/level1.html +2 -2
  22. package/dist/web/level1.txt +10 -10
  23. package/dist/web/presets.html +2 -2
  24. package/dist/web/presets.txt +10 -10
  25. package/dist/web/sessions/view.html +2 -2
  26. package/dist/web/sessions/view.txt +10 -10
  27. package/dist/web/system.html +2 -2
  28. package/dist/web/system.txt +10 -10
  29. package/package.json +2 -1
  30. package/dist/web/_next/static/chunks/867-dfaaa8047cbf2fc2.js +0 -1
  31. package/dist/web/_next/static/chunks/app/layout-3efbb282292ccc38.js +0 -1
  32. /package/dist/web/_next/static/{G_-u_mF-aLMdcOv0kc9us → k4MMPCGaEGVTHKLfTmYlf}/_buildManifest.js +0 -0
  33. /package/dist/web/_next/static/{G_-u_mF-aLMdcOv0kc9us → 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
- onEvent: (e, d) => console.log(` [${e}]${d ? ' ' + JSON.stringify(d) : ''}`),
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
- const result = await transport.selectModel(wanted, { locator }).catch((e) => ({
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,28 +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
+ const pause = this.opts.modelBeforePressMs ?? ModelPicking.beforePressMs;
944
+ const poll = this.opts.modelPollMs ?? ModelPicking.pollMs;
943
945
  const appear = this.opts.modelAppearMs ?? ModelPicking.appearMs;
944
- /** Waits until the element is there and visible. */
945
- const present = async (el) => await el.waitFor({ state: 'visible', timeout: appear }).then(() => true).catch(() => false);
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);
946
979
  const reach = async () => {
947
- const button = await this.resolveModelButton();
980
+ const button = await waitThenFind('the picker button', async () => visible(await this.resolveModelButton(1_000)));
948
981
  if (!button)
949
982
  return { problem: 'This chat does not show a model picker.' };
950
- await button.click();
983
+ await button.click({ timeout: 5_000 }).catch(() => undefined);
951
984
  await settle();
952
985
  if (!(await this.waitForPopup()))
953
986
  return { problem: 'The model picker did not open.' };
954
987
  this.emit('model-step', { step: 'picker opened' });
955
988
  if (target.group) {
956
- const group = await this.rowByXPath(target.group.xpath, target.group.name, appear);
957
- if (!group || !(await present(group)))
989
+ const group = await waitThenFind(`the "${target.group.name}" group`, () => this.rowByXPath(target.group.xpath, target.group.name, 0));
990
+ if (!group)
958
991
  return { problem: `the "${target.group.name}" row was not found by ${target.group.xpath}` };
959
- this.emit('model-step', { step: 'group found', text: await textOf(group) });
960
992
  /*
961
993
  * Opened without the mouse first: a mouse click goes to coordinates, and the picker moves while it
962
994
  * opens, so on the work machine a press meant for "GPT" (now second) opened "Claude" (now first)
963
995
  * (2026-10-06). A click sent to the element itself cannot land on another row; then the keyboard
964
- * (focus, ArrowRight opens a submenu); the mouse only last. Each time, its model must be on screen.
996
+ * (focus, ArrowRight opens a submenu); the mouse only last. Each time, its model must appear.
965
997
  */
966
998
  const ways = [
967
999
  ['click on the element', async () => { await group.evaluate((el) => el.click(), undefined, { timeout: 3_000 }); }],
@@ -972,18 +1004,19 @@ Current URL: ${url}`);
972
1004
  for (const [how, act] of ways) {
973
1005
  await act().catch(() => undefined);
974
1006
  await settle();
975
- const row = await this.rowByXPath(target.xpath, target.model, appear);
976
- if (row && (await present(row))) {
1007
+ const row = await waitThenFind(`"${target.model}"`, () => this.rowByXPath(target.xpath, target.model, 0));
1008
+ if (row) {
977
1009
  this.emit('model-step', { step: 'group opened', how, model: await textOf(row) });
978
1010
  return { row };
979
1011
  }
980
1012
  this.emit('model-step', { step: 'group not opened', how });
1013
+ await this.p.waitForTimeout(pause);
981
1014
  }
982
1015
  await this.captureMenu('select-failed', await this.readMenuRows().catch(() => [])).catch(() => undefined);
983
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` };
984
1017
  }
985
- const row = await this.rowByXPath(target.xpath, target.model, appear);
986
- if (!row || !(await present(row))) {
1018
+ const row = await waitThenFind(`"${target.model}"`, () => this.rowByXPath(target.xpath, target.model, 0));
1019
+ if (!row) {
987
1020
  await this.captureMenu('select-failed', await this.readMenuRows().catch(() => [])).catch(() => undefined);
988
1021
  return { problem: `"${target.model}" was not found by ${target.xpath}; the menu is kept as models-select-failed.html/.png` };
989
1022
  }
@@ -1016,18 +1049,31 @@ Current URL: ${url}`);
1016
1049
  await found.row.evaluate((el) => el.click(), undefined, { timeout: 3_000 }).catch(() => undefined);
1017
1050
  await settle();
1018
1051
  if ((await this.modelMenuOpen()) && !(await checked(found.row))) {
1052
+ await this.p.waitForTimeout(pause);
1019
1053
  await found.row.click({ timeout: 3_000 }).catch(() => undefined);
1020
1054
  await settle();
1021
1055
  }
1056
+ await picture('after-press');
1022
1057
  await this.closeMenu();
1023
1058
  await settle();
1024
- // Is it set? Read again, the same way, from a fresh menu.
1059
+ /*
1060
+ * Is it set? The picker button first: it shows the model in force, shortened by words dropped from
1061
+ * its end, and reading it opens nothing. The menu was opened again to read the row's mark, and at
1062
+ * work that second walk failed with the right model chosen (2026-10-06); it is now only the second
1063
+ * witness, when the button does not show the model. Nothing here reloads the page: a choice not
1064
+ * set is made again from the button, in the same page.
1065
+ */
1066
+ const shownNow = await this.currentModel();
1067
+ if (buttonShows(shownNow, name) || buttonShows(shownNow, target.model)) {
1068
+ this.emit('model-selected', { model: name, buttonShows: shownNow, by: 'operator', attempt, seenOn: 'button' });
1069
+ return { ok: true, current: name, by: 'operator' };
1070
+ }
1025
1071
  const again = await reach();
1026
1072
  const ok = 'row' in again && (await checked(again.row));
1027
1073
  await this.closeMenu();
1028
1074
  const after = await this.currentModel();
1029
1075
  if (ok) {
1030
- this.emit('model-selected', { model: name, buttonShows: after, by: 'operator', attempt });
1076
+ this.emit('model-selected', { model: name, buttonShows: after, by: 'operator', attempt, seenOn: 'menu' });
1031
1077
  return { ok: true, current: name, by: 'operator' };
1032
1078
  }
1033
1079
  why = 'problem' in again ? `after pressing "${target.model}": ${again.problem}` : `"${target.model}" was pressed, but the picker does not mark it as chosen (the button shows "${after ?? 'nothing'}")`;
@@ -167,8 +167,15 @@ export const OperatorModelLocators = {
167
167
  */
168
168
  export const ModelPicking = {
169
169
  attempts: 6,
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,
176
+ beforePressMs: 2_000,
170
177
  settleMs: 1_500,
171
- appearMs: 10_000,
178
+ appearMs: 20_000,
172
179
  };
173
180
  /** A text as an XPath string literal, whatever quotes it holds. */
174
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
- return s.length > 0 && (s === a || a.startsWith(`${s} `));
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><!--G__u_mF_aLMdcOv0kc9us--><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-dfaaa8047cbf2fc2.js" async=""></script><script src="/_next/static/chunks/549-7e35e4fdefadb05d.js" async=""></script><script src="/_next/static/chunks/app/layout-3efbb282292ccc38.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>
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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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\":\"G_-u_mF-aLMdcOv0kc9us\",\"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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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>