@webex/internal-plugin-device 3.12.0-next.54 → 3.12.0-next.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.repo-context.json +519 -0
- package/.sdd/manifest.json +335 -0
- package/AGENTS.md +181 -0
- package/dist/device.js +1 -1
- package/dist/ipNetworkDetector.js +1 -1
- package/docs/adr/index.md +28 -0
- package/docs/architecture.md +237 -0
- package/docs/getting-started.md +91 -0
- package/docs/index.md +40 -0
- package/docs/specs/README.md +80 -0
- package/package.json +3 -3
- package/schemas/repo-context.schema.json +796 -0
- package/src/docs/README.md +676 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest_version": 1,
|
|
3
|
+
"repository": {
|
|
4
|
+
"name": "@webex/internal-plugin-device",
|
|
5
|
+
"purpose": "Device registration for the Webex JS SDK: registers, refreshes, and unregisters this client's device with the WDM service and exposes the device-derived state (URLs, feature toggles, organization policy) as the webex.internal.device plugin.",
|
|
6
|
+
"category": "cat2-legacy",
|
|
7
|
+
"primary_languages": [
|
|
8
|
+
"javascript",
|
|
9
|
+
"typescript"
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"topology": "Single-repo",
|
|
13
|
+
"commands": {
|
|
14
|
+
"compile": {
|
|
15
|
+
"command": "yarn workspace @webex/internal-plugin-device build:src",
|
|
16
|
+
"source_file": "package.json",
|
|
17
|
+
"role": "compile"
|
|
18
|
+
},
|
|
19
|
+
"build": {
|
|
20
|
+
"command": "yarn workspace @webex/internal-plugin-device build",
|
|
21
|
+
"source_file": "package.json",
|
|
22
|
+
"role": "package"
|
|
23
|
+
},
|
|
24
|
+
"unit-test": {
|
|
25
|
+
"command": "yarn workspace @webex/internal-plugin-device test:unit",
|
|
26
|
+
"source_file": "package.json",
|
|
27
|
+
"role": "unit-test"
|
|
28
|
+
},
|
|
29
|
+
"browser-test": {
|
|
30
|
+
"command": "yarn workspace @webex/internal-plugin-device test:browser",
|
|
31
|
+
"source_file": "package.json",
|
|
32
|
+
"role": "integration-test"
|
|
33
|
+
},
|
|
34
|
+
"lint": {
|
|
35
|
+
"command": "yarn workspace @webex/internal-plugin-device test:style",
|
|
36
|
+
"source_file": "package.json",
|
|
37
|
+
"role": "lint"
|
|
38
|
+
},
|
|
39
|
+
"deploy": {
|
|
40
|
+
"command": "yarn workspace @webex/internal-plugin-device deploy:npm",
|
|
41
|
+
"source_file": "package.json",
|
|
42
|
+
"role": "deploy"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"toolchain": [
|
|
46
|
+
{
|
|
47
|
+
"name": "node",
|
|
48
|
+
"version": ">=18",
|
|
49
|
+
"origin": "repo-config",
|
|
50
|
+
"source_file": "package.json"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"tests": {
|
|
54
|
+
"unit": {
|
|
55
|
+
"command_ref": "unit-test",
|
|
56
|
+
"dir": "test/unit",
|
|
57
|
+
"framework": "jest"
|
|
58
|
+
},
|
|
59
|
+
"integration": {
|
|
60
|
+
"command_ref": "browser-test",
|
|
61
|
+
"dir": "test/integration",
|
|
62
|
+
"framework": "mocha (karma runner)",
|
|
63
|
+
"external_deps": [
|
|
64
|
+
"Provisioned Webex test users via @webex/test-helper-test-users",
|
|
65
|
+
"Network access to Webex services"
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"quality_gates": {
|
|
70
|
+
"code_coverage": {
|
|
71
|
+
"origin": "none",
|
|
72
|
+
"declared_by": "riag@cisco.com via bootstrap questionnaire"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"coverage_status_definitions": {
|
|
76
|
+
"specced": ">=80% public surface specced, drift <5% — spec is authoritative",
|
|
77
|
+
"partial": "40-80% specced — spec is a hint, cross-check code",
|
|
78
|
+
"untracked": "<40% specced — code is the source of truth"
|
|
79
|
+
},
|
|
80
|
+
"modules": [
|
|
81
|
+
{
|
|
82
|
+
"path": "src/",
|
|
83
|
+
"coverage_status": "Partial",
|
|
84
|
+
"coverage_evidence": "Generator-side field measurement 80.0% (12 of 15 mandatory fields PRESENT, critical 6 of 7) assessed 2026-10-07. WEAK: external WDM integration (no committed machine-readable contract; owner states none can be provided, recorded as an approved unknown), test and characterization coverage (no baseline; MOD-015, INV-004, INV-005, MOD-026 untested), and design rationale (no accepted ADR). Provenance is PRESENT now that approval is recorded. Promotion to Specced held: a critical field is weak and no drift measurement exists.",
|
|
85
|
+
"canonical_spec": "src/docs/README.md",
|
|
86
|
+
"contracts": {
|
|
87
|
+
"provides": [
|
|
88
|
+
"device-plugin-sdk",
|
|
89
|
+
"device-registration-events",
|
|
90
|
+
"cisco-device-url-header"
|
|
91
|
+
],
|
|
92
|
+
"requires": [
|
|
93
|
+
"wdm-device-registration-service",
|
|
94
|
+
"webex-core-plugin-host",
|
|
95
|
+
"webex-common-sdk",
|
|
96
|
+
"common-timers-sdk",
|
|
97
|
+
"http-core-sdk",
|
|
98
|
+
"internal-plugin-metrics-sdk"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"last_assessed": "2026-10-07",
|
|
102
|
+
"section_profile": {
|
|
103
|
+
"has_ui": false,
|
|
104
|
+
"crosses_service_boundaries": true,
|
|
105
|
+
"enforces_domain_rules": true,
|
|
106
|
+
"is_concurrent_async": true,
|
|
107
|
+
"owns_persistence": false,
|
|
108
|
+
"returns_caller_errors": true,
|
|
109
|
+
"has_design_tradeoff": false,
|
|
110
|
+
"stateful_transitions": true,
|
|
111
|
+
"exposes_wire_protocol": false,
|
|
112
|
+
"ui_multi_screen": false,
|
|
113
|
+
"large_data_model": false,
|
|
114
|
+
"has_tiers": false,
|
|
115
|
+
"module_specific_conventions": true,
|
|
116
|
+
"published_package": true,
|
|
117
|
+
"embedded_in_host": false,
|
|
118
|
+
"holds_client_state": true,
|
|
119
|
+
"has_submodules": false,
|
|
120
|
+
"has_submodules_computed_by": "scripts/module_tree.py",
|
|
121
|
+
"has_submodules_computed_at": "2026-10-07T04:04:09Z",
|
|
122
|
+
"resolved_by": "claude-code/claude-sonnet-5-5 (host metadata; bootstrap questionnaire)",
|
|
123
|
+
"resolved_at": "2026-10-07T04:04:09Z"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
"contract_catalog": {
|
|
128
|
+
"index_path": "docs/architecture.md",
|
|
129
|
+
"definitions": {
|
|
130
|
+
"device-plugin-sdk": {
|
|
131
|
+
"kind": "sdk",
|
|
132
|
+
"publication": "published",
|
|
133
|
+
"source_kind": "repository-path",
|
|
134
|
+
"source": "package.json",
|
|
135
|
+
"summary": "Published npm package surface declared by package.json (main: dist/index.js, devMain: src/index.js): the default Device plugin registered as webex.internal.device, the config namespace webex.config.device, constants, CatalogDetails, DeviceRegistrationOptions, DeviceUrlInterceptor, and the feature classes exported from src/index.js. Internal plugin: semantic versioning is not strictly followed. Per-export detail lives in the owning module spec Public surface."
|
|
136
|
+
},
|
|
137
|
+
"device-registration-events": {
|
|
138
|
+
"kind": "event",
|
|
139
|
+
"publication": "published",
|
|
140
|
+
"source_kind": "repository-path",
|
|
141
|
+
"source": "src/device.js",
|
|
142
|
+
"summary": "Events on webex.internal.device: registration:success (name declared as DEVICE_EVENT_REGISTRATION_SUCCESS in src/constants.js, triggered in src/device.js), change and change:features (re-emitted by src/device.js), and change:<collection> for the developer, entitlement, and user feature collections (emitted by src/features/features-model.js; collection names declared in src/constants.js)."
|
|
143
|
+
},
|
|
144
|
+
"cisco-device-url-header": {
|
|
145
|
+
"kind": "http",
|
|
146
|
+
"publication": "internal",
|
|
147
|
+
"source_kind": "repository-path",
|
|
148
|
+
"source": "src/interceptors/device-url.js",
|
|
149
|
+
"summary": "cisco-device-url request header carrying the registered device URL, added by DeviceUrlInterceptor to outbound requests for catalog services other than idbroker, oauth, and saml."
|
|
150
|
+
},
|
|
151
|
+
"wdm-device-registration-service": {
|
|
152
|
+
"kind": "http",
|
|
153
|
+
"publication": "internal",
|
|
154
|
+
"source_kind": "external",
|
|
155
|
+
"source": "WDM service (Webex web device manager), reached through the wdm entry of the services catalog; no machine-readable contract is committed in this repository, and the response shape is exercised by the fixture test/unit/spec/wdm-dto.json",
|
|
156
|
+
"summary": "Device registration endpoints consumed by this module: POST wdm/devices to register, PUT and DELETE on the device url to refresh and unregister, and GET wdm/devices to list devices for cleanup."
|
|
157
|
+
},
|
|
158
|
+
"webex-core-plugin-host": {
|
|
159
|
+
"kind": "sdk",
|
|
160
|
+
"publication": "published",
|
|
161
|
+
"source_kind": "external",
|
|
162
|
+
"source": "@webex/webex-core (workspace package; no module spec, so source was used: WebexPlugin, persist, waitForValue, registerInternalPlugin, services plugin)",
|
|
163
|
+
"summary": "Plugin host contract consumed by this module: the WebexPlugin base model, the persist and waitForValue decorators, registerInternalPlugin, webex.request, and the services methods waitForCatalog, get, waitForService, getServiceFromUrl, convertUrlToPriorityHostUrl, and markFailedUrl."
|
|
164
|
+
},
|
|
165
|
+
"webex-common-sdk": {
|
|
166
|
+
"kind": "sdk",
|
|
167
|
+
"publication": "published",
|
|
168
|
+
"source_kind": "external",
|
|
169
|
+
"source": "@webex/common (workspace package; module spec consulted: oneFlight, deprecated, inBrowser, deviceType)",
|
|
170
|
+
"summary": "Shared primitives used here: oneFlight and deprecated decorators, the inBrowser flag, and the deviceType constants."
|
|
171
|
+
},
|
|
172
|
+
"common-timers-sdk": {
|
|
173
|
+
"kind": "sdk",
|
|
174
|
+
"publication": "published",
|
|
175
|
+
"source_kind": "external",
|
|
176
|
+
"source": "@webex/common-timers (workspace package; module spec consulted: safeSetTimeout)",
|
|
177
|
+
"summary": "safeSetTimeout, a setTimeout wrapper that unrefs the handle, used for the ephemeral refresh timer, the logout timer, and the registration wait."
|
|
178
|
+
},
|
|
179
|
+
"http-core-sdk": {
|
|
180
|
+
"kind": "sdk",
|
|
181
|
+
"publication": "published",
|
|
182
|
+
"source_kind": "external",
|
|
183
|
+
"source": "@webex/http-core (workspace package; module spec consulted: Interceptor)",
|
|
184
|
+
"summary": "The Interceptor base class extended by DeviceUrlInterceptor."
|
|
185
|
+
},
|
|
186
|
+
"internal-plugin-metrics-sdk": {
|
|
187
|
+
"kind": "sdk",
|
|
188
|
+
"publication": "published",
|
|
189
|
+
"source_kind": "external",
|
|
190
|
+
"source": "@webex/internal-plugin-metrics (workspace package; no module spec, so source was used: newMetrics.submitInternalEvent, newMetrics.callDiagnosticMetrics.setDeviceInfo, metrics.submitClientMetrics)",
|
|
191
|
+
"summary": "Metrics plugin API called during registration for internal events, call-diagnostic device info, and client metrics."
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"spec_policy": {
|
|
196
|
+
"require_what_and_why": true,
|
|
197
|
+
"require_provenance": true,
|
|
198
|
+
"protected_specs": [
|
|
199
|
+
"src/docs/README.md"
|
|
200
|
+
]
|
|
201
|
+
},
|
|
202
|
+
"validation": {
|
|
203
|
+
"generator_runtime": "claude-code",
|
|
204
|
+
"generator_model": "claude-sonnet-5-5",
|
|
205
|
+
"generator_run_id": "080ee7e9-bd3c-4dfc-a1ac-81cc28eec83f",
|
|
206
|
+
"generator_runtime_source": "host-metadata",
|
|
207
|
+
"validator_runtime": "01a114a2-39d4-73f2-b1b0-e0a3d977933d",
|
|
208
|
+
"validator_run_id": "01a114a2-39d4-73f2-b1b0-e0a3d977933d",
|
|
209
|
+
"validator_runtime_source": "host-metadata",
|
|
210
|
+
"minimum_independence": "different-runtime",
|
|
211
|
+
"runtime_fallback_tier": "different-runtime",
|
|
212
|
+
"blocking_severities": [
|
|
213
|
+
"Blocking"
|
|
214
|
+
]
|
|
215
|
+
},
|
|
216
|
+
"layout": {
|
|
217
|
+
"sdd_root": ".sdd",
|
|
218
|
+
"docs_root": "docs",
|
|
219
|
+
"agent_entry_path": "AGENTS.md",
|
|
220
|
+
"standing_docs_root": "docs",
|
|
221
|
+
"spec_index_path": "docs/specs/README.md",
|
|
222
|
+
"module_docs_strategy": "source-local",
|
|
223
|
+
"module_docs_relative_path": "docs/README.md",
|
|
224
|
+
"module_docs_decision": {
|
|
225
|
+
"basis": "repo-standards-default",
|
|
226
|
+
"reason": "The package has no module-local documentation folder (the existing docs and src/docs directories were empty), documentation build, or protected authored file that collides with the source-local default.",
|
|
227
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
228
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
229
|
+
},
|
|
230
|
+
"repo_context_decision": {
|
|
231
|
+
"path": ".repo-context.json",
|
|
232
|
+
"schema_path": "schemas/repo-context.schema.json",
|
|
233
|
+
"action": "create",
|
|
234
|
+
"schema_action": "create",
|
|
235
|
+
"reason": "Neither the operational context nor its schema exists in this package; both are created from the bundled Repo Standards templates and verified repository evidence.",
|
|
236
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
237
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
238
|
+
},
|
|
239
|
+
"artifact_decisions": [
|
|
240
|
+
{
|
|
241
|
+
"path": "docs/service.md",
|
|
242
|
+
"action": "omit",
|
|
243
|
+
"reason": "The package is a published library, not a deployable service; it declares no deployment descriptor, container, or runtime entry point.",
|
|
244
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
245
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"path": "mkdocs.yml",
|
|
249
|
+
"action": "omit",
|
|
250
|
+
"reason": "No documentation build exists for this package.",
|
|
251
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
252
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"path": "api-specs/openapi.yaml",
|
|
256
|
+
"action": "omit",
|
|
257
|
+
"reason": "The package serves no HTTP routes; its published surface is the npm package declared in package.json, so no OpenAPI source applies.",
|
|
258
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
259
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"path": "SECURITY.md",
|
|
263
|
+
"action": "omit",
|
|
264
|
+
"reason": "Absent at the package; the questionnaire did not select a security-policy artifact and no reporting contact is established.",
|
|
265
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
266
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"path": "CONTRIBUTING.md",
|
|
270
|
+
"action": "omit",
|
|
271
|
+
"reason": "No package-level contribution guide exists; contribution rules are owned at the surrounding monorepo root.",
|
|
272
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
273
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"path": "CHANGELOG.md",
|
|
277
|
+
"action": "omit",
|
|
278
|
+
"reason": "No package-level changelog exists; release notes are owned at the surrounding monorepo root.",
|
|
279
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
280
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"path": "CTO_CHECKLIST.yml",
|
|
284
|
+
"action": "omit",
|
|
285
|
+
"reason": "The CTO readiness workflow applies to deployable services; this package is a published library.",
|
|
286
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
287
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"path": "schemas/cto-checklist.schema.json",
|
|
291
|
+
"action": "omit",
|
|
292
|
+
"reason": "Selected together with CTO_CHECKLIST.yml, which is omitted.",
|
|
293
|
+
"decided_by": "claude-code (bootstrap questionnaire)",
|
|
294
|
+
"decided_at": "2026-10-07T04:04:09Z"
|
|
295
|
+
}
|
|
296
|
+
],
|
|
297
|
+
"template_roots": {
|
|
298
|
+
"canonical": ".sdd/templates/repo-standards"
|
|
299
|
+
},
|
|
300
|
+
"repo_skills_root": ".sdd/skills",
|
|
301
|
+
"contract_index_path": "docs/architecture.md"
|
|
302
|
+
},
|
|
303
|
+
"substrate": {
|
|
304
|
+
"source": "WebexTools/repo-standards@d89a7fe59126ae3ad9bac9ca352aa7f12b4c85dc",
|
|
305
|
+
"consumed": [
|
|
306
|
+
"@webex/eslint-config-legacy and ESLint through package.json scripts",
|
|
307
|
+
"@webex/babel-config-legacy via babel.config.js",
|
|
308
|
+
"@webex/jest-config-legacy via jest.config.js",
|
|
309
|
+
"@webex/legacy-tools build and test runner via package.json",
|
|
310
|
+
"package README.md"
|
|
311
|
+
],
|
|
312
|
+
"compliance_tier": "baseline"
|
|
313
|
+
},
|
|
314
|
+
"section_profiles": {
|
|
315
|
+
"repo": {
|
|
316
|
+
"owns_datastore": false,
|
|
317
|
+
"holds_client_state": true,
|
|
318
|
+
"components_interact": true,
|
|
319
|
+
"domain_data_across_components": false,
|
|
320
|
+
"caches_data": true,
|
|
321
|
+
"observability_convention": true,
|
|
322
|
+
"deploys_to_infra": false,
|
|
323
|
+
"shared_base_libs": false,
|
|
324
|
+
"is_monorepo": false,
|
|
325
|
+
"multi_platform": true,
|
|
326
|
+
"published_package": true,
|
|
327
|
+
"embedded_in_host": false,
|
|
328
|
+
"cross_repo_deps_material": false,
|
|
329
|
+
"security_arch_warranted": false,
|
|
330
|
+
"exposes_commands_or_artifacts": false
|
|
331
|
+
},
|
|
332
|
+
"resolved_by": "claude-code/claude-sonnet-5-5 (host metadata; bootstrap questionnaire)",
|
|
333
|
+
"resolved_at": "2026-10-07T04:04:09Z"
|
|
334
|
+
}
|
|
335
|
+
}
|
package/AGENTS.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
<!-- sdd-generated-metadata
|
|
2
|
+
doc_kind: agent-entry
|
|
3
|
+
generated_from: agents@0.3.0
|
|
4
|
+
generated_by: claude-code
|
|
5
|
+
approved_by: riag@cisco.com
|
|
6
|
+
updated_at: 2026-10-07T15:08:52Z
|
|
7
|
+
validation_status: pass
|
|
8
|
+
-->
|
|
9
|
+
|
|
10
|
+
# AI Agent Instructions
|
|
11
|
+
|
|
12
|
+
Instructions for AI coding assistants working in `@webex/internal-plugin-device`, a package of the Webex JS SDK
|
|
13
|
+
monorepo. The monorepo root has its own `AGENTS.md`; this file adds the package-specific rules and does not replace it.
|
|
14
|
+
|
|
15
|
+
## Working Method
|
|
16
|
+
|
|
17
|
+
- Read the relevant repository files before editing. Do not edit blind.
|
|
18
|
+
- Understand the task and affected surfaces before writing code.
|
|
19
|
+
- Prefer focused edits over rewriting whole files.
|
|
20
|
+
- Do not invent commands, paths, exports, or behavior. Verify them from repository-local source.
|
|
21
|
+
- Test or validate before declaring done.
|
|
22
|
+
- Keep output concise. If something is uncertain, say so instead of guessing.
|
|
23
|
+
|
|
24
|
+
## Canonical Repository Documentation
|
|
25
|
+
|
|
26
|
+
Before changing code or documentation, start with:
|
|
27
|
+
|
|
28
|
+
- [`docs/index.md`](docs/index.md) for repository documentation navigation;
|
|
29
|
+
- [`docs/architecture.md`](docs/architecture.md) for repository boundaries and interactions;
|
|
30
|
+
- [`docs/specs/README.md`](docs/specs/README.md) for the manifest-backed module and contract registry;
|
|
31
|
+
- the affected module's manifest-routed spec, [`src/docs/README.md`](src/docs/README.md); and
|
|
32
|
+
- [`docs/adr/index.md`](docs/adr/index.md) plus applicable concrete ADRs for durable decisions.
|
|
33
|
+
|
|
34
|
+
Follow `.sdd/manifest.json` for each contract's publication state and canonical source. This package owns no
|
|
35
|
+
HTTP API: its published surface is the npm package declared in `package.json`, and its other contracts are
|
|
36
|
+
internal. The manifest remains authoritative for canonical paths and artifact decisions.
|
|
37
|
+
|
|
38
|
+
## 1. Commands (Run First)
|
|
39
|
+
|
|
40
|
+
Use only documented commands. Do not invent alternatives when a command is missing. Run them from the monorepo root.
|
|
41
|
+
|
|
42
|
+
| Task | Command |
|
|
43
|
+
| ---------------------- | ---------------------------------------------------------- |
|
|
44
|
+
| Install dependencies | Not defined in this package; installed by the monorepo root workspace |
|
|
45
|
+
| Start dev environment | Not applicable: a library with no process to start |
|
|
46
|
+
| Run tests | `yarn workspace @webex/internal-plugin-device test:unit` |
|
|
47
|
+
| Run linters | `yarn workspace @webex/internal-plugin-device test:style` |
|
|
48
|
+
| Build/release artifact | `yarn workspace @webex/internal-plugin-device build:src` |
|
|
49
|
+
| Format code | Not defined in this package (Prettier is a dev dependency without a script) |
|
|
50
|
+
|
|
51
|
+
If a required command is unknown, stop and ask for the exact command.
|
|
52
|
+
|
|
53
|
+
## 2. Agent Persona and Scope
|
|
54
|
+
|
|
55
|
+
You are the Webex JS SDK engineering assistant for `@webex/internal-plugin-device`.
|
|
56
|
+
|
|
57
|
+
Primary outcomes:
|
|
58
|
+
|
|
59
|
+
- Deliver production-safe changes with passing tests.
|
|
60
|
+
- Preserve existing behavior unless a change request explicitly requires a behavior change.
|
|
61
|
+
- Keep docs and configuration aligned with code changes.
|
|
62
|
+
|
|
63
|
+
Definition of done:
|
|
64
|
+
|
|
65
|
+
1. Requested change is implemented.
|
|
66
|
+
2. Relevant tests/lint/build checks pass locally.
|
|
67
|
+
3. Updated docs/config cover new behavior, including the module spec when a requirement, invariant, or failure mode changes.
|
|
68
|
+
4. PR summary includes risks and rollback notes.
|
|
69
|
+
|
|
70
|
+
## 3. Repository Knowledge
|
|
71
|
+
|
|
72
|
+
### Tech Stack
|
|
73
|
+
|
|
74
|
+
| Area | Tooling | Version |
|
|
75
|
+
| ---------------- | ----------------------------------------------- | ---------------------------------------------------- |
|
|
76
|
+
| Language runtime | Node.js, browser | `>=18` (`engines` in `package.json`) |
|
|
77
|
+
| Build tool | `@webex/legacy-tools` (`webex-legacy-tools build`) | Workspace-pinned |
|
|
78
|
+
| Test framework | Jest (unit), Mocha through Karma (integration), Sinon, Chai | Jest workspace-pinned; Sinon `^9.2.4`; Chai `^4.3.4` |
|
|
79
|
+
| Lint/format | ESLint, Prettier | `^8.24.0`, `^2.7.1` |
|
|
80
|
+
|
|
81
|
+
### Project Map
|
|
82
|
+
|
|
83
|
+
- `src/`: plugin source (`device.js`, `index.js`, `config.js`, `constants.js`, `types.ts`, `ipNetworkDetector.ts`)
|
|
84
|
+
- `src/features/`: feature toggle models
|
|
85
|
+
- `src/interceptors/`: the `cisco-device-url` request interceptor
|
|
86
|
+
- `src/docs/README.md`: the canonical module specification
|
|
87
|
+
- `test/unit/spec/` and `test/integration/spec/`: unit and integration tests
|
|
88
|
+
- `docs/`: package architecture, getting started, registry, and ADRs
|
|
89
|
+
- `.sdd/manifest.json`: machine-readable SDD manifest; `.repo-context.json`: operational context for agents
|
|
90
|
+
|
|
91
|
+
### Critical Constraints
|
|
92
|
+
|
|
93
|
+
- Other SDK packages read `webex.internal.device` property and event names directly; renaming one is a breaking change.
|
|
94
|
+
- Never attach `cisco-device-url` to `idbroker`, `oauth`, or `saml` requests, and never store `services` or `serviceHostMap` on the device.
|
|
95
|
+
- The package is an internal plugin: semantic versioning is not strictly followed, but dependent packages in the monorepo still break on API changes.
|
|
96
|
+
|
|
97
|
+
## 4. Testing Workflow
|
|
98
|
+
|
|
99
|
+
Run checks in this order:
|
|
100
|
+
|
|
101
|
+
1. `yarn workspace @webex/internal-plugin-device test:unit`
|
|
102
|
+
2. `yarn workspace @webex/internal-plugin-device test:style`
|
|
103
|
+
3. `yarn workspace @webex/internal-plugin-device test:browser` when integration behavior changes (needs provisioned Webex test users)
|
|
104
|
+
|
|
105
|
+
Testing rules:
|
|
106
|
+
|
|
107
|
+
- Add or update tests for every behavior change.
|
|
108
|
+
- Cover failure paths and edge cases, not only happy paths.
|
|
109
|
+
- Do not remove tests to make CI pass.
|
|
110
|
+
|
|
111
|
+
## 5. Code Style and Patterns
|
|
112
|
+
|
|
113
|
+
Coding expectations:
|
|
114
|
+
|
|
115
|
+
- Follow repository style rules and static analysis output.
|
|
116
|
+
- Prefer small, composable functions over large procedural blocks.
|
|
117
|
+
- Make error handling explicit at system boundaries.
|
|
118
|
+
- Keep public interfaces stable unless a breaking change is requested.
|
|
119
|
+
- Before adding a literal path, filename, command, workflow identifier, status,
|
|
120
|
+
or other policy value, search the repository for exact and semantically
|
|
121
|
+
equivalent uses. When repeated production values represent one shared
|
|
122
|
+
contract, move them to the narrowest owning shared module or catalog as one
|
|
123
|
+
canonical named constant, enum, or type and update consumers. Keep incidental
|
|
124
|
+
similarities, one-off implementation details, and independent test fixtures
|
|
125
|
+
local.
|
|
126
|
+
- Do not import a default, named, object, or namespace binding and immediately
|
|
127
|
+
re-export it. Consumers should import from the owning module; package barrels
|
|
128
|
+
should use direct named re-exports.
|
|
129
|
+
- Do not write inline runtime `typeof` checks outside descriptively named guard
|
|
130
|
+
implementations. Import and reuse the owning guard instead; TypeScript
|
|
131
|
+
type-position `typeof` queries remain allowed.
|
|
132
|
+
- Write Ampersand `derived` functions as methods, not arrow functions, and keep `@waitForValue('@')` on methods that need loaded persisted state.
|
|
133
|
+
|
|
134
|
+
Pattern example:
|
|
135
|
+
|
|
136
|
+
```text
|
|
137
|
+
Preferred:
|
|
138
|
+
- Validate external input close to the boundary.
|
|
139
|
+
- Return typed/structured results.
|
|
140
|
+
- Include actionable error messages.
|
|
141
|
+
|
|
142
|
+
Avoid:
|
|
143
|
+
- Passing unvalidated payloads deep into the system.
|
|
144
|
+
- Swallowing exceptions or returning ambiguous null values.
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## 6. Git Workflow
|
|
148
|
+
|
|
149
|
+
- Branch naming: follow the monorepo root conventions; this package defines none of its own.
|
|
150
|
+
- Commit format: conventional commits (`feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`), as enforced by the monorepo root commit lint configuration.
|
|
151
|
+
- Keep commits focused and reversible.
|
|
152
|
+
- Rebase on the target branch before opening PR.
|
|
153
|
+
|
|
154
|
+
PR checklist:
|
|
155
|
+
|
|
156
|
+
- What changed and why.
|
|
157
|
+
- Tests run and results.
|
|
158
|
+
- Risk/impact areas.
|
|
159
|
+
- Rollback approach.
|
|
160
|
+
|
|
161
|
+
## 7. Boundaries and Escalation
|
|
162
|
+
|
|
163
|
+
### Always
|
|
164
|
+
|
|
165
|
+
- Prefer existing patterns over introducing new architecture.
|
|
166
|
+
- Keep changes minimal for the requested scope.
|
|
167
|
+
- Call out assumptions and unknowns explicitly.
|
|
168
|
+
|
|
169
|
+
### Ask First
|
|
170
|
+
|
|
171
|
+
- Adding new dependencies or external services.
|
|
172
|
+
- Large refactors or schema migrations.
|
|
173
|
+
- Security-sensitive changes (auth, encryption, secrets handling).
|
|
174
|
+
- Any destructive data or infrastructure operation.
|
|
175
|
+
|
|
176
|
+
### Never
|
|
177
|
+
|
|
178
|
+
- Commit secrets, keys, or credentials.
|
|
179
|
+
- Bypass required checks by disabling tests or linters.
|
|
180
|
+
- Rewrite history on shared branches.
|
|
181
|
+
- Change unrelated files "while here" without clear need.
|
package/dist/device.js
CHANGED
|
@@ -951,7 +951,7 @@ var Device = _webexCore.WebexPlugin.extend((_dec = (0, _webexCore.waitForValue)(
|
|
|
951
951
|
_this10.resetLogoutTimer();
|
|
952
952
|
});
|
|
953
953
|
} /* eslint-enable require-jsdoc */,
|
|
954
|
-
version: "3.12.0-next.
|
|
954
|
+
version: "3.12.0-next.55"
|
|
955
955
|
}, (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight, _dec], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "register", [_dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "register"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "_registerInternal", [_common.oneFlight, _dec3], (0, _getOwnPropertyDescriptor.default)(_obj, "_registerInternal"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "unregister", [_common.oneFlight, _dec4], (0, _getOwnPropertyDescriptor.default)(_obj, "unregister"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "markUrlFailedAndGetNew", [_dec5], (0, _getOwnPropertyDescriptor.default)(_obj, "markUrlFailedAndGetNew"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "initialize", [_dec6], (0, _getOwnPropertyDescriptor.default)(_obj, "initialize"), _obj), _obj));
|
|
956
956
|
var _default = exports.default = Device;
|
|
957
957
|
//# sourceMappingURL=device.js.map
|
|
@@ -225,7 +225,7 @@ var IpNetworkDetector = _webexCore.WebexPlugin.extend({
|
|
|
225
225
|
}, _callee2, null, [[2,, 4, 5]]);
|
|
226
226
|
}))();
|
|
227
227
|
},
|
|
228
|
-
version: "3.12.0-next.
|
|
228
|
+
version: "3.12.0-next.55"
|
|
229
229
|
});
|
|
230
230
|
var _default = exports.default = IpNetworkDetector;
|
|
231
231
|
//# sourceMappingURL=ipNetworkDetector.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<!-- sdd-generated-metadata
|
|
2
|
+
doc_kind: standing-doc
|
|
3
|
+
generated_from: adr-index@0.3.0
|
|
4
|
+
generated_by: claude-code
|
|
5
|
+
approved_by: riag@cisco.com
|
|
6
|
+
updated_at: 2026-10-07T15:08:52Z
|
|
7
|
+
validation_status: pass
|
|
8
|
+
-->
|
|
9
|
+
|
|
10
|
+
# Architectural decision records
|
|
11
|
+
|
|
12
|
+
Numbered, append-only records of structural decisions affecting this package
|
|
13
|
+
and its documentation. Add a concrete ADR (for example, `0001-cache-policy.md`) when a decision
|
|
14
|
+
is non-obvious, hard to reverse, or worth explaining to a future contributor.
|
|
15
|
+
Do not edit an accepted decision in place when its outcome changes; supersede it
|
|
16
|
+
with a new ADR and link both records.
|
|
17
|
+
|
|
18
|
+
## Index
|
|
19
|
+
|
|
20
|
+
No architectural decisions are registered yet. Decisions that the code implies but no record explains (for
|
|
21
|
+
example, the cleanup-then-retry policy for excessive registrations) need their rationale confirmed by the package
|
|
22
|
+
owners before an ADR is written; this generation deliberately did not invent one.
|
|
23
|
+
|
|
24
|
+
Add new entries as ADRs are accepted. Keep this list in numeric order.
|
|
25
|
+
|
|
26
|
+
Each ADR should state its context, decision, alternatives, consequences, and
|
|
27
|
+
the condition that would cause the team to revisit it. Record the deciders,
|
|
28
|
+
any superseded decision, and the constraint future changes must preserve.
|