pi-orchestrator-config 4.3.7 → 4.3.9

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 (104) hide show
  1. package/README.md +191 -173
  2. package/agents/git-expert.md +30 -1
  3. package/extensions/openai-compatible-discovery/index.ts +204 -0
  4. package/extensions/orchestrator/extended-autocomplete.ts +4 -0
  5. package/extensions/orchestrator/mcpc.ts +172 -0
  6. package/extensions/orchestrator/session-validation.ts +4 -2
  7. package/extensions/pidiff/pidiff-ui/dist/assets/{angular-html-mp_sY19l.js → angular-html-ghA4VuM0.js} +1 -1
  8. package/extensions/pidiff/pidiff-ui/dist/assets/{angular-ts-BG7dz03J.js → angular-ts-BiEwt-Qs.js} +1 -1
  9. package/extensions/pidiff/pidiff-ui/dist/assets/{apl-D0TQH1Y8.js → apl-DmYAGNOL.js} +1 -1
  10. package/extensions/pidiff/pidiff-ui/dist/assets/{astro-cuP4968W.js → astro-Bju7L81l.js} +1 -1
  11. package/extensions/pidiff/pidiff-ui/dist/assets/{blade-ClqnBqi9.js → blade-C_YtSRJN.js} +1 -1
  12. package/extensions/pidiff/pidiff-ui/dist/assets/{c-VbuMUaRD.js → c-DxcP9pmN.js} +1 -1
  13. package/extensions/pidiff/pidiff-ui/dist/assets/{chapel-Cs_P4bPZ.js → chapel-BjVM8zvB.js} +1 -1
  14. package/extensions/pidiff/pidiff-ui/dist/assets/{cobol-B1_QfE_s.js → cobol-CyAifE-8.js} +1 -1
  15. package/extensions/pidiff/pidiff-ui/dist/assets/{coffee-DngpUQ-g.js → coffee-BNW4Zttb.js} +1 -1
  16. package/extensions/pidiff/pidiff-ui/dist/assets/{cpp-BJ9Ee2yy.js → cpp-De6s9lN-.js} +1 -1
  17. package/extensions/pidiff/pidiff-ui/dist/assets/{crystal-ClUiGo15.js → crystal-JzhjW33_.js} +1 -1
  18. package/extensions/pidiff/pidiff-ui/dist/assets/{css-DqTo82CB.js → css-DAnI1EKT.js} +1 -1
  19. package/extensions/pidiff/pidiff-ui/dist/assets/{edge-DNO_p1iz.js → edge-DlbkxEj4.js} +1 -1
  20. package/extensions/pidiff/pidiff-ui/dist/assets/{elixir-D9BFTDA2.js → elixir-BXz6vpDX.js} +1 -1
  21. package/extensions/pidiff/pidiff-ui/dist/assets/{elm-DViZ7oy1.js → elm-CJcSKM6_.js} +1 -1
  22. package/extensions/pidiff/pidiff-ui/dist/assets/{erb-BkoQ4OFP.js → erb-VHOaTR5g.js} +1 -1
  23. package/extensions/pidiff/pidiff-ui/dist/assets/{git-rebase-7gJjIY6i.js → git-rebase-PAYwCVk-.js} +1 -1
  24. package/extensions/pidiff/pidiff-ui/dist/assets/{glimmer-js-BsUtNNHb.js → glimmer-js-CspJJiU_.js} +1 -1
  25. package/extensions/pidiff/pidiff-ui/dist/assets/{glimmer-ts-D-0tIMzg.js → glimmer-ts-CSMIai5o.js} +1 -1
  26. package/extensions/pidiff/pidiff-ui/dist/assets/{glsl-B_FkRuRZ.js → glsl-Cw9yKL2B.js} +1 -1
  27. package/extensions/pidiff/pidiff-ui/dist/assets/{graphql--F2JnwKx.js → graphql-D0OMgGsM.js} +1 -1
  28. package/extensions/pidiff/pidiff-ui/dist/assets/{hack-oDlxgxMa.js → hack-DfiAACVA.js} +1 -1
  29. package/extensions/pidiff/pidiff-ui/dist/assets/{haml-BZwbB22w.js → haml-DU8pAbRK.js} +1 -1
  30. package/extensions/pidiff/pidiff-ui/dist/assets/{handlebars-D5xaEd_e.js → handlebars-CoaiK3xT.js} +1 -1
  31. package/extensions/pidiff/pidiff-ui/dist/assets/{html-DBGhw7-O.js → html-B4C3aTRB.js} +1 -1
  32. package/extensions/pidiff/pidiff-ui/dist/assets/{html-derivative-0H2oo-Br.js → html-derivative-C_NJUsxF.js} +1 -1
  33. package/extensions/pidiff/pidiff-ui/dist/assets/{http-BH6WBJxg.js → http-Cr9w59E3.js} +1 -1
  34. package/extensions/pidiff/pidiff-ui/dist/assets/{hurl-pKbsDPF3.js → hurl-BEScLvfg.js} +1 -1
  35. package/extensions/pidiff/pidiff-ui/dist/assets/index-CcrT73jQ.css +1 -0
  36. package/extensions/pidiff/pidiff-ui/dist/assets/{index-D9FMfzhy.js → index-CisAus9r.js} +10 -10
  37. package/extensions/pidiff/pidiff-ui/dist/assets/{java-DAIRA2DV.js → java-hb-3TTCg.js} +1 -1
  38. package/extensions/pidiff/pidiff-ui/dist/assets/{javascript-0oTH0XMX.js → javascript-Bc0DeQtz.js} +1 -1
  39. package/extensions/pidiff/pidiff-ui/dist/assets/{jinja-Cr2SKvYs.js → jinja-DoEIYL2y.js} +1 -1
  40. package/extensions/pidiff/pidiff-ui/dist/assets/{jison-DkQ5WAwI.js → jison-C2OZYR2e.js} +1 -1
  41. package/extensions/pidiff/pidiff-ui/dist/assets/{json-Dso4xRBa.js → json-DKeabECb.js} +1 -1
  42. package/extensions/pidiff/pidiff-ui/dist/assets/{jsx-6lZH5KCN.js → jsx-Dadu-wAB.js} +1 -1
  43. package/extensions/pidiff/pidiff-ui/dist/assets/{julia-D5nsVlA4.js → julia-CpUr0nh2.js} +1 -1
  44. package/extensions/pidiff/pidiff-ui/dist/assets/{just-BJmCTT8q.js → just-BysHL69Z.js} +1 -1
  45. package/extensions/pidiff/pidiff-ui/dist/assets/{latex-RNBDVFOB.js → latex-iNrlK36R.js} +1 -1
  46. package/extensions/pidiff/pidiff-ui/dist/assets/{liquid-BNfcDoyE.js → liquid-g8x_A5Ru.js} +1 -1
  47. package/extensions/pidiff/pidiff-ui/dist/assets/{lua-C5h0aGmI.js → lua-B4BSWsUC.js} +1 -1
  48. package/extensions/pidiff/pidiff-ui/dist/assets/{marko-DNEK1bML.js → marko-CHSFXjEi.js} +1 -1
  49. package/extensions/pidiff/pidiff-ui/dist/assets/{mdc-B2NVBmGf.js → mdc-js2C5rVG.js} +1 -1
  50. package/extensions/pidiff/pidiff-ui/dist/assets/{nginx-_X9UmOgs.js → nginx-BblTQvRl.js} +1 -1
  51. package/extensions/pidiff/pidiff-ui/dist/assets/{nim-DOS51HeY.js → nim-ChxMAPPZ.js} +1 -1
  52. package/extensions/pidiff/pidiff-ui/dist/assets/{org-Rx4519lx.js → org-CHoj3SWZ.js} +1 -1
  53. package/extensions/pidiff/pidiff-ui/dist/assets/{perl-Daok6kZs.js → perl-3zusLAIc.js} +1 -1
  54. package/extensions/pidiff/pidiff-ui/dist/assets/{php-XTt5v859.js → php-DVx3dbu3.js} +1 -1
  55. package/extensions/pidiff/pidiff-ui/dist/assets/{pug-f7ey1fQl.js → pug-DITNjLsK.js} +1 -1
  56. package/extensions/pidiff/pidiff-ui/dist/assets/{qml-juoUuAUN.js → qml-BYmD788c.js} +1 -1
  57. package/extensions/pidiff/pidiff-ui/dist/assets/{r-BOYZHofT.js → r-Dp_qVPOX.js} +1 -1
  58. package/extensions/pidiff/pidiff-ui/dist/assets/{razor-BcuibiM6.js → razor-DT4CEDjF.js} +1 -1
  59. package/extensions/pidiff/pidiff-ui/dist/assets/{regexp-BMJaNING.js → regexp-DVFGbBOe.js} +1 -1
  60. package/extensions/pidiff/pidiff-ui/dist/assets/{rst-CJY1LueG.js → rst-njZM0E3u.js} +1 -1
  61. package/extensions/pidiff/pidiff-ui/dist/assets/{ruby-r3j2HpTd.js → ruby-gu2hDDCx.js} +1 -1
  62. package/extensions/pidiff/pidiff-ui/dist/assets/{sas-D60aovOU.js → sas-Bo6NwyH7.js} +1 -1
  63. package/extensions/pidiff/pidiff-ui/dist/assets/{scss-DsQ9e_9i.js → scss-COdGMqPA.js} +1 -1
  64. package/extensions/pidiff/pidiff-ui/dist/assets/{shellscript-C0CTDLfP.js → shellscript-DSg7qNC1.js} +1 -1
  65. package/extensions/pidiff/pidiff-ui/dist/assets/{shellsession-CYQ4mhku.js → shellsession-CD1RmUpx.js} +1 -1
  66. package/extensions/pidiff/pidiff-ui/dist/assets/{soy-K7-GBqQU.js → soy-C0QWCEMl.js} +1 -1
  67. package/extensions/pidiff/pidiff-ui/dist/assets/{sql-BPU0aGlV.js → sql-VoWQdTUw.js} +1 -1
  68. package/extensions/pidiff/pidiff-ui/dist/assets/{stata-BBQHbN5d.js → stata-BEj75h4q.js} +1 -1
  69. package/extensions/pidiff/pidiff-ui/dist/assets/{surrealql-DaVLur3e.js → surrealql-Cj1XbW6j.js} +1 -1
  70. package/extensions/pidiff/pidiff-ui/dist/assets/{svelte-CPKe6KLX.js → svelte-HcwCBvjC.js} +1 -1
  71. package/extensions/pidiff/pidiff-ui/dist/assets/{templ-4FsggzCO.js → templ-D775vyzu.js} +1 -1
  72. package/extensions/pidiff/pidiff-ui/dist/assets/{tex-Bz9V0XEc.js → tex-DNmK_71Q.js} +1 -1
  73. package/extensions/pidiff/pidiff-ui/dist/assets/{ts-tags-BAJP-RsL.js → ts-tags-KERjFDJj.js} +1 -1
  74. package/extensions/pidiff/pidiff-ui/dist/assets/{tsx-CaD50Q9K.js → tsx-CMT8AiHA.js} +1 -1
  75. package/extensions/pidiff/pidiff-ui/dist/assets/{twig-Bo_rsqRW.js → twig-B5uxCA6R.js} +1 -1
  76. package/extensions/pidiff/pidiff-ui/dist/assets/{typescript-BTuHo9Ga.js → typescript-5zwf3bJw.js} +1 -1
  77. package/extensions/pidiff/pidiff-ui/dist/assets/{typst-BvQMhY4k.js → typst-xx02l63O.js} +1 -1
  78. package/extensions/pidiff/pidiff-ui/dist/assets/{vue-D8h9s3oH.js → vue-BvvQRkFj.js} +1 -1
  79. package/extensions/pidiff/pidiff-ui/dist/assets/{vue-html-UkoLjlSQ.js → vue-html-BrBDvgBy.js} +1 -1
  80. package/extensions/pidiff/pidiff-ui/dist/assets/{vue-vine-lVry86q7.js → vue-vine-1CllPWUz.js} +1 -1
  81. package/extensions/pidiff/pidiff-ui/dist/assets/{xml-BxyPU0Nr.js → xml-C3nsfg4x.js} +1 -1
  82. package/extensions/pidiff/pidiff-ui/dist/assets/{xsl-BUb2EUMx.js → xsl-DDOShcMh.js} +1 -1
  83. package/extensions/pidiff/pidiff-ui/dist/assets/{yaml-qnjzIwGf.js → yaml-BGNXenqm.js} +1 -1
  84. package/extensions/pidiff/pidiff-ui/dist/index.html +2 -2
  85. package/extensions/pidiff/pidiff-ui/package.json +1 -1
  86. package/extensions/pidiff/pidiff-ui/src/App.tsx +95 -36
  87. package/extensions/pidiff/pidiff-ui/src/hooks/useWebSocket.ts +52 -10
  88. package/extensions/pidiff/pidiff-ui/src/lib/app-reconnect-watch.tsx +32 -0
  89. package/extensions/pidiff/pidiff-ui/src/lib/app-refresh-actions.tsx +47 -0
  90. package/extensions/pidiff/pidiff-ui/src/lib/create-logger.ts +37 -0
  91. package/extensions/pidiff/pidiff-ui/src/lib/file-cache-key.ts +34 -0
  92. package/extensions/pidiff/pidiff-ui/src/lib/refresh-control.tsx +43 -0
  93. package/extensions/pidiff/pidiff-ui/src/lib/request-diffs.ts +91 -0
  94. package/extensions/pidiff/pidiff-ui/src/lib/ws-send.ts +141 -0
  95. package/extensions/shared/openai-compatible-discovery.ts +558 -0
  96. package/package.json +5 -2
  97. package/rules/00-orchestrator-core.md +2 -2
  98. package/rules/15-mcpc.md +35 -0
  99. package/rules/20-code-review-loop.md +11 -1
  100. package/scripts/pidiff-git-ignore.ts +55 -0
  101. package/scripts/pidiff-server.ts +27 -26
  102. package/settings-keys.json +1 -1
  103. package/extensions/pidiff/pidiff-ui/dist/assets/index-CHmSwztf.css +0 -1
  104. package/rules/15-mcp-launchpad.md +0 -46
@@ -55,7 +55,36 @@ Before ANY `git commit`, if `review_loop_enforcement` is `true`:
55
55
  ## Protection Rules
56
56
 
57
57
  - NEVER commit or push to main/master branch (unless `allow_push_to_protected_branches` is `true` — see Project Settings)
58
- - NEVER commit to already-merged branches
58
+ - Before every commit on a non-main/master branch, check whether that branch was merged:
59
+
60
+ ```bash
61
+ current_branch=$(git branch --show-current)
62
+ remote_ref="refs/remotes/origin/$current_branch"
63
+ default_ref=$(git symbolic-ref --quiet refs/remotes/origin/HEAD 2>/dev/null || true)
64
+ if ! git show-ref --verify --quiet "$default_ref"; then
65
+ if git show-ref --verify --quiet refs/remotes/origin/main; then
66
+ default_ref=refs/remotes/origin/main
67
+ elif git show-ref --verify --quiet refs/remotes/origin/master; then
68
+ default_ref=refs/remotes/origin/master
69
+ else
70
+ echo "BLOCK: cannot resolve origin's default branch"
71
+ exit 1
72
+ fi
73
+ fi
74
+
75
+ if git show-ref --verify --quiet "$remote_ref" \
76
+ && git merge-base --is-ancestor "$remote_ref" "$default_ref" \
77
+ && [ "$(git rev-parse "$remote_ref")" != "$(git rev-parse "$default_ref")" ]; then
78
+ echo "BLOCK: origin/$current_branch is already merged into ${default_ref#refs/remotes/origin/}"
79
+ exit 1
80
+ fi
81
+ ```
82
+
83
+ Resolve the default branch from `refs/remotes/origin/HEAD`. If that symbolic ref is unavailable
84
+ or invalid, fall back to `refs/remotes/origin/main`, then `refs/remotes/origin/master`; block the
85
+ commit if neither exists. Block only when `refs/remotes/origin/<current-branch>` exists, its tip
86
+ is an ancestor of the resolved default tip, and the two tips are not equal. A fresh pushed branch
87
+ at the default tip is allowed. If the matching remote ref does not exist, continue with the commit.
59
88
  - NEVER use `--no-verify` flag
60
89
  - Branch prefixes: `feature/`, `fix/`, `hotfix/`, `refactor/`
61
90
 
@@ -0,0 +1,204 @@
1
+ import type { AuthResult, Model, Provider } from "@earendil-works/pi-ai";
2
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
3
+ import { createRuntimeProvider } from "../shared/create-runtime-provider.js";
4
+ import { createLogger } from "../shared/logger.js";
5
+ import {
6
+ OpenAiCompatibleDiscoveryCache,
7
+ buildOpenAiCompatibleModelsRequest,
8
+ findEligibleOpenAiCompatibleProviderConfigsResult,
9
+ formatOpenAiCompatibleDiscoverySummary,
10
+ materializeOpenAiCompatibleModels,
11
+ openAiCompatibleConnectionFingerprint,
12
+ redactOpenAiCompatibleDiagnostic,
13
+ resolveStaticOpenAiCompatibleHeaders,
14
+ type OpenAiCompatibleModelRecord,
15
+ type ResolvedOpenAiCompatibleConnection,
16
+ } from "../shared/openai-compatible-discovery.js";
17
+
18
+ const log = createLogger("openai-compatible-discovery");
19
+ const REQUEST_TIMEOUT_MS = 20_000;
20
+
21
+ function responseRecords(payload: unknown): OpenAiCompatibleModelRecord[] {
22
+ if (!payload || typeof payload !== "object" || !Array.isArray((payload as { data?: unknown }).data))
23
+ throw new Error("OpenAI-compatible /v1/models response must contain a data array");
24
+ return (payload as { data: unknown[] }).data.flatMap((record) => {
25
+ if (!record || typeof record !== "object" || Array.isArray(record)) return [];
26
+ const model = record as OpenAiCompatibleModelRecord;
27
+ return typeof model.id === "string" ? [model] : [];
28
+ });
29
+ }
30
+
31
+ function resolvedConnection(source: Provider, auth?: AuthResult, staticHeaders?: Record<string, string>): ResolvedOpenAiCompatibleConnection {
32
+ return {
33
+ baseUrl: auth?.auth.baseUrl ?? source.baseUrl,
34
+ apiKey: auth?.auth.apiKey,
35
+ headers: { ...(source.headers ?? {}), ...(staticHeaders ?? {}), ...(auth?.auth.headers ?? {}) },
36
+ };
37
+ }
38
+
39
+ function combineModels(sourceProviderId: string, staticModels: readonly Model[], records: readonly OpenAiCompatibleModelRecord[], baseUrl: string): Model[] {
40
+ const existingIds = new Set(staticModels.map((model) => model.id));
41
+ const discovered = materializeOpenAiCompatibleModels(records, baseUrl, sourceProviderId)
42
+ .filter((model) => !existingIds.has(model.id));
43
+ return [...staticModels, ...discovered];
44
+ }
45
+
46
+ async function discoverProvider(
47
+ pi: ExtensionAPI,
48
+ ctx: any,
49
+ sourceProviderId: string,
50
+ rawStaticHeaders: Record<string, string> | undefined,
51
+ cache: OpenAiCompatibleDiscoveryCache<OpenAiCompatibleModelRecord>,
52
+ signal: AbortSignal,
53
+ isCurrent: () => boolean,
54
+ registeredSources: Set<string>,
55
+ ): Promise<void> {
56
+ if (!isCurrent()) return;
57
+ const source = ctx.modelRegistry.getProvider(sourceProviderId) as Provider | undefined;
58
+ if (!source) {
59
+ log.warn(`${sourceProviderId}: configured provider was not resolved`);
60
+ return;
61
+ }
62
+ let auth: AuthResult | undefined;
63
+ let staticHeaders: Record<string, string> | undefined;
64
+ try {
65
+ auth = await ctx.modelRegistry.getProviderAuth(sourceProviderId);
66
+ staticHeaders = await resolveStaticOpenAiCompatibleHeaders(rawStaticHeaders);
67
+ } catch {
68
+ log.warn(`${sourceProviderId}: authentication or configured headers could not be resolved`);
69
+ return;
70
+ }
71
+ const connection = resolvedConnection(source, auth, staticHeaders);
72
+ let request;
73
+ try {
74
+ request = buildOpenAiCompatibleModelsRequest(connection);
75
+ } catch (error) {
76
+ log.warn(`${sourceProviderId}: discovery inactive`, redactOpenAiCompatibleDiagnostic(error instanceof Error ? error.message : String(error), connection));
77
+ return;
78
+ }
79
+ const records = await cache.get(async () => {
80
+ try {
81
+ const response = await fetch(request.url, {
82
+ headers: request.headers,
83
+ redirect: "error",
84
+ signal: AbortSignal.any([signal, AbortSignal.timeout(REQUEST_TIMEOUT_MS)]),
85
+ });
86
+ if (!response.ok) throw new Error(`OpenAI-compatible /v1/models returned HTTP ${response.status}`);
87
+ return responseRecords(await response.json());
88
+ } catch (error) {
89
+ log.warn(`${sourceProviderId}: discovery refresh failed`, redactOpenAiCompatibleDiagnostic(error instanceof Error ? error.message : String(error), connection));
90
+ throw error;
91
+ }
92
+ }, { cacheKey: openAiCompatibleConnectionFingerprint(connection) });
93
+ if (!isCurrent() || !records.hasSnapshot) return;
94
+ if (records.stale) log.warn(`${sourceProviderId}: refresh failed; using last-known-good discovery result`);
95
+
96
+ const staticModels = (ctx.modelRegistry.getAll() as Model[])
97
+ .filter((model) => model.provider === sourceProviderId);
98
+ const models = combineModels(sourceProviderId, staticModels, records.models, request.streamBaseUrl);
99
+ try {
100
+ const provider = await createRuntimeProvider({
101
+ id: sourceProviderId,
102
+ name: source.name,
103
+ baseUrl: request.streamBaseUrl,
104
+ auth: source.auth,
105
+ models,
106
+ api: {
107
+ stream: source.stream.bind(source),
108
+ streamSimple: source.streamSimple.bind(source),
109
+ },
110
+ });
111
+ if (!isCurrent()) return;
112
+ // Pi composes this native provider with the existing models.json entry. The
113
+ // source key is therefore both the ordinary picker label and routing key.
114
+ pi.registerProvider(provider);
115
+ registeredSources.add(sourceProviderId);
116
+ try {
117
+ pi.appendEntry<OpenAiCompatibleDiscoverySummary>(
118
+ "openai-compatible-discovery-summary",
119
+ { summary: formatOpenAiCompatibleDiscoverySummary(sourceProviderId, records.models.length) },
120
+ );
121
+ } catch (error) {
122
+ log.warn(`${sourceProviderId}: discovery summary append failed`, error instanceof Error ? error.name : typeof error);
123
+ }
124
+ log.info(`${sourceProviderId}: registered ${records.models.length} discovered model(s) on configured provider`);
125
+ } catch (error) {
126
+ log.warn(`${sourceProviderId}: provider augmentation failed`, redactOpenAiCompatibleDiagnostic(error instanceof Error ? error.message : String(error), connection));
127
+ }
128
+ }
129
+
130
+ interface OpenAiCompatibleDiscoverySummary {
131
+ summary: string;
132
+ }
133
+
134
+ /** A renderer component without a runtime dependency on Pi's TUI package. */
135
+ function discoverySummaryComponent(summary: string, theme: { fg: (color: "muted", text: string) => string }) {
136
+ log.debug("rendering discovery summary", { summary });
137
+ return {
138
+ render: (_width: number): string[] => [theme.fg("muted", summary)],
139
+ invalidate: (): void => {},
140
+ };
141
+ }
142
+
143
+ export default function (pi: ExtensionAPI) {
144
+ if (typeof pi.registerEntryRenderer === "function") {
145
+ pi.registerEntryRenderer<OpenAiCompatibleDiscoverySummary>(
146
+ "openai-compatible-discovery-summary",
147
+ (entry, _options, theme) => discoverySummaryComponent(entry.data?.summary ?? "", theme),
148
+ );
149
+ }
150
+
151
+ const cache = new OpenAiCompatibleDiscoveryCache<OpenAiCompatibleModelRecord>();
152
+ const registeredSources = new Set<string>();
153
+ const controllers = new Set<AbortController>();
154
+ let active = true;
155
+ let generation = 0;
156
+
157
+ const restoreSources = () => {
158
+ for (const id of registeredSources) {
159
+ try {
160
+ // Removing our native overlay makes Pi recompose the unchanged static provider.
161
+ pi.unregisterProvider(id);
162
+ } catch (error) {
163
+ log.warn("provider augmentation cleanup failed", { provider: id, cause: error instanceof Error ? error.name : typeof error });
164
+ }
165
+ registeredSources.delete(id);
166
+ }
167
+ };
168
+
169
+ pi.on("session_shutdown", () => {
170
+ active = false;
171
+ generation += 1;
172
+ for (const controller of controllers) controller.abort();
173
+ controllers.clear();
174
+ cache.clear();
175
+ restoreSources();
176
+ });
177
+
178
+ pi.on("session_start", async (_event, ctx) => {
179
+ if (ctx?.mode !== "tui" || ctx?.hasUI !== true) return;
180
+ active = true;
181
+ generation += 1;
182
+ for (const controller of controllers) controller.abort();
183
+ controllers.clear();
184
+ cache.clear();
185
+ restoreSources();
186
+ const currentGeneration = generation;
187
+ const controller = new AbortController();
188
+ controllers.add(controller);
189
+ const isCurrent = () => active && currentGeneration === generation;
190
+ const configResult = findEligibleOpenAiCompatibleProviderConfigsResult();
191
+ if (configResult.providers.length === 0) {
192
+ const diagnostic = { modelsConfig: configResult.status };
193
+ if (configResult.status === "unreadable" || configResult.status === "malformed")
194
+ log.warn("inactive: OpenAI-compatible discovery configuration unavailable", diagnostic);
195
+ else log.debug("inactive: no opted-in OpenAI-compatible providers", diagnostic);
196
+ controllers.delete(controller);
197
+ return;
198
+ }
199
+ await Promise.all(configResult.providers.map(({ id, headers }) =>
200
+ discoverProvider(pi, ctx, id, headers, cache, controller.signal, isCurrent, registeredSources),
201
+ ));
202
+ controllers.delete(controller);
203
+ });
204
+ }
@@ -19,6 +19,7 @@
19
19
  * /cron <Tab> → add, list, list-all, remove
20
20
  * /dream-auto <Tab> → on, off
21
21
  * /async-kill <Tab> → all (or type name / id prefix)
22
+ * /mcpc <Tab> → connect
22
23
  */
23
24
 
24
25
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
@@ -28,6 +29,7 @@ import * as fs from "node:fs";
28
29
  import { execFileSync } from "node:child_process";
29
30
  import * as path from "node:path";
30
31
  import { getCronFilePath } from "./cron.js";
32
+ import { mcpcArgumentCompletions } from "./mcpc.js";
31
33
 
32
34
  // ── Cache infrastructure ────────────────────────────────────────────
33
35
 
@@ -266,6 +268,8 @@ function registerCompletions(
266
268
  }
267
269
  },
268
270
 
271
+ "mcpc": mcpcArgumentCompletions,
272
+
269
273
  "dream-auto": (prefix: string) => {
270
274
  return filter([
271
275
  { value: "on", label: "on", description: "Enable auto-dreaming (every 3h + session end)" },
@@ -0,0 +1,172 @@
1
+ /**
2
+ * mcpc — connect MCP servers from ~/.pi/pi-config/mcp.json.
3
+ *
4
+ * Auto-connect on pi process start (session_start reason "startup").
5
+ * /mcpc connect reconnects after the user edits that file.
6
+ * Connect failure is logged; it never fails the pi session.
7
+ */
8
+
9
+ import { execFile } from "node:child_process";
10
+ import * as fs from "node:fs";
11
+ import * as os from "node:os";
12
+ import * as path from "node:path";
13
+ import { promisify } from "node:util";
14
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
15
+ import { isPiOneshotInvocation } from "../shared/oneshot.js";
16
+ import { createLogger } from "../shared/logger.js";
17
+
18
+ const execFileAsync = promisify(execFile);
19
+ const log = createLogger("orchestrator", "mcpc");
20
+
21
+ const CONNECT_TIMEOUT_MS = 120_000;
22
+ const MAX_BUFFER = 10 * 1024 * 1024;
23
+
24
+ export type McpcExecFile = (
25
+ file: string,
26
+ args: readonly string[],
27
+ options: { timeout: number; maxBuffer: number; env?: NodeJS.ProcessEnv },
28
+ ) => Promise<{ stdout: string | Buffer; stderr: string | Buffer }>;
29
+
30
+ let execMcpcConnect: McpcExecFile = execFileAsync as McpcExecFile;
31
+
32
+ /** Replace the mcpc subprocess (tests). Pass undefined to restore. */
33
+ export function setMcpcExecFile(fn: McpcExecFile | undefined): void {
34
+ execMcpcConnect = fn ?? (execFileAsync as McpcExecFile);
35
+ log.debug("setMcpcExecFile", fn ? "override" : "restore");
36
+ }
37
+
38
+ export function mcpcConfigPath(): string {
39
+ const home = process.env.HOME || os.homedir();
40
+ const configPath = path.join(home, ".pi", "pi-config", "mcp.json");
41
+ log.debug("mcpcConfigPath", configPath);
42
+ return configPath;
43
+ }
44
+
45
+ export type McpcConnectResult = {
46
+ ok: boolean;
47
+ skipped: boolean;
48
+ message: string;
49
+ };
50
+
51
+ export type McpcCompletionItem = {
52
+ value: string;
53
+ label: string;
54
+ description: string;
55
+ };
56
+
57
+ const MCPC_CONNECT_COMPLETION: McpcCompletionItem = {
58
+ value: "connect",
59
+ label: "connect",
60
+ description: "Connect ~/.pi/pi-config/mcp.json (--stdio)",
61
+ };
62
+
63
+ export function mcpcArgumentCompletions(prefix: string): McpcCompletionItem[] | null {
64
+ log.debug("mcpc argument completions", prefix);
65
+ const needle = prefix.trim().toLowerCase();
66
+ const haystack = `${MCPC_CONNECT_COMPLETION.label} ${MCPC_CONNECT_COMPLETION.description}`.toLowerCase();
67
+ if (!needle || haystack.includes(needle) || MCPC_CONNECT_COMPLETION.value.startsWith(needle)) {
68
+ return [MCPC_CONNECT_COMPLETION];
69
+ }
70
+ return null;
71
+ }
72
+
73
+ function formatExecError(err: unknown): string {
74
+ if (!err || typeof err !== "object") {
75
+ log.debug("formatExecError non-object", String(err));
76
+ return String(err);
77
+ }
78
+ const e = err as {
79
+ code?: string;
80
+ killed?: boolean;
81
+ message?: string;
82
+ stdout?: string;
83
+ stderr?: string;
84
+ };
85
+ log.debug("formatExecError", { code: e.code ?? "none", killed: Boolean(e.killed) });
86
+ const parts: string[] = [];
87
+ if (e.code === "ENOENT") {
88
+ parts.push("mcpc not on PATH. Install: npm install -g @apify/mcpc");
89
+ } else if (e.killed) {
90
+ parts.push(`mcpc connect timed out after ${CONNECT_TIMEOUT_MS / 1000}s`);
91
+ } else if (e.message) {
92
+ parts.push(e.message);
93
+ }
94
+ const out = [e.stdout, e.stderr].filter(Boolean).join("\n").trim();
95
+ if (out) parts.push(out);
96
+ return parts.join("\n") || "mcpc connect failed";
97
+ }
98
+
99
+ /** Run `mcpc connect <mcp.json> --stdio`. Never throws. */
100
+ export async function connectMcpc(): Promise<McpcConnectResult> {
101
+ const configPath = mcpcConfigPath();
102
+ log.debug("connectMcpc entry", configPath);
103
+
104
+ if (!fs.existsSync(configPath)) {
105
+ log.debug("skip: mcp.json missing", configPath);
106
+ return {
107
+ ok: true,
108
+ skipped: true,
109
+ message: `No MCP config at ${configPath} — skip connect (create that file to use mcpc).`,
110
+ };
111
+ }
112
+
113
+ log.info("mcpc connect start", configPath);
114
+ try {
115
+ const { stdout, stderr } = await execMcpcConnect(
116
+ "mcpc",
117
+ ["connect", configPath, "--stdio"],
118
+ {
119
+ timeout: CONNECT_TIMEOUT_MS,
120
+ maxBuffer: MAX_BUFFER,
121
+ env: process.env,
122
+ },
123
+ );
124
+ const out = [stdout, stderr].filter(Boolean).join("\n").trim();
125
+ log.info("mcpc connect finished", configPath);
126
+ log.debug("mcpc connect output", out);
127
+ return {
128
+ ok: true,
129
+ skipped: false,
130
+ message: out || `mcpc connect finished (${configPath} --stdio)`,
131
+ };
132
+ } catch (err) {
133
+ const message = formatExecError(err);
134
+ log.warn("mcpc connect failed; continuing", message);
135
+ return { ok: false, skipped: false, message };
136
+ }
137
+ }
138
+
139
+ export function registerMcpc(pi: ExtensionAPI): void {
140
+ log.info("registerMcpc");
141
+ pi.registerCommand("mcpc", {
142
+ description:
143
+ "Reconnect MCP servers from ~/.pi/pi-config/mcp.json (mcpc connect --stdio). Run after editing that file.",
144
+ handler: async (args, ctx) => {
145
+ const sub = (args || "").trim();
146
+ if (sub && sub !== "connect") {
147
+ log.debug("/mcpc ignored unknown args", sub);
148
+ if (ctx.hasUI) ctx.ui.notify("Usage: /mcpc connect", "warning");
149
+ return;
150
+ }
151
+ log.info("/mcpc connect");
152
+ const result = await connectMcpc();
153
+ if (!ctx.hasUI) return;
154
+ if (result.skipped) ctx.ui.notify(result.message, "info");
155
+ else if (result.ok) ctx.ui.notify(result.message, "info");
156
+ else ctx.ui.notify(result.message, "warning");
157
+ },
158
+ });
159
+
160
+ pi.on("session_start", async (event, _ctx) => {
161
+ const reason = (event as { reason?: string })?.reason ?? "unknown";
162
+ if (reason !== "startup") {
163
+ log.debug("skip auto-connect: session_start reason", reason);
164
+ return;
165
+ }
166
+ if (isPiOneshotInvocation()) {
167
+ log.debug("skip auto-connect: oneshot");
168
+ return;
169
+ }
170
+ await connectMcpc();
171
+ });
172
+ }
@@ -8,6 +8,7 @@ import * as fs from "node:fs";
8
8
  import * as path from "node:path";
9
9
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
10
10
  import { setUvAvailable, isUvAvailable } from "./enforcement-helpers.js";
11
+ import { registerMcpc } from "./mcpc.js";
11
12
  import { checkMinPiVersion } from "./utils.js";
12
13
 
13
14
  /** Check whether a CLI command is available on PATH. */
@@ -209,9 +210,9 @@ async function checkSessionTools(ctx: any): Promise<void> {
209
210
  // Optional
210
211
  if (!hasCmd("gh"))
211
212
  optional.push("gh — GitHub CLI. Install: https://cli.github.com/");
212
- if (!hasCmd("mcpl"))
213
+ if (!hasCmd("mcpc"))
213
214
  optional.push(
214
- "mcpl — MCP Launchpad. Install: https://github.com/kenneth-liao/mcp-launchpad",
215
+ "mcpc — MCP CLI. Install: npm install -g @apify/mcpc",
215
216
  );
216
217
  if (!hasCmd("myk-pi-tools"))
217
218
  optional.push(
@@ -333,6 +334,7 @@ async function checkUpgradeChangelog(ctx: any): Promise<void> {
333
334
 
334
335
  export function registerSessionValidation(pi: ExtensionAPI): void {
335
336
  registerRepairCommand(pi);
337
+ registerMcpc(pi);
336
338
 
337
339
  pi.on("session_start", async (_event, ctx) => {
338
340
  // Always check uv availability — even in headless mode.
@@ -1 +1 @@
1
- import{t as e}from"./index-D9FMfzhy.js";import{t}from"./html-DBGhw7-O.js";var n=[Object.freeze(JSON.parse('{"injectionSelector":"L:text.html -comment","name":"angular-expression","patterns":[{"include":"#ngExpression"}],"repository":{"arrayLiteral":{"begin":"\\\\[","beginCaptures":{"0":{"name":"meta.brace.square.ts"}},"end":"]","endCaptures":{"0":{"name":"meta.brace.square.ts"}},"name":"meta.array.literal.ts","patterns":[{"include":"#ngExpression"},{"include":"#punctuationComma"}]},"booleanLiteral":{"patterns":[{"match":"(?<![$.])\\\\btrue\\\\b(?!\\\\$)","name":"constant.language.boolean.true.ts"},{"match":"(?<![$.])\\\\bfalse\\\\b(?!\\\\$)","name":"constant.language.boolean.false.ts"}]},"expressionOperator":{"patterns":[{"captures":{"1":{"name":"keyword.operator.logical.ts"},"2":{"name":"entity.name.function.pipe.ng"}},"match":"((?<!\\\\|)\\\\|(?!\\\\|))\\\\s?([-$0-9A-Z_a-z]*)"},{"match":"(?<![$.])\\\\b(let)\\\\b(?!\\\\$)","name":"storage.type.ts"},{"match":"(?<![$.])\\\\b(await)\\\\b(?!\\\\$)","name":"keyword.control.flow.ts"},{"match":"(?<![$.])\\\\bdelete\\\\b(?!\\\\$)","name":"keyword.operator.expression.delete.ts"},{"match":"(?<![$.])\\\\bin\\\\b(?!\\\\$)","name":"keyword.operator.expression.in.ts"},{"match":"(?<![$.])\\\\bof\\\\b(?!\\\\$)","name":"keyword.operator.expression.of.ts"},{"match":"(?<![$.])\\\\bif\\\\b(?!\\\\$)","name":"keyword.control.if.ts"},{"match":"(?<![$.])\\\\belse\\\\b(?!\\\\$)","name":"keyword.control.else.ts"},{"match":"(?<![$.])\\\\bthen\\\\b(?!\\\\$)","name":"keyword.control.then.ts"},{"match":"(?<![$.])\\\\binstanceof\\\\b(?!\\\\$)","name":"keyword.operator.expression.instanceof.ts"},{"match":"(?<![$.])\\\\bnew\\\\b(?!\\\\$)","name":"keyword.operator.new.ts"},{"match":"(?<![$.])\\\\bvoid\\\\b(?!\\\\$)","name":"keyword.operator.expression.void.ts"},{"begin":"(?<![$.])\\\\bas\\\\b(?!\\\\$)","beginCaptures":{"0":{"name":"storage.type.as.ts"}},"end":"(?=$|[]\\"\'),:;}])","patterns":[{"include":"#type"}]},{"match":"(?:\\\\*|(?<!\\\\()/|[-%+])=","name":"keyword.operator.assignment.compound.ts"},{"match":"(?:[\\\\&^]|<<|>>>??|\\\\|)=","name":"keyword.operator.assignment.compound.bitwise.ts"},{"match":"<<|>>>?","name":"keyword.operator.bitwise.shift.ts"},{"match":"[!=]==?","name":"keyword.operator.comparison.ts"},{"match":"<=|>=|<>|[<>]","name":"keyword.operator.relational.ts"},{"match":"!|&&|\\\\?\\\\?|\\\\|\\\\|","name":"keyword.operator.logical.ts"},{"match":"[\\\\&^|~]","name":"keyword.operator.bitwise.ts"},{"match":"=","name":"keyword.operator.assignment.ts"},{"match":"--","name":"keyword.operator.decrement.ts"},{"match":"\\\\+\\\\+","name":"keyword.operator.increment.ts"},{"match":"[-%*+/]","name":"keyword.operator.arithmetic.ts"},{"captures":{"1":{"name":"keyword.operator.arithmetic.ts"}},"match":"(?<=[$_[:alnum:]])\\\\s*(/)(?![*/])"},{"include":"#typeofOperator"}]},"functionCall":{"begin":"(?=(\\\\??\\\\.\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\()","end":"(?<=\\\\))(?!(\\\\??\\\\.\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\()","patterns":[{"match":"\\\\?","name":"punctuation.accessor.ts"},{"match":"\\\\.","name":"punctuation.accessor.ts"},{"match":"([$_[:alpha:]][$_[:alnum:]]*)","name":"entity.name.function.ts"},{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.typeparameters.begin.ts"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.typeparameters.end.ts"}},"name":"meta.type.parameters.ts","patterns":[{"include":"#type"},{"include":"#punctuationComma"}]},{"include":"#parenExpression"}]},"functionParameters":{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.parameters.begin.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.ts"}},"name":"meta.parameters.ts","patterns":[{"include":"#decorator"},{"include":"#parameterName"},{"include":"#variableInitializer"},{"match":",","name":"punctuation.separator.parameter.ts"}]},"identifiers":{"patterns":[{"match":"([$_[:alpha:]][$_[:alnum:]]*)(?=\\\\s*\\\\.\\\\s*prototype\\\\b(?!\\\\$))","name":"support.class.ts"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"constant.other.object.property.ts"},"3":{"name":"variable.other.object.property.ts"}},"match":"([!?]?\\\\.)\\\\s*(?:(\\\\p{upper}[$_\\\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\\\s*\\\\.\\\\s*[$_[:alpha:]][$_[:alnum:]]*)"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"entity.name.function.ts"}},"match":"(?:([!?]?\\\\.)\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)(?=\\\\s*=\\\\s*((async\\\\s+)|(function\\\\s*[(<])|(function\\\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\\\s*=>)|((<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)(\\\\s*:\\\\s*(.)*)?\\\\s*=>)))"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"constant.other.property.ts"}},"match":"([!?]?\\\\.)\\\\s*(\\\\p{upper}[$_\\\\d[:upper:]]*)(?![$_[:alnum:]])"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"variable.other.property.ts"}},"match":"([!?]?\\\\.)\\\\s*([$_[:alpha:]][$_[:alnum:]]*)"},{"captures":{"1":{"name":"constant.other.object.ts"},"2":{"name":"variable.other.object.ts"}},"match":"(?:(\\\\p{upper}[$_\\\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\\\s*\\\\.\\\\s*[$_[:alpha:]][$_[:alnum:]]*)"},{"match":"(\\\\p{upper}[$_\\\\d[:upper:]]*)(?![$_[:alnum:]])","name":"constant.character.other"},{"match":"[$_[:alpha:]][$_[:alnum:]]*","name":"variable.other.readwrite.ts"}]},"literal":{"name":"literal.ts","patterns":[{"include":"#numericLiteral"},{"include":"#booleanLiteral"},{"include":"#nullLiteral"},{"include":"#undefinedLiteral"},{"include":"#numericConstantLiteral"},{"include":"#arrayLiteral"},{"include":"#thisLiteral"}]},"ngExpression":{"name":"meta.expression.ng","patterns":[{"include":"#string"},{"include":"#literal"},{"include":"#ternaryExpression"},{"include":"#expressionOperator"},{"include":"#functionCall"},{"include":"#identifiers"},{"include":"#parenExpression"},{"include":"#punctuationComma"},{"include":"#punctuationSemicolon"},{"include":"#punctuationAccessor"}]},"nullLiteral":{"match":"(?<![$.])\\\\bnull\\\\b(?!\\\\$)","name":"constant.language.null.ts"},"numericConstantLiteral":{"patterns":[{"match":"(?<![$.])\\\\bNaN\\\\b(?!\\\\$)","name":"constant.language.nan.ts"},{"match":"(?<![$.])\\\\bInfinity\\\\b(?!\\\\$)","name":"constant.language.infinity.ts"}]},"numericLiteral":{"patterns":[{"match":"\\\\b(?<!\\\\$)0([Xx])\\\\h+\\\\b(?!\\\\$)","name":"constant.numeric.hex.ts"},{"match":"\\\\b(?<!\\\\$)0([Bb])[01]+\\\\b(?!\\\\$)","name":"constant.numeric.binary.ts"},{"match":"\\\\\\\\b(?<!\\\\$)0([Oo])?[0-7]+\\\\b(?!\\\\$)","name":"constant.numeric.octal.ts"},{"captures":{"0":{"name":"constant.numeric.decimal.ts"},"1":{"name":"meta.delimiter.decimal.period.ts"},"2":{"name":"meta.delimiter.decimal.period.ts"},"3":{"name":"meta.delimiter.decimal.period.ts"},"4":{"name":"meta.delimiter.decimal.period.ts"},"5":{"name":"meta.delimiter.decimal.period.ts"},"6":{"name":"meta.delimiter.decimal.period.ts"}},"match":"(?<!\\\\$)(?:\\\\b[0-9]+(\\\\.)[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+(\\\\.)[Ee][-+]?[0-9]+\\\\b|\\\\B(\\\\.)[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+(\\\\.)\\\\B|\\\\B(\\\\.)[0-9]+\\\\b|\\\\b[0-9]+\\\\b(?!\\\\.))(?!\\\\$)"}]},"parameterName":{"patterns":[{"captures":{"1":{"name":"storage.modifier.ts"},"2":{"name":"storage.modifier.ts"},"3":{"name":"keyword.operator.rest.ts"},"4":{"name":"entity.name.function.ts"},"5":{"name":"keyword.operator.optional.ts"}},"match":"(?:\\\\s*\\\\b(readonly)\\\\s+)?(?:\\\\s*\\\\b(p(?:ublic|rivate|rotected))\\\\s+)?(\\\\.\\\\.\\\\.)?\\\\s*(?<![:=])([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(\\\\??)(?=\\\\s*(=\\\\s*((async\\\\s+)|(function\\\\s*[(<])|(function\\\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\\\s*=>)|((<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)(\\\\s*:\\\\s*(.)*)?\\\\s*=>)))|(:\\\\s*((<)|(\\\\(\\\\s*((\\\\))|(\\\\.\\\\.\\\\.)|([$_[:alnum:]]+\\\\s*(([,:=?])|(\\\\)\\\\s*=>))))))))"},{"captures":{"1":{"name":"storage.modifier.ts"},"2":{"name":"storage.modifier.ts"},"3":{"name":"keyword.operator.rest.ts"},"4":{"name":"variable.parameter.ts"},"5":{"name":"keyword.operator.optional.ts"}},"match":"(?:\\\\s*\\\\b(readonly)\\\\s+)?(?:\\\\s*\\\\b(p(?:ublic|rivate|rotected))\\\\s+)?(\\\\.\\\\.\\\\.)?\\\\s*(?<![:=])([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(\\\\??)"}]},"parenExpression":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"patterns":[{"include":"#ngExpression"},{"include":"#punctuationComma"}]},"punctuationAccessor":{"match":"(?:\\\\?|!?)\\\\.","name":"punctuation.accessor.ts"},"punctuationComma":{"match":",","name":"punctuation.separator.comma.ts"},"punctuationSemicolon":{"match":";","name":"punctuation.terminator.statement.ts"},"qstringDouble":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ts"}},"end":"(\\")|([^\\\\n\\\\\\\\])$","endCaptures":{"1":{"name":"punctuation.definition.string.end.ts"},"2":{"name":"invalid.illegal.newline.ts"}},"name":"string.quoted.double.ts","patterns":[{"include":"#stringCharacterEscape"}]},"qstringSingle":{"begin":"\'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ts"}},"end":"(\')|([^\\\\n\\\\\\\\])$","endCaptures":{"1":{"name":"punctuation.definition.string.end.ts"},"2":{"name":"invalid.illegal.newline.ts"}},"name":"string.quoted.single.ts","patterns":[{"include":"#stringCharacterEscape"}]},"string":{"patterns":[{"include":"#qstringSingle"},{"include":"#qstringDouble"},{"include":"#templateLiteral"}]},"stringCharacterEscape":{"match":"\\\\\\\\(x\\\\h{2}|[012][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)","name":"constant.character.escape.ts"},"templateLiteral":{"patterns":[{"include":"#templateLiteralCall"},{"begin":"([$_[:alpha:]][$_[:alnum:]]*)?(`)","beginCaptures":{"1":{"name":"entity.name.function.tagged-template.ts"},"2":{"name":"string.template.ts punctuation.definition.string.template.begin.ts"}},"contentName":"string.template.ts","end":"`","endCaptures":{"0":{"name":"string.template.ts punctuation.definition.string.template.end.ts"}},"patterns":[{"include":"#templateLiteralSubstitutionElement"},{"include":"#stringCharacterEscape"}]}]},"templateLiteralCall":{"patterns":[{"begin":"(?=(([$_[:alpha:]][$_[:alnum:]]*\\\\s*\\\\??\\\\.\\\\s*)*|(\\\\??\\\\.\\\\s*)?)([$_[:alpha:]][$_[:alnum:]]*)(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)?`)","end":"(?=`)","patterns":[{"begin":"(?=(([$_[:alpha:]][$_[:alnum:]]*\\\\s*\\\\??\\\\.\\\\s*)*|(\\\\??\\\\.\\\\s*)?)([$_[:alpha:]][$_[:alnum:]]*))","end":"(?=(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)?`)","patterns":[{"include":"#support-function-call-identifiers"},{"match":"([$_[:alpha:]][$_[:alnum:]]*)","name":"entity.name.function.tagged-template.ts"}]},{"include":"#typeArguments"}]},{"begin":"([$_[:alpha:]][$_[:alnum:]]*)?\\\\s*(?=(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)`)","beginCaptures":{"1":{"name":"entity.name.function.tagged-template.ts"}},"end":"(?=`)","patterns":[{"include":"#typeArguments"}]}]},"templateLiteralSubstitutionElement":{"begin":"\\\\$\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.template-expression.begin.ts"}},"contentName":"meta.embedded.line.ts","end":"}","endCaptures":{"0":{"name":"punctuation.definition.template-expression.end.ts"}},"name":"meta.template.expression.ts","patterns":[{"include":"#ngExpression"}]},"ternaryExpression":{"begin":"(?!\\\\?\\\\.\\\\s*\\\\D)(\\\\?)(?!\\\\?)","beginCaptures":{"1":{"name":"keyword.operator.ternary.ts"}},"end":"\\\\s*(:)","endCaptures":{"1":{"name":"keyword.operator.ternary.ts"}},"patterns":[{"include":"#ngExpression"}]},"thisLiteral":{"match":"(?<![$.])\\\\bthis\\\\b(?!\\\\$)","name":"variable.language.this.ts"},"type":{"name":"meta.type.ts","patterns":[{"include":"#string"},{"include":"#numericLiteral"},{"include":"#typeBuiltinLiterals"},{"include":"#typeTuple"},{"include":"#typeObject"},{"include":"#typeOperators"},{"include":"#typeFnTypeParameters"},{"include":"#typeParenOrFunctionParameters"},{"include":"#typeName"}]},"typeAnnotation":{"begin":":","beginCaptures":{"0":{"name":"keyword.operator.type.annotation.ts"}},"end":"(?=$|[]),;}]|//|\\")|(?==[^>])|(?<=[]$)>_}[:alpha:]])\\\\s*(?=\\\\{)","name":"meta.type.annotation.ts","patterns":[{"include":"#type"}]},"typeArguments":{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.typeparameters.begin.ts"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.typeparameters.end.ts"}},"name":"meta.type.parameters.ts","patterns":[{"include":"#typeArgumentsBody"}]},"typeArgumentsBody":{"patterns":[{"captures":{"0":{"name":"keyword.operator.type.ts"}},"match":"(?<![$_[:alnum:]])(?:(?<=\\\\.\\\\.\\\\.)|(?<!\\\\.))(_)(?![$_[:alnum:]])(?:(?=\\\\.\\\\.\\\\.)|(?!\\\\.))"},{"include":"#type"},{"include":"#punctuationComma"}]},"typeBuiltinLiterals":{"match":"(?<![$.])\\\\b(this|true|false|undefined|null)\\\\b(?!\\\\$)","name":"support.type.builtin.ts"},"typeFnTypeParameters":{"patterns":[{"captures":{"1":{"name":"keyword.control.new.ts"}},"match":"(?<![$.])\\\\b(new)\\\\b(?=\\\\s*<)","name":"meta.type.constructor.ts"},{"begin":"(?<![$.])\\\\b(new)\\\\b\\\\s*(?=\\\\()","beginCaptures":{"1":{"name":"keyword.control.new.ts"}},"end":"(?<=\\\\))","name":"meta.type.constructor.ts","patterns":[{"include":"#functionParameters"}]},{"begin":"(?<=>)\\\\s*(?=\\\\()","end":"(?<=\\\\))","include":"#typeofOperator","name":"meta.type.function.ts","patterns":[{"include":"#functionParameters"}]},{"begin":"((?=\\\\(\\\\s*((\\\\))|(\\\\.\\\\.\\\\.)|([$_[:alnum:]]+\\\\s*(([,:=?])|(\\\\)\\\\s*=>))))))","end":"(?<=\\\\))","name":"meta.type.function.ts","patterns":[{"include":"#functionParameters"}]}]},"typeName":{"patterns":[{"captures":{"1":{"name":"entity.name.type.module.ts"},"2":{"name":"punctuation.accessor.ts"}},"match":"([$_[:alpha:]][$_[:alnum:]]*)\\\\s*([!?]?\\\\.)"},{"match":"[$_[:alpha:]][$_[:alnum:]]*","name":"entity.name.type.ts"}]},"typeObject":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"name":"meta.object.type.ts","patterns":[{"include":"#typeObjectMembers"}]},"typeObjectMembers":{"patterns":[{"include":"#typeAnnotation"},{"include":"#punctuationComma"},{"include":"#punctuationSemicolon"}]},"typeOperators":{"patterns":[{"include":"#typeofOperator"},{"match":"[\\\\&|]","name":"keyword.operator.type.ts"},{"match":"(?<![$.])\\\\bkeyof\\\\b(?!\\\\$)","name":"keyword.operator.expression.keyof.ts"}]},"typeParenOrFunctionParameters":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"name":"meta.type.paren.cover.ts","patterns":[{"include":"#type"},{"include":"#functionParameters"}]},"typeTuple":{"begin":"\\\\[","beginCaptures":{"0":{"name":"meta.brace.square.ts"}},"end":"]","endCaptures":{"0":{"name":"meta.brace.square.ts"}},"name":"meta.type.tuple.ts","patterns":[{"include":"#type"},{"include":"#punctuationComma"}]},"typeofOperator":{"match":"(?<![$.])\\\\btypeof\\\\b(?!\\\\$)","name":"keyword.operator.expression.typeof.ts"},"undefinedLiteral":{"match":"(?<![$.])\\\\bundefined\\\\b(?!\\\\$)","name":"constant.language.undefined.ts"},"variableInitializer":{"begin":"(?<![!=])(=)(?!=)","beginCaptures":{"1":{"name":"keyword.operator.assignment.ts"}},"end":"(?=$|[]),;}])","patterns":[{"include":"#ngExpression"}]}},"scopeName":"expression.ng"}'))],r=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment -expression.ng -meta.tag -source.css -source.js","name":"angular-let-declaration","patterns":[{"include":"#letDeclaration"}],"repository":{"letDeclaration":{"begin":"(@let)\\\\s+([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(=)?","beginCaptures":{"1":{"name":"storage.type.ng"},"2":{"name":"variable.other.constant.ng"},"3":{"name":"keyword.operator.assignment.ng"}},"end":"(?<=;)","name":"meta.definition.variable.ng","patterns":[{"include":"#letInitializer"}]},"letInitializer":{"begin":"\\\\s*","beginCaptures":{"0":{"name":"keyword.operator.assignment.ng"}},"contentName":"meta.definition.variable.initializer.ng","end":";","endCaptures":{"0":{"name":"punctuation.terminator.statement.ng"}},"patterns":[{"include":"expression.ng"}]}},"scopeName":"template.let.ng","embeddedLangs":["angular-expression"]}`)),i=[...n,r],a=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment","name":"angular-template","patterns":[{"include":"#interpolation"}],"repository":{"interpolation":{"begin":"\\\\{\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"contentName":"expression.ng","end":"}}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"patterns":[{"include":"expression.ng"}]}},"scopeName":"template.ng","embeddedLangs":["angular-expression"]}`)),o=[...n,a],s=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment -expression.ng -meta.tag -source.css -source.js","name":"angular-template-blocks","patterns":[{"include":"#block"}],"repository":{"block":{"begin":"(@)(if|else if|else|defer|placeholder|loading|error|switch|case|default|for|empty)\\\\s*","beginCaptures":{"1":{"patterns":[{"include":"#transition"}]},"2":{"name":"keyword.control.block.kind.ng"}},"end":"(?<=})","name":"control.block.ng","patterns":[{"include":"#blockExpression"},{"include":"#blockBody"}]},"blockBody":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"contentName":"control.block.body.ng","end":"}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"patterns":[{"include":"text.html.derivative.ng"},{"include":"template.ng"}]},"blockExpression":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"contentName":"control.block.expression.ng","end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"patterns":[{"include":"#blockExpressionOfClause"},{"include":"#blockExpressionLetBinding"},{"include":"#blockExpressionTrackClause"},{"include":"expression.ng"}]},"blockExpressionLetBinding":{"begin":"\\\\blet\\\\b","beginCaptures":{"0":{"name":"storage.type.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"blockExpressionOfClause":{"begin":"([$_[:alpha:]][$_[:alnum:]]*)\\\\s+(of)\\\\b","beginCaptures":{"1":{"name":"variable.other.constant.ng"},"2":{"name":"keyword.operator.expression.of.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"blockExpressionTrackClause":{"begin":"\\\\btrack\\\\b","beginCaptures":{"0":{"name":"keyword.control.track.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"transition":{"match":"@","name":"keyword.control.block.transition.ng"}},"scopeName":"template.blocks.ng","embeddedLangs":["angular-expression","angular-template"]}`)),c=[...n,...o,s],l=e({default:()=>d}),u=Object.freeze(JSON.parse(`{"displayName":"Angular HTML","injections":{"R:text.html - (comment.block, text.html meta.embedded, meta.tag.*.*.html, meta.tag.*.*.*.html, meta.tag.*.*.*.*.html)":{"patterns":[{"match":"<","name":"invalid.illegal.bad-angle-bracket.html"}]}},"name":"angular-html","patterns":[{"include":"text.html.basic#core-minus-invalid"},{"begin":"(</?)(\\\\w[^>\\\\s]*)(?<!/)","beginCaptures":{"1":{"name":"punctuation.definition.tag.begin.html"},"2":{"name":"entity.name.tag.html"}},"end":"((?: ?/)?>)","endCaptures":{"1":{"name":"punctuation.definition.tag.end.html"}},"name":"meta.tag.other.unrecognized.html.derivative","patterns":[{"include":"text.html.basic#attribute"}]}],"scopeName":"text.html.derivative.ng","embeddedLangs":["html","angular-expression","angular-let-declaration","angular-template","angular-template-blocks"]}`)),d=[...t,...n,...i,...o,...c,u];export{i as a,o as i,l as n,n as o,c as r,d as t};
1
+ import{t as e}from"./index-CisAus9r.js";import{t}from"./html-B4C3aTRB.js";var n=[Object.freeze(JSON.parse('{"injectionSelector":"L:text.html -comment","name":"angular-expression","patterns":[{"include":"#ngExpression"}],"repository":{"arrayLiteral":{"begin":"\\\\[","beginCaptures":{"0":{"name":"meta.brace.square.ts"}},"end":"]","endCaptures":{"0":{"name":"meta.brace.square.ts"}},"name":"meta.array.literal.ts","patterns":[{"include":"#ngExpression"},{"include":"#punctuationComma"}]},"booleanLiteral":{"patterns":[{"match":"(?<![$.])\\\\btrue\\\\b(?!\\\\$)","name":"constant.language.boolean.true.ts"},{"match":"(?<![$.])\\\\bfalse\\\\b(?!\\\\$)","name":"constant.language.boolean.false.ts"}]},"expressionOperator":{"patterns":[{"captures":{"1":{"name":"keyword.operator.logical.ts"},"2":{"name":"entity.name.function.pipe.ng"}},"match":"((?<!\\\\|)\\\\|(?!\\\\|))\\\\s?([-$0-9A-Z_a-z]*)"},{"match":"(?<![$.])\\\\b(let)\\\\b(?!\\\\$)","name":"storage.type.ts"},{"match":"(?<![$.])\\\\b(await)\\\\b(?!\\\\$)","name":"keyword.control.flow.ts"},{"match":"(?<![$.])\\\\bdelete\\\\b(?!\\\\$)","name":"keyword.operator.expression.delete.ts"},{"match":"(?<![$.])\\\\bin\\\\b(?!\\\\$)","name":"keyword.operator.expression.in.ts"},{"match":"(?<![$.])\\\\bof\\\\b(?!\\\\$)","name":"keyword.operator.expression.of.ts"},{"match":"(?<![$.])\\\\bif\\\\b(?!\\\\$)","name":"keyword.control.if.ts"},{"match":"(?<![$.])\\\\belse\\\\b(?!\\\\$)","name":"keyword.control.else.ts"},{"match":"(?<![$.])\\\\bthen\\\\b(?!\\\\$)","name":"keyword.control.then.ts"},{"match":"(?<![$.])\\\\binstanceof\\\\b(?!\\\\$)","name":"keyword.operator.expression.instanceof.ts"},{"match":"(?<![$.])\\\\bnew\\\\b(?!\\\\$)","name":"keyword.operator.new.ts"},{"match":"(?<![$.])\\\\bvoid\\\\b(?!\\\\$)","name":"keyword.operator.expression.void.ts"},{"begin":"(?<![$.])\\\\bas\\\\b(?!\\\\$)","beginCaptures":{"0":{"name":"storage.type.as.ts"}},"end":"(?=$|[]\\"\'),:;}])","patterns":[{"include":"#type"}]},{"match":"(?:\\\\*|(?<!\\\\()/|[-%+])=","name":"keyword.operator.assignment.compound.ts"},{"match":"(?:[\\\\&^]|<<|>>>??|\\\\|)=","name":"keyword.operator.assignment.compound.bitwise.ts"},{"match":"<<|>>>?","name":"keyword.operator.bitwise.shift.ts"},{"match":"[!=]==?","name":"keyword.operator.comparison.ts"},{"match":"<=|>=|<>|[<>]","name":"keyword.operator.relational.ts"},{"match":"!|&&|\\\\?\\\\?|\\\\|\\\\|","name":"keyword.operator.logical.ts"},{"match":"[\\\\&^|~]","name":"keyword.operator.bitwise.ts"},{"match":"=","name":"keyword.operator.assignment.ts"},{"match":"--","name":"keyword.operator.decrement.ts"},{"match":"\\\\+\\\\+","name":"keyword.operator.increment.ts"},{"match":"[-%*+/]","name":"keyword.operator.arithmetic.ts"},{"captures":{"1":{"name":"keyword.operator.arithmetic.ts"}},"match":"(?<=[$_[:alnum:]])\\\\s*(/)(?![*/])"},{"include":"#typeofOperator"}]},"functionCall":{"begin":"(?=(\\\\??\\\\.\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\()","end":"(?<=\\\\))(?!(\\\\??\\\\.\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\()","patterns":[{"match":"\\\\?","name":"punctuation.accessor.ts"},{"match":"\\\\.","name":"punctuation.accessor.ts"},{"match":"([$_[:alpha:]][$_[:alnum:]]*)","name":"entity.name.function.ts"},{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.typeparameters.begin.ts"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.typeparameters.end.ts"}},"name":"meta.type.parameters.ts","patterns":[{"include":"#type"},{"include":"#punctuationComma"}]},{"include":"#parenExpression"}]},"functionParameters":{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.parameters.begin.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.ts"}},"name":"meta.parameters.ts","patterns":[{"include":"#decorator"},{"include":"#parameterName"},{"include":"#variableInitializer"},{"match":",","name":"punctuation.separator.parameter.ts"}]},"identifiers":{"patterns":[{"match":"([$_[:alpha:]][$_[:alnum:]]*)(?=\\\\s*\\\\.\\\\s*prototype\\\\b(?!\\\\$))","name":"support.class.ts"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"constant.other.object.property.ts"},"3":{"name":"variable.other.object.property.ts"}},"match":"([!?]?\\\\.)\\\\s*(?:(\\\\p{upper}[$_\\\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\\\s*\\\\.\\\\s*[$_[:alpha:]][$_[:alnum:]]*)"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"entity.name.function.ts"}},"match":"(?:([!?]?\\\\.)\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)(?=\\\\s*=\\\\s*((async\\\\s+)|(function\\\\s*[(<])|(function\\\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\\\s*=>)|((<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)(\\\\s*:\\\\s*(.)*)?\\\\s*=>)))"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"constant.other.property.ts"}},"match":"([!?]?\\\\.)\\\\s*(\\\\p{upper}[$_\\\\d[:upper:]]*)(?![$_[:alnum:]])"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"variable.other.property.ts"}},"match":"([!?]?\\\\.)\\\\s*([$_[:alpha:]][$_[:alnum:]]*)"},{"captures":{"1":{"name":"constant.other.object.ts"},"2":{"name":"variable.other.object.ts"}},"match":"(?:(\\\\p{upper}[$_\\\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\\\s*\\\\.\\\\s*[$_[:alpha:]][$_[:alnum:]]*)"},{"match":"(\\\\p{upper}[$_\\\\d[:upper:]]*)(?![$_[:alnum:]])","name":"constant.character.other"},{"match":"[$_[:alpha:]][$_[:alnum:]]*","name":"variable.other.readwrite.ts"}]},"literal":{"name":"literal.ts","patterns":[{"include":"#numericLiteral"},{"include":"#booleanLiteral"},{"include":"#nullLiteral"},{"include":"#undefinedLiteral"},{"include":"#numericConstantLiteral"},{"include":"#arrayLiteral"},{"include":"#thisLiteral"}]},"ngExpression":{"name":"meta.expression.ng","patterns":[{"include":"#string"},{"include":"#literal"},{"include":"#ternaryExpression"},{"include":"#expressionOperator"},{"include":"#functionCall"},{"include":"#identifiers"},{"include":"#parenExpression"},{"include":"#punctuationComma"},{"include":"#punctuationSemicolon"},{"include":"#punctuationAccessor"}]},"nullLiteral":{"match":"(?<![$.])\\\\bnull\\\\b(?!\\\\$)","name":"constant.language.null.ts"},"numericConstantLiteral":{"patterns":[{"match":"(?<![$.])\\\\bNaN\\\\b(?!\\\\$)","name":"constant.language.nan.ts"},{"match":"(?<![$.])\\\\bInfinity\\\\b(?!\\\\$)","name":"constant.language.infinity.ts"}]},"numericLiteral":{"patterns":[{"match":"\\\\b(?<!\\\\$)0([Xx])\\\\h+\\\\b(?!\\\\$)","name":"constant.numeric.hex.ts"},{"match":"\\\\b(?<!\\\\$)0([Bb])[01]+\\\\b(?!\\\\$)","name":"constant.numeric.binary.ts"},{"match":"\\\\\\\\b(?<!\\\\$)0([Oo])?[0-7]+\\\\b(?!\\\\$)","name":"constant.numeric.octal.ts"},{"captures":{"0":{"name":"constant.numeric.decimal.ts"},"1":{"name":"meta.delimiter.decimal.period.ts"},"2":{"name":"meta.delimiter.decimal.period.ts"},"3":{"name":"meta.delimiter.decimal.period.ts"},"4":{"name":"meta.delimiter.decimal.period.ts"},"5":{"name":"meta.delimiter.decimal.period.ts"},"6":{"name":"meta.delimiter.decimal.period.ts"}},"match":"(?<!\\\\$)(?:\\\\b[0-9]+(\\\\.)[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+(\\\\.)[Ee][-+]?[0-9]+\\\\b|\\\\B(\\\\.)[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+(\\\\.)\\\\B|\\\\B(\\\\.)[0-9]+\\\\b|\\\\b[0-9]+\\\\b(?!\\\\.))(?!\\\\$)"}]},"parameterName":{"patterns":[{"captures":{"1":{"name":"storage.modifier.ts"},"2":{"name":"storage.modifier.ts"},"3":{"name":"keyword.operator.rest.ts"},"4":{"name":"entity.name.function.ts"},"5":{"name":"keyword.operator.optional.ts"}},"match":"(?:\\\\s*\\\\b(readonly)\\\\s+)?(?:\\\\s*\\\\b(p(?:ublic|rivate|rotected))\\\\s+)?(\\\\.\\\\.\\\\.)?\\\\s*(?<![:=])([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(\\\\??)(?=\\\\s*(=\\\\s*((async\\\\s+)|(function\\\\s*[(<])|(function\\\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\\\s*=>)|((<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)(\\\\s*:\\\\s*(.)*)?\\\\s*=>)))|(:\\\\s*((<)|(\\\\(\\\\s*((\\\\))|(\\\\.\\\\.\\\\.)|([$_[:alnum:]]+\\\\s*(([,:=?])|(\\\\)\\\\s*=>))))))))"},{"captures":{"1":{"name":"storage.modifier.ts"},"2":{"name":"storage.modifier.ts"},"3":{"name":"keyword.operator.rest.ts"},"4":{"name":"variable.parameter.ts"},"5":{"name":"keyword.operator.optional.ts"}},"match":"(?:\\\\s*\\\\b(readonly)\\\\s+)?(?:\\\\s*\\\\b(p(?:ublic|rivate|rotected))\\\\s+)?(\\\\.\\\\.\\\\.)?\\\\s*(?<![:=])([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(\\\\??)"}]},"parenExpression":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"patterns":[{"include":"#ngExpression"},{"include":"#punctuationComma"}]},"punctuationAccessor":{"match":"(?:\\\\?|!?)\\\\.","name":"punctuation.accessor.ts"},"punctuationComma":{"match":",","name":"punctuation.separator.comma.ts"},"punctuationSemicolon":{"match":";","name":"punctuation.terminator.statement.ts"},"qstringDouble":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ts"}},"end":"(\\")|([^\\\\n\\\\\\\\])$","endCaptures":{"1":{"name":"punctuation.definition.string.end.ts"},"2":{"name":"invalid.illegal.newline.ts"}},"name":"string.quoted.double.ts","patterns":[{"include":"#stringCharacterEscape"}]},"qstringSingle":{"begin":"\'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ts"}},"end":"(\')|([^\\\\n\\\\\\\\])$","endCaptures":{"1":{"name":"punctuation.definition.string.end.ts"},"2":{"name":"invalid.illegal.newline.ts"}},"name":"string.quoted.single.ts","patterns":[{"include":"#stringCharacterEscape"}]},"string":{"patterns":[{"include":"#qstringSingle"},{"include":"#qstringDouble"},{"include":"#templateLiteral"}]},"stringCharacterEscape":{"match":"\\\\\\\\(x\\\\h{2}|[012][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)","name":"constant.character.escape.ts"},"templateLiteral":{"patterns":[{"include":"#templateLiteralCall"},{"begin":"([$_[:alpha:]][$_[:alnum:]]*)?(`)","beginCaptures":{"1":{"name":"entity.name.function.tagged-template.ts"},"2":{"name":"string.template.ts punctuation.definition.string.template.begin.ts"}},"contentName":"string.template.ts","end":"`","endCaptures":{"0":{"name":"string.template.ts punctuation.definition.string.template.end.ts"}},"patterns":[{"include":"#templateLiteralSubstitutionElement"},{"include":"#stringCharacterEscape"}]}]},"templateLiteralCall":{"patterns":[{"begin":"(?=(([$_[:alpha:]][$_[:alnum:]]*\\\\s*\\\\??\\\\.\\\\s*)*|(\\\\??\\\\.\\\\s*)?)([$_[:alpha:]][$_[:alnum:]]*)(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)?`)","end":"(?=`)","patterns":[{"begin":"(?=(([$_[:alpha:]][$_[:alnum:]]*\\\\s*\\\\??\\\\.\\\\s*)*|(\\\\??\\\\.\\\\s*)?)([$_[:alpha:]][$_[:alnum:]]*))","end":"(?=(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)?`)","patterns":[{"include":"#support-function-call-identifiers"},{"match":"([$_[:alpha:]][$_[:alnum:]]*)","name":"entity.name.function.tagged-template.ts"}]},{"include":"#typeArguments"}]},{"begin":"([$_[:alpha:]][$_[:alnum:]]*)?\\\\s*(?=(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)`)","beginCaptures":{"1":{"name":"entity.name.function.tagged-template.ts"}},"end":"(?=`)","patterns":[{"include":"#typeArguments"}]}]},"templateLiteralSubstitutionElement":{"begin":"\\\\$\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.template-expression.begin.ts"}},"contentName":"meta.embedded.line.ts","end":"}","endCaptures":{"0":{"name":"punctuation.definition.template-expression.end.ts"}},"name":"meta.template.expression.ts","patterns":[{"include":"#ngExpression"}]},"ternaryExpression":{"begin":"(?!\\\\?\\\\.\\\\s*\\\\D)(\\\\?)(?!\\\\?)","beginCaptures":{"1":{"name":"keyword.operator.ternary.ts"}},"end":"\\\\s*(:)","endCaptures":{"1":{"name":"keyword.operator.ternary.ts"}},"patterns":[{"include":"#ngExpression"}]},"thisLiteral":{"match":"(?<![$.])\\\\bthis\\\\b(?!\\\\$)","name":"variable.language.this.ts"},"type":{"name":"meta.type.ts","patterns":[{"include":"#string"},{"include":"#numericLiteral"},{"include":"#typeBuiltinLiterals"},{"include":"#typeTuple"},{"include":"#typeObject"},{"include":"#typeOperators"},{"include":"#typeFnTypeParameters"},{"include":"#typeParenOrFunctionParameters"},{"include":"#typeName"}]},"typeAnnotation":{"begin":":","beginCaptures":{"0":{"name":"keyword.operator.type.annotation.ts"}},"end":"(?=$|[]),;}]|//|\\")|(?==[^>])|(?<=[]$)>_}[:alpha:]])\\\\s*(?=\\\\{)","name":"meta.type.annotation.ts","patterns":[{"include":"#type"}]},"typeArguments":{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.typeparameters.begin.ts"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.typeparameters.end.ts"}},"name":"meta.type.parameters.ts","patterns":[{"include":"#typeArgumentsBody"}]},"typeArgumentsBody":{"patterns":[{"captures":{"0":{"name":"keyword.operator.type.ts"}},"match":"(?<![$_[:alnum:]])(?:(?<=\\\\.\\\\.\\\\.)|(?<!\\\\.))(_)(?![$_[:alnum:]])(?:(?=\\\\.\\\\.\\\\.)|(?!\\\\.))"},{"include":"#type"},{"include":"#punctuationComma"}]},"typeBuiltinLiterals":{"match":"(?<![$.])\\\\b(this|true|false|undefined|null)\\\\b(?!\\\\$)","name":"support.type.builtin.ts"},"typeFnTypeParameters":{"patterns":[{"captures":{"1":{"name":"keyword.control.new.ts"}},"match":"(?<![$.])\\\\b(new)\\\\b(?=\\\\s*<)","name":"meta.type.constructor.ts"},{"begin":"(?<![$.])\\\\b(new)\\\\b\\\\s*(?=\\\\()","beginCaptures":{"1":{"name":"keyword.control.new.ts"}},"end":"(?<=\\\\))","name":"meta.type.constructor.ts","patterns":[{"include":"#functionParameters"}]},{"begin":"(?<=>)\\\\s*(?=\\\\()","end":"(?<=\\\\))","include":"#typeofOperator","name":"meta.type.function.ts","patterns":[{"include":"#functionParameters"}]},{"begin":"((?=\\\\(\\\\s*((\\\\))|(\\\\.\\\\.\\\\.)|([$_[:alnum:]]+\\\\s*(([,:=?])|(\\\\)\\\\s*=>))))))","end":"(?<=\\\\))","name":"meta.type.function.ts","patterns":[{"include":"#functionParameters"}]}]},"typeName":{"patterns":[{"captures":{"1":{"name":"entity.name.type.module.ts"},"2":{"name":"punctuation.accessor.ts"}},"match":"([$_[:alpha:]][$_[:alnum:]]*)\\\\s*([!?]?\\\\.)"},{"match":"[$_[:alpha:]][$_[:alnum:]]*","name":"entity.name.type.ts"}]},"typeObject":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"name":"meta.object.type.ts","patterns":[{"include":"#typeObjectMembers"}]},"typeObjectMembers":{"patterns":[{"include":"#typeAnnotation"},{"include":"#punctuationComma"},{"include":"#punctuationSemicolon"}]},"typeOperators":{"patterns":[{"include":"#typeofOperator"},{"match":"[\\\\&|]","name":"keyword.operator.type.ts"},{"match":"(?<![$.])\\\\bkeyof\\\\b(?!\\\\$)","name":"keyword.operator.expression.keyof.ts"}]},"typeParenOrFunctionParameters":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"name":"meta.type.paren.cover.ts","patterns":[{"include":"#type"},{"include":"#functionParameters"}]},"typeTuple":{"begin":"\\\\[","beginCaptures":{"0":{"name":"meta.brace.square.ts"}},"end":"]","endCaptures":{"0":{"name":"meta.brace.square.ts"}},"name":"meta.type.tuple.ts","patterns":[{"include":"#type"},{"include":"#punctuationComma"}]},"typeofOperator":{"match":"(?<![$.])\\\\btypeof\\\\b(?!\\\\$)","name":"keyword.operator.expression.typeof.ts"},"undefinedLiteral":{"match":"(?<![$.])\\\\bundefined\\\\b(?!\\\\$)","name":"constant.language.undefined.ts"},"variableInitializer":{"begin":"(?<![!=])(=)(?!=)","beginCaptures":{"1":{"name":"keyword.operator.assignment.ts"}},"end":"(?=$|[]),;}])","patterns":[{"include":"#ngExpression"}]}},"scopeName":"expression.ng"}'))],r=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment -expression.ng -meta.tag -source.css -source.js","name":"angular-let-declaration","patterns":[{"include":"#letDeclaration"}],"repository":{"letDeclaration":{"begin":"(@let)\\\\s+([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(=)?","beginCaptures":{"1":{"name":"storage.type.ng"},"2":{"name":"variable.other.constant.ng"},"3":{"name":"keyword.operator.assignment.ng"}},"end":"(?<=;)","name":"meta.definition.variable.ng","patterns":[{"include":"#letInitializer"}]},"letInitializer":{"begin":"\\\\s*","beginCaptures":{"0":{"name":"keyword.operator.assignment.ng"}},"contentName":"meta.definition.variable.initializer.ng","end":";","endCaptures":{"0":{"name":"punctuation.terminator.statement.ng"}},"patterns":[{"include":"expression.ng"}]}},"scopeName":"template.let.ng","embeddedLangs":["angular-expression"]}`)),i=[...n,r],a=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment","name":"angular-template","patterns":[{"include":"#interpolation"}],"repository":{"interpolation":{"begin":"\\\\{\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"contentName":"expression.ng","end":"}}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"patterns":[{"include":"expression.ng"}]}},"scopeName":"template.ng","embeddedLangs":["angular-expression"]}`)),o=[...n,a],s=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment -expression.ng -meta.tag -source.css -source.js","name":"angular-template-blocks","patterns":[{"include":"#block"}],"repository":{"block":{"begin":"(@)(if|else if|else|defer|placeholder|loading|error|switch|case|default|for|empty)\\\\s*","beginCaptures":{"1":{"patterns":[{"include":"#transition"}]},"2":{"name":"keyword.control.block.kind.ng"}},"end":"(?<=})","name":"control.block.ng","patterns":[{"include":"#blockExpression"},{"include":"#blockBody"}]},"blockBody":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"contentName":"control.block.body.ng","end":"}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"patterns":[{"include":"text.html.derivative.ng"},{"include":"template.ng"}]},"blockExpression":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"contentName":"control.block.expression.ng","end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"patterns":[{"include":"#blockExpressionOfClause"},{"include":"#blockExpressionLetBinding"},{"include":"#blockExpressionTrackClause"},{"include":"expression.ng"}]},"blockExpressionLetBinding":{"begin":"\\\\blet\\\\b","beginCaptures":{"0":{"name":"storage.type.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"blockExpressionOfClause":{"begin":"([$_[:alpha:]][$_[:alnum:]]*)\\\\s+(of)\\\\b","beginCaptures":{"1":{"name":"variable.other.constant.ng"},"2":{"name":"keyword.operator.expression.of.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"blockExpressionTrackClause":{"begin":"\\\\btrack\\\\b","beginCaptures":{"0":{"name":"keyword.control.track.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"transition":{"match":"@","name":"keyword.control.block.transition.ng"}},"scopeName":"template.blocks.ng","embeddedLangs":["angular-expression","angular-template"]}`)),c=[...n,...o,s],l=e({default:()=>d}),u=Object.freeze(JSON.parse(`{"displayName":"Angular HTML","injections":{"R:text.html - (comment.block, text.html meta.embedded, meta.tag.*.*.html, meta.tag.*.*.*.html, meta.tag.*.*.*.*.html)":{"patterns":[{"match":"<","name":"invalid.illegal.bad-angle-bracket.html"}]}},"name":"angular-html","patterns":[{"include":"text.html.basic#core-minus-invalid"},{"begin":"(</?)(\\\\w[^>\\\\s]*)(?<!/)","beginCaptures":{"1":{"name":"punctuation.definition.tag.begin.html"},"2":{"name":"entity.name.tag.html"}},"end":"((?: ?/)?>)","endCaptures":{"1":{"name":"punctuation.definition.tag.end.html"}},"name":"meta.tag.other.unrecognized.html.derivative","patterns":[{"include":"text.html.basic#attribute"}]}],"scopeName":"text.html.derivative.ng","embeddedLangs":["html","angular-expression","angular-let-declaration","angular-template","angular-template-blocks"]}`)),d=[...t,...n,...i,...o,...c,u];export{i as a,o as i,l as n,n as o,c as r,d as t};